diff --git a/.gitattributes b/.gitattributes index 7864b8fab..693b49cd1 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,7 +1,18 @@ -# Prevent Windows systems from cloning this repository with "\r\n" line endings. +# https://git-scm.com/docs/git-config/#Documentation/git-config.txt-coreautocrlf +# Default value: input +# Explicitly setting it to false prevents Git from changing line endings at any point, which can +# prevent issues when Windows users collaborate with MacOS/Linus users. core.autocrlf=false -# Prevent people from making merge commits: +# https://git-scm.com/docs/git-config/#Documentation/git-config.txt-coreignoreCase +# Default value: false (on Linux machines) or true (on Windows machines) +# Explicitly setting it to false prevents the issue where Windows users cannot pull down +# casing-related file renames. +core.ignoreCase=false + +# https://git-scm.com/docs/git-config/#Documentation/git-config.txt-pullrebase +# Default value: false +# Setting this prevents spurious merge commits: # https://www.endoflineblog.com/gitflow-considered-harmful pull.rebase=true @@ -23,6 +34,7 @@ tsconfig*.json linguist-language=JSON-with-Comments package-lock.json linguist-generated=true yarn.lock linguist-generated=true pnpm-lock.yaml linguist-generated=true +bun.lock linguist-generated=true # @template-customization-start diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 33aa5bc10..0ba64dc20 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,19 +6,21 @@ jobs: get-build-packages: runs-on: ubuntu-latest outputs: - matrix: ${{ steps.set-matrix.outputs.matrix }} + package-names: ${{ steps.set-matrix.outputs.package-names }} steps: - uses: actions/checkout@v4 - - uses: ./.github/workflows/setup - id: set-matrix - run: npx tsx ./scripts/getMonorepoPackageNames.ts build + uses: complete-ts/get-package-names@main + with: + script-name: build build: needs: get-build-packages runs-on: ubuntu-latest strategy: matrix: - package-name: ${{ fromJson(needs.get-build-packages.outputs.matrix) }} + package-name: ${{ fromJson(needs.get-build-packages.outputs.package-names) }} + fail-fast: false steps: - uses: actions/checkout@v4 - uses: ./.github/workflows/setup @@ -34,19 +36,21 @@ jobs: get-lint-packages: runs-on: ubuntu-latest outputs: - matrix: ${{ steps.set-matrix.outputs.matrix }} + package-names: ${{ steps.set-matrix.outputs.package-names }} steps: - uses: actions/checkout@v4 - - uses: ./.github/workflows/setup - id: set-matrix - run: npx tsx ./scripts/getMonorepoPackageNames.ts lint + uses: complete-ts/get-package-names@main + with: + script-name: lint lint: needs: get-lint-packages runs-on: ubuntu-latest strategy: matrix: - package-name: ${{ fromJson(needs.get-lint-packages.outputs.matrix) }} + package-name: ${{ fromJson(needs.get-lint-packages.outputs.package-names) }} + fail-fast: false steps: - uses: actions/checkout@v4 - uses: ./.github/workflows/setup @@ -56,19 +60,21 @@ jobs: get-test-packages: runs-on: ubuntu-latest outputs: - matrix: ${{ steps.set-matrix.outputs.matrix }} + package-names: ${{ steps.set-matrix.outputs.package-names }} steps: - uses: actions/checkout@v4 - - uses: ./.github/workflows/setup - id: set-matrix - run: npx tsx ./scripts/getMonorepoPackageNames.ts test + uses: complete-ts/get-package-names@main + with: + script-name: test test: needs: get-test-packages runs-on: ubuntu-latest strategy: matrix: - package-name: ${{ fromJson(needs.get-test-packages.outputs.matrix) }} + package-name: ${{ fromJson(needs.get-test-packages.outputs.package-names) }} + fail-fast: false steps: - uses: actions/checkout@v4 - uses: ./.github/workflows/setup @@ -100,6 +106,46 @@ jobs: # name: docs-build # path: ./packages/docs/build + # - name: Check if the "DOCS_SSH_PRIVATE_KEY" GitHub secret is set + # env: + # SECRET_CHECK: ${{ secrets.DOCS_SSH_PRIVATE_KEY }} + # if: ${{ env.SECRET_CHECK == '' }} + # run: | + # echo "Error: The GitHub secret of \"DOCS_SSH_PRIVATE_KEY\" is not set." + # exit 1 + + # - name: Check if the "TYPESENSE_API_KEY" GitHub secret is set + # env: + # SECRET_CHECK: ${{ secrets.TYPESENSE_API_KEY }} + # if: ${{ env.SECRET_CHECK == '' }} + # run: | + # echo "Error: The GitHub secret of \"TYPESENSE_API_KEY\" is not set." + # exit 1 + + # - name: Check if the "TYPESENSE_HOST" GitHub secret is set + # env: + # SECRET_CHECK: ${{ secrets.TYPESENSE_HOST }} + # if: ${{ env.SECRET_CHECK == '' }} + # run: | + # echo "Error: The GitHub secret of \"TYPESENSE_HOST\" is not set." + # exit 1 + + # - name: Check if the "TYPESENSE_PORT" GitHub secret is set + # env: + # SECRET_CHECK: ${{ secrets.TYPESENSE_PORT }} + # if: ${{ env.SECRET_CHECK == '' }} + # run: | + # echo "Error: The GitHub secret of \"TYPESENSE_PORT\" is not set." + # exit 1 + + # - name: Check if the "TYPESENSE_PROTOCOL" GitHub secret is set + # env: + # SECRET_CHECK: ${{ secrets.TYPESENSE_PROTOCOL }} + # if: ${{ env.SECRET_CHECK == '' }} + # run: | + # echo "Error: The GitHub secret of \"TYPESENSE_PROTOCOL\" is not set." + # exit 1 + # - name: Checkout the docs repository # uses: actions/checkout@v4 # with: diff --git a/.github/workflows/setup/action.yml b/.github/workflows/setup/action.yml index 8fd2da1b6..1d4324daa 100644 --- a/.github/workflows/setup/action.yml +++ b/.github/workflows/setup/action.yml @@ -2,18 +2,12 @@ runs: using: composite steps: - # TODO: Remove this section once `setup-node` has a corepack option: - # https://github.com/actions/setup-node/pull/901 - - name: Enable corepack to work around a setup-node bug - run: corepack enable - shell: bash # Composite jobs must specify the shell. - - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: lts/* - cache: yarn + cache: npm - name: Install dependencies - run: yarn install --immutable + run: npm ci shell: bash # Composite jobs must specify the shell. diff --git a/.gitignore b/.gitignore index 6aab4e091..299fd5274 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ thumbs.db # Docusaurus artifacts +# https://github.com/facebook/docusaurus/blob/main/packages/create-docusaurus/templates/shared/gitignore build .docusaurus .cache-loader @@ -20,6 +21,9 @@ packages/docs/docs/isaac-typescript-definitions # Temporary build files packages/isaacscript-common/src/indexLua.ts +# Agents +.claude + # ------------------------------ # GitHub Node.gitignore template # https://raw.githubusercontent.com/github/gitignore/master/Node.gitignore @@ -33,7 +37,6 @@ npm-debug.log* yarn-debug.log* yarn-error.log* lerna-debug.log* -.pnpm-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -85,12 +88,6 @@ web_modules/ # Optional stylelint cache .stylelintcache -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - # Optional REPL history .node_repl_history @@ -102,10 +99,8 @@ web_modules/ # dotenv environment variable files .env -.env.development.local -.env.test.local -.env.production.local -.env.local +.env.* +!.env.example # parcel-bundler cache (https://parceljs.org/) .cache @@ -118,6 +113,7 @@ out # Nuxt.js build / generate output .nuxt dist +.output # Gatsby files .cache/ @@ -132,6 +128,15 @@ dist .temp .cache +# Sveltekit cache directory +.svelte-kit/ + +# vitepress build output +**/.vitepress/dist + +# vitepress cache directory +**/.vitepress/cache + # Docusaurus cache and generated files .docusaurus @@ -144,15 +149,28 @@ dist # DynamoDB Local files .dynamodb/ +# Firebase cache directory +.firebase/ + # TernJS port file .tern-port # Stores VSCode versions used for testing VSCode extensions .vscode-test -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz +# pnpm +.pnpm-store + +# yarn v3 .pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +# Vite files +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +.vite/ diff --git a/.prettierignore b/.prettierignore index af24caff2..1c0782c85 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,6 +5,7 @@ dist package-lock.json yarn.lock pnpm-lock.yaml +bun.lock # Minified files *.min.js @@ -34,9 +35,4 @@ packages/docs/docs/isaacscript-common packages/docs/docs/isaac-typescript-definitions packages/docs/docs/eslint-config-isaacscript -# Rules copied from ESLint -packages/eslint-plugin-isaacscript/src/rules/eqeqeq-fix.ts -packages/eslint-plugin-isaacscript/src/rules/no-useless-return.ts -packages/eslint-plugin-isaacscript/src/rules/prefer-const.ts - # @template-customization-end diff --git a/.vscode/extensions.json b/.vscode/extensions.json index b7f95e8a0..be2a1d9ef 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,8 +2,8 @@ // repository: https://go.microsoft.com/fwlink/?LinkId=827846 { "recommendations": [ - "esbenp.prettier-vscode", // The TypeScript formatter "dbaeumer.vscode-eslint", // The TypeScript linter + "esbenp.prettier-vscode", // The TypeScript formatter "streetsidesoftware.code-spell-checker", // A spell-checker extension based on CSpell "typescript-to-lua.vscode-typescript-to-lua", // The TypeScriptToLua extension "redhat.vscode-xml", // The XML language server diff --git a/.vscode/settings.json b/.vscode/settings.json index 7373b8ce5..f181464b0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -36,16 +36,24 @@ "**/.yarn/": true, "**/dist/": true, "**/node_modules/": true, + "bun.lock": true, "LICENSE": true, + "package-lock.json": true, + "pnpm-lock.yaml": true, + "yarn.lock": true, }, // ------------------ // Extension settings // ------------------ - // Use Prettier to format "cspell.jsonc". + // Use Prettier to format "cspell.config.jsonc". "cSpell.autoFormatConfigFile": true, + // Change all ESLint errors to have yellow squigglies instead of red squigglies. + // https://www.joshuakgoldberg.com/blog/if-i-wrote-a-linter-part-2-developer-experience/#only-errors + "eslint.rules.customizations": [{ "rule": "*", "severity": "warn" }], + // ----------------- // Language settings // ----------------- @@ -55,25 +63,76 @@ "typescript.suggest.completeFunctionCalls": true, // By default, VSCode will prefer non-relative paths for deeply nested files. - "javascript.preferences.importModuleSpecifier": "relative", - "typescript.preferences.importModuleSpecifier": "relative", + "javascript.preferences.importModuleSpecifier": "project-relative", + "typescript.preferences.importModuleSpecifier": "project-relative", // By default, VSCode will not add `import type` automatically. "typescript.preferences.preferTypeOnlyAutoImports": true, // Show TypeScript errors for files that don't happen to be currently open, which makes TypeScript // work similar to other compiled languages like Golang or Rust. - "typescript.tsserver.experimental.enableProjectDiagnostics": true, + // @template-ignore-next-line This causes massive lag for some reason. + "typescript.tsserver.experimental.enableProjectDiagnostics": false, - // Automatically run the formatter when certain files are saved. - "[javascript][typescript][javascriptreact][typescriptreact]": { + // Automatically run the formatter when certain files are saved. We intentionally do not group + // languages together because of this bug: https://github.com/microsoft/vscode/issues/168411 + "[javascript]": { + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + }, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[typescript]": { + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + }, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[javascriptreact]": { + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + }, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[typescriptreact]": { "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit", }, "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, }, - "[css][html][json][jsonc][markdown][postcss][xml][yaml]": { + "[css]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[jsonc]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[markdown]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[postcss]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[xml]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[yaml]": { "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, }, @@ -83,6 +142,5 @@ "editor.formatOnSave": true, "editor.tabSize": 4, }, - "typescript.tsdk": "node_modules\\typescript\\lib", // @template-customization-end } diff --git a/.yarnrc.yml b/.yarnrc.yml deleted file mode 100644 index 3186f3f07..000000000 --- a/.yarnrc.yml +++ /dev/null @@ -1 +0,0 @@ -nodeLinker: node-modules diff --git a/README.md b/README.md index 69e7ff72f..0c08e8e27 100644 --- a/README.md +++ b/README.md @@ -21,14 +21,12 @@ Each project in the monorepo is contained within the "packages" directory. | Name | Description | Version | | ----------------------------------------------------------------------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | [docs](./packages/docs) | The Docusaurus website. | n/a | -| [eslint-config-isaacscript](./packages/eslint-config-isaacscript) | A sharable ESLint config for TypeScript and IsaacScript projects. | [![npm version](https://img.shields.io/npm/v/eslint-config-isaacscript.svg)](https://www.npmjs.com/package/eslint-config-isaacscript) | +| [eslint-config-isaacscript](./packages/eslint-config-isaacscript) | A sharable ESLint config for IsaacScript projects. | [![npm version](https://img.shields.io/npm/v/eslint-config-isaacscript.svg)](https://www.npmjs.com/package/eslint-config-isaacscript) | | [eslint-plugin-isaacscript](./packages/eslint-plugin-isaacscript) | An ESLint plugin that contains useful rules. | [![npm version](https://img.shields.io/npm/v/eslint-plugin-isaacscript.svg)](https://www.npmjs.com/package/eslint-plugin-isaacscript) | | [isaac-lua-polyfill](./packages/isaac-lua-polyfill) | Polyfills for testing Isaac mods using TypeScript. | [![npm version](https://img.shields.io/npm/v/isaac-lua-polyfill.svg)](https://www.npmjs.com/package/isaac-lua-polyfill) | | [isaac-typescript-definitions](./packages/isaac-typescript-definitions) | TypeScript definitions for the _The Binding of Isaac: Repentance_ API. | [![npm version](https://img.shields.io/npm/v/isaac-typescript-definitions.svg)](https://www.npmjs.com/package/isaac-typescript-definitions) | | [isaacscript-cli](./packages/isaacscript-cli) | The command-line tool for managing Isaac mods written in TypeScript. | [![npm version](https://img.shields.io/npm/v/isaacscript.svg)](https://www.npmjs.com/package/isaacscript) | | [isaacscript-common](./packages/isaacscript-common) | Helper functions and features for IsaacScript mods. | [![npm version](https://img.shields.io/npm/v/isaacscript-common.svg)](https://www.npmjs.com/package/isaacscript-common) | -| [isaacscript-common-node](./packages/isaacscript-common-node) | Helper functions for Node.js projects. | [![npm version](https://img.shields.io/npm/v/isaacscript-common-node.svg)](https://www.npmjs.com/package/isaacscript-common-node) | -| [isaacscript-common-ts](./packages/isaacscript-common-ts) | Helper functions for TypeScript projects. | [![npm version](https://img.shields.io/npm/v/isaacscript-common-ts.svg)](https://www.npmjs.com/package/isaacscript-common-ts) | | [isaacscript-lint](./packages/isaacscript-lint) | A linting dependency meta-package for IsaacScript and TypeScript projects. | [![npm version](https://img.shields.io/npm/v/isaacscript-lint.svg)](https://www.npmjs.com/package/isaacscript-lint) | | [isaacscript-lua](./packages/isaacscript-lua) | A tool for managing IsaacScript libraries in Lua projects. | [![pypi version](https://img.shields.io/pypi/v/isaacscript-lua.svg)](https://pypi.org/project/isaacscript-lua/) | | [isaacscript-spell](./packages/isaacscript-spell) | Spelling dictionaries for _The Binding of Isaac: Repentance_. | [![npm version](https://img.shields.io/npm/v/isaacscript-spell.svg)](https://www.npmjs.com/package/isaacscript-spell) | @@ -58,10 +56,8 @@ For getting started in building your own mods, see the [website](https://isaacsc (replace "[username]" with your GitHub username) - Enter the cloned repository: - `cd isaacscript` -- Ensure that [Yarn](https://classic.yarnpkg.com/lang/en/) is installed: - - `corepack enable` - Install dependencies: - - `yarn install` + - `npm ci` - Open the monorepo in VSCode: - `code .` @@ -83,6 +79,6 @@ This command will initialize a new mod named "test" and then automatically link ### Using an Existing Mod -Testing with a brand new mod is recommended, but it is also possible to use an existing mod. Just set `"isaacScriptCommonDev": true` in your `isaacscript.json` file and then start IsaacScript. (Doing this will automatically set up the local Yarn link.) +Testing with a brand new mod is recommended, but it is also possible to use an existing mod. Just set `"isaacScriptCommonDev": true` in your `isaacscript.json` file and then start IsaacScript. (Doing this will automatically set up the local npm link.) -Make sure that your existing mod project uses Yarn as the package manager, or the link won't work properly. +Make sure that your existing mod project uses npm as the package manager, or the link won't work properly. diff --git a/cspell.jsonc b/cspell.config.jsonc similarity index 72% rename from cspell.jsonc rename to cspell.config.jsonc index 9ede64ad5..aa60bc473 100644 --- a/cspell.jsonc +++ b/cspell.config.jsonc @@ -14,6 +14,7 @@ "*.svg", ".git/**", ".yarn/**", + "bun.lock", "dist/**", "LICENSE", "node_modules/**", @@ -36,43 +37,15 @@ // @template-customization-end ], "words": [ - "adduser", - "Alicè", - "APPDATA", - "arktype", - "Basarat", "celsiusnarhwal", - "chunkname", - "cloc", - "docsearch", - "execa", - "gulpfile", "klaw", - "knip", "lualib", - "markdownlintignore", - "Neovim", - "nonblock", - "nonconstructor", - "nonoctal", - "preid", "pypi", "pyproject", - "remarkrc", "ssmacro", "sublist", - "svgr", - "Syed", "syncer", - "syncpack", - "tsconfck", - "tsdoc", - "TSES", - "tseslint", - "tsup", "typedoc", "typesense", - "unidecode", - "Webstorm", ], } diff --git a/eslint.config.mjs b/eslint.config.mjs index b9e9796a6..0cc0799d7 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,4 +1,5 @@ -import { base } from "./packages/eslint-config-isaacscript/base.js"; -import { monorepo } from "./packages/eslint-config-isaacscript/monorepo.js"; +// @ts-check -export default [...base, ...monorepo]; +import { completeConfigBase } from "eslint-config-complete"; + +export default [...completeConfigBase]; diff --git a/knip.config.js b/knip.config.js new file mode 100644 index 000000000..5f713647b --- /dev/null +++ b/knip.config.js @@ -0,0 +1,80 @@ +// This is the configuration file for Knip: +// https://knip.dev/overview/configuration + +// @ts-check + +/** @type {import("knip").KnipConfig} */ +const config = { + // Knip cannot exclude enum members per package: + // https://github.com/webpro-nl/knip/issues/794 + exclude: ["enumMembers"], + + ignore: ["eslint.config.mjs"], + + ignoreBinaries: [ + "tsx", // This is provided by "complete-lint". + ], + + // Ignore all dependencies in the root. (This is checked by the `lintMonorepoPackageJSONs` helper + // function.) + ignoreDependencies: [".+"], + + workspaces: { + "packages/*": {}, + "packages/docs": { + ignore: [ + "babel.config.js", + "docusaurus.config.ts", + "eslint.config.mjs", + "scripts/**", + "sidebars.ts", + "src/**/index.tsx", + "static/js/hotkey.js", + "typedoc.config.base.mjs", + ], + }, + "packages/eslint-plugin-isaacscript": { + ignore: [ + "eslint.config.mjs", + "src/template.ts", + "tests/fixtures/file.ts", + "tests/template.ts", + ], + }, + "packages/isaac-lua-polyfill": { + ignore: ["eslint.config.mjs"], + }, + "packages/isaac-typescript-definitions": { + ignore: ["eslint.config.mjs", "typedoc.config.mjs"], + }, + "packages/isaac-typescript-definitions-repentogon": { + ignore: ["eslint.config.mjs", "typedoc.config.mjs"], + }, + "packages/isaacscript-cli": { + entry: [ + "src/commands/monitor/modDirectorySyncer/modDirectorySyncer.ts", + "src/commands/monitor/saveDatWriter/saveDatWriter.ts", + ], + ignore: [ + "**/copied/**", + "eslint.config.mjs", + "file-templates/**", + "plugins/**", + "src/interfaces/IsaacScriptTSConfig.ts", + ], + }, + "packages/isaacscript-common": { + ignore: [ + "eslint.config.mjs", + "src/classes/features/other/extraConsoleCommands/commands.ts", + "src/lib/jsonLua.js", + "typedoc.config.mjs", + ], + }, + "packages/isaacscript-spell": { + ignore: ["eslint.config.mjs"], + }, + }, +}; + +export default config; diff --git a/knip.jsonc b/knip.jsonc deleted file mode 100644 index d10649e14..000000000 --- a/knip.jsonc +++ /dev/null @@ -1,61 +0,0 @@ -{ - "$schema": "https://unpkg.com/knip@3/schema-jsonc.json", - "workspaces": { - "packages/docs": { - "ignore": [ - "babel.config.js", - "docusaurus.config.ts", - "scripts/**", - "sidebars.ts", - "src/**/index.tsx", - "static/js/hotkey.js", - "typedoc.config.base.mjs", - ], - }, - "packages/eslint-config-isaacscript": { - "entry": ["base.js", "mod.js"], - }, - "packages/eslint-plugin-isaacscript": { - "ignore": [ - "src/template.ts", - "tests/fixtures/file.ts", - "tests/template.ts", - ], - }, - "packages/isaac-lua-polyfill": {}, - "packages/isaac-typescript-definitions": { - "ignore": ["typedoc.config.mjs"], - }, - "packages/isaac-typescript-definitions-repentogon": { - "ignore": ["typedoc.config.mjs"], - }, - "packages/isaacscript-cli": { - "entry": [ - "src/main.ts", - "src/commands/monitor/modDirectorySyncer/modDirectorySyncer.ts", - "src/commands/monitor/saveDatWriter/saveDatWriter.ts", - ], - "ignore": [ - "**/copied/**", - "file-templates/**", - "plugins/**", - "src/interfaces/IsaacScriptTSConfig.ts", - ], - }, - "packages/isaacscript-common": { - "ignore": [ - "src/classes/features/other/extraConsoleCommands/commands.ts", - "src/lib/jsonLua.js", - "typedoc.config.mjs", - ], - }, - "packages/isaacscript-common-node": {}, - "packages/isaacscript-common-ts": {}, - "packages/isaacscript-spell": {}, - }, - "ignoreDependencies": [ - "eslint-plugin-isaacscript", - "isaacscript-common-node", - "isaacscript-common-ts", - ], -} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..6995b15ce --- /dev/null +++ b/package-lock.json @@ -0,0 +1,29566 @@ +{ + "name": "isaacscript-monorepo", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "isaacscript-monorepo", + "hasInstallScript": true, + "license": "GPL-3.0", + "dependencies": { + "@babel/core": "7.29.0", + "@babel/preset-env": "7.29.2", + "@babel/preset-typescript": "7.28.5", + "@commander-js/extra-typings": "14.0.0", + "@docusaurus/core": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/preset-classic": "3.9.2", + "@docusaurus/tsconfig": "3.9.2", + "@docusaurus/types": "3.9.2", + "@eslint/eslintrc": "3.3.5", + "@mdx-js/react": "3.1.1", + "@microsoft/api-extractor": "7.57.7", + "@prettier/plugin-xml": "3.4.2", + "@tsconfig/node-lts": "24.0.0", + "@tsconfig/strictest": "2.0.8", + "@types/figlet": "1.7.0", + "@types/jest": "30.0.0", + "@types/klaw-sync": "6.0.5", + "@types/node": "25.5.0", + "@types/prompt": "1.1.9", + "@types/source-map-support": "0.5.10", + "@types/xml2js": "0.4.14", + "@typescript-eslint/rule-tester": "8.57.1", + "@typescript-eslint/type-utils": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "@zamiell/sync-directory": "6.0.5", + "@zamiell/typedoc-plugin-not-exported": "0.3.0", + "ajv": "8.18.0", + "chalk": "5.6.2", + "clsx": "2.1.1", + "commander": "14.0.3", + "complete-common": "2.21.0", + "complete-lint": "5.5.0", + "complete-node": "16.4.0", + "docusaurus-theme-search-typesense": "0.26.0", + "eslint-import-resolver-typescript": "4.4.4", + "eslint-plugin-sort-exports": "0.9.1", + "figlet": "1.9.2-beta.0", + "isaac-typescript-definitions": "43.0.6", + "jest": "30.3.0", + "jsonc-parser": "3.3.1", + "klaw-sync": "7.0.0", + "lua-types": "2.14.1", + "moment": "2.30.1", + "prettier": "3.8.1", + "prism-react-renderer": "2.4.1", + "prompt": "1.3.0", + "react": "19.2.4", + "react-dom": "19.2.4", + "source-map": "0.7.6", + "source-map-support": "0.5.21", + "ts-json-schema-generator": "2.9.0", + "ts-prune-2": "0.10.7", + "typedoc": "0.28.17", + "typedoc-plugin-markdown": "4.10.0", + "typedoc-plugin-rename": "1.1.1", + "typescript": "5.9.3", + "typescript-eslint": "8.57.1", + "typescript-to-lua": "1.34.0", + "xml2js": "0.6.2", + "yaml": "2.8.2" + }, + "devDependencies": { + "eslint": "9.39.2", + "tsx": "4.21.0" + } + }, + "node_modules/@ai-sdk/gateway": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.5.tgz", + "integrity": "sha512-5TTDSl0USWY6YGnb4QmJGplFZhk+p9OT7hZevAaER6OGiZ17LB1GypsGYDpNo/MiVMklk8kX4gk6p1/R/EiJ8Q==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.15", + "@vercel/oidc": "3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.15.tgz", + "integrity": "sha512-kOc6Pxb7CsRlNt+sLZKL7/VGQUd7ccl3/tIK+Bqf5/QhHR0Qm3qRBMz1IwU1RmjJEZA73x+KB5cUckbDl2WF7Q==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/react": { + "version": "2.0.86", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.86.tgz", + "integrity": "sha512-vqxbbMOKMpYFHZy0aYEO4jtDcKaFCHL/rEtTqAIDlH14GT0uusSjN99gkDHHG3EnbyJSQmk9gqtqbd1GDwlRRg==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "3.0.15", + "ai": "5.0.86", + "swr": "^2.2.5", + "throttleit": "2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "zod": "^3.25.76 || ^4.1.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.8.0.tgz", + "integrity": "sha512-Hb4BkGNnvgCj3F9XzqjiFTpA5IGkjOXwGAOV13qtc27l2qNF8X9rzSp1H5hu8XewlC0DzYtQtZZIOYzRZDyuXg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.42.0", + "@algolia/requester-browser-xhr": "5.42.0", + "@algolia/requester-fetch": "5.42.0", + "@algolia/requester-node-http": "5.42.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", + "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", + "@algolia/autocomplete-shared": "1.19.2" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", + "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.2" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", + "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.42.0.tgz", + "integrity": "sha512-JLyyG7bb7XOda+w/sp8ch7rEVy6LnWs3qtxr6VJJ2XIINqGsY6U+0L3aJ6QFliBRNUeEAr2QBDxSm8u9Sal5uA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.42.0", + "@algolia/requester-browser-xhr": "5.42.0", + "@algolia/requester-fetch": "5.42.0", + "@algolia/requester-node-http": "5.42.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.42.0.tgz", + "integrity": "sha512-SkCrvtZpdSWjNq9NGu/TtOg4TbzRuUToXlQqV6lLePa2s/WQlEyFw7QYjrz4itprWG9ASuH+StDlq7n49F2sBA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.42.0", + "@algolia/requester-browser-xhr": "5.42.0", + "@algolia/requester-fetch": "5.42.0", + "@algolia/requester-node-http": "5.42.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.42.0.tgz", + "integrity": "sha512-6iiFbm2tRn6B2OqFv9XDTcw5LdWPudiJWIbRk+fsTX+hkPrPm4e1/SbU+lEYBciPoaTShLkDbRge4UePEyCPMQ==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.42.0.tgz", + "integrity": "sha512-iEokmw2k6FBa8g/TT7ClyEriaP/FUEmz3iczRoCklEHWSgoABMkaeYrxRXrA2yx76AN+gyZoC8FX0iCJ55dsOg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.42.0", + "@algolia/requester-browser-xhr": "5.42.0", + "@algolia/requester-fetch": "5.42.0", + "@algolia/requester-node-http": "5.42.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.42.0.tgz", + "integrity": "sha512-ivVniRqX2ARd+jGvRHTxpWeOtO9VT+rK+OmiuRgkSunoTyxk0vjeDO7QkU7+lzBOXiYgakNjkZrBtIpW9c+muw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.42.0", + "@algolia/requester-browser-xhr": "5.42.0", + "@algolia/requester-fetch": "5.42.0", + "@algolia/requester-node-http": "5.42.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.42.0.tgz", + "integrity": "sha512-9+BIw6rerUfA+eLMIS2lF4mgoeBGTCIHiqb35PLn3699Rm3CaJXz03hChdwAWcA6SwGw0haYXYJa7LF0xI6EpA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.42.0", + "@algolia/requester-browser-xhr": "5.42.0", + "@algolia/requester-fetch": "5.42.0", + "@algolia/requester-node-http": "5.42.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.42.0.tgz", + "integrity": "sha512-NZR7yyHj2WzK6D5X8gn+/KOxPdzYEXOqVdSaK/biU8QfYUpUuEA0sCWg/XlO05tPVEcJelF/oLrrNY3UjRbOww==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.42.0", + "@algolia/requester-browser-xhr": "5.42.0", + "@algolia/requester-fetch": "5.42.0", + "@algolia/requester-node-http": "5.42.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "license": "MIT" + }, + "node_modules/@algolia/ingestion": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.42.0.tgz", + "integrity": "sha512-MBkjRymf4BT6VOvMpJlg6kq8K+PkH9q+N+K4YMNdzTXlL40YwOa1wIWQ5LxP/Jhlz64kW5g9/oaMWY06Sy9dcw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.42.0", + "@algolia/requester-browser-xhr": "5.42.0", + "@algolia/requester-fetch": "5.42.0", + "@algolia/requester-node-http": "5.42.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.42.0.tgz", + "integrity": "sha512-kmLs7YfjT4cpr4FnhhRmnoSX4psh9KYZ9NAiWt/YcUV33m0B/Os5L4QId30zVXkOqAPAEpV5VbDPWep+/aoJdQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.42.0", + "@algolia/requester-browser-xhr": "5.42.0", + "@algolia/requester-fetch": "5.42.0", + "@algolia/requester-node-http": "5.42.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.42.0.tgz", + "integrity": "sha512-U5yZ8+Jj+A4ZC0IMfElpPcddQ9NCoawD1dKyWmjHP49nzN2Z4284IFVMAJWR6fq/0ddGf4OMjjYO9cnF8L+5tw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.42.0", + "@algolia/requester-browser-xhr": "5.42.0", + "@algolia/requester-fetch": "5.42.0", + "@algolia/requester-node-http": "5.42.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.42.0.tgz", + "integrity": "sha512-EbuxgteaYBlKgc2Fs3JzoPIKAIaevAIwmv1F+fakaEXeibG4pkmVNsyTUjpOZIgJ1kXeqNvDrcjRb6g3vYBJ9A==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.42.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.42.0.tgz", + "integrity": "sha512-4vnFvY5Q8QZL9eDNkywFLsk/eQCRBXCBpE8HWs8iUsFNHYoamiOxAeYMin0W/nszQj6abc+jNxMChHmejO+ftQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.42.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.42.0.tgz", + "integrity": "sha512-gkLNpU+b1pCIwk1hKTJz2NWQPT8gsfGhQasnZ5QVv4jd79fKRL/1ikd86P0AzuIQs9tbbhlMwxsSTyJmlq502w==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.42.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz", + "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-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==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", + "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz", + "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", + "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.0", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.0.tgz", + "integrity": "sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.6", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz", + "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.43.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@commander-js/extra-typings": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-14.0.0.tgz", + "integrity": "sha512-hIn0ncNaJRLkZrxBIp5AsW/eXEHNKYQBh0aPdoUqNgD+Io3NIykQqpKFyKcuasZhicGaEZJX/JBSIkZ4e5x8Dg==", + "license": "MIT", + "peerDependencies": { + "commander": "~14.0.0" + } + }, + "node_modules/@cspell/cspell-bundled-dicts": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.6.0.tgz", + "integrity": "sha512-gLNe9bB+5gMsTEhR9YPE0Wt122HR2EV+Q1j9W+MbwbeBJmpTWrgAP1ZdpvHOg+6LF6x/bD/EC9HfWdd/om8wXA==", + "license": "MIT", + "dependencies": { + "@cspell/dict-ada": "^4.1.1", + "@cspell/dict-al": "^1.1.1", + "@cspell/dict-aws": "^4.0.17", + "@cspell/dict-bash": "^4.2.2", + "@cspell/dict-companies": "^3.2.10", + "@cspell/dict-cpp": "^7.0.2", + "@cspell/dict-cryptocurrencies": "^5.0.5", + "@cspell/dict-csharp": "^4.0.8", + "@cspell/dict-css": "^4.0.19", + "@cspell/dict-dart": "^2.3.2", + "@cspell/dict-data-science": "^2.0.13", + "@cspell/dict-django": "^4.1.6", + "@cspell/dict-docker": "^1.1.17", + "@cspell/dict-dotnet": "^5.0.11", + "@cspell/dict-elixir": "^4.0.8", + "@cspell/dict-en_us": "^4.4.27", + "@cspell/dict-en-common-misspellings": "^2.1.11", + "@cspell/dict-en-gb-mit": "^3.1.16", + "@cspell/dict-filetypes": "^3.0.15", + "@cspell/dict-flutter": "^1.1.1", + "@cspell/dict-fonts": "^4.0.5", + "@cspell/dict-fsharp": "^1.1.1", + "@cspell/dict-fullstack": "^3.2.7", + "@cspell/dict-gaming-terms": "^1.1.2", + "@cspell/dict-git": "^3.0.7", + "@cspell/dict-golang": "^6.0.26", + "@cspell/dict-google": "^1.0.9", + "@cspell/dict-haskell": "^4.0.6", + "@cspell/dict-html": "^4.0.14", + "@cspell/dict-html-symbol-entities": "^4.0.5", + "@cspell/dict-java": "^5.0.12", + "@cspell/dict-julia": "^1.1.1", + "@cspell/dict-k8s": "^1.0.12", + "@cspell/dict-kotlin": "^1.1.1", + "@cspell/dict-latex": "^4.0.4", + "@cspell/dict-lorem-ipsum": "^4.0.5", + "@cspell/dict-lua": "^4.0.8", + "@cspell/dict-makefile": "^1.0.5", + "@cspell/dict-markdown": "^2.0.14", + "@cspell/dict-monkeyc": "^1.0.12", + "@cspell/dict-node": "^5.0.8", + "@cspell/dict-npm": "^5.2.29", + "@cspell/dict-php": "^4.1.1", + "@cspell/dict-powershell": "^5.0.15", + "@cspell/dict-public-licenses": "^2.0.15", + "@cspell/dict-python": "^4.2.25", + "@cspell/dict-r": "^2.1.1", + "@cspell/dict-ruby": "^5.1.0", + "@cspell/dict-rust": "^4.1.1", + "@cspell/dict-scala": "^5.0.9", + "@cspell/dict-shell": "^1.1.2", + "@cspell/dict-software-terms": "^5.1.20", + "@cspell/dict-sql": "^2.2.1", + "@cspell/dict-svelte": "^1.0.7", + "@cspell/dict-swift": "^2.0.6", + "@cspell/dict-terraform": "^1.1.3", + "@cspell/dict-typescript": "^3.2.3", + "@cspell/dict-vue": "^3.0.5", + "@cspell/dict-zig": "^1.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-bundled-dicts/node_modules/@cspell/dict-cpp": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-7.0.2.tgz", + "integrity": "sha512-dfbeERiVNeqmo/npivdR6rDiBCqZi3QtjH2Z0HFcXwpdj6i97dX1xaKyK2GUsO/p4u1TOv63Dmj5Vm48haDpuA==", + "license": "MIT" + }, + "node_modules/@cspell/cspell-json-reporter": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-9.6.0.tgz", + "integrity": "sha512-5sY1lgAXS5xEOsjT5rREMADj7pHIt56XOL7xR80nNl0TwlpZbeBHhoB2aH5sirVTeodJFN5iraXNbVOYPPupPw==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.6.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-pipe": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-9.6.0.tgz", + "integrity": "sha512-YNuY8NNXfE+8Qzknm2ps6QbrZLZu6rSZTZr3dYW3K6TK7+IFVlJ6e2Z9iKJTqp6aZ4AGU/r9QYGmNX4Oq4gZ0A==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-resolver": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-9.6.0.tgz", + "integrity": "sha512-Gb2UWNmRpTOQGpYL4Q/LMw+b50KcRZcf/wJg6w0Yl3IT+F/uDNhNh1f5rHuTyGsbMsMxHJhsb2AoP+73GlbIfw==", + "license": "MIT", + "dependencies": { + "global-directory": "^4.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-service-bus": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-9.6.0.tgz", + "integrity": "sha512-DCuKKkySTEB8MPLTdoPMdmakYcx7XCsHz1YEMbzOcLqJCxXsRlRZg4qE9kRBee/2QY7eYA2kaYNgn/TDMooa4g==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-types": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-9.6.0.tgz", + "integrity": "sha512-JTqrD47tV+rWc1y2W8T0NTfWLQMlSWX4OF64/Jf3WbsOD+4UXVIfjRlzPry7+1Zekm6pa38+23jkDBytYpu8yw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/dict-ada": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.1.1.tgz", + "integrity": "sha512-E+0YW9RhZod/9Qy2gxfNZiHJjCYFlCdI69br1eviQQWB8yOTJX0JHXLs79kOYhSW0kINPVUdvddEBe6Lu6CjGQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-al": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-al/-/dict-al-1.1.1.tgz", + "integrity": "sha512-sD8GCaZetgQL4+MaJLXqbzWcRjfKVp8x+px3HuCaaiATAAtvjwUQ5/Iubiqwfd1boIh2Y1/3EgM3TLQ7Q8e0wQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-aws": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.17.tgz", + "integrity": "sha512-ORcblTWcdlGjIbWrgKF+8CNEBQiLVKdUOFoTn0KPNkAYnFcdPP0muT4892h7H4Xafh3j72wqB4/loQ6Nti9E/w==", + "license": "MIT" + }, + "node_modules/@cspell/dict-bash": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.2.2.tgz", + "integrity": "sha512-kyWbwtX3TsCf5l49gGQIZkRLaB/P8g73GDRm41Zu8Mv51kjl2H7Au0TsEvHv7jzcsRLS6aUYaZv6Zsvk1fOz+Q==", + "license": "MIT", + "dependencies": { + "@cspell/dict-shell": "1.1.2" + } + }, + "node_modules/@cspell/dict-companies": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.2.10.tgz", + "integrity": "sha512-bJ1qnO1DkTn7JYGXvxp8FRQc4yq6tRXnrII+jbP8hHmq5TX5o1Wu+rdfpoUQaMWTl6balRvcMYiINDesnpR9Bw==", + "license": "MIT" + }, + "node_modules/@cspell/dict-cpp": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-6.0.15.tgz", + "integrity": "sha512-N7MKK3llRNoBncygvrnLaGvmjo4xzVr5FbtAc9+MFGHK6/LeSySBupr1FM72XDaVSIsmBEe7sDYCHHwlI9Jb2w==", + "license": "MIT" + }, + "node_modules/@cspell/dict-cryptocurrencies": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.5.tgz", + "integrity": "sha512-R68hYYF/rtlE6T/dsObStzN5QZw+0aQBinAXuWCVqwdS7YZo0X33vGMfChkHaiCo3Z2+bkegqHlqxZF4TD3rUA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-csharp": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.8.tgz", + "integrity": "sha512-qmk45pKFHSxckl5mSlbHxmDitSsGMlk/XzFgt7emeTJWLNSTUK//MbYAkBNRtfzB4uD7pAFiKgpKgtJrTMRnrQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-css": { + "version": "4.0.19", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.19.tgz", + "integrity": "sha512-VYHtPnZt/Zd/ATbW3rtexWpBnHUohUrQOHff/2JBhsVgxOrksAxJnLAO43Q1ayLJBJUUwNVo+RU0sx0aaysZfg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-dart": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.3.2.tgz", + "integrity": "sha512-sUiLW56t9gfZcu8iR/5EUg+KYyRD83Cjl3yjDEA2ApVuJvK1HhX+vn4e4k4YfjpUQMag8XO2AaRhARE09+/rqw==", + "license": "MIT" + }, + "node_modules/@cspell/dict-data-science": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-2.0.13.tgz", + "integrity": "sha512-l1HMEhBJkPmw4I2YGVu2eBSKM89K9pVF+N6qIr5Uo5H3O979jVodtuwP8I7LyPrJnC6nz28oxeGRCLh9xC5CVA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-django": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.6.tgz", + "integrity": "sha512-SdbSFDGy9ulETqNz15oWv2+kpWLlk8DJYd573xhIkeRdcXOjskRuxjSZPKfW7O3NxN/KEf3gm3IevVOiNuFS+w==", + "license": "MIT" + }, + "node_modules/@cspell/dict-docker": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.17.tgz", + "integrity": "sha512-OcnVTIpHIYYKhztNTyK8ShAnXTfnqs43hVH6p0py0wlcwRIXe5uj4f12n7zPf2CeBI7JAlPjEsV0Rlf4hbz/xQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-dotnet": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.12.tgz", + "integrity": "sha512-FiV934kNieIjGTkiApu/WKvLYi/KBpvfWB2TSqpDQtmXZlt3uSa5blwblO1ZC8OvjH8RCq/31H5IdEYmTaZS7A==", + "license": "MIT" + }, + "node_modules/@cspell/dict-elixir": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.8.tgz", + "integrity": "sha512-CyfphrbMyl4Ms55Vzuj+mNmd693HjBFr9hvU+B2YbFEZprE5AG+EXLYTMRWrXbpds4AuZcvN3deM2XVB80BN/Q==", + "license": "MIT" + }, + "node_modules/@cspell/dict-en_us": { + "version": "4.4.29", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.29.tgz", + "integrity": "sha512-G3B27++9ziRdgbrY/G/QZdFAnMzzx17u8nCb2Xyd4q6luLpzViRM/CW3jA+Mb/cGT5zR/9N+Yz9SrGu1s0bq7g==", + "license": "MIT" + }, + "node_modules/@cspell/dict-en-common-misspellings": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.12.tgz", + "integrity": "sha512-14Eu6QGqyksqOd4fYPuRb58lK1Va7FQK9XxFsRKnZU8LhL3N+kj7YKDW+7aIaAN/0WGEqslGP6lGbQzNti8Akw==", + "license": "CC BY-SA 4.0" + }, + "node_modules/@cspell/dict-en-gb-mit": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.18.tgz", + "integrity": "sha512-AXaMzbaxhSc32MSzKX0cpwT+Thv1vPfxQz1nTly1VHw3wQcwPqVFSqrLOYwa8VNqAPR45583nnhD6iqJ9YESoQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-filetypes": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.15.tgz", + "integrity": "sha512-uDMeqYlLlK476w/muEFQGBy9BdQWS0mQ7BJiy/iQv5XUWZxE2O54ZQd9nW8GyQMzAgoyg5SG4hf9l039Qt66oA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-flutter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-flutter/-/dict-flutter-1.1.1.tgz", + "integrity": "sha512-UlOzRcH2tNbFhZmHJN48Za/2/MEdRHl2BMkCWZBYs+30b91mWvBfzaN4IJQU7dUZtowKayVIF9FzvLZtZokc5A==", + "license": "MIT" + }, + "node_modules/@cspell/dict-fonts": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.5.tgz", + "integrity": "sha512-BbpkX10DUX/xzHs6lb7yzDf/LPjwYIBJHJlUXSBXDtK/1HaeS+Wqol4Mlm2+NAgZ7ikIE5DQMViTgBUY3ezNoQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-fsharp": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.1.1.tgz", + "integrity": "sha512-imhs0u87wEA4/cYjgzS0tAyaJpwG7vwtC8UyMFbwpmtw+/bgss+osNfyqhYRyS/ehVCWL17Ewx2UPkexjKyaBA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-fullstack": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.2.7.tgz", + "integrity": "sha512-IxEk2YAwAJKYCUEgEeOg3QvTL4XLlyArJElFuMQevU1dPgHgzWElFevN5lsTFnvMFA1riYsVinqJJX0BanCFEg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-gaming-terms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.1.2.tgz", + "integrity": "sha512-9XnOvaoTBscq0xuD6KTEIkk9hhdfBkkvJAIsvw3JMcnp1214OCGW8+kako5RqQ2vTZR3Tnf3pc57o7VgkM0q1Q==", + "license": "MIT" + }, + "node_modules/@cspell/dict-git": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-3.0.7.tgz", + "integrity": "sha512-odOwVKgfxCQfiSb+nblQZc4ErXmnWEnv8XwkaI4sNJ7cNmojnvogYVeMqkXPjvfrgEcizEEA4URRD2Ms5PDk1w==", + "license": "MIT" + }, + "node_modules/@cspell/dict-golang": { + "version": "6.0.26", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.26.tgz", + "integrity": "sha512-YKA7Xm5KeOd14v5SQ4ll6afe9VSy3a2DWM7L9uBq4u3lXToRBQ1W5PRa+/Q9udd+DTURyVVnQ+7b9cnOlNxaRg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-google": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-google/-/dict-google-1.0.9.tgz", + "integrity": "sha512-biL65POqialY0i4g6crj7pR6JnBkbsPovB2WDYkj3H4TuC/QXv7Pu5pdPxeUJA6TSCHI7T5twsO4VSVyRxD9CA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-haskell": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.6.tgz", + "integrity": "sha512-ib8SA5qgftExpYNjWhpYIgvDsZ/0wvKKxSP+kuSkkak520iPvTJumEpIE+qPcmJQo4NzdKMN8nEfaeci4OcFAQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-html": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.14.tgz", + "integrity": "sha512-2bf7n+kS92g+cMKV0wr9o/Oq9n8JzU7CcrB96gIh2GHgnF+0xDOqO2W/1KeFAqOfqosoOVE48t+4dnEMkkoJ2Q==", + "license": "MIT" + }, + "node_modules/@cspell/dict-html-symbol-entities": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.5.tgz", + "integrity": "sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-java": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.12.tgz", + "integrity": "sha512-qPSNhTcl7LGJ5Qp6VN71H8zqvRQK04S08T67knMq9hTA8U7G1sTKzLmBaDOFhq17vNX/+rT+rbRYp+B5Nwza1A==", + "license": "MIT" + }, + "node_modules/@cspell/dict-julia": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-julia/-/dict-julia-1.1.1.tgz", + "integrity": "sha512-WylJR9TQ2cgwd5BWEOfdO3zvDB+L7kYFm0I9u0s9jKHWQ6yKmfKeMjU9oXxTBxIufhCXm92SKwwVNAC7gjv+yA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-k8s": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.12.tgz", + "integrity": "sha512-2LcllTWgaTfYC7DmkMPOn9GsBWsA4DZdlun4po8s2ysTP7CPEnZc1ZfK6pZ2eI4TsZemlUQQ+NZxMe9/QutQxg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-kotlin": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-kotlin/-/dict-kotlin-1.1.1.tgz", + "integrity": "sha512-J3NzzfgmxRvEeOe3qUXnSJQCd38i/dpF9/t3quuWh6gXM+krsAXP75dY1CzDmS8mrJAlBdVBeAW5eAZTD8g86Q==", + "license": "MIT" + }, + "node_modules/@cspell/dict-latex": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-4.0.4.tgz", + "integrity": "sha512-YdTQhnTINEEm/LZgTzr9Voz4mzdOXH7YX+bSFs3hnkUHCUUtX/mhKgf1CFvZ0YNM2afjhQcmLaR9bDQVyYBvpA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-lorem-ipsum": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.5.tgz", + "integrity": "sha512-9a4TJYRcPWPBKkQAJ/whCu4uCAEgv/O2xAaZEI0n4y1/l18Yyx8pBKoIX5QuVXjjmKEkK7hi5SxyIsH7pFEK9Q==", + "license": "MIT" + }, + "node_modules/@cspell/dict-lua": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.8.tgz", + "integrity": "sha512-N4PkgNDMu9JVsRu7JBS/3E/dvfItRgk9w5ga2dKq+JupP2Y3lojNaAVFhXISh4Y0a6qXDn2clA6nvnavQ/jjLA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-makefile": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-makefile/-/dict-makefile-1.0.5.tgz", + "integrity": "sha512-4vrVt7bGiK8Rx98tfRbYo42Xo2IstJkAF4tLLDMNQLkQ86msDlYSKG1ZCk8Abg+EdNcFAjNhXIiNO+w4KflGAQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-markdown": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@cspell/dict-markdown/-/dict-markdown-2.0.14.tgz", + "integrity": "sha512-uLKPNJsUcumMQTsZZgAK9RgDLyQhUz/uvbQTEkvF/Q4XfC1i/BnA8XrOrd0+Vp6+tPOKyA+omI5LRWfMu5K/Lw==", + "license": "MIT", + "peerDependencies": { + "@cspell/dict-css": "^4.0.19", + "@cspell/dict-html": "^4.0.14", + "@cspell/dict-html-symbol-entities": "^4.0.5", + "@cspell/dict-typescript": "^3.2.3" + } + }, + "node_modules/@cspell/dict-monkeyc": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.12.tgz", + "integrity": "sha512-MN7Vs11TdP5mbdNFQP5x2Ac8zOBm97ARg6zM5Sb53YQt/eMvXOMvrep7+/+8NJXs0jkp70bBzjqU4APcqBFNAw==", + "license": "MIT" + }, + "node_modules/@cspell/dict-node": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-5.0.8.tgz", + "integrity": "sha512-AirZcN2i84ynev3p2/1NCPEhnNsHKMz9zciTngGoqpdItUb2bDt1nJBjwlsrFI78GZRph/VaqTVFwYikmncpXg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-npm": { + "version": "5.2.35", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.35.tgz", + "integrity": "sha512-w0VIDUvzHSTt4S9pfvSatApxtCesLMFrDUYD0Wjtw91EBRkB2wVw/RV3q1Ni9Nzpx6pCFpcB7c1xBY8l22cyiQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-php": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.1.1.tgz", + "integrity": "sha512-EXelI+4AftmdIGtA8HL8kr4WlUE11OqCSVlnIgZekmTkEGSZdYnkFdiJ5IANSALtlQ1mghKjz+OFqVs6yowgWA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-powershell": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.15.tgz", + "integrity": "sha512-l4S5PAcvCFcVDMJShrYD0X6Huv9dcsQPlsVsBGbH38wvuN7gS7+GxZFAjTNxDmTY1wrNi1cCatSg6Pu2BW4rgg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-public-licenses": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.15.tgz", + "integrity": "sha512-cJEOs901H13Pfy0fl4dCD1U+xpWIMaEPq8MeYU83FfDZvellAuSo4GqWCripfIqlhns/L6+UZEIJSOZnjgy7Wg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-python": { + "version": "4.2.25", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.2.25.tgz", + "integrity": "sha512-hDdN0YhKgpbtZVRjQ2c8jk+n0wQdidAKj1Fk8w7KEHb3YlY5uPJ0mAKJk7AJKPNLOlILoUmN+HAVJz+cfSbWYg==", + "license": "MIT", + "dependencies": { + "@cspell/dict-data-science": "^2.0.13" + } + }, + "node_modules/@cspell/dict-r": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.1.1.tgz", + "integrity": "sha512-71Ka+yKfG4ZHEMEmDxc6+blFkeTTvgKbKAbwiwQAuKl3zpqs1Y0vUtwW2N4b3LgmSPhV3ODVY0y4m5ofqDuKMw==", + "license": "MIT" + }, + "node_modules/@cspell/dict-ruby": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.1.0.tgz", + "integrity": "sha512-9PJQB3cfkBULrMLp5kSAcFPpzf8oz9vFN+QYZABhQwWkGbuzCIXSorHrmWSASlx4yejt3brjaWS57zZ/YL5ZQQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-rust": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.1.2.tgz", + "integrity": "sha512-O1FHrumYcO+HZti3dHfBPUdnDFkI+nbYK3pxYmiM1sr+G0ebOd6qchmswS0Wsc6ZdEVNiPYJY/gZQR6jfW3uOg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-scala": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.9.tgz", + "integrity": "sha512-AjVcVAELgllybr1zk93CJ5wSUNu/Zb5kIubymR/GAYkMyBdYFCZ3Zbwn4Zz8GJlFFAbazABGOu0JPVbeY59vGg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-shell": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-shell/-/dict-shell-1.1.2.tgz", + "integrity": "sha512-WqOUvnwcHK1X61wAfwyXq04cn7KYyskg90j4lLg3sGGKMW9Sq13hs91pqrjC44Q+lQLgCobrTkMDw9Wyl9nRFA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-software-terms": { + "version": "5.1.22", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.1.22.tgz", + "integrity": "sha512-ELi8wqyDAreDpo17Pu45AuKvcrhqPCkGeL+DMuSVxEimBwEqPB+KeQ89DkVap6QDJHl3LCth0pjv8uOgS1dtdQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-sql": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.2.1.tgz", + "integrity": "sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-svelte": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.7.tgz", + "integrity": "sha512-hGZsGqP0WdzKkdpeVLBivRuSNzOTvN036EBmpOwxH+FTY2DuUH7ecW+cSaMwOgmq5JFSdTcbTNFlNC8HN8lhaQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-swift": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.6.tgz", + "integrity": "sha512-PnpNbrIbex2aqU1kMgwEKvCzgbkHtj3dlFLPMqW1vSniop7YxaDTtvTUO4zA++ugYAEL+UK8vYrBwDPTjjvSnA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-terraform": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-terraform/-/dict-terraform-1.1.3.tgz", + "integrity": "sha512-gr6wxCydwSFyyBKhBA2xkENXtVFToheqYYGFvlMZXWjviynXmh+NK/JTvTCk/VHk3+lzbO9EEQKee6VjrAUSbA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-typescript": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", + "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-vue": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.5.tgz", + "integrity": "sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-zig": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-zig/-/dict-zig-1.0.0.tgz", + "integrity": "sha512-XibBIxBlVosU06+M6uHWkFeT0/pW5WajDRYdXG2CgHnq85b0TI/Ks0FuBJykmsgi2CAD3Qtx8UHFEtl/DSFnAQ==", + "license": "MIT" + }, + "node_modules/@cspell/dynamic-import": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-9.6.0.tgz", + "integrity": "sha512-Lkn82wyGj2ltxeYfH2bEjshdes1fx3ouYUZxeW5i6SBBvEVJoSmr43AygI8A317UMIQxVj59qVBorrtGYcRI1w==", + "license": "MIT", + "dependencies": { + "@cspell/url": "9.6.0", + "import-meta-resolve": "^4.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/filetypes": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-9.6.0.tgz", + "integrity": "sha512-CaWyk5j20H6sr+HCArtUY95jUQb7A/6W0GC4B4umnqoWvgqwR72duowLFa+w1K2C7tZg3GoV4Wf2cUn9jjt5FA==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/strong-weak-map": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-9.6.0.tgz", + "integrity": "sha512-9g8LCLv/2RrprGeGnFAaBETWq7ESnBcoMbvgNu+vZE58iF+pbFvP0qGgKvVeKEEpc2LZhNuHLsUH37MUS6DOQg==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/url": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/url/-/url-9.6.0.tgz", + "integrity": "sha512-257WOxh9vOYHAVgBNXRCdLEd+ldzlVbzcc9u+6DYoCDCNGe0OvOWOGsAfnUbMc9xEw48XgBlDYgOlPbjWGLOTg==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-alpha-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", + "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", + "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function-display-p3-linear": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", + "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", + "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", + "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", + "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", + "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", + "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", + "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", + "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", + "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", + "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", + "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", + "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.2.0.tgz", + "integrity": "sha512-65KU9Fw5fGsPPPlgIghonMcndyx1bszzrDQYLfierN+Ha29yotMHzVS94bPkZS6On9LS8dE4qmW4P/fGjtCf/g==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.2.0.tgz", + "integrity": "sha512-zSN/KblmtBcerf7Z87yuKIHZQmxuXvYc6/m0+qnjyNu+Ir67AVOagTa1zBqcxkVUVkmBqUExdcyrdo9hbGbqTw==", + "license": "MIT", + "dependencies": { + "@ai-sdk/react": "^2.0.30", + "@algolia/autocomplete-core": "1.19.2", + "@docsearch/css": "4.2.0", + "ai": "^5.0.30", + "algoliasearch": "^5.28.0", + "marked": "^16.3.0", + "zod": "^4.1.8" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docusaurus/babel": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.2.tgz", + "integrity": "sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/runtime-corejs3": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/bundler": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.2.tgz", + "integrity": "sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.9.2", + "@docusaurus/cssnano-preset": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.11.0", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.2", + "null-loader": "^4.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^6.0.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", + "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.9.2", + "@docusaurus/bundler": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "execa": "5.1.1", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.6", + "tinypool": "^1.0.2", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^5.2.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@docusaurus/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@docusaurus/core/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@docusaurus/core/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@docusaurus/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.2.tgz", + "integrity": "sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.5.4", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.2.tgz", + "integrity": "sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/logger/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@docusaurus/logger/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@docusaurus/logger/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.2.tgz", + "integrity": "sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz", + "integrity": "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.9.2", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.2.tgz", + "integrity": "sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "cheerio": "1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", + "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.2.tgz", + "integrity": "sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.2.tgz", + "integrity": "sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.2.tgz", + "integrity": "sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^2.3.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.2.tgz", + "integrity": "sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.2.tgz", + "integrity": "sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.2.tgz", + "integrity": "sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.2.tgz", + "integrity": "sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.2.tgz", + "integrity": "sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.2.tgz", + "integrity": "sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/plugin-content-blog": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/plugin-content-pages": "3.9.2", + "@docusaurus/plugin-css-cascade-layers": "3.9.2", + "@docusaurus/plugin-debug": "3.9.2", + "@docusaurus/plugin-google-analytics": "3.9.2", + "@docusaurus/plugin-google-gtag": "3.9.2", + "@docusaurus/plugin-google-tag-manager": "3.9.2", + "@docusaurus/plugin-sitemap": "3.9.2", + "@docusaurus/plugin-svgr": "3.9.2", + "@docusaurus/theme-classic": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-search-algolia": "3.9.2", + "@docusaurus/types": "3.9.2" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.2.tgz", + "integrity": "sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/plugin-content-blog": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/plugin-content-pages": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-translations": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "infima": "0.2.0-alpha.45", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.5.4", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", + "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.2.tgz", + "integrity": "sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==", + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.9.0 || ^4.1.0", + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-translations": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "algoliasearch": "^5.37.0", + "algoliasearch-helper": "^3.26.0", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.2.tgz", + "integrity": "sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/tsconfig": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.9.2.tgz", + "integrity": "sha512-j6/Fp4Rlpxsc632cnRnl5HpOWeb6ZKssDj6/XzzAzVGXXfm9Eptx3rxCC+fDzySn9fHTS+CWJjPineCR1bB5WQ==", + "license": "MIT" + }, + "node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/types/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.2.tgz", + "integrity": "sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "escape-string-regexp": "^4.0.0", + "execa": "5.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "p-queue": "^6.6.2", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.2.tgz", + "integrity": "sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.2.tgz", + "integrity": "sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", + "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.84.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.84.0.tgz", + "integrity": "sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@typescript-eslint/types": "^8.54.0", + "comment-parser": "1.4.5", + "esquery": "^1.7.0", + "jsdoc-type-pratt-parser": "~7.1.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@es-joy/resolve.exports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz", + "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "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.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@gerrit0/mini-shiki": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.17.0.tgz", + "integrity": "sha512-Bpf6WuFar20ZXL6qU6VpVl4bVQfyyYiX+6O4xrns4nkU3Mr8paeupDbS1HENpcLOYj7pN4Rkd/yCaPA0vQwKww==", + "license": "MIT", + "dependencies": { + "@shikijs/engine-oniguruma": "^3.17.0", + "@shikijs/langs": "^3.17.0", + "@shikijs/themes": "^3.17.0", + "@shikijs/types": "^3.17.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.3.0.tgz", + "integrity": "sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww==", + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.3.0.tgz", + "integrity": "sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw==", + "license": "MIT", + "dependencies": { + "@jest/console": "30.3.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.3.0", + "jest-config": "30.3.0", + "jest-haste-map": "30.3.0", + "jest-message-util": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-resolve-dependencies": "30.3.0", + "jest-runner": "30.3.0", + "jest-runtime": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "jest-watcher": "30.3.0", + "pretty-format": "30.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/diff-sequences": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", + "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.3.0.tgz", + "integrity": "sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-mock": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.3.0.tgz", + "integrity": "sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg==", + "license": "MIT", + "dependencies": { + "expect": "30.3.0", + "jest-snapshot": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz", + "integrity": "sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==", + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.3.0.tgz", + "integrity": "sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@sinonjs/fake-timers": "^15.0.0", + "@types/node": "*", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.3.0.tgz", + "integrity": "sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA==", + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/expect": "30.3.0", + "@jest/types": "30.3.0", + "jest-mock": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.3.0.tgz", + "integrity": "sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw==", + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "jest-worker": "30.3.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", + "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.3.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.3.0.tgz", + "integrity": "sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g==", + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.3.0.tgz", + "integrity": "sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "30.3.0", + "@jest/types": "30.3.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.3.0.tgz", + "integrity": "sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.3.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.3.0.tgz", + "integrity": "sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.3.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.3.0", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", + "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", + "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", + "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.57.7", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.57.7.tgz", + "integrity": "sha512-kmnmVs32MFWbV5X6BInC1/TfCs7y1ugwxv1xHsAIj/DyUfoe7vtO0alRUgbQa57+yRGHBBjlNcEk33SCAt5/dA==", + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor-model": "7.33.4", + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.1", + "@rushstack/node-core-library": "5.20.3", + "@rushstack/rig-package": "0.7.2", + "@rushstack/terminal": "0.22.3", + "@rushstack/ts-command-line": "5.3.3", + "diff": "~8.0.2", + "lodash": "~4.17.23", + "minimatch": "10.2.3", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "5.8.2" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.33.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.33.4.tgz", + "integrity": "sha512-u1LTaNTikZAQ9uK6KG1Ms7nvNedsnODnspq/gH2dcyETWvH4hVNGNDvRAEutH66kAmxA4/necElqGNs1FggC8w==", + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.1", + "@rushstack/node-core-library": "5.20.3" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@microsoft/api-extractor/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==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/minimatch": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", + "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", + "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", + "license": "MIT" + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz", + "integrity": "sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==", + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.16.0", + "ajv": "~8.18.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@oxc-resolver/binding-android-arm-eabi": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.19.0.tgz", + "integrity": "sha512-dlMjjWE3h+qMujLp5nBX/x7R5ny+xfr4YtsyaMNuM5JImOtQBzpFxQr9kJOKGL+9RbaoTOXpt5KF05f9pnOsgw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@oxc-resolver/binding-android-arm64": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.19.0.tgz", + "integrity": "sha512-x5P0Y12oMcSC9PKkz1FtdVVLosXYi/05m+ufxPrUggd6vZRBPJhW4zZUsMVbz8dwwk71Dh0f6/2ntw3WPOq+Ig==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@oxc-resolver/binding-darwin-arm64": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.19.0.tgz", + "integrity": "sha512-DjnuIPB60IQrVSCiuVBzN8/8AeeIjthdkk+dZYdZzgLeP2T5ZF41u50haJMtIdGr5cRzRH6zPV/gh6+RFjlvKA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxc-resolver/binding-darwin-x64": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.19.0.tgz", + "integrity": "sha512-dVAqIZIIY7xOXCCV0nJPs8ExlYc6R7mcNpFobwNyE3qlXGbgvwb7Gl3iOumOiPBfF+sbJR3MMP7RAPfKqbvYyA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxc-resolver/binding-freebsd-x64": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.19.0.tgz", + "integrity": "sha512-kwcZ30bIpJNFcT22sIlde4mz0EyXmB3lAefCFWtffqpbmLweQUwz1dKDcsutxEjpkbEKLmfrj1wCyRZp7n5Hnw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.19.0.tgz", + "integrity": "sha512-GImk/cb3X+zBGEwr6l9h0dbiNo5zNd52gamZmluEpbyybiZ8kc5q44/7zRR4ILChWRW7pI92W57CJwhkF+wRmg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm-musleabihf": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.19.0.tgz", + "integrity": "sha512-uIEyws3bBD1gif4SZCOV2XIr6q5fd1WbzzBbpL8qk+TbzOvKMWnMNNtfNacnAGGa2lLRNXR1Fffot2mlZ/Xmbw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.19.0.tgz", + "integrity": "sha512-bIkgp+AB+yZfvdKDfjFT7PycsRtih7+zCV5AbnkzfyvNvQ47rfssf8R1IbG++mx+rZ4YUCUu8EbP66HC3O5c5w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm64-musl": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.19.0.tgz", + "integrity": "sha512-bOt5pKPcbidTSy64m2CfM0XcaCmxBEFclCMPuOPO08hh8QIFTiZVhFf/OxTFqyRwhq/tlzzKmXpMo7DfzbO5lQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-ppc64-gnu": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.19.0.tgz", + "integrity": "sha512-BymEPqVeLZzA/1kXow9U9rdniq1r5kk4u686Cx3ZU77YygR48NJI/2TyjM70vKHZffGx75ZShobcc1M5GXG3WA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-riscv64-gnu": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.19.0.tgz", + "integrity": "sha512-aFgPTzZZY+XCYe4B+3A1S63xcIh2i136+2TPXWr9NOwXXTdMdBntb1J9fEgxXDnX82MjBknLUpJqAZHNTJzixA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-riscv64-musl": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.19.0.tgz", + "integrity": "sha512-9WDGt7fV9GK97WrWE/VEDhMFv9m0ZXYn5NQ+16QvyT0ux8yGLAvyadi6viaTjEdJII/OaHBRYHcL+zUjmaWwmg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-s390x-gnu": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.19.0.tgz", + "integrity": "sha512-SY3di6tccocppAVal5Hev3D6D1N5Y6TCEypAvNCOiPqku2Y8U/aXfvGbthqdPNa72KYqjUR1vomOv6J9thHITA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-x64-gnu": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.19.0.tgz", + "integrity": "sha512-SV+4zBeCC3xjSE2wvhN45eyABoVRX3xryWBABFKfLwAWhF3wsB3bUF+CantYfQ/TLpasyvplRS9ovvFT9cb/0A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-x64-musl": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.19.0.tgz", + "integrity": "sha512-LkbjO+r5Isl8Xl29pJYOCB/iSUIULFUJDGdMp+yJD3OgWtSa6VJta2iw7QXmpcoOkq18UIL09yWrlyjLDL0Hug==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-openharmony-arm64": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.19.0.tgz", + "integrity": "sha512-Ud1gelL5slpEU5AjzBWQz1WheprOAl5CPnCKTWynvvdlBbAZXA6fPYLuCrlRo0uw+x3f37XJ71kirpSew8Zyvg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@oxc-resolver/binding-wasm32-wasi": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.19.0.tgz", + "integrity": "sha512-wXLNAVmL4vWXKaYJnFPgg5zQsSr3Rv+ftNReIU3UkzTcoVLK0805Pnbr2NwcBWSO5hhpOEdys02qlT2kxVgjWw==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.19.0.tgz", + "integrity": "sha512-zszvr0dJfvv0Jg49hLwjAJ4SRzfsq28SoearUtT1qv3qXRYsBWuctdlRa/lEZkiuG4tZWiY425Jh9QqLafwsAg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oxc-resolver/binding-win32-ia32-msvc": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-11.19.0.tgz", + "integrity": "sha512-I7ZYujr5XL1l7OwuddbOeqdUyFOaf51W1U2xUogInFdupIAKGqbpugpAK6RaccLcSlN0bbuo3CS5h7ue38SUAg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oxc-resolver/binding-win32-x64-msvc": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.19.0.tgz", + "integrity": "sha512-NxErbI1TmJEZZVvGPePjgXFZCuOzrjQuJ6YwHjcWkelReK7Uhg4QeL05zRdfTpgkH6IY/C8OjbKx5ZilQ4yDFg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "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==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@prettier/plugin-xml": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-3.4.2.tgz", + "integrity": "sha512-/UyNlHfkuLXG6Ed85KB0WBF283xn2yavR+UtRibBRUcvEJId2DSLdGXwJ/cDa1X++SWDPzq3+GSFniHjkNy7yg==", + "license": "MIT", + "dependencies": { + "@xml-tools/parser": "^1.0.11" + }, + "peerDependencies": { + "prettier": "^3.0.0" + } + }, + "node_modules/@rushstack/node-core-library": { + "version": "5.20.3", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.20.3.tgz", + "integrity": "sha512-95JgEPq2k7tHxhF9/OJnnyHDXfC9cLhhta0An/6MlkDsX2A6dTzDrTUG18vx4vjc280V0fi0xDH9iQczpSuWsw==", + "license": "MIT", + "dependencies": { + "ajv": "~8.18.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/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==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/@rushstack/problem-matcher": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.2.1.tgz", + "integrity": "sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==", + "license": "MIT", + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.7.2.tgz", + "integrity": "sha512-9XbFWuqMYcHUso4mnETfhGVUSaADBRj6HUAAEYk50nMPn8WRICmBuCphycQGNB3duIR6EEZX3Xj3SYc2XiP+9A==", + "license": "MIT", + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.22.3", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.22.3.tgz", + "integrity": "sha512-gHC9pIMrUPzAbBiI4VZMU7Q+rsCzb8hJl36lFIulIzoceKotyKL3Rd76AZ2CryCTKEg+0bnTj406HE5YY5OQvw==", + "license": "MIT", + "dependencies": { + "@rushstack/node-core-library": "5.20.3", + "@rushstack/problem-matcher": "0.2.1", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.3.3.tgz", + "integrity": "sha512-c+ltdcvC7ym+10lhwR/vWiOhsrm/bP3By2VsFcs5qTKv+6tTmxgbVrtJ5NdNjANiV5TcmOZgUN+5KYQ4llsvEw==", + "license": "MIT", + "dependencies": { + "@rushstack/terminal": "0.22.3", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "license": "MIT" + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.17.0.tgz", + "integrity": "sha512-flSbHZAiOZDNTrEbULY8DLWavu/TyVu/E7RChpLB4WvKX4iHMfj80C6Hi3TjIWaQtHOW0KC6kzMcuB5TO1hZ8Q==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.17.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.17.0.tgz", + "integrity": "sha512-icmur2n5Ojb+HAiQu6NEcIIJ8oWDFGGEpiqSCe43539Sabpx7Y829WR3QuUW2zjTM4l6V8Sazgb3rrHO2orEAw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.17.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.17.0.tgz", + "integrity": "sha512-/xEizMHLBmMHwtx4JuOkRf3zwhWD2bmG5BRr0IPjpcWpaq4C3mYEuTk/USAEglN0qPrTwEHwKVpSu/y2jhferA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.17.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.17.0.tgz", + "integrity": "sha512-wjLVfutYWVUnxAjsWEob98xgyaGv0dTEnMZDruU5mRjVN7szcGOfgO+997W2yR6odp+1PtSBNeSITRRTfUzK/g==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.34.38", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.38.tgz", + "integrity": "sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==", + "license": "MIT" + }, + "node_modules/@sindresorhus/base62": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", + "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz", + "integrity": "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, + "node_modules/@stylistic/eslint-plugin": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/types": "^8.56.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.0.0 || ^10.0.0" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.18.1.tgz", + "integrity": "sha512-RVE+zSRICWRsfrkAw5qCAK+4ZH9kwEFv5h0+/YeHTLieWP7F4wWq4JsKFuNWG+fYh/KF+8rAtgdj5zb2mm+DVA==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.12", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tsconfig/node-lts": { + "version": "24.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/node-lts/-/node-lts-24.0.0.tgz", + "integrity": "sha512-8mSTqWwCd6aQpvxSrpQlMoA9RiUZSs7bYhL5qsLXIIaN9HQaINeoydrRu/Y7/fws4bvfuyhs0BRnW9/NI8tySg==", + "license": "MIT" + }, + "node_modules/@tsconfig/strictest": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/strictest/-/strictest-2.0.8.tgz", + "integrity": "sha512-XnQ7vNz5HRN0r88GYf1J9JJjqtZPiHt2woGJOo2dYqyHGGcd6OLGqSlBB6p1j9mpzja6Oe5BoPqWmeDx6X9rLw==", + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "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.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/figlet": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@types/figlet/-/figlet-1.7.0.tgz", + "integrity": "sha512-KwrT7p/8Eo3Op/HBSIwGXOsTZKYiM9NpWRBJ5sVjWP/SmlS+oxxRvJht/FNAtliJvja44N3ul1yATgohnVBV0Q==", + "license": "MIT" + }, + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "license": "MIT", + "dependencies": { + "expect": "^30.0.0", + "pretty-format": "^30.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/klaw-sync": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@types/klaw-sync/-/klaw-sync-6.0.5.tgz", + "integrity": "sha512-xlavCRyu5ibDjsOc7PSgeUbwOBZdnJsND8gFUVfBilplbBIWhLZVjwtqbZq0327ny3jNt7oviEh5NS9a4LudeQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "license": "MIT" + }, + "node_modules/@types/prompt": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@types/prompt/-/prompt-1.1.9.tgz", + "integrity": "sha512-Yl0hzOWGDNCo2JHA8s7g7e9higzonlP/MssTMAIAwYmA7GugrB5WZ1DmrfrpJyJY8Y5UHFr8uaXDlxiyHt2jbg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/revalidator": "*" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", + "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "license": "MIT" + }, + "node_modules/@types/revalidator": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@types/revalidator/-/revalidator-0.3.12.tgz", + "integrity": "sha512-DsA2jHfz73JaIROVoMDd/x7nVWXBmEdDSoXB4yQlDzv/NCBkFY2fMHkyE6DGrvooLDAFe5QI6l9Wq0TgdopMtg==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/source-map-support": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-tgVP2H469x9zq34Z0m/fgPewGhg/MLClalNOiPIzQlXrSS2YrKu/xCdSCKnEDwkFha51VKEKB6A9wW26/ZNwzA==", + "license": "MIT", + "dependencies": { + "source-map": "^0.6.0" + } + }, + "node_modules/@types/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@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==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/xml2js": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz", + "integrity": "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.1.tgz", + "integrity": "sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/type-utils": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.57.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.1.tgz", + "integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.1.tgz", + "integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.57.1", + "@typescript-eslint/types": "^8.57.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/rule-tester": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/rule-tester/-/rule-tester-8.57.1.tgz", + "integrity": "sha512-gk0q0rLa7a1uEB0iD2t1GZELK1z6HfudiKYeSVhjQ5gW5FdL0OcZ+8f09Lg7NbmHSBF3V+S9BDuw0qoCFkHR+w==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/parser": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "ajv": "^6.12.6", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "4.6.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/@typescript-eslint/rule-tester/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@typescript-eslint/rule-tester/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/rule-tester/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz", + "integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz", + "integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.1.tgz", + "integrity": "sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz", + "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz", + "integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.1", + "@typescript-eslint/tsconfig-utils": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.1.tgz", + "integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz", + "integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-to-lua/language-extensions": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@typescript-to-lua/language-extensions/-/language-extensions-1.19.0.tgz", + "integrity": "sha512-Os5wOKwviTD4LeqI29N0btYOjokSJ97iCf45EOjIABlb5IwNQy7AE/AqZJobRw3ywHH8+KzJUMkEirWPzh2tUA==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vercel/oidc": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.3.tgz", + "integrity": "sha512-yNEQvPcVrK9sIe637+I0jD6leluPxzwJKx/Haw6F4H77CdDsszUn5V3o96LPziXkSNE2B83+Z3mjqGKBK/R6Gg==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xml-tools/parser": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz", + "integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==", + "license": "Apache-2.0", + "dependencies": { + "chevrotain": "7.1.1" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/@zamiell/sync-directory": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@zamiell/sync-directory/-/sync-directory-6.0.5.tgz", + "integrity": "sha512-jieFMKb4BsAHtNuf1vOsGZ6tdtzLVtftrFgdbvsyX7hWeYBQ35KAmtN2n4ukyF+muuaZuQ8mq2KALqyw67kWyQ==", + "license": "ISC", + "dependencies": { + "chokidar": "^3.3.1", + "commander": "^6.2.0", + "fs-extra": "^7.0.1", + "is-absolute": "^1.0.0", + "readdir-enhanced": "^1.5.2" + }, + "bin": { + "syncdir": "cmd.js" + } + }, + "node_modules/@zamiell/sync-directory/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@zamiell/sync-directory/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@zamiell/sync-directory/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@zamiell/sync-directory/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@zamiell/typedoc-plugin-not-exported": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@zamiell/typedoc-plugin-not-exported/-/typedoc-plugin-not-exported-0.3.0.tgz", + "integrity": "sha512-StHJp28ianqpEVRYWnelFp52FfeV8q3sSg+g/1iVz0R6CCwAyBUkHCp1t9MgV09atQY/RymF72uQ7J9cMsLRWw==", + "license": "CC0-1.0", + "peerDependencies": { + "typedoc": ">=0.26.2" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aggregate-error/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ai": { + "version": "5.0.86", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.86.tgz", + "integrity": "sha512-ooHwNTkLdedFf98iQhtSc5btc/P4UuXuOpYneoifq0190vqosLunNdW8Hs6CiE0Am7YOGNplDK56JIPlHZIL4w==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "2.0.5", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.15", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.42.0.tgz", + "integrity": "sha512-X5+PtWc9EJIPafT/cj8ZG+6IU3cjRRnlHGtqMHK/9gsiupQbAyYlH5y7qt/FtsAhfX5AICHffZy69ZAsVrxWkQ==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.8.0", + "@algolia/client-abtesting": "5.42.0", + "@algolia/client-analytics": "5.42.0", + "@algolia/client-common": "5.42.0", + "@algolia/client-insights": "5.42.0", + "@algolia/client-personalization": "5.42.0", + "@algolia/client-query-suggestions": "5.42.0", + "@algolia/client-search": "5.42.0", + "@algolia/ingestion": "1.42.0", + "@algolia/monitoring": "1.42.0", + "@algolia/recommend": "5.42.0", + "@algolia/requester-browser-xhr": "5.42.0", + "@algolia/requester-fetch": "5.42.0", + "@algolia/requester-node-http": "5.42.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz", + "integrity": "sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw==", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/args-tokenizer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/args-tokenizer/-/args-tokenizer-0.3.0.tgz", + "integrity": "sha512-xXAd7G2Mll5W8uo37GETpQ2VrE84M181Z7ugHFGQnJZ50M2mbOv0osSZ9VsSgPfJQ+LVG0prSi0th+ELMsno7Q==", + "license": "MIT" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.3.0.tgz", + "integrity": "sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ==", + "license": "MIT", + "dependencies": { + "@jest/transform": "30.3.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.3.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.3.0.tgz", + "integrity": "sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg==", + "license": "MIT", + "dependencies": { + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz", + "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.6", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz", + "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.6" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.3.0.tgz", + "integrity": "sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ==", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.3.0", + "babel-preset-current-node-syntax": "^1.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz", + "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==", + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bumpp": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/bumpp/-/bumpp-10.4.1.tgz", + "integrity": "sha512-X/bwWs5Gbb/D7rN4aHLB7zdjiA6nGdjckM1sTHhI9oovIbEw2L5pw5S4xzk8ZTeOZ8EnwU/Ze4SoZ6/Vr3pM2Q==", + "license": "MIT", + "dependencies": { + "ansis": "^4.2.0", + "args-tokenizer": "^0.3.0", + "c12": "^3.3.3", + "cac": "^6.7.14", + "escalade": "^3.2.0", + "jsonc-parser": "^3.3.1", + "package-manager-detector": "^1.6.0", + "semver": "^7.7.3", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "yaml": "^2.8.2" + }, + "bin": { + "bumpp": "bin/bumpp.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/bumpp/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c12": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.3.tgz", + "integrity": "sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==", + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^17.2.3", + "exsolve": "^1.0.8", + "giget": "^2.0.0", + "jiti": "^2.6.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.0.0", + "pkg-types": "^2.3.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "*" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/c12/node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/c12/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001774", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz", + "integrity": "sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", + "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", + "license": "MIT", + "dependencies": { + "chalk": "^5.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "license": "MIT" + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chevrotain": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz", + "integrity": "sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==", + "license": "Apache-2.0", + "dependencies": { + "regexp-to-ast": "0.5.0" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/clear-module": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/clear-module/-/clear-module-4.1.2.tgz", + "integrity": "sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==", + "license": "MIT", + "dependencies": { + "parent-module": "^2.0.0", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", + "license": "MIT", + "dependencies": { + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", + "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipanion": { + "version": "4.0.0-rc.4", + "resolved": "https://registry.npmjs.org/clipanion/-/clipanion-4.0.0-rc.4.tgz", + "integrity": "sha512-CXkMQxU6s9GklO/1f714dkKBMu1lopS1WFF0B8o4AxPykR1hpozxSiUZ5ZUeBjfPgCWqbcNOtZVFhB8Lkfp1+Q==", + "license": "MIT", + "workspaces": [ + "website" + ], + "dependencies": { + "typanion": "^3.8.0" + }, + "peerDependencies": { + "typanion": "*" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/code-block-writer": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", + "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==", + "license": "MIT" + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/comment-json": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.5.1.tgz", + "integrity": "sha512-taEtr3ozUmOB7it68Jll7s0Pwm+aoiHyXKrEC8SEodL4rNpdfDLqa7PfBlrgFoCNNdR8ImL+muti5IGvktJAAg==", + "license": "MIT", + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/comment-parser": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.5.tgz", + "integrity": "sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==", + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" + }, + "node_modules/complete-common": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/complete-common/-/complete-common-2.21.0.tgz", + "integrity": "sha512-NhzhgTNuUaZ6ITPQ+KxnqXBv9G6QkW2xcNUD/X4BGKNNFxV9DfqpLHdRxjWFPUxCOZEfbbgKVVxQ3xH6v1FxuA==", + "license": "MIT" + }, + "node_modules/complete-lint": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/complete-lint/-/complete-lint-5.5.0.tgz", + "integrity": "sha512-FVLvJkLlklBC5gGl18PRCsUGf1P/ekAmSUdK7SVETbKAT4Oe63OxwvlmLFOubBCzZEyPO8QktQghGABViiS2oA==", + "license": "MIT", + "dependencies": { + "@types/node": "25.4.0", + "complete-tsconfig": "1.3.0", + "cspell": "9.6.0", + "cspell-check-unused-words": "1.6.0", + "eslint": "9.39.2", + "eslint-config-complete": "4.6.0", + "eslint-import-resolver-typescript": "4.4.4", + "knip": "5.81.0", + "prettier": "3.7.2", + "prettier-plugin-organize-imports": "4.3.0", + "prettier-plugin-packagejson": "2.5.21" + }, + "peerDependencies": { + "typescript": ">= 5.0.0" + } + }, + "node_modules/complete-lint/node_modules/@types/node": { + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.4.0.tgz", + "integrity": "sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/complete-lint/node_modules/prettier": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.2.tgz", + "integrity": "sha512-n3HV2J6QhItCXndGa3oMWvWFAgN1ibnS7R9mt6iokScBOC0Ul9/iZORmU2IWUMcyAQaMPjTlY3uT34TqocUxMA==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/complete-node": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/complete-node/-/complete-node-16.4.0.tgz", + "integrity": "sha512-AWv8ibB02eA6Z1QolM3vlwQQ4+k/Fq56AUpU9zNN95Sk84gMAJA5QlloFEidzJxpL1W4cJTDIo91ZWN1JNGY8Q==", + "license": "MIT", + "dependencies": { + "bumpp": "10.4.1", + "chalk": "5.6.2", + "complete-common": "2.21.0", + "diff": "8.0.3", + "dotenv": "17.3.1", + "execa": "9.6.1", + "jsonc-parser": "3.3.1", + "listr2": "10.2.1", + "npm-check-updates": "19.6.3", + "package-directory": "8.2.0", + "prettier": "3.7.2", + "which": "6.0.1" + } + }, + "node_modules/complete-node/node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/complete-node/node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/complete-node/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/complete-node/node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/complete-node/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/complete-node/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/complete-node/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/complete-node/node_modules/prettier": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.2.tgz", + "integrity": "sha512-n3HV2J6QhItCXndGa3oMWvWFAgN1ibnS7R9mt6iokScBOC0Ul9/iZORmU2IWUMcyAQaMPjTlY3uT34TqocUxMA==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/complete-node/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==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/complete-node/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/complete-tsconfig": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/complete-tsconfig/-/complete-tsconfig-1.3.0.tgz", + "integrity": "sha512-Kc38Z/gcvuZ6M23Xsj+o7/gKM797gTDMlL24ZQI8Nzfr4chIoifHiOtyI1a6Um5HHsUD2QrGVZl57tEomEikcg==", + "license": "MIT", + "dependencies": { + "@tsconfig/node-lts": "22.0.2", + "@tsconfig/strictest": "2.0.5" + } + }, + "node_modules/complete-tsconfig/node_modules/@tsconfig/node-lts": { + "version": "22.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node-lts/-/node-lts-22.0.2.tgz", + "integrity": "sha512-Kgq5yXTvnUnvlhob0xJpOH4na9PWtuFhHSf94MpDwnENWgiFeJKDNANQV2MT1WpXZYkK2WSWfVYKhVkR7bc8TA==", + "license": "MIT" + }, + "node_modules/complete-tsconfig/node_modules/@tsconfig/strictest": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@tsconfig/strictest/-/strictest-2.0.5.tgz", + "integrity": "sha512-ec4tjL2Rr0pkZ5hww65c+EEPYwxOi4Ryv+0MtjeaSQRJyq322Q27eOQiFbuNgw2hpL4hB1/W/HBGk3VKS43osg==", + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.44.0.tgz", + "integrity": "sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", + "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.46.0.tgz", + "integrity": "sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cspell": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-9.6.0.tgz", + "integrity": "sha512-Mpf0oT2KAHTIb3YPAXWhW64/4CZKW5Lka4j1YxCLK3jM3nenmIsY/ocrJvqCMF4+1eejRF0N55sT3XmrijI5YQ==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-json-reporter": "9.6.0", + "@cspell/cspell-pipe": "9.6.0", + "@cspell/cspell-types": "9.6.0", + "@cspell/dynamic-import": "9.6.0", + "@cspell/url": "9.6.0", + "ansi-regex": "^6.2.2", + "chalk": "^5.6.2", + "chalk-template": "^1.1.2", + "commander": "^14.0.2", + "cspell-config-lib": "9.6.0", + "cspell-dictionary": "9.6.0", + "cspell-gitignore": "9.6.0", + "cspell-glob": "9.6.0", + "cspell-io": "9.6.0", + "cspell-lib": "9.6.0", + "fast-json-stable-stringify": "^2.1.0", + "flatted": "^3.3.3", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15" + }, + "bin": { + "cspell": "bin.mjs", + "cspell-esm": "bin.mjs" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" + } + }, + "node_modules/cspell-check-unused-words": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cspell-check-unused-words/-/cspell-check-unused-words-1.6.0.tgz", + "integrity": "sha512-KmqAlR9+FzLepKxZGEy2+v8s11aBAVhQ+x2XnTJlcmU3fK3aWqaY3MnKvXbRFB1IC33pMZbQp+PoCr9++yg1fw==", + "license": "MIT", + "dependencies": { + "chalk": "5.6.2", + "clipanion": "4.0.0-rc.4", + "cspell": "9.3.2", + "cspell-lib": "9.3.2", + "prettier": "3.7.2" + }, + "bin": { + "cspell-check-unused-words": "dist/main.js" + } + }, + "node_modules/cspell-check-unused-words/node_modules/@cspell/cspell-bundled-dicts": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.3.2.tgz", + "integrity": "sha512-OmKzq/0FATHU671GKMzBrTyLdm25Wnziva7h4ylumVn1wnwWsXGef5bgXD7iuApqfqH9SzxsU0NtTB8m8vwEHQ==", + "license": "MIT", + "dependencies": { + "@cspell/dict-ada": "^4.1.1", + "@cspell/dict-al": "^1.1.1", + "@cspell/dict-aws": "^4.0.16", + "@cspell/dict-bash": "^4.2.2", + "@cspell/dict-companies": "^3.2.7", + "@cspell/dict-cpp": "^6.0.14", + "@cspell/dict-cryptocurrencies": "^5.0.5", + "@cspell/dict-csharp": "^4.0.7", + "@cspell/dict-css": "^4.0.18", + "@cspell/dict-dart": "^2.3.1", + "@cspell/dict-data-science": "^2.0.11", + "@cspell/dict-django": "^4.1.5", + "@cspell/dict-docker": "^1.1.16", + "@cspell/dict-dotnet": "^5.0.10", + "@cspell/dict-elixir": "^4.0.8", + "@cspell/dict-en_us": "^4.4.24", + "@cspell/dict-en-common-misspellings": "^2.1.8", + "@cspell/dict-en-gb-mit": "^3.1.14", + "@cspell/dict-filetypes": "^3.0.14", + "@cspell/dict-flutter": "^1.1.1", + "@cspell/dict-fonts": "^4.0.5", + "@cspell/dict-fsharp": "^1.1.1", + "@cspell/dict-fullstack": "^3.2.7", + "@cspell/dict-gaming-terms": "^1.1.2", + "@cspell/dict-git": "^3.0.7", + "@cspell/dict-golang": "^6.0.24", + "@cspell/dict-google": "^1.0.9", + "@cspell/dict-haskell": "^4.0.6", + "@cspell/dict-html": "^4.0.12", + "@cspell/dict-html-symbol-entities": "^4.0.4", + "@cspell/dict-java": "^5.0.12", + "@cspell/dict-julia": "^1.1.1", + "@cspell/dict-k8s": "^1.0.12", + "@cspell/dict-kotlin": "^1.1.1", + "@cspell/dict-latex": "^4.0.4", + "@cspell/dict-lorem-ipsum": "^4.0.5", + "@cspell/dict-lua": "^4.0.8", + "@cspell/dict-makefile": "^1.0.5", + "@cspell/dict-markdown": "^2.0.12", + "@cspell/dict-monkeyc": "^1.0.11", + "@cspell/dict-node": "^5.0.8", + "@cspell/dict-npm": "^5.2.22", + "@cspell/dict-php": "^4.1.0", + "@cspell/dict-powershell": "^5.0.15", + "@cspell/dict-public-licenses": "^2.0.15", + "@cspell/dict-python": "^4.2.21", + "@cspell/dict-r": "^2.1.1", + "@cspell/dict-ruby": "^5.0.9", + "@cspell/dict-rust": "^4.0.12", + "@cspell/dict-scala": "^5.0.8", + "@cspell/dict-shell": "^1.1.2", + "@cspell/dict-software-terms": "^5.1.13", + "@cspell/dict-sql": "^2.2.1", + "@cspell/dict-svelte": "^1.0.7", + "@cspell/dict-swift": "^2.0.6", + "@cspell/dict-terraform": "^1.1.3", + "@cspell/dict-typescript": "^3.2.3", + "@cspell/dict-vue": "^3.0.5", + "@cspell/dict-zig": "^1.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/@cspell/cspell-json-reporter": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-9.3.2.tgz", + "integrity": "sha512-YRgpeHN9uY8kUlIw9q+8zJ0tRTAJMbfBTGzCq9Puah09NeMWlRMFPUkXVrkdic6NA7etboZ+zEdoZwRO9EmhiA==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.3.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/@cspell/cspell-pipe": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-9.3.2.tgz", + "integrity": "sha512-REF7ibG79WLEynIMUss/IRDCdYEb1nlE1rj/gt2CbPFzLa6t5MRwW2lajEvXS6/WgbMtsTVHAWi3ALqJzCwxng==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/@cspell/cspell-resolver": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-9.3.2.tgz", + "integrity": "sha512-jLN2Aa/vxm8+IBvTd884SwPEfjxnDwIEPBT3hmqgLlKuUHQ3FMG27lsM4Ik9L2KWBXMgV/wGz4BaxfhKI41Ttw==", + "license": "MIT", + "dependencies": { + "global-directory": "^4.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/@cspell/cspell-service-bus": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-9.3.2.tgz", + "integrity": "sha512-/rB8LazM0JzKL+AvZa5fEpLutmwy5QFMpzw8HJd+rDGkzb5r79hURWSRo84QArgaskUqA9XlOHSieDE9pt+WAA==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/@cspell/cspell-types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-9.3.2.tgz", + "integrity": "sha512-l4H8bMAmdzCbXHO8y1JZiAKszrPEiuLFKWrbhCacHF0iP+PIc/yuQp7cO70m0p70vArRfih6kgGyHFaCy47CfA==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/@cspell/dynamic-import": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-9.3.2.tgz", + "integrity": "sha512-au7FyuIHUNI2r9sO3pUBKVTeD/v7c9x/nPUStaAK1bG4rdKt4w+/jUY2IaldAraW5w29z528BboXbiV87SM1kw==", + "license": "MIT", + "dependencies": { + "@cspell/url": "9.3.2", + "import-meta-resolve": "^4.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/@cspell/filetypes": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-9.3.2.tgz", + "integrity": "sha512-0bUxQlmJPRHZrRQD7adbc4lFizO8tGD/6+1cBgU3kV3+NVrpr12y4jU8twCSChhYibZyPr7bnvhkM3cQgb8RzA==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/@cspell/strong-weak-map": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-9.3.2.tgz", + "integrity": "sha512-pFcmOTWCoFMRETb9PCkCmaiZiLb5i2qOZmGH/p/tFEH8kIYhMGfhaulnXwKwS+Ke6PKceQd2YL98bGmo8hL4aQ==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/@cspell/url": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@cspell/url/-/url-9.3.2.tgz", + "integrity": "sha512-TobUlZl7Z7VehhNOMNAg1ABuGizieseftlG94OZJ934JptOhK8TC/1o2ldKrbDH50jyt6E7rPTMV2BW/vWuTzQ==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/cspell": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-9.3.2.tgz", + "integrity": "sha512-3xFyVSTYrYa/QJzLfzsCRMkMXqOsytP8E26DuGrVMJQoLPFmbOXNNtnMu4wrtr17QVloxpvutW77U4vb2L/LDQ==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-json-reporter": "9.3.2", + "@cspell/cspell-pipe": "9.3.2", + "@cspell/cspell-types": "9.3.2", + "@cspell/dynamic-import": "9.3.2", + "@cspell/url": "9.3.2", + "chalk": "^5.6.2", + "chalk-template": "^1.1.2", + "commander": "^14.0.2", + "cspell-config-lib": "9.3.2", + "cspell-dictionary": "9.3.2", + "cspell-gitignore": "9.3.2", + "cspell-glob": "9.3.2", + "cspell-io": "9.3.2", + "cspell-lib": "9.3.2", + "fast-json-stable-stringify": "^2.1.0", + "flatted": "^3.3.3", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15" + }, + "bin": { + "cspell": "bin.mjs", + "cspell-esm": "bin.mjs" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" + } + }, + "node_modules/cspell-check-unused-words/node_modules/cspell-config-lib": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-9.3.2.tgz", + "integrity": "sha512-zXhmA4rqgWQRTVijI+g/mgiep76TvTO4d+P3CHwcqLG57BKVzoW+jkO4qDLC+Neh4b8+CcNWEIr3w16BfuEJAA==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.3.2", + "comment-json": "^4.4.1", + "smol-toml": "^1.5.2", + "yaml": "^2.8.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/cspell-dictionary": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-9.3.2.tgz", + "integrity": "sha512-E3YhOhZzZt1a+AEbFV2B3THCyZ576PDg0mDNUDrU1Y65SyIhf4DC6itfPoAb6R3FI/DI218RqWZg/FTT8lJ2gA==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-pipe": "9.3.2", + "@cspell/cspell-types": "9.3.2", + "cspell-trie-lib": "9.3.2", + "fast-equals": "^5.3.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/cspell-gitignore": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-9.3.2.tgz", + "integrity": "sha512-G2bLR+Dfb9GX4Sdm75GfCCa9V/sQYkRbLckuCuVmJxvcDB0xfczAtb6TfAXIziF3oUI6cOB1g+PoNLWBelcK5w==", + "license": "MIT", + "dependencies": { + "@cspell/url": "9.3.2", + "cspell-glob": "9.3.2", + "cspell-io": "9.3.2" + }, + "bin": { + "cspell-gitignore": "bin.mjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/cspell-glob": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-9.3.2.tgz", + "integrity": "sha512-TuSupENEKyOCupOUZ3vnPxaTOghxY/rD1JIkb8e5kjzRprYVilO/rYqEk/52iLwJVd+4Npe8fNhR3KhU7u/UUg==", + "license": "MIT", + "dependencies": { + "@cspell/url": "9.3.2", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/cspell-grammar": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-9.3.2.tgz", + "integrity": "sha512-ysonrFu9vJvF/derDlEjUfmvLeCfNOWPh00t6Yh093AKrJFoWQiyaS/5bEN/uB5/n1sa4k3ItnWvuTp3+YuZsA==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-pipe": "9.3.2", + "@cspell/cspell-types": "9.3.2" + }, + "bin": { + "cspell-grammar": "bin.mjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/cspell-io": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-9.3.2.tgz", + "integrity": "sha512-ahoULCp0j12TyXXmIcdO/7x65A/2mzUQO1IkOC65OXEbNT+evt0yswSO5Nr1F6kCHDuEKc46EZWwsYAzj78pMg==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-service-bus": "9.3.2", + "@cspell/url": "9.3.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/cspell-lib": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-9.3.2.tgz", + "integrity": "sha512-kdk11kib68zNANNICuOA8h4oA9kENQUAdeX/uvT4+7eHbHHV8WSgjXm4k4o/pRIbg164UJTX/XxKb/65ftn5jw==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-bundled-dicts": "9.3.2", + "@cspell/cspell-pipe": "9.3.2", + "@cspell/cspell-resolver": "9.3.2", + "@cspell/cspell-types": "9.3.2", + "@cspell/dynamic-import": "9.3.2", + "@cspell/filetypes": "9.3.2", + "@cspell/strong-weak-map": "9.3.2", + "@cspell/url": "9.3.2", + "clear-module": "^4.1.2", + "cspell-config-lib": "9.3.2", + "cspell-dictionary": "9.3.2", + "cspell-glob": "9.3.2", + "cspell-grammar": "9.3.2", + "cspell-io": "9.3.2", + "cspell-trie-lib": "9.3.2", + "env-paths": "^3.0.0", + "gensequence": "^8.0.8", + "import-fresh": "^3.3.1", + "resolve-from": "^5.0.0", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-uri": "^3.1.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/cspell-trie-lib": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-9.3.2.tgz", + "integrity": "sha512-1Af7Mq9jIccFQyJl/ZCcqQbtJwuDqpQVkk8xfs/92x4OI6gW1iTVRMtsrh0RTw1HZoR8aQD7tRRCiLPf/D+UiQ==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-pipe": "9.3.2", + "@cspell/cspell-types": "9.3.2", + "gensequence": "^8.0.8" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-check-unused-words/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/cspell-check-unused-words/node_modules/prettier": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.2.tgz", + "integrity": "sha512-n3HV2J6QhItCXndGa3oMWvWFAgN1ibnS7R9mt6iokScBOC0Ul9/iZORmU2IWUMcyAQaMPjTlY3uT34TqocUxMA==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/cspell-check-unused-words/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cspell-config-lib": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-9.6.0.tgz", + "integrity": "sha512-5ztvheawkmFXNHGN82iOOntU3T5mmlQBP/plgoKdBZ6+lSYrOJLkOyqxYyi7MrUBDtWrXPzFllkBrPNRDlbX/A==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.6.0", + "comment-json": "^4.5.1", + "smol-toml": "^1.6.0", + "yaml": "^2.8.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-dictionary": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-9.6.0.tgz", + "integrity": "sha512-wW0m1kLrbK6bRY/GrLUGKUUJ1Z4ZUgIb8LD4zNaECcvGviv9V7VcR3mEwUip3ZjoHa3ClzEoWgQ9gXrtac80Wg==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-pipe": "9.6.0", + "@cspell/cspell-types": "9.6.0", + "cspell-trie-lib": "9.6.0", + "fast-equals": "^6.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-dictionary/node_modules/fast-equals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-6.0.0.tgz", + "integrity": "sha512-PFhhIGgdM79r5Uztdj9Zb6Tt1zKafqVfdMGwVca1z5z6fbX7DmsySSuJd8HiP6I1j505DCS83cLxo5rmSNeVEA==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cspell-gitignore": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-9.6.0.tgz", + "integrity": "sha512-8GfmJuRBBvibyPHnNE2wYJAiQ/ceDYLD1X1sUQaCyj6hPMR7ChJiVhFPtS11hMqkjZ46OBMYTMGWqO792L9fEQ==", + "license": "MIT", + "dependencies": { + "@cspell/url": "9.6.0", + "cspell-glob": "9.6.0", + "cspell-io": "9.6.0" + }, + "bin": { + "cspell-gitignore": "bin.mjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-glob": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-9.6.0.tgz", + "integrity": "sha512-KmEbKN0qdEamsEYbkFu7zjLYfw3hMmn9kmeh94IHr2kq6vWq5vNP5l1BuqmrUeFZlbNd07vj08IKAZHYsoGheQ==", + "license": "MIT", + "dependencies": { + "@cspell/url": "9.6.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-glob/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/cspell-grammar": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-9.6.0.tgz", + "integrity": "sha512-jZVIM5/3eB9rWURDq+VXdYip+DmPuFzO+bqaRtzqT8w6YoOIGYbiIxdwvyyA9xdH7SmW8uqHJP5x4pzZju1lNQ==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-pipe": "9.6.0", + "@cspell/cspell-types": "9.6.0" + }, + "bin": { + "cspell-grammar": "bin.mjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-io": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-9.6.0.tgz", + "integrity": "sha512-wZuZzKOYIb698kVEINYjGaNFQu+AFZ945TORM3hapmPjez+vsHwl8m/pPpCHeGMpQtHMEDkX84AbQ7R55MRIwg==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-service-bus": "9.6.0", + "@cspell/url": "9.6.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-lib": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-9.6.0.tgz", + "integrity": "sha512-m9rIv8hkQ3Dio4s80HQbM9cdxENcd6pS8j2AHWL50OSjJf3Xhw6/wMrIAGbwLHP15K6QZVU2eJ/abCzIJwjA4w==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-bundled-dicts": "9.6.0", + "@cspell/cspell-pipe": "9.6.0", + "@cspell/cspell-resolver": "9.6.0", + "@cspell/cspell-types": "9.6.0", + "@cspell/dynamic-import": "9.6.0", + "@cspell/filetypes": "9.6.0", + "@cspell/strong-weak-map": "9.6.0", + "@cspell/url": "9.6.0", + "clear-module": "^4.1.2", + "cspell-config-lib": "9.6.0", + "cspell-dictionary": "9.6.0", + "cspell-glob": "9.6.0", + "cspell-grammar": "9.6.0", + "cspell-io": "9.6.0", + "cspell-trie-lib": "9.6.0", + "env-paths": "^3.0.0", + "gensequence": "^8.0.8", + "import-fresh": "^3.3.1", + "resolve-from": "^5.0.0", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-uri": "^3.1.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-trie-lib": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-9.6.0.tgz", + "integrity": "sha512-L7GSff5F9cF60QT78WsebVlb3sppi6jbvTHwsw7WF1jUN/ioAo7OzBYtYB7xkYeejcdVEpqfvf/ZOXPDp8x2Wg==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@cspell/cspell-types": "9.6.0" + } + }, + "node_modules/cspell/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", + "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", + "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.4.2.tgz", + "integrity": "sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-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==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/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==", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-indent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", + "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/docusaurus-theme-search-typesense": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/docusaurus-theme-search-typesense/-/docusaurus-theme-search-typesense-0.26.0.tgz", + "integrity": "sha512-+HgkCW8ZBzjAHNIprt3tik2p7AzK2tRi+s+eIRxeDpQV7ldEtV71ihbimMmT8AgRpOuEhCYngFfU1jPJjK1vig==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "~3.9.0", + "@docusaurus/logger": "~3.9.0", + "@docusaurus/plugin-content-docs": "~3.9.0", + "@docusaurus/theme-common": "~3.9.0", + "@docusaurus/theme-translations": "~3.9.0", + "@docusaurus/utils": "~3.9.0", + "@docusaurus/utils-validation": "~3.9.0", + "algoliasearch-helper": "^3.13.3", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "typesense-docsearch-react": "^3.4.1", + "typesense-instantsearch-adapter": "^2.9.0-5", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@docusaurus/core": "~3.8.0", + "@docusaurus/theme-common": "~3.8.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/docusaurus-theme-search-typesense/node_modules/@algolia/autocomplete-core": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.8.2.tgz", + "integrity": "sha512-mTeshsyFhAqw/ebqNsQpMtbnjr+qVOSKXArEj4K0d7sqc8It1XD0gkASwecm9mF/jlOQ4Z9RNg1HbdA8JPdRwQ==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.8.2" + } + }, + "node_modules/docusaurus-theme-search-typesense/node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.8.2.tgz", + "integrity": "sha512-J0oTx4me6ZM9kIKPuL3lyU3aB8DEvpVvR6xWmHVROx5rOYJGQcZsdG4ozxwcOyiiu3qxMkIbzntnV1S1VWD8yA==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.8.2" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/docusaurus-theme-search-typesense/node_modules/@algolia/autocomplete-shared": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.8.2.tgz", + "integrity": "sha512-b6Z/X4MczChMcfhk6kfRmBzPgjoPzuS9KGR4AFsiLulLNRAAqhP+xZTKtMnZGhLuc61I20d5WqlId02AZvcO6g==", + "license": "MIT" + }, + "node_modules/docusaurus-theme-search-typesense/node_modules/typesense": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/typesense/-/typesense-1.8.2.tgz", + "integrity": "sha512-aBpePjA99Qvo+OP2pJwMpvga4Jrm1Y2oV5NsrWXBxlqUDNEUCPZBIksPv2Hq0jxQxHhLLyJVbjXjByXsvpCDVA==", + "license": "Apache-2.0", + "dependencies": { + "axios": "^1.6.0", + "loglevel": "^1.8.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/docusaurus-theme-search-typesense/node_modules/typesense-docsearch-react": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/typesense-docsearch-react/-/typesense-docsearch-react-3.4.1.tgz", + "integrity": "sha512-d0PQym/B/p5oP+hfdFEOH6goiKa1JLR63bikZSDGq1+jT2FtuwNrdMGVBZZMNFUsXVsJRA8ULHJpsREmfSJmVw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.8.2", + "@algolia/autocomplete-preset-algolia": "1.8.2", + "typesense": "^1.7.2", + "typesense-docsearch-css": "^0.4.1", + "typesense-instantsearch-adapter": "^2.7.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "license": "MIT" + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-compat-utils/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-config-complete": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-complete/-/eslint-config-complete-4.6.0.tgz", + "integrity": "sha512-8BKd3ZOVnmCxKaowj3TdIT2ZX53F5qOk57R33TYGk2wKq1il/vWqRRA1Xs36gWZBywN10T9YqXasGTQF4x8pFg==", + "license": "MIT", + "dependencies": { + "@stylistic/eslint-plugin": "5.10.0", + "confusing-browser-globals": "1.0.11", + "eslint-import-resolver-typescript": "4.4.4", + "eslint-plugin-complete": "1.4.0", + "eslint-plugin-eslint-plugin": "7.3.2", + "eslint-plugin-import-x": "4.16.1", + "eslint-plugin-jsdoc": "62.7.1", + "eslint-plugin-n": "17.24.0", + "eslint-plugin-perfectionist": "5.6.0", + "eslint-plugin-unicorn": "63.0.0", + "jsonc-eslint-parser": "3.1.0", + "typescript-eslint": "8.57.0" + }, + "peerDependencies": { + "eslint": ">= 9.0.0" + } + }, + "node_modules/eslint-config-complete/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.0.tgz", + "integrity": "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/type-utils": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.57.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-config-complete/node_modules/@typescript-eslint/parser": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.0.tgz", + "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-config-complete/node_modules/@typescript-eslint/project-service": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.0.tgz", + "integrity": "sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.57.0", + "@typescript-eslint/types": "^8.57.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-config-complete/node_modules/@typescript-eslint/scope-manager": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.0.tgz", + "integrity": "sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-complete/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz", + "integrity": "sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-config-complete/node_modules/@typescript-eslint/type-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.0.tgz", + "integrity": "sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-config-complete/node_modules/@typescript-eslint/types": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.0.tgz", + "integrity": "sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-complete/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.0.tgz", + "integrity": "sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.0", + "@typescript-eslint/tsconfig-utils": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-config-complete/node_modules/@typescript-eslint/utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz", + "integrity": "sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-config-complete/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.0.tgz", + "integrity": "sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-complete/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-complete/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-complete/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-complete/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-complete/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-complete/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-config-complete/node_modules/typescript-eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.0.tgz", + "integrity": "sha512-W8GcigEMEeB07xEZol8oJ26rigm3+bfPHxHvwbYUlu1fUDsGuQ7Hiskx5xGW/xM4USc9Ephe3jtv7ZYPQntHeA==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.57.0", + "@typescript-eslint/parser": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-import-context": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", + "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", + "license": "MIT", + "dependencies": { + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" + }, + "peerDependencies": { + "unrs-resolver": "^1.0.0" + }, + "peerDependenciesMeta": { + "unrs-resolver": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.4.tgz", + "integrity": "sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw==", + "license": "ISC", + "dependencies": { + "debug": "^4.4.1", + "eslint-import-context": "^0.1.8", + "get-tsconfig": "^4.10.1", + "is-bun-module": "^2.0.0", + "stable-hash-x": "^0.2.0", + "tinyglobby": "^0.2.14", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^16.17.0 || >=18.6.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-complete": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-complete/-/eslint-plugin-complete-1.4.0.tgz", + "integrity": "sha512-0/yuOYrCJde977J6ApJL96pyMoVFTiJM8tIXLHfMc7srrHCGIJxRjxtYH/D0ZIxVK/5ao6xS225siFMV29z9Vg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "typescript-eslint": "8.56.1" + }, + "peerDependencies": { + "eslint": ">= 9.0.0", + "typescript": ">= 5.0.0" + } + }, + "node_modules/eslint-plugin-complete/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", + "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.56.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-complete/node_modules/@typescript-eslint/parser": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", + "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-complete/node_modules/@typescript-eslint/project-service": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-complete/node_modules/@typescript-eslint/scope-manager": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-complete/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-complete/node_modules/@typescript-eslint/type-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", + "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-complete/node_modules/@typescript-eslint/types": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-complete/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-complete/node_modules/@typescript-eslint/utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", + "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-complete/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-complete/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-plugin-complete/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-plugin-complete/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-complete/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-plugin-complete/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-complete/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-complete/node_modules/typescript-eslint": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", + "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.56.1", + "@typescript-eslint/parser": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-eslint-plugin": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-plugin/-/eslint-plugin-eslint-plugin-7.3.2.tgz", + "integrity": "sha512-odUwjaeon0s3W96vAmZf13XbTEGKnnXStnRykwM3XysTce7ZI7C8AJRn47OFJMdDNVtG/jLb/gFk0Wvj9zkSbQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "estraverse": "^5.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" + } + }, + "node_modules/eslint-plugin-import-x": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.1.tgz", + "integrity": "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "^8.35.0", + "comment-parser": "^1.4.1", + "debug": "^4.4.1", + "eslint-import-context": "^0.1.9", + "is-glob": "^4.0.3", + "minimatch": "^9.0.3 || ^10.0.1", + "semver": "^7.7.2", + "stable-hash-x": "^0.2.0", + "unrs-resolver": "^1.9.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-import-x" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "eslint-import-resolver-node": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/utils": { + "optional": true + }, + "eslint-import-resolver-node": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-import-x/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "62.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.7.1.tgz", + "integrity": "sha512-4Zvx99Q7d1uggYBUX/AIjvoyqXhluGbbKrRmG8SQTLprPFg6fa293tVJH1o1GQwNe3lUydd8ZHzn37OaSncgSQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@es-joy/jsdoccomment": "~0.84.0", + "@es-joy/resolve.exports": "1.2.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.5", + "debug": "^4.4.3", + "escape-string-regexp": "^4.0.0", + "espree": "^11.1.0", + "esquery": "^1.7.0", + "html-entities": "^2.6.0", + "object-deep-merge": "^2.0.0", + "parse-imports-exports": "^0.2.4", + "semver": "^7.7.4", + "spdx-expression-parse": "^4.0.0", + "to-valid-identifier": "^1.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-n": { + "version": "17.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz", + "integrity": "sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "globrex": "^0.1.2", + "ignore": "^5.3.2", + "semver": "^7.6.3", + "ts-declaration-location": "^1.0.6" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-perfectionist": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-5.6.0.tgz", + "integrity": "sha512-pxrLrfRp5wl1Vol1fAEa/G5yTXxefTPJjz07qC7a8iWFXcOZNuWBItMQ2OtTzfQIvMq6bMyYcrzc3Wz++na55Q==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.56.0", + "natural-orderby": "^5.0.0" + }, + "engines": { + "node": "^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "eslint": "^8.45.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-sort-exports": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-sort-exports/-/eslint-plugin-sort-exports-0.9.1.tgz", + "integrity": "sha512-2w6jHusdF2K60bcGKpa9HEinETwNzVrvplZipVculCfu3ZDd5IW3xL54XVEnVkGIPJnp/LitFCg7owL4DOtuHg==", + "license": "MIT", + "dependencies": { + "minimatch": "^9.0.3" + }, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-sort-exports/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-sort-exports/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-unicorn": { + "version": "63.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-63.0.0.tgz", + "integrity": "sha512-Iqecl9118uQEXYh7adylgEmGfkn5es3/mlQTLLkd4pXkIk9CTGrAbeUux+YljSa2ohXCBmQQ0+Ej1kZaFgcfkA==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "@eslint-community/eslint-utils": "^4.9.0", + "change-case": "^5.4.4", + "ci-info": "^4.3.1", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.46.0", + "find-up-simple": "^1.0.1", + "globals": "^16.4.0", + "indent-string": "^5.0.0", + "is-builtin-module": "^5.0.0", + "jsesc": "^3.1.0", + "pluralize": "^8.0.0", + "regexp-tree": "^0.1.27", + "regjsparser": "^0.13.0", + "semver": "^7.7.3", + "strip-indent": "^4.1.1" + }, + "engines": { + "node": "^20.10.0 || >=21.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=9.38.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-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==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", + "engines": { + "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==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.4.0.tgz", + "integrity": "sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz", + "integrity": "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==", + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.3.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "engines": { + "node": "> 0.1.90" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", + "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-package-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-2.0.0.tgz", + "integrity": "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==", + "license": "MIT", + "dependencies": { + "walk-up-path": "^4.0.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figlet": { + "version": "1.9.2-beta.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.9.2-beta.0.tgz", + "integrity": "sha512-7A6bwqCou2/NIG5sMzfaQfCqLgC9v75Nz6UAUBwlLo9mCf2Ym1y7+t2nqLhC5MO6dQ5ay+p6mv6/BSmpiOJ5Iw==", + "license": "MIT", + "dependencies": { + "commander": "^14.0.0" + }, + "bin": { + "figlet": "bin/index.js" + }, + "engines": { + "node": ">= 17.0.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/formatly": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/formatly/-/formatly-0.3.0.tgz", + "integrity": "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==", + "license": "MIT", + "dependencies": { + "fd-package-json": "^2.0.0" + }, + "bin": { + "formatly": "bin/index.mjs" + }, + "engines": { + "node": ">=18.3.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensequence": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-8.0.8.tgz", + "integrity": "sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-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==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/git-hooks-list": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-4.2.1.tgz", + "integrity": "sha512-WNvqJjOxxs/8ZP9+DWdwWJ7cDsd60NHf39XnD82pDVrKO5q7xfPqpkK6hwEAmBa/ZSEE4IOoR75EzbbIuwGlMw==", + "license": "MIT", + "funding": { + "url": "https://github.com/fisker/git-hooks-list?sponsor=1" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "license": "ISC" + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==", + "license": "BSD" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", + "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/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==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/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==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/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==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/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==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-builtin-module": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", + "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", + "license": "MIT", + "dependencies": { + "builtin-modules": "^5.0.0" + }, + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", + "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "license": "MIT", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isaac-typescript-definitions": { + "version": "43.0.6", + "resolved": "https://registry.npmjs.org/isaac-typescript-definitions/-/isaac-typescript-definitions-43.0.6.tgz", + "integrity": "sha512-rFkbD68mWQLKL6Ba5QQvbPg+DFx9XWP5MvW1R3KyKEtVSyarZSP3dUgHxl//uZleyjIGNweQbdeOPvY3SfNpQg==", + "license": "GPL-3.0", + "dependencies": { + "lua-types": "2.14.1" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "license": "MIT" + }, + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.3.0.tgz", + "integrity": "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==", + "license": "MIT", + "dependencies": { + "@jest/core": "30.3.0", + "@jest/types": "30.3.0", + "import-local": "^3.2.0", + "jest-cli": "30.3.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.3.0.tgz", + "integrity": "sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA==", + "license": "MIT", + "dependencies": { + "execa": "^5.1.1", + "jest-util": "30.3.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.3.0.tgz", + "integrity": "sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA==", + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/expect": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.3.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-runtime": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "p-limit": "^3.1.0", + "pretty-format": "30.3.0", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.3.0.tgz", + "integrity": "sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw==", + "license": "MIT", + "dependencies": { + "@jest/core": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "yargs": "^17.7.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.3.0.tgz", + "integrity": "sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.3.0", + "@jest/types": "30.3.0", + "babel-jest": "30.3.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-circus": "30.3.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-runner": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "parse-json": "^5.2.0", + "pretty-format": "30.3.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz", + "integrity": "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==", + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.3.0", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", + "license": "MIT", + "dependencies": { + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.3.0.tgz", + "integrity": "sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA==", + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.3.0", + "chalk": "^4.1.2", + "jest-util": "30.3.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.3.0.tgz", + "integrity": "sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ==", + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-mock": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.3.0.tgz", + "integrity": "sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA==", + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.3.0", + "jest-worker": "30.3.0", + "picomatch": "^4.0.3", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-haste-map/node_modules/jest-worker": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", + "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.3.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-leak-detector": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.3.0.tgz", + "integrity": "sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==", + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz", + "integrity": "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==", + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.3.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", + "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.3.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3", + "pretty-format": "30.3.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.3.0.tgz", + "integrity": "sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==", + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-util": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.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==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.3.0.tgz", + "integrity": "sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.3.0.tgz", + "integrity": "sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw==", + "license": "MIT", + "dependencies": { + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.3.0.tgz", + "integrity": "sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw==", + "license": "MIT", + "dependencies": { + "@jest/console": "30.3.0", + "@jest/environment": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.3.0", + "jest-haste-map": "30.3.0", + "jest-leak-detector": "30.3.0", + "jest-message-util": "30.3.0", + "jest-resolve": "30.3.0", + "jest-runtime": "30.3.0", + "jest-util": "30.3.0", + "jest-watcher": "30.3.0", + "jest-worker": "30.3.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/jest-worker": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", + "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.3.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runner/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==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.3.0.tgz", + "integrity": "sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng==", + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/globals": "30.3.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.3.0.tgz", + "integrity": "sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.3.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.3.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.3.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "pretty-format": "30.3.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", + "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.3.0.tgz", + "integrity": "sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q==", + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.3.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.3.0.tgz", + "integrity": "sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.3.0", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" + }, + "node_modules/jest-worker/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-worker/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-worker/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "license": "MIT" + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.1.1.tgz", + "integrity": "sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/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==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-3.1.0.tgz", + "integrity": "sha512-75EA7EWZExL/j+MDKQrRbdzcRI2HOkRlmUw8fZJc1ioqFEOvBsq7Rt+A6yCxOt9w/TYNpkt52gC6nm/g5tFIng==", + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^5.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-7.0.0.tgz", + "integrity": "sha512-UQVrq/XIu/nqf/t89IAhc0sLy0x7VlE+Gv2XCouN4rp0RKrv/S4rx80O61V6LCHqoidBr3Sz28gWvobiPAH9UQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11", + "memfs": "^4.17.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/knip": { + "version": "5.81.0", + "resolved": "https://registry.npmjs.org/knip/-/knip-5.81.0.tgz", + "integrity": "sha512-EM9YdNg6zU2DWMJuc9zD8kPUpj0wvPspa63Qe9DPGygzL956uYThfoUQk5aNpPmMr9hs/k+Xm7FLuWFKERFkrQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/webpro" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/knip" + } + ], + "license": "ISC", + "dependencies": { + "@nodelib/fs.walk": "^1.2.3", + "fast-glob": "^3.3.3", + "formatly": "^0.3.0", + "jiti": "^2.6.0", + "js-yaml": "^4.1.1", + "minimist": "^1.2.8", + "oxc-resolver": "^11.15.0", + "picocolors": "^1.1.1", + "picomatch": "^4.0.1", + "smol-toml": "^1.5.2", + "strip-json-comments": "5.0.3", + "zod": "^4.1.11" + }, + "bin": { + "knip": "bin/knip.js", + "knip-bun": "bin/knip-bun.js" + }, + "engines": { + "node": ">=18.18.0" + }, + "peerDependencies": { + "@types/node": ">=18", + "typescript": ">=5.0.4 <7" + } + }, + "node_modules/knip/node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/knip/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/knip/node_modules/strip-json-comments": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", + "integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz", + "integrity": "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/listr2": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-10.2.1.tgz", + "integrity": "sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q==", + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.2.0", + "eventemitter3": "^5.0.4", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^10.0.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/listr2/node_modules/string-width": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", + "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-10.0.0.tgz", + "integrity": "sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "string-width": "^8.2.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lua-types": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/lua-types/-/lua-types-2.14.1.tgz", + "integrity": "sha512-+EbnTjF+Bbfp5xmpfT0O9AZgC5J6Oq6jRnZei3HLb0pbWuCRHmdnIVRPIgEpUncWvHq21DHB2qTHhA4xGceHHg==", + "license": "MIT" + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.1.tgz", + "integrity": "sha512-ntROs7RaN3EvWfy3EZi14H4YxmT6A5YvywfhO+0pm+cH/dnSQRmdAmoFIc3B9aiwTehyk7pESH4ofyBY+V5hZg==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.50.0.tgz", + "integrity": "sha512-N0LUYQMUA1yS5tJKmMtU9yprPm6ZIg24yr/OVv/7t6q0kKDIho4cBbXRi1XKttUmNYDYgF/q45qrKE/UhGO0CA==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "license": "ISC" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.2.tgz", + "integrity": "sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==", + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "license": "MIT" + }, + "node_modules/natural-orderby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-5.0.0.tgz", + "integrity": "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.2.tgz", + "integrity": "sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-check-updates": { + "version": "19.6.3", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-19.6.3.tgz", + "integrity": "sha512-VAt9Bp26eLaymZ0nZyh5n/by+YZIuegXlvWR0yv1zBqd984f8VnEnBbn+1lS3nN5LyEjn62BJ+yYgzNSpb6Gzg==", + "license": "Apache-2.0", + "bin": { + "ncu": "build/cli.js", + "npm-check-updates": "build/cli.js" + }, + "engines": { + "node": ">=20.0.0", + "npm": ">=8.12.1" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/nypm": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.5.tgz", + "integrity": "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==", + "license": "MIT", + "dependencies": { + "citty": "^0.2.0", + "pathe": "^2.0.3", + "tinyexec": "^1.0.2" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/nypm/node_modules/citty": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.1.tgz", + "integrity": "sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg==", + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-deep-merge": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz", + "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==", + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/oxc-resolver": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.19.0.tgz", + "integrity": "sha512-oEe42WEoZc2T5sCQqgaRBx8huzP4cJvrnm+BfNTJESdtM633Tqs6iowkpsMTXgnb7SLwU6N6D9bqwW/PULjo6A==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-resolver/binding-android-arm-eabi": "11.19.0", + "@oxc-resolver/binding-android-arm64": "11.19.0", + "@oxc-resolver/binding-darwin-arm64": "11.19.0", + "@oxc-resolver/binding-darwin-x64": "11.19.0", + "@oxc-resolver/binding-freebsd-x64": "11.19.0", + "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.0", + "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.0", + "@oxc-resolver/binding-linux-arm64-gnu": "11.19.0", + "@oxc-resolver/binding-linux-arm64-musl": "11.19.0", + "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.0", + "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.0", + "@oxc-resolver/binding-linux-riscv64-musl": "11.19.0", + "@oxc-resolver/binding-linux-s390x-gnu": "11.19.0", + "@oxc-resolver/binding-linux-x64-gnu": "11.19.0", + "@oxc-resolver/binding-linux-x64-musl": "11.19.0", + "@oxc-resolver/binding-openharmony-arm64": "11.19.0", + "@oxc-resolver/binding-wasm32-wasi": "11.19.0", + "@oxc-resolver/binding-win32-arm64-msvc": "11.19.0", + "@oxc-resolver/binding-win32-ia32-msvc": "11.19.0", + "@oxc-resolver/binding-win32-x64-msvc": "11.19.0" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-directory": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/package-directory/-/package-directory-8.2.0.tgz", + "integrity": "sha512-qJSu5Mo6tHmRxCy2KCYYKYgcfBdUpy9dwReaZD/xwf608AUk/MoRtIOWzgDtUeGeC7n/55yC3MI1Q+MbSoektw==", + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/package-json/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", + "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", + "license": "MIT", + "dependencies": { + "callsites": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", + "license": "MIT", + "dependencies": { + "parse-statements": "1.0.11" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" + }, + "node_modules/parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", + "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", + "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", + "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-merge-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", + "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.4.0.tgz", + "integrity": "sha512-2kqpOthQ6JhxqQq1FSAAZGe9COQv75Aw8WbsOvQVNJ2nSevc9Yx/IKZGuZ7XJ+iOTtVon7LfO7ELRzg8AZ+sdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-alpha-function": "^1.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-color-function": "^4.0.12", + "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", + "@csstools/postcss-color-mix-function": "^3.0.12", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", + "@csstools/postcss-content-alt-text": "^2.0.8", + "@csstools/postcss-contrast-color-function": "^2.0.12", + "@csstools/postcss-exponential-functions": "^2.0.9", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.11", + "@csstools/postcss-gradients-interpolation-method": "^5.0.12", + "@csstools/postcss-hwb-function": "^4.0.12", + "@csstools/postcss-ic-unit": "^4.0.4", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.11", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.0", + "@csstools/postcss-oklab-function": "^4.0.12", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.12", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-text-decoration-shorthand": "^4.0.3", + "@csstools/postcss-trigonometric-functions": "^4.0.9", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.21", + "browserslist": "^4.26.0", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.3", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.4.2", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.12", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.4", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.12", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.2", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", + "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", + "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.2.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.23" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", + "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-organize-imports": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.3.0.tgz", + "integrity": "sha512-FxFz0qFhyBsGdIsb697f/EkvHzi5SZOhWAjxcx2dLt+Q532bAlhswcXGYB1yzjZ69kW8UoadFBw7TyNwlq96Iw==", + "license": "MIT", + "peerDependencies": { + "prettier": ">=2.0", + "typescript": ">=2.9", + "vue-tsc": "^2.1.0 || 3" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/prettier-plugin-packagejson": { + "version": "2.5.21", + "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.21.tgz", + "integrity": "sha512-d9ivsysb1SeRaKDhjf6Hi7jBGnP4TVsh7DeVi8N5HtHJ5vwD7YHcQIuy6jRkr2qGW/VKbrEVDWVMODuqcZuz8Q==", + "license": "MIT", + "dependencies": { + "sort-package-json": "3.5.0" + }, + "peerDependencies": { + "prettier": ">= 1.16.0" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prompt": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.3.0.tgz", + "integrity": "sha512-ZkaRWtaLBZl7KKAKndKYUL8WqNT+cQHKRZnT4RYYms48jQkFw3rrBL+/N5K/KtdEveHkxs982MX2BkDKub2ZMg==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.5.0", + "async": "3.2.3", + "read": "1.0.x", + "revalidator": "0.1.x", + "winston": "2.x" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/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==", + "license": "MIT" + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "name": "@slorber/react-helmet-async", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", + "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "license": "ISC", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-enhanced": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/readdir-enhanced/-/readdir-enhanced-1.5.2.tgz", + "integrity": "sha512-oncAoS9LLjy/+DeZfSAdZBI/iFJGcPCOp44RPFI6FIMHuxt5CC5P0cUZ9mET+EZB9ONhcEvAids/lVRkj0sTHw==", + "license": "MIT", + "dependencies": { + "call-me-maybe": "^1.0.1", + "es6-promise": "^4.1.0", + "glob-to-regexp": "^0.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", + "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "license": "MIT" + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", + "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", + "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/reserved-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/resolve-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==", + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/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==", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/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==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/revalidator": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", + "integrity": "sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg==", + "license": "Apache 2.0", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rtlcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/schema-dts": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", + "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", + "license": "Apache-2.0" + }, + "node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", + "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/smol-toml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", + "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", + "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/sort-object-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-2.1.0.tgz", + "integrity": "sha512-SOiEnthkJKPv2L6ec6HMwhUcN0/lppkeYuN1x63PbyPRrgSPIuBJCiYxYyvWRTtjMlOi14vQUCGUJqS6PLVm8g==", + "license": "MIT" + }, + "node_modules/sort-package-json": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-3.5.0.tgz", + "integrity": "sha512-moY4UtptUuP5sPuu9H9dp8xHNel7eP5/Kz/7+90jTvC0IOiPH2LigtRM/aSFSxreaWoToHUVUpEV4a2tAs2oKQ==", + "license": "MIT", + "dependencies": { + "detect-indent": "^7.0.1", + "detect-newline": "^4.0.1", + "git-hooks-list": "^4.0.0", + "is-plain-obj": "^4.1.0", + "semver": "^7.7.1", + "sort-object-keys": "^2.0.0", + "tinyglobby": "^0.2.12" + }, + "bin": { + "sort-package-json": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/sort-package-json/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==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sort-package-json/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "license": "CC0-1.0" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stable-hash-x": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", + "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", + "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", + "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.9" + } + }, + "node_modules/style-to-object": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", + "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/swr": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.6.tgz", + "integrity": "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/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==", + "license": "ISC", + "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==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/thingies": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", + "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.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==", + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-valid-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz", + "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/base62": "^1.0.0", + "reserved-identifiers": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-dump": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/true-myth": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/true-myth/-/true-myth-4.1.1.tgz", + "integrity": "sha512-rqy30BSpxPznbbTcAcci90oZ1YR4DqvKcNXNerG5gQBU2v4jk0cygheiul5J6ExIMrgDVuanv/MkGfqZbKrNNg==", + "license": "MIT", + "engines": { + "node": "10.* || >= 12.*" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-declaration-location": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz", + "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==", + "funding": [ + { + "type": "ko-fi", + "url": "https://ko-fi.com/rebeccastevens" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/ts-declaration-location" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": ">=4.0.0" + } + }, + "node_modules/ts-declaration-location/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/ts-json-schema-generator": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-2.9.0.tgz", + "integrity": "sha512-NR5ZE108uiPtBHBJNGnhwoUaUx5vWTDJzDFG9YlRoqxPU76n+5FClRh92dcGgysbe1smRmYalM9Saj97GW1J4Q==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.15", + "commander": "^14.0.3", + "glob": "^13.0.6", + "json5": "^2.2.3", + "normalize-path": "^3.0.0", + "safe-stable-stringify": "^2.5.0", + "tslib": "^2.8.1", + "typescript": "^5.9.3" + }, + "bin": { + "ts-json-schema-generator": "bin/ts-json-schema-generator.js" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/ts-json-schema-generator/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/ts-json-schema-generator/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/ts-json-schema-generator/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ts-json-schema-generator/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/ts-json-schema-generator/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ts-json-schema-generator/node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ts-morph": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-17.0.1.tgz", + "integrity": "sha512-10PkHyXmrtsTvZSL+cqtJLTgFXkU43Gd0JCc0Rw6GchWbqKe0Rwgt1v3ouobTZwQzF1mGhDeAlWYBMGRV7y+3g==", + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.18.0", + "code-block-writer": "^11.0.3" + } + }, + "node_modules/ts-prune-2": { + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/ts-prune-2/-/ts-prune-2-0.10.7.tgz", + "integrity": "sha512-Kg5yVc3eUWUqNHID0blPBUOmYINxnH+Syer0j5PnKW13AZa8cyL5R/kND9NX/bG/5c5WjLu+8nrh2DbbLCUD2g==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "commander": "^6.2.1", + "cosmiconfig": "^7.0.1", + "json5": "^2.1.3", + "lodash": "^4.17.21", + "true-myth": "^4.1.0", + "ts-morph": "^17.0.1" + }, + "bin": { + "ts-prune": "lib/index.js" + } + }, + "node_modules/ts-prune-2/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-prune-2/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-prune-2/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/ts-prune-2/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-prune-2/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-prune-2/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typanion": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/typanion/-/typanion-3.14.0.tgz", + "integrity": "sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==", + "license": "MIT", + "workspaces": [ + "website" + ] + }, + "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==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typedoc": { + "version": "0.28.17", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.17.tgz", + "integrity": "sha512-ZkJ2G7mZrbxrKxinTQMjFqsCoYY6a5Luwv2GKbTnBCEgV2ihYm5CflA9JnJAwH0pZWavqfYxmDkFHPt4yx2oDQ==", + "license": "Apache-2.0", + "dependencies": { + "@gerrit0/mini-shiki": "^3.17.0", + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "yaml": "^2.8.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18", + "pnpm": ">= 10" + }, + "peerDependencies": { + "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x" + } + }, + "node_modules/typedoc-plugin-markdown": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.10.0.tgz", + "integrity": "sha512-psrg8Rtnv4HPWCsoxId+MzEN8TVK5jeKCnTbnGAbTBqcDapR9hM41bJT/9eAyKn9C2MDG9Qjh3MkltAYuLDoXg==", + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typedoc": "0.28.x" + } + }, + "node_modules/typedoc-plugin-rename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/typedoc-plugin-rename/-/typedoc-plugin-rename-1.1.1.tgz", + "integrity": "sha512-Hb+YpMa9ejUF8kvd4B8vyzpJ9bhLxhrR/md8zbHJaiA+T3heSDdb5bZM7sx04+jVMmaROy2SBI0zQ3Jr8aSiOA==", + "license": "ISC", + "peerDependencies": { + "typedoc": ">=0.26.2" + } + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.1.tgz", + "integrity": "sha512-fLvZWf+cAGw3tqMCYzGIU6yR8K+Y9NT2z23RwOjlNFF2HwSB3KhdEFI5lSBv8tNmFkkBShSjsCjzx1vahZfISA==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.57.1", + "@typescript-eslint/parser": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/utils": "8.57.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-to-lua": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/typescript-to-lua/-/typescript-to-lua-1.34.0.tgz", + "integrity": "sha512-DOSU1qSpUiGEW9H6shKFkeWjiBFsl+qFWTKZU9Xqo3B5FqarVZGiIkWKz2rmWi1tGD2314RHYzOuOO1l3Ex1pw==", + "license": "MIT", + "dependencies": { + "@typescript-to-lua/language-extensions": "1.19.0", + "enhanced-resolve": "5.8.2", + "picomatch": "^2.3.1", + "resolve": "^1.15.1", + "source-map": "^0.7.3" + }, + "bin": { + "tstl": "dist/tstl.js" + }, + "engines": { + "node": ">=16.10.0" + }, + "peerDependencies": { + "typescript": "5.9.3" + } + }, + "node_modules/typescript-to-lua/node_modules/enhanced-resolve": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", + "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/typesense": { + "version": "2.1.0-12", + "resolved": "https://registry.npmjs.org/typesense/-/typesense-2.1.0-12.tgz", + "integrity": "sha512-dN4bsOSToqw+VfzPYmZWwYqaoe4pQmWt92lIQ56uM+8dwbdMm6AC1PzRukeBwseU8fKUBuLEdESd1bUI+Bulig==", + "license": "Apache-2.0", + "dependencies": { + "axios": "^1.8.4", + "loglevel": "^1.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/typesense-docsearch-css": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/typesense-docsearch-css/-/typesense-docsearch-css-0.4.1.tgz", + "integrity": "sha512-mN8K18pfIpCrhzsMAJBzoS7l/YDcC4P3f9vsScenUceXmC8n3FCPldmF10dKDJmK3Lr7aAScQt70jCA5126y2w==", + "license": "MIT" + }, + "node_modules/typesense-instantsearch-adapter": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/typesense-instantsearch-adapter/-/typesense-instantsearch-adapter-2.9.0.tgz", + "integrity": "sha512-ZSgpi9T/S70Zs2eYIv0VmD0o4+VfBN9jz97Rhbf9Bj+gpUAbjmm46XAobEE2TGs2Wo04hpzCrXifXNJecalC/w==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "typesense": "^2.1.0-1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/runtime": "^7.24.1" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "license": "ISC", + "dependencies": { + "@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/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "license": "MIT" + }, + "node_modules/walk-up-path": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", + "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/watchpack/node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "5.100.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.100.2.tgz", + "integrity": "sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.2", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", + "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.21.2", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpackbar": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", + "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "consola": "^3.2.3", + "figures": "^3.2.0", + "markdown-table": "^2.0.0", + "pretty-time": "^1.1.0", + "std-env": "^3.7.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/webpackbar/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpackbar/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/webpackbar/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/webpackbar/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/webpackbar/node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "license": "MIT", + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpackbar/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpackbar/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpackbar/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpackbar/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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" + }, + "node_modules/winston": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.7.tgz", + "integrity": "sha512-vLB4BqzCKDnnZH9PHGoS2ycawueX4HLqENXQitvFHczhgW2vFpSOn31LZtVr1KU8YTw7DS4tM+cqyovxo8taVg==", + "license": "MIT", + "dependencies": { + "async": "^2.6.4", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "stack-trace": "0.0.x" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/winston/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/winston/node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-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==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.2.1.tgz", + "integrity": "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package-metadata.json b/package-metadata.json new file mode 100644 index 000000000..5a2700c0f --- /dev/null +++ b/package-metadata.json @@ -0,0 +1,20 @@ +{ + "@schema": "https://raw.githubusercontent.com/complete-ts/complete/refs/heads/main/packages/complete-cli/schemas/package-metadata-schema.json", + "dependencies": { + "figlet": { + "lock-version": true, + "lock-reason": "https://github.com/patorjk/figlet.js/issues/139" + }, + "typescript": { + "lock-version": true, + "lock-reason": "https://github.com/TypeScriptToLua/TypeScriptToLua/blob/master/package.json#L45" + } + }, + "devDependencies": { + "eslint": { + "lock-version": true, + "lock-reason": "ESLint 10 does not seem to work yet.", + "description": "Even though ESLint is part of complete-lint, it is also part of other dependencies, so npm will take the more conservative approach and choose to install the older version. Thus, we must explicitly specify it as a root dependency to force the latest version." + } + } +} diff --git a/package.json b/package.json index 5f3c86626..56dacb745 100644 --- a/package.json +++ b/package.json @@ -14,124 +14,78 @@ "author": "Zamiell", "type": "module", "scripts": { - "cloc": "cloc . --exclude-dir=node_modules --include-lang=TypeScript", "postinstall": "tsx ./packages/eslint-plugin-isaacscript/scripts/build.ts", "lint": "tsx ./scripts/lint.ts", - "lint-all": "tsx ./scripts/lintAll.ts", + "lint-all": "tsx ./scripts/lint-all.ts", "package-json-lint": "tsx ./scripts/packageJSONLint.ts", "publish": "tsx ./scripts/publish.ts", "update": "tsx ./scripts/update.ts" }, "dependencies": { - "@algolia/client-search": "^5.0.0", - "@arktype/fs": "^0.2.1", - "@babel/core": "^7.25.2", - "@babel/preset-env": "^7.25.3", - "@babel/preset-typescript": "^7.24.7", - "@commander-js/extra-typings": "^12.1.0", - "@docusaurus/core": "^3.5.2", - "@docusaurus/eslint-plugin": "^3.5.2", - "@docusaurus/module-type-aliases": "^3.5.2", - "@docusaurus/preset-classic": "^3.5.2", - "@docusaurus/theme-classic": "^3.5.2", - "@docusaurus/theme-common": "^3.5.2", - "@docusaurus/tsconfig": "^3.5.2", - "@eslint/compat": "^1.1.1", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "^9.9.0", - "@mdx-js/react": "^3.0.1", - "@microsoft/api-extractor": "^7.47.6", - "@prettier/plugin-xml": "^3.4.1", - "@stylistic/eslint-plugin": "^2.6.4", - "@svgr/webpack": "^8.1.0", - "@tsconfig/node-lts": "^20.1.3", - "@tsconfig/strictest": "^2.0.5", - "@types/command-exists": "^1.2.3", - "@types/confusing-browser-globals": "^1.0.3", - "@types/diff": "^5.2.1", - "@types/eslint-config-prettier": "^6.11.3", - "@types/eslint__eslintrc": "^2.1.2", - "@types/eslint__js": "^8.42.3", - "@types/figlet": "^1.5.8", - "@types/glob": "^8.1.0", - "@types/jest": "^29.5.12", - "@types/klaw-sync": "^6.0.5", - "@types/node": "^22.4.0", - "@types/prompt": "^1.1.8", - "@types/react": "^18.3.3", - "@types/source-map-support": "^0.5.10", - "@types/touch": "^3.1.5", - "@types/unidecode": "^0.1.3", - "@types/xml2js": "^0.4.14", - "@typescript-eslint/rule-tester": "^8.1.0", - "@typescript-eslint/type-utils": "^8.1.0", - "@typescript-eslint/utils": "^8.1.0", - "@zamiell/sync-directory": "^6.0.5", - "@zamiell/typedoc-plugin-not-exported": "^0.3.0", - "ajv": "^8.17.1", - "chalk": "^5.3.0", - "cloc": "^2.2.0-cloc", - "clsx": "^2.1.1", - "command-exists": "^1.2.9", - "commander": "^12.1.0", - "confusing-browser-globals": "^1.0.11", - "cspell": "^8.14.1", - "cspell-check-unused-words": "^1.2.1", - "diff": "^5.2.0", - "docusaurus-theme-search-typesense": "^0.20.0", - "dotenv": "^16.4.5", - "eslint": "^9.9.0", - "eslint-config-prettier": "^9.1.0", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-deprecation": "^3.0.0", - "eslint-plugin-eslint-plugin": "^6.2.0", - "eslint-plugin-import-x": "^3.1.0", - "eslint-plugin-jsdoc": "^50.2.2", - "eslint-plugin-n": "^17.10.2", - "eslint-plugin-sort-exports": "^0.9.1", - "eslint-plugin-unicorn": "^55.0.0", - "execa": "^9.3.1", - "extract-comments": "^1.1.0", - "figlet": "^1.7.0", - "glob": "^11.0.0", - "isaac-typescript-definitions": "^42.2.0", - "jest": "^29.7.0", - "jest-summarizing-reporter": "^1.1.4", - "jsonc-parser": "^3.3.1", - "klaw-sync": "^6.0.0", - "knip": "^5.27.2", - "lua-types": "^2.13.1", - "markdownlint": "^0.34.0", - "markdownlint-cli": "^0.41.0", - "moment": "^2.30.1", - "npm-check-updates": "^17.0.6", - "prettier": "^3.3.3", - "prettier-plugin-organize-imports": "^4.0.0", - "prettier-plugin-packagejson": "^2.5.1", - "prism-react-renderer": "^2.3.1", - "prompt": "^1.3.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "source-map": "^0.7.4", - "source-map-support": "^0.5.21", - "syncpack": "^12.4.0", - "ts-json-schema-generator": "^2.3.0", - "ts-prune-2": "^0.10.7", - "tsconfck": "^3.1.1", - "tsconfig-paths": "^4.2.0", - "tsx": "^4.17.0", - "typedoc": "^0.26.5", - "typedoc-plugin-markdown": "^4.2.5", - "typedoc-plugin-rename": "^1.1.1", - "typescript": "^5.5.4", - "typescript-eslint": "^8.1.0", - "typescript-to-lua": "^1.26.2", - "unbuild": "^2.0.0", - "unidecode": "^1.1.0", - "unified": "^11.0.5", - "xml2js": "^0.6.2", - "yaml": "^2.5.0", - "zod": "^3.23.8" + "@babel/core": "7.29.0", + "@babel/preset-env": "7.29.2", + "@babel/preset-typescript": "7.28.5", + "@commander-js/extra-typings": "14.0.0", + "@docusaurus/core": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/preset-classic": "3.9.2", + "@docusaurus/tsconfig": "3.9.2", + "@docusaurus/types": "3.9.2", + "@eslint/eslintrc": "3.3.5", + "@mdx-js/react": "3.1.1", + "@microsoft/api-extractor": "7.57.7", + "@prettier/plugin-xml": "3.4.2", + "@tsconfig/node-lts": "24.0.0", + "@tsconfig/strictest": "2.0.8", + "@types/figlet": "1.7.0", + "@types/jest": "30.0.0", + "@types/klaw-sync": "6.0.5", + "@types/node": "25.5.0", + "@types/prompt": "1.1.9", + "@types/source-map-support": "0.5.10", + "@types/xml2js": "0.4.14", + "@typescript-eslint/rule-tester": "8.57.1", + "@typescript-eslint/type-utils": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "@zamiell/sync-directory": "6.0.5", + "@zamiell/typedoc-plugin-not-exported": "0.3.0", + "ajv": "8.18.0", + "chalk": "5.6.2", + "clsx": "2.1.1", + "commander": "14.0.3", + "complete-common": "2.21.0", + "complete-lint": "5.5.0", + "complete-node": "16.4.0", + "docusaurus-theme-search-typesense": "0.26.0", + "eslint-import-resolver-typescript": "4.4.4", + "eslint-plugin-sort-exports": "0.9.1", + "figlet": "1.9.2-beta.0", + "isaac-typescript-definitions": "43.0.6", + "jest": "30.3.0", + "jsonc-parser": "3.3.1", + "klaw-sync": "7.0.0", + "lua-types": "2.14.1", + "moment": "2.30.1", + "prettier": "3.8.1", + "prism-react-renderer": "2.4.1", + "prompt": "1.3.0", + "react": "19.2.4", + "react-dom": "19.2.4", + "source-map": "0.7.6", + "source-map-support": "0.5.21", + "ts-json-schema-generator": "2.9.0", + "ts-prune-2": "0.10.7", + "typedoc": "0.28.17", + "typedoc-plugin-markdown": "4.10.0", + "typedoc-plugin-rename": "1.1.1", + "typescript": "5.9.3", + "typescript-eslint": "8.57.1", + "typescript-to-lua": "1.34.0", + "xml2js": "0.6.2", + "yaml": "2.8.2" }, - "packageManager": "yarn@4.4.0" + "devDependencies": { + "eslint": "9.39.2", + "tsx": "4.21.0" + } } diff --git a/packages/docs/babel.config.cjs b/packages/docs/babel.config.cjs deleted file mode 100644 index bfd75dbdf..000000000 --- a/packages/docs/babel.config.cjs +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: [require.resolve("@docusaurus/core/lib/babel/preset")], -}; diff --git a/packages/docs/docs/main/change-log.md b/packages/docs/docs/main/change-log.md index 800e14fff..00a3d2b5a 100644 --- a/packages/docs/docs/main/change-log.md +++ b/packages/docs/docs/main/change-log.md @@ -9,13 +9,36 @@ This page lists the changes to the IsaacScript framework.
-## May 13th, 2023 +## July 26th, 2025 + +- Added the following custom callbacks: + - `POST_ENTITY_REMOVE_FILTER` + +## September 11th, 2024 + +- Breaking changes: + - `isaacscript-lint` has been split up into `isaacscript-lint` and `complete-lint`. + - `eslint-plugin-isaacscript` has been split up into `eslint-plugin-isaacscript` and `eslint-plugin-complete`. + - `eslint-config-isaacscript` has been split up into `eslint-config-isaacscript` and `eslint-config-complete`. + - `isaacscript-tsconfig` has been split up into `isaacscript-tsconfig` and `isaacscript-complete`. + - `isaacscript-common-ts` has been moved to `complete-common`. + - `isaacscript-common-node` has been moved to `complete-node`. + - All ESLint related packages now use the "flat config", which is new ESLint config file format. + - If you want to upgrade your mod's dependencies, you will need to rewrite your ESLint configuration. For reference, you can init a new mod and inspect the "eslint.config.mjs" file. + +## August 31st, 2024 + +- Breaking changes: + - The `isaacscript-tsconfig` package has been rewritten to favor composition over inheritance. Specifically, the `isaacscript-tsconfig/tsconfig.mod.json` and `isaacscript-tsconfig/tsconfig.node.json` configs no longer extend from the base config. Thus, if you want to upgrade to the latest version, you must explicitly extend from the base as demonstrated in the [template "tsconfig.json" file](https://github.com/IsaacScript/isaacscript/blob/main/packages/isaacscript-cli/file-templates/static-mod/tsconfig.json). + - The location for the "tsconfig.json" strict schema has moved from [here](https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json) to [here](https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json)". + +## May 13th, 2024 - Added REPENTOGON support. Since this hack changes vanilla classes, you must install a separate package if you want to use it called `isaac-typescript-definitions-repentogon`. Since using REPENTOGON functionality will cause run-time errors on vanilla, you should very carefully gate your mod behind a REPENTOGON check with a clear error message. (Thanks 4Grabs) - Added the following helper functions: - `isRepentogon` -## January 8th, 2023 +## January 8th, 2024 - Added the following helper functions: - `isNormalPillColor` @@ -28,7 +51,7 @@ This page lists the changes to the IsaacScript framework. - Added the following lint rules: - `isaacscript/no-unnecessary-assignment` -## January 1st, 2023 +## January 1st, 2024 - Added the following custom commands: - `megaSatan` @@ -928,7 +951,7 @@ pnpm add isaacscript-tsconfig ## October 10th, 2022 - `isaacscript-common` has been rewritten to only enable the custom features that you are actually using (rather than all of them). The idea here is to keep the library blazing fast and allow it to scale well into the future as more features are added. -- Breaking: +- Breaking changes: - All of the extra feature functions in `isaacscript-common` are now attached to the `ModUpgraded` object (instead of being normal functions that you import). The idea here is to eliminate run-time errors from non-upgraded mods. See [the website](https://isaacscript.github.io/isaacscript-common#using-extra-features) for more details. - Added the following helper functions: - `removeUrnRewards` @@ -1322,8 +1345,8 @@ pnpm add isaacscript-tsconfig ## July 20th, 2022 -- The shader crash fix will now be automatically be applied to any upgraded mods. (The method was originally discovered by AgentCucco.) -- Breaking: +- The shader crash fix will now be automatically applied to any upgraded mods. (The method was originally discovered by AgentCucco.) +- Breaking changes: - The `removeAllNPCs` function now takes "entityType", "variant", and "subType" parameters, which moves the location of the "cap" parameter. - Added the following helper functions: - `getRoomShapeDoorSlot` @@ -1397,7 +1420,7 @@ pnpm add isaacscript-tsconfig ## July 12th, 2022 -- Breaking: +- Breaking changes: - `addRoomClearCharge` now has an argument of `bigRoomDoubleCharge` (instead of the old argument of `ignoreBigRoomDoubleCharge`), so you will need to invert the boolean. - `arrayRemove` will now only remove the first matching element (instead of every matching element). Use `arrayRemoveAll` for that behavior instead. - Renamed `ISAAC_FRAMES_PER_SECOND` --> `RENDER_FRAMES_PER_SECOND` @@ -3176,7 +3199,7 @@ You can still use `null` in your own variables, but make sure that it is for var ## August 3rd, 2021 -- Released the `isaacscript-common` package, which includes helper functions that you can use in your IsaacScript mods. Right now there are not that many functions, but I plan to increase this in the future. They are documented [here](https://isaacscript.github.io/isaacscript-common). +- Released the [`isaacscript-common`](https://isaacscript.github.io/isaacscript-common) package, which includes helper functions that you can use in your IsaacScript mods. Right now there are not that many functions, but I plan to increase this in the future. - Breaking changes: - The `isaacscript` package is no longer a meta-package that provides everything else. (It was getting too big and hard to handle.) - This means that instead of having 1 dependency of just `isaacscript`, new IsaacScript mods created with `init` are initialized with 4 dependencies: diff --git a/packages/docs/docs/main/custom-stages.md b/packages/docs/docs/main/custom-stages.md index 760e9d135..a4097663d 100644 --- a/packages/docs/docs/main/custom-stages.md +++ b/packages/docs/docs/main/custom-stages.md @@ -230,7 +230,7 @@ Note that it is possible to have vanilla bosses in the boss pool, if needed. Thu ## Motivation -[StageAPI](https://github.com/Meowlala/BOIStageAPI15) is a fantastic library created by [DeadInfinity](https://steamcommunity.com/profiles/76561198172774482/myworkshopfiles/?appid=250900) and [BudJMT](https://steamcommunity.com/profiles/76561198067029619/myworkshopfiles/?appid=250900), the two smartest people in the Isaac community. Until 2022, it has been the engine that has powered all Isaac mods that have custom stages, like [Revelations](https://steamcommunity.com/sharedfiles/filedetails/?id=1536643474) and [Fiend Folio](https://steamcommunity.com/sharedfiles/filedetails/?id=2305131709&searchtext=fiend+folio). However, no library is perfect. I wanted to try and improve on Stage API with the following goals in mind: +[StageAPI](https://github.com/Meowlala/BOIStageAPI15) is a fantastic library created by [DeadInfinity](https://steamcommunity.com/profiles/76561198172774482/myworkshopfiles/?appid=250900) and [BudJMT](https://steamcommunity.com/profiles/76561198067029619/myworkshopfiles/?appid=250900), the two smartest people in the Isaac community. Until 2022, it has been the engine that has powered all Isaac mods that have custom stages, like [Revelations](https://steamcommunity.com/sharedfiles/filedetails/?id=1536643474) and [Fiend Folio](https://steamcommunity.com/sharedfiles/filedetails/?id=2305131709). However, no library is perfect. I wanted to try and improve on Stage API with the following goals in mind: diff --git a/packages/docs/docs/main/directory-structure.md b/packages/docs/docs/main/directory-structure.md index 44595b09f..5e3ba4afc 100644 --- a/packages/docs/docs/main/directory-structure.md +++ b/packages/docs/docs/main/directory-structure.md @@ -87,14 +87,6 @@ This is the TypeScript source directory. All of the TypeScript files for your mo ## Files -### `.eslintrc.cjs` - -This is the configuration file for [ESLint](https://eslint.org/), the TypeScript linter. - -You can edit this file if you need to disable a specific linting rule. - -
- ### `.gitattributes` This contains specific Git attributes that should be applied to this Git repository, if present. By default, it prevent Windows systems from cloning the repository with "\r\n" line endings (since "\n" line endings should always be used for consistency). @@ -119,7 +111,7 @@ This contains a list of files that should not be automatically formatted. By def
-### `cspell.jsonc` +### `cspell.config.jsonc` This is the configuration file for [CSpell](https://github.com/streetsidesoftware/cspell), a spell-checker for code. @@ -127,6 +119,14 @@ If VSCode incorrectly reports that a file is misspelled, you can right-click on
+### `eslint.config.mjs` + +This is the configuration file for [ESLint](https://eslint.org/), the TypeScript linter. + +You can edit this file if you need to disable a specific linting rule. + +
+ ### `isaacscript.json` This is the configuration file for `isaacscript`. It contains only per-user settings. Thus, it should not be committed to a Git repository. You can see the format of the file in [the IsaacScript source code](https://github.com/IsaacScript/isaacscript/blob/main/packages/isaacscript-cli/src/classes/Config.ts). @@ -152,8 +152,8 @@ IsaacScript projects start with some dependencies: \n ${dstPath}`); @@ -219,39 +220,43 @@ function moveModulesFiles() { ); } - deleteFileOrDirectory(MODULES_DIR); + await deleteFileOrDirectory(MODULES_DIR); } -function addCategoryFilesAndMarkdownHeaders() { +async function addCategoryFilesAndMarkdownHeaders() { const directories = getDirectoryNames(PACKAGE_DOCS_DIR); for (const directoryName of directories) { const directoryPath = path.join(PACKAGE_DOCS_DIR, directoryName); - addCategoryFile(directoryPath); + // eslint-disable-next-line no-await-in-loop + await addCategoryFile(directoryPath); const subDirectories = getDirectoryNames(directoryPath); for (const subDirectoryName of subDirectories) { const subDirectoryPath = path.join(directoryPath, subDirectoryName); - addCategoryFile(subDirectoryPath); + // eslint-disable-next-line no-await-in-loop + await addCategoryFile(subDirectoryPath); } const markdownFileNames = getMarkdownFileNames(directoryPath); for (const markdownFileName of markdownFileNames) { const markdownFilePath = path.join(directoryPath, markdownFileName); - addMarkdownHeader(markdownFilePath, directoryName); + // eslint-disable-next-line no-await-in-loop + await addMarkdownHeader(markdownFilePath, directoryName); } } } /** Move some specific directories to an "other" directory for better top-level organization. */ -function moveDirsToOther() { +async function moveDirsToOther() { for (const otherDirName of OTHER_DIR_NAMES) { const srcPath = path.join(PACKAGE_DOCS_DIR, otherDirName); const dstPath = path.join(OTHER_DIR, otherDirName); - renameFile(srcPath, dstPath); + // eslint-disable-next-line no-await-in-loop + await renameFileOrDirectory(srcPath, dstPath); } } -function addCategoryFile(directoryPath: string) { +async function addCategoryFile(directoryPath: string) { const directoryName = path.basename(directoryPath); const categoryFilePath = path.join(directoryPath, CATEGORY_FILE_NAME); @@ -263,10 +268,10 @@ function addCategoryFile(directoryPath: string) { if (position !== undefined) { fileContents += `position: ${position}\n`; } - writeFile(categoryFilePath, fileContents); + await writeFile(categoryFilePath, fileContents); } -function addMarkdownHeader(filePath: string, directoryName: string) { +async function addMarkdownHeader(filePath: string, directoryName: string) { const title = getTitle(filePath, directoryName); const header = ` --- @@ -277,7 +282,7 @@ custom_edit_url: null `.trimStart(); - let fileContents = readFile(filePath); + let fileContents = await readFile(filePath); // Remove the title generated by `typedoc-plugin-markdown`, which will be on the first line. const lines = fileContents.trim().split("\n"); @@ -295,7 +300,7 @@ custom_edit_url: null fileContents = lines.join("\n"); const newFileContents = header + fileContents; - writeFile(filePath, newFileContents); + await writeFile(filePath, newFileContents); } function getTitle(filePath: string, directoryName: string) { @@ -341,24 +346,24 @@ function getTitle(filePath: string, directoryName: string) { * Some pages are erroneously deleted by the `deleteDuplicatedPages`, so we must handle them * manually. */ -function renameSpecialPages() { +async function renameSpecialPages() { const oldPath = path.join( OTHER_DIR, "classes", "features_other_extraConsoleCommands_commands.md", ); const newPath = path.join(FEATURES_DIR, "ExtraConsoleCommandsList.md"); - renameFile(oldPath, newPath); + await renameFileOrDirectory(oldPath, newPath); - const contents = readFile(newPath); + const contents = await readFile(newPath); const newContents = contents.replace( "# features_other_extraConsoleCommands_commands", "# Extra Console Commands (List)", ); - writeFile(newPath, newContents); + await writeFile(newPath, newContents); } -function deleteDuplicatedPages() { +async function deleteDuplicatedPages() { for (const directoryName of DIR_NAMES_WITH_SECOND_BREADCRUMBS_LINE) { const directoryPath = path.join(OTHER_DIR, directoryName); const fileNames = getFileNames(directoryPath); @@ -370,7 +375,8 @@ function deleteDuplicatedPages() { if (!isValidDuplicate(fileName, directoryName)) { const filePath = path.join(directoryPath, fileName); - deleteFileOrDirectory(filePath); + // eslint-disable-next-line no-await-in-loop + await deleteFileOrDirectory(filePath); if (DEBUG) { echo(`Deleted duplicate page:\n ${filePath}`); @@ -380,7 +386,7 @@ function deleteDuplicatedPages() { } } -function renameDuplicatedPages() { +async function renameDuplicatedPages() { for (const directoryName of DIR_NAMES_WITH_SECOND_BREADCRUMBS_LINE) { const directoryPath = path.join(OTHER_DIR, directoryName); const fileNames = getFileNames(directoryPath); @@ -415,7 +421,8 @@ function renameDuplicatedPages() { properPath = path.join(FEATURES_DIR, properName); } - renameFile(filePath, properPath); + // eslint-disable-next-line no-await-in-loop + await renameFileOrDirectory(filePath, properPath); if (DEBUG) { echo(`Renamed:\n ${filePath}\n -->\n ${properPath}`); @@ -432,12 +439,13 @@ function isValidDuplicate(fileName: string, directoryName: string) { } /** Because we manually moved files around, internal links generated by TypeDoc will break. */ -function fixLinks() { - const markdownFilePaths = globSync("**/*.md", { cwd: PACKAGE_DOCS_DIR }); +async function fixLinks() { + const markdownFilePaths = fs.globSync("**/*.md", { cwd: PACKAGE_DOCS_DIR }); for (const filePath of markdownFilePaths) { const fullFilePath = path.join(PACKAGE_DOCS_DIR, filePath); - const fileContents = readFile(fullFilePath); + // eslint-disable-next-line no-await-in-loop + const fileContents = await readFile(fullFilePath); let newFileContents = fileContents; // Start by removing any links with a "modules" prefix, since they are moved to the root. @@ -490,7 +498,10 @@ function fixLinks() { // Fix the path to links in the "other" directory. // e.g. "(../classes_ModUpgraded.md)" --> "(../classes/ModUpgraded.md)" - const brokenLink = new RegExp(`\\(\\.*/*${brokenLinkDirName}_`, "gm"); + const brokenLink = new RegExp( + String.raw`\(\.*/*${brokenLinkDirName}_`, + "gm", + ); const fixedLink = `(${linkPrefix}other/${brokenLinkDirName}/`; newFileContents = newFileContents.replaceAll(brokenLink, fixedLink); } @@ -501,7 +512,8 @@ function fixLinks() { newFileContents = newFileContents.replaceAll(/types_\w+\./gm, ""); if (fileContents !== newFileContents) { - writeFile(fullFilePath, newFileContents); + // eslint-disable-next-line no-await-in-loop + await writeFile(fullFilePath, newFileContents); } } } @@ -533,9 +545,9 @@ function getMarkdownFileNames(directoryPath: string): readonly string[] { function getNumDirectoriesAwayFromRoot(filePath: string, num = 0): number { const directoryPath = path.dirname(filePath); if ( - directoryPath === "." || - directoryPath === "/" || - directoryPath.endsWith(PACKAGE_NAME) + directoryPath === "." + || directoryPath === "/" + || directoryPath.endsWith(PACKAGE_NAME) ) { return num; } diff --git a/packages/docs/scripts/fixIsaacTypeScriptDefinitions.mts b/packages/docs/scripts/fixIsaacTypeScriptDefinitions.mts index 634356ba6..4c6556bcb 100644 --- a/packages/docs/scripts/fixIsaacTypeScriptDefinitions.mts +++ b/packages/docs/scripts/fixIsaacTypeScriptDefinitions.mts @@ -1,23 +1,23 @@ // See the comment in "fixIsaacScriptCommon.ts". -import { - deleteFileOrDirectory, - isMain, - readFile, - renameFile, - writeFile, -} from "isaacscript-common-node"; import { ReadonlyMap, assertDefined, capitalizeFirstLetter, trimSuffix, -} from "isaacscript-common-ts"; +} from "complete-common"; +import { + deleteFileOrDirectory, + isMain, + readFile, + renameFileOrDirectory, + writeFile, +} from "complete-node"; import fs from "node:fs"; import path from "node:path"; const PACKAGE_NAME = "isaac-typescript-definitions"; -const PACKAGE_ROOT = path.join(import.meta.dirname, ".."); +const PACKAGE_ROOT = path.resolve(import.meta.dirname, ".."); const MARKDOWN_DOCS_DIR = path.join(PACKAGE_ROOT, "docs"); const PACKAGE_DOCS_DIR = path.join(MARKDOWN_DOCS_DIR, PACKAGE_NAME); const MODULES_DIR = path.join(PACKAGE_DOCS_DIR, "modules"); @@ -46,36 +46,38 @@ const SIDEBAR_POSITIONS = new ReadonlyMap([ ["Mods", 8], ]); -if (isMain()) { - main(); +if (isMain(import.meta.filename)) { + await main(); } -function main() { +async function main() { // Since we are only generating enums, there will be nothing in the module directory that we need, // so we can just delete it. - deleteFileOrDirectory(MODULES_DIR); - deleteFileOrDirectory(MODULES_MD_PATH); + await deleteFileOrDirectory(MODULES_DIR); + await deleteFileOrDirectory(MODULES_MD_PATH); - addCategoryFilesAndMarkdownHeaders(); - renameEnumFiles(); + await addCategoryFilesAndMarkdownHeaders(); + await renameEnumFiles(); } -function addCategoryFilesAndMarkdownHeaders() { +async function addCategoryFilesAndMarkdownHeaders() { // Do every subdirectory. (As of August 2022, it should only be the "enums" directory.) const directories = getDirectoryNames(PACKAGE_DOCS_DIR); for (const directoryName of directories) { const directoryPath = path.join(PACKAGE_DOCS_DIR, directoryName); - addCategoryFile(directoryPath); + // eslint-disable-next-line no-await-in-loop + await addCategoryFile(directoryPath); const markdownFileNames = getMarkdownFileNames(directoryPath); for (const markdownFileName of markdownFileNames) { const markdownFilePath = path.join(directoryPath, markdownFileName); - addMarkdownHeader(markdownFilePath); + // eslint-disable-next-line no-await-in-loop + await addMarkdownHeader(markdownFilePath); } } } -function addCategoryFile(directoryPath: string) { +async function addCategoryFile(directoryPath: string) { const directoryName = path.basename(directoryPath); const categoryFilePath = path.join(directoryPath, CATEGORY_FILE_NAME); @@ -86,10 +88,10 @@ function addCategoryFile(directoryPath: string) { if (position !== undefined) { fileContents += `position: ${position}\n`; } - writeFile(categoryFilePath, fileContents); + await writeFile(categoryFilePath, fileContents); } -function addMarkdownHeader(filePath: string) { +async function addMarkdownHeader(filePath: string) { const title = getTitle(filePath); const header = ` --- @@ -100,7 +102,7 @@ custom_edit_url: null `.trimStart(); - let fileContents = readFile(filePath); + let fileContents = await readFile(filePath); // Remove the title generated by `typedoc-plugin-markdown`, which will be on the first line. const lines = fileContents.trim().split("\n"); @@ -115,7 +117,7 @@ custom_edit_url: null fileContents = lines.join("\n"); const newFileContents = header + fileContents; - writeFile(filePath, newFileContents); + await writeFile(filePath, newFileContents); } function getTitle(filePath: string) { @@ -149,7 +151,7 @@ function getTitle(filePath: string) { * "collections_entityState.BigHornState.md". We want all of the enums to appear in the left-hand * sidebar in alphabetical order, so we want to rename everything to just be named after the enum. */ -function renameEnumFiles() { +async function renameEnumFiles() { const markdownFileNames = getMarkdownFileNames(ENUMS_DIR); for (const markdownFileName of markdownFileNames) { const markdownFilePath = path.join(ENUMS_DIR, markdownFileName); @@ -167,7 +169,8 @@ function renameEnumFiles() { ); const dstPath = path.join(ENUMS_DIR, simplifiedFileName); - renameFile(markdownFilePath, dstPath); + // eslint-disable-next-line no-await-in-loop + await renameFileOrDirectory(markdownFilePath, dstPath); } } diff --git a/packages/docs/scripts/lint.mts b/packages/docs/scripts/lint.mts index 290fcfe0d..d828f8792 100644 --- a/packages/docs/scripts/lint.mts +++ b/packages/docs/scripts/lint.mts @@ -1,10 +1,7 @@ -import { $, lintScript } from "isaacscript-common-node"; +import { lintCommands } from "complete-node"; -await lintScript(async () => { - const promises = [ - $`tsc --noEmit`, - $`tsc --noEmit --project ./scripts/tsconfig.json`, - $`eslint --max-warnings 0 .`, - ]; - await Promise.all(promises); -}); +await lintCommands(import.meta.dirname, [ + "tsc --noEmit", + "tsc --noEmit --project ./scripts/tsconfig.json", + "eslint --max-warnings 0 .", +]); diff --git a/packages/docs/scripts/tsconfig.json b/packages/docs/scripts/tsconfig.json index 7e72f83be..4d267ab44 100644 --- a/packages/docs/scripts/tsconfig.json +++ b/packages/docs/scripts/tsconfig.json @@ -1,10 +1,12 @@ { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../../isaacscript-tsconfig/tsconfig.base.json", - "../../isaacscript-tsconfig/tsconfig.node.json", - "../../../tsconfig.monorepo.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], "include": ["*.ts", "*.mts"], diff --git a/packages/docs/src/components/HomepageFeatures/index.tsx b/packages/docs/src/components/HomepageFeatures/index.tsx index 9b87c6673..3317f805c 100644 --- a/packages/docs/src/components/HomepageFeatures/index.tsx +++ b/packages/docs/src/components/HomepageFeatures/index.tsx @@ -1,7 +1,7 @@ import Link from "@docusaurus/Link"; import useBaseUrl from "@docusaurus/useBaseUrl"; import Heading from "@theme/Heading"; -import clsx from "clsx"; +import { clsx } from "clsx"; import styles from "./styles.module.css"; interface FeatureItem { @@ -56,7 +56,7 @@ function Feature({ title, img, description }: FeatureItem) { return (
- {title} + {title}
diff --git a/packages/docs/src/pages/index.tsx b/packages/docs/src/pages/index.tsx index 5554ba5a2..5c32831ec 100644 --- a/packages/docs/src/pages/index.tsx +++ b/packages/docs/src/pages/index.tsx @@ -4,7 +4,7 @@ import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; import CodeBlock from "@theme/CodeBlock"; import Heading from "@theme/Heading"; import Layout from "@theme/Layout"; -import clsx from "clsx"; +import { clsx } from "clsx"; import HomepageFeatures from "../components/HomepageFeatures/index"; // eslint-disable-line @typescript-eslint/no-restricted-imports import styles from "./index.module.css"; @@ -18,8 +18,8 @@ function HomepageHeader(): React.JSX.Element {
{siteConfig.title} diff --git a/packages/docs/static/js/hotkey.js b/packages/docs/static/js/hotkey.js index 78554c6e4..457bb75a1 100644 --- a/packages/docs/static/js/hotkey.js +++ b/packages/docs/static/js/hotkey.js @@ -37,8 +37,8 @@ function isSearchBarFocused() { document.querySelectorAll(".DocSearch-Input"), ); return ( - document.activeElement !== null && - searchInputElements.includes(document.activeElement) + document.activeElement !== null + && searchInputElements.includes(document.activeElement) ); } diff --git a/packages/docs/tsconfig.json b/packages/docs/tsconfig.json index 4bef12681..9a593a0d9 100644 --- a/packages/docs/tsconfig.json +++ b/packages/docs/tsconfig.json @@ -1,10 +1,11 @@ // A TypeScript configuration file for Docusaurus. It is not used for compilation. It is just used // by VSCode. { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../isaacscript-tsconfig/tsconfig.base.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", // https://github.com/facebook/docusaurus/blob/main/packages/docusaurus-tsconfig/tsconfig.json "@docusaurus/tsconfig", @@ -14,14 +15,13 @@ "compilerOptions": { // We enable "ES2021" to provide support for `String.replaceAll` in TypeDoc configuration files. "lib": ["DOM", "ES2021"], + "types": ["@docusaurus/theme-classic"], }, "include": [ "./src/**/*.ts", "./src/**/*.tsx", "./static/js/*.js", - "docusaurus.config.ts", "sidebars.ts", - "typedoc.config.base.mjs", ], } diff --git a/packages/docs/typedoc.config.base.mjs b/packages/docs/typedoc.config.base.mjs index fe22d17f5..ef80185c3 100644 --- a/packages/docs/typedoc.config.base.mjs +++ b/packages/docs/typedoc.config.base.mjs @@ -2,7 +2,7 @@ import fs from "node:fs"; import path from "node:path"; import { OptionDefaults } from "typedoc"; -/** @type {Partial} */ +/** @type {Partial} */ const config = { sort: ["source-order"], tsconfig: "tsconfig.json", @@ -35,7 +35,7 @@ const configTypeDocPluginMarkdown = { /** * @param {string} packageDirectoryPath The path to the package directory. - * @returns {Partial} The generated config. + * @returns {Partial} The generated config. */ export function getTypeDocConfig(packageDirectoryPath) { const packageName = path.basename(packageDirectoryPath); @@ -44,7 +44,7 @@ export function getTypeDocConfig(packageDirectoryPath) { // We want one entry point for each export source file, which will correspond to one Markdown file // for each source file. const indexTSPath = path.join(packageDirectoryPath, "src", "index.ts"); - const typeScriptFileExports = getTypeScriptFileExports(indexTSPath); + const typeScriptFileExports = getIndexTSExports(indexTSPath); const exportsWithSrcPrefix = typeScriptFileExports.map((entryPoint) => entryPoint.replaceAll("./", "./src/"), ); @@ -61,15 +61,21 @@ export function getTypeDocConfig(packageDirectoryPath) { } /** + * By default, TypeDoc will create a page for each individual function (even if the + * "entryPointStrategy" is set to "expand"). Instead, we want to create a page per function + * category. + * + * This function parses the "index.ts" file to find all of the individual pages. + * * @param {string} typeScriptFilePath The path to the ".ts" file. * @returns {readonly string[]} An array of exported file paths. */ -function getTypeScriptFileExports(typeScriptFilePath) { +function getIndexTSExports(typeScriptFilePath) { const typeScriptFile = fs.readFileSync(typeScriptFilePath, "utf8"); const lines = typeScriptFile.split("\n"); const exportLines = lines.filter((line) => line.startsWith("export")); return exportLines.map((line) => { - const match = line.match(/"(.+)"/); + const match = line.match(/export (?:type )?\* from "(.+)";/); if (match === null) { throw new Error(`Failed to parse line: ${line}`); } diff --git a/packages/eslint-config-isaacscript/LICENSE b/packages/eslint-config-isaacscript/LICENSE index b2cf86336..968812d65 100644 --- a/packages/eslint-config-isaacscript/LICENSE +++ b/packages/eslint-config-isaacscript/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2022 IsaacScript +Copyright (c) 2022 The IsaacScript Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/packages/eslint-config-isaacscript/README.md b/packages/eslint-config-isaacscript/README.md index 060575587..06d777103 100644 --- a/packages/eslint-config-isaacscript/README.md +++ b/packages/eslint-config-isaacscript/README.md @@ -1,7 +1,5 @@ -# eslint-config-isaacscript +# `eslint-config-isaacscript` [![npm version](https://img.shields.io/npm/v/eslint-config-isaacscript.svg)](https://www.npmjs.com/package/eslint-config-isaacscript) -This is a sharable configuration for [ESLint](https://eslint.org/) that is intended to be used in TypeScript projects. - -Please see the [docs](https://isaacscript.github.io/eslint-config-isaacscript) for more information. +This is a shared configuration for [ESLint](https://eslint.org/) that is intended to be used in [IsaacScript](https://isaacscript.github.io/) mods. (By default, IsaacScript mods are automatically configured to use this config.) diff --git a/packages/eslint-config-isaacscript/base.js b/packages/eslint-config-isaacscript/base.js deleted file mode 100644 index dc41c1339..000000000 --- a/packages/eslint-config-isaacscript/base.js +++ /dev/null @@ -1,58 +0,0 @@ -import ESLintPluginIsaacScript from "eslint-plugin-isaacscript"; -import tseslint from "typescript-eslint"; -import { baseDeprecation } from "./configs/base-deprecation.js"; -import { baseESLint } from "./configs/base-eslint.js"; -import { baseImportX } from "./configs/base-import-x.js"; -import { baseJSDoc } from "./configs/base-jsdoc.js"; -import { baseN } from "./configs/base-n.js"; -import { baseStylistic } from "./configs/base-stylistic.js"; -import { baseTypeScriptESLint } from "./configs/base-typescript-eslint.js"; -import { baseUnicorn } from "./configs/base-unicorn.js"; - -// Hot-patch "eslint-plugin-isaacscript" to convert errors to warnings. -for (const config of ESLintPluginIsaacScript.configs.recommended) { - if (config.rules !== undefined) { - for (const [key, value] of Object.entries(config.rules)) { - if (value === "error") { - config.rules[key] = "warn"; - } - } - } -} - -/** - * This ESLint config is meant to be used as a base for all TypeScript projects. - * - * Rule modifications are split out into different files for better organization (based on the - * originating plugin) . - */ -export const base = tseslint.config( - ...baseESLint, - ...baseTypeScriptESLint, - ...baseStylistic, - ...baseImportX, - ...baseJSDoc, - ...baseN, // "n" stands for Node. - ...baseUnicorn, - ...baseDeprecation, - - // `eslint-plugin-isaacscript` provides extra miscellaneous rules to keep code safe: - // https://github.com/IsaacScript/isaacscript/tree/main/packages/eslint-plugin-isaacscript - ...ESLintPluginIsaacScript.configs.recommended, - - // We prefer the official `reportUnusedDisableDirectives` linter option over the 3rd-party plugin - // of "eslint-plugin-eslint-comments". - { - linterOptions: { - reportUnusedDisableDirectives: "warn", - }, - }, - - { - // By default, ESLint ignores "**/node_modules/" and ".git/": - // https://eslint.org/docs/latest/use/configure/ignore#ignoring-files - // We also ignore want to ignore the "dist" directory since it is the idiomatic place for - // compiled output in TypeScript. - ignores: ["**/dist/"], - }, -); diff --git a/packages/eslint-config-isaacscript/configs/base-deprecation.js b/packages/eslint-config-isaacscript/configs/base-deprecation.js deleted file mode 100644 index 0fdb2e6e6..000000000 --- a/packages/eslint-config-isaacscript/configs/base-deprecation.js +++ /dev/null @@ -1,19 +0,0 @@ -import { fixupPluginRules } from "@eslint/compat"; -import ESLintPluginDeprecation from "eslint-plugin-deprecation"; -import tseslint from "typescript-eslint"; - -/** - * This ESLint config only contains rules from `eslint-plugin-deprecation`: - * https://github.com/gund/eslint-plugin-deprecation - */ -export const baseDeprecation = tseslint.config({ - plugins: { - // https://github.com/gund/eslint-plugin-deprecation/issues/78 - // @ts-expect-error: The types are not matching, but it works. - deprecation: fixupPluginRules(ESLintPluginDeprecation), - }, - - rules: { - "deprecation/deprecation": "warn", - }, -}); diff --git a/packages/eslint-config-isaacscript/configs/base-eslint.js b/packages/eslint-config-isaacscript/configs/base-eslint.js deleted file mode 100644 index c30c06580..000000000 --- a/packages/eslint-config-isaacscript/configs/base-eslint.js +++ /dev/null @@ -1,839 +0,0 @@ -import confusingBrowserGlobals from "confusing-browser-globals"; -import tseslint from "typescript-eslint"; - -/** @type {Record} */ -const POSSIBLE_PROBLEMS = { - /** The `checkForEach` option is enabled to make the rule stricter. */ - "array-callback-return": [ - "warn", - { - checkForEach: true, - }, - ], - - "constructor-super": "off", // @typescript-eslint/eslint-recommended - "for-direction": "warn", - "getter-return": "off", // @typescript-eslint/eslint-recommended - "no-async-promise-executor": "warn", - "no-await-in-loop": "warn", - "no-class-assign": "warn", - "no-compare-neg-zero": "warn", - "no-cond-assign": "warn", - "no-const-assign": "off", // @typescript-eslint/eslint-recommended - "no-constant-binary-expression": "warn", - "no-constant-condition": "warn", - "no-constructor-return": "warn", - "no-control-regex": "warn", - "no-debugger": "warn", - "no-dupe-args": "off", // @typescript-eslint/eslint-recommended - "no-dupe-class-members": "off", // @typescript-eslint/eslint-recommended - "no-dupe-else-if": "warn", - "no-dupe-keys": "off", // @typescript-eslint/eslint-recommended - "no-duplicate-case": "warn", - - /** Superseded by the `import-x/no-duplicates` rule. */ - "no-duplicate-imports": "off", - - "no-empty-character-class": "warn", - "no-empty-pattern": "warn", - "no-ex-assign": "warn", - "no-fallthrough": "warn", - "no-func-assign": "off", // @typescript-eslint/eslint-recommended - "no-import-assign": "off", // @typescript-eslint/eslint-recommended - "no-inner-declarations": "warn", - "no-invalid-regexp": "warn", - "no-irregular-whitespace": "warn", - - /** Superseded by the `@typescript-eslint/no-loss-of-precision` rule. */ - "no-loss-of-precision": "off", - - "no-misleading-character-class": "warn", - "no-new-native-nonconstructor": "warn", - "no-new-symbol": "off", // @typescript-eslint/eslint-recommended - "no-obj-calls": "off", // @typescript-eslint/eslint-recommended` - "no-promise-executor-return": "warn", - "no-prototype-builtins": "warn", - "no-self-assign": "warn", - "no-self-compare": "warn", - "no-setter-return": "off", // @typescript-eslint/eslint-recommended - "no-sparse-arrays": "warn", - "no-template-curly-in-string": "warn", - "no-this-before-super": "off", // @typescript-eslint/eslint-recommended` - "no-undef": "off", // @typescript-eslint/eslint-recommended - "no-unexpected-multiline": "off", // eslint-config-prettier - "no-unmodified-loop-condition": "warn", - "no-unreachable": "off", // @typescript-eslint/eslint-recommended - "no-unreachable-loop": "warn", - "no-unsafe-finally": "warn", - "no-unsafe-negation": "off", // @typescript-eslint/eslint-recommended - "no-unsafe-optional-chaining": "warn", - "no-unused-private-class-members": "warn", - - /** Superseded by the `@typescript-eslint/no-unused-vars` rule. */ - "no-unused-vars": "off", - - /** Superseded by the `@typescript-eslint/no-use-before-define` rule. */ - "no-use-before-define": "off", - - "no-useless-backreference": "warn", - - /** - * Disabled since [Airbnb reports that the rule is "very - * buggy"](https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/errors.js). - */ - "require-atomic-updates": "off", - - "use-isnan": "warn", - "valid-typeof": "warn", -}; - -/** @type {Record} */ -const SUGGESTIONS = { - "accessor-pairs": "warn", - "arrow-body-style": "warn", - "block-scoped-var": "warn", - - /** - * Superseded by the `@typescript-eslint/naming-convention` rule. (`camelcase` is used to enforce - * naming conventions.) - */ - camelcase: "off", - - /** - * Superseded by the `isaacscript/complete-sentences-jsdoc` and - * `isaacscript/complete-sentences-line-comments` rules. - */ - "capitalized-comments": "off", - - /** Superseded by the `@typescript-eslint/class-methods-use-this` rule. */ - "class-methods-use-this": "off", - - /** - * Disabled since cyclomatic complexity is not a good enough general indicator of code complexity - * and leads to too many false positives. - */ - complexity: "off", - - /** Superseded by the `@typescript-eslint/consistent-return` rule. */ - "consistent-return": "off", - - "consistent-this": "warn", - - /** - * Always requiring curly braces can partially ward against [Apple-style if statement - * bugs](https://www.imperialviolet.org/2014/02/22/applebug.html). Additionally, this rule needs - * to be set to "all" to [work properly with - * `eslint-prettier-config`](https://github.com/prettier/eslint-config-prettier#curly). - */ - curly: ["warn", "all"], - - /** - * Disabled since it would cause the `@typescript-eslint/switch-exhaustiveness-check` rule to not - * work properly. - */ - "default-case": "off", - - "default-case-last": "warn", - - /** Superseded by the `@typescript-eslint/default-param-last` rule. */ - "default-param-last": "off", - - /** Superseded by the `@typescript-eslint/dot-notation` rule. */ - "dot-notation": "off", - - /** Superseded by the `isaacscript/eqeqeq-fix` rule. */ - eqeqeq: "off", - - "func-name-matching": "warn", - "func-names": "warn", - - /** - * Disabled since it is common in the TypeScript ecosystem to use both function forms, depending - * on the situation. - */ - "func-style": "off", - - "grouped-accessor-pairs": "warn", - - /** Superseded by the `isaacscript/no-for-in` rule. */ - "guard-for-in": "off", - - /** Disabled since it is expected to be configured with project-specific keywords. */ - "id-denylist": "off", - - /** Disabled because short variable names are understandable in many contexts. */ - "id-length": "off", - - /** - * Superseded by the `@typescript-eslint/naming-convention` rule. (`id-match` is used to enforce - * naming conventions.) - */ - "id-match": "off", - - /** Superseded by the `@typescript-eslint/init-declarations` rule. */ - "init-declarations": "off", - - /** The `enforceForIfStatements` option is enabled to make the rule stricter. */ - "logical-assignment-operators": [ - "warn", - "always", - { - enforceForIfStatements: true, - }, - ], - - "max-classes-per-file": "warn", - - /** Disabled since this rule is too prescriptive for general-purpose use. */ - "max-depth": "off", - - /** - * Disabled because enforcing an arbitrary line threshold for every file in a project does not - * provide much value. - */ - "max-lines": "off", - - /** - * Disabled because enforcing an arbitrary line threshold for every function in a project does not - * provide much value. - */ - "max-lines-per-function": "off", - - "max-nested-callbacks": "warn", - - /** Superseded by the `@typescript-eslint/max-params` rule. */ - "max-params": "off", - - /** - * Disabled because enforcing an arbitrary statement threshold for every function in a project - * does not provide much value. - */ - "max-statements": "off", - - /** Disabled because it is conventional to use both kinds of comments in TypeScript projects. */ - "multiline-comment-style": "off", - - "new-cap": "warn", - "no-alert": "warn", - - /** Superseded by the `@typescript-eslint/no-array-constructor` rule. */ - "no-array-constructor": "off", - - "no-bitwise": "warn", - "no-caller": "warn", - "no-case-declarations": "warn", - "no-confusing-arrow": "off", // eslint-config-prettier - - /** - * Disabled because command-line programs written in TypeScript commonly write to standard out and - * standard error. - */ - "no-console": "off", - - /** - * Disabled because proper use of continues can reduce indentation for long blocks of code in the - * same way as the [early return - * pattern](https://medium.com/swlh/return-early-pattern-3d18a41bba8). - */ - "no-continue": "off", - - "no-delete-var": "warn", - - /** Disabled since it is incompatible with the `unicorn/better-regex` rule. */ - "no-div-regex": "off", - - /** The `allowElseIf` option is disabled to make the rule stricter. */ - "no-else-return": [ - "warn", - { - allowElseIf: false, - }, - ], - - "no-empty": "warn", - - /** Superseded by the `@typescript-eslint/no-empty-function` rule. */ - "no-empty-function": "off", - - "no-empty-static-block": "warn", - "no-eq-null": "warn", - "no-eval": "warn", - "no-extend-native": "warn", - "no-extra-bind": "warn", - "no-extra-boolean-cast": "warn", - "no-extra-label": "warn", - - /** Superseded by the `@typescript-eslint/no-extra-semi` rule. */ - "no-extra-semi": "off", - - "no-floating-decimal": "off", // eslint-config-prettier - "no-global-assign": "warn", - "no-implicit-coercion": "warn", - "no-implicit-globals": "warn", - - /** Superseded by the `@typescript-eslint/no-implied-eval` rule. */ - "no-implied-eval": "off", - - /** Disabled because inline comments are common in the TypeScript ecosystem. */ - "no-inline-comments": "off", - - /** Superseded by the `@typescript-eslint/no-invalid-this` rule. */ - "no-invalid-this": "off", - - "no-iterator": "warn", - "no-label-var": "warn", - "no-labels": "warn", - "no-lone-blocks": "warn", - "no-lonely-if": "warn", - - /** Superseded by the `@typescript-eslint/no-loop-func` rule. */ - "no-loop-func": "off", - - /** Superseded by the `@typescript-eslint/no-magic-numbers` rule. */ - "no-magic-numbers": "off", - - "no-mixed-operators": "off", // eslint-config-prettier - "no-multi-assign": "warn", - "no-multi-str": "warn", - - /** Superseded by the `unicorn/no-negated-condition` rule. */ - "no-negated-condition": "off", - - /** - * `unicorn/no-nested-ternary` is a modified version of this rule but that version is less strict. - */ - "no-nested-ternary": "warn", - - "no-new": "warn", - "no-new-func": "warn", - "no-new-wrappers": "warn", - "no-nonoctal-decimal-escape": "warn", - "no-object-constructor": "warn", - "no-octal": "warn", - "no-octal-escape": "warn", - - /** - * The options are [copied from - * Airbnb](https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/best-practices.js). - */ - "no-param-reassign": [ - "warn", - { - props: true, - ignorePropertyModificationsFor: [ - "acc", // for reduce accumulators - "accumulator", // for reduce accumulators - "e", // for e.returnvalue - "ctx", // for Koa routing - "context", // for Koa routing - "req", // for Express requests - "request", // for Express requests - "res", // for Express responses - "response", // for Express responses - "$scope", // for Angular 1 scopes - "staticContext", // for ReactRouter context - ], - }, - ], - - /** - * Disabled because the rule is unnecessary when using Prettier. (Unary operators can lead to - * errors with minified code, but Prettier adds semicolons automatically.) - */ - "no-plusplus": "off", - - "no-proto": "warn", - - /** Superseded by the `@typescript-eslint/block-spacing` rule. */ - "no-redeclare": "off", - - "no-regex-spaces": "warn", - - /** - * The options are [copied from - * Airbnb](https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/es6.js). - */ - "no-restricted-exports": [ - "warn", - { - restrictedNamedExports: [ - "default", // use `export default` to provide a default export - "then", // this will cause tons of confusion when your module is dynamically `import()`ed, and will break in most node ESM versions - ], - }, - ], - - /** - * The options are [copied from - * Airbnb](https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/variables.js). - */ - "no-restricted-globals": [ - "warn", - { - name: "isFinite", - message: - "Use Number.isFinite instead: https://github.com/airbnb/javascript#standard-library--isfinite", - }, - { - name: "isNaN", - message: - "Use Number.isNaN instead: https://github.com/airbnb/javascript#standard-library--isnan", - }, - ...confusingBrowserGlobals, - ], - - /** Superseded by the `@typescript-eslint/no-restricted-imports` rule. */ - "no-restricted-imports": "off", - - /** - * The options are [copied from - * Airbnb](https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/best-practices.js). - */ - "no-restricted-properties": [ - "warn", - { - object: "arguments", - property: "callee", - message: "arguments.callee is deprecated", - }, - { - object: "global", - property: "isFinite", - message: "Please use Number.isFinite instead", - }, - { - object: "self", - property: "isFinite", - message: "Please use Number.isFinite instead", - }, - { - object: "window", - property: "isFinite", - message: "Please use Number.isFinite instead", - }, - { - object: "global", - property: "isNaN", - message: "Please use Number.isNaN instead", - }, - { - object: "self", - property: "isNaN", - message: "Please use Number.isNaN instead", - }, - { - object: "window", - property: "isNaN", - message: "Please use Number.isNaN instead", - }, - { - property: "__defineGetter__", - message: "Please use Object.defineProperty instead.", - }, - { - property: "__defineSetter__", - message: "Please use Object.defineProperty instead.", - }, - { - object: "Math", - property: "pow", - message: "Use the exponentiation operator (**) instead.", - }, - ], - - /** Disabled because it is intended for disallowing specific language features per-project. */ - "no-restricted-syntax": "off", - - /** The `always` option is provided to make the rule stricter. */ - "no-return-assign": ["warn", "always"], - - "no-script-url": "warn", - - /** - * Disabled because [it can conflict with - * Prettier](https://github.com/prettier/eslint-config-prettier/tree/main#no-sequences). - */ - "no-sequences": "off", - - /** Superseded by the `@typescript-eslint/no-shadow` rule. */ - "no-shadow": "off", - - "no-shadow-restricted-names": "warn", - - /** - * Disabled because ternaries are common in the TypeScript ecosystem and can often lead to concise - * code that is easy to read. - */ - "no-ternary": "off", - - /** Superseded by the `@typescript-eslint/no-throw-literal` rule. */ - "no-throw-literal": "off", - - "no-undef-init": "warn", - - /** - * Disabled because in TypeScript, it is common to explicitly check for undefined for the purposes - * of type narrowing. - */ - "no-undefined": "off", - - /** - * Disabled since it is a common pattern to use underscores to temporarily allow unused variables - * during development. - */ - "no-underscore-dangle": "off", - - /** The `defaultAssignment` option is disabled to make the rule stricter. */ - "no-unneeded-ternary": [ - "warn", - { - defaultAssignment: false, - }, - ], - - /** Superseded by the `@typescript-eslint/no-unused-expressions` rule. */ - "no-unused-expressions": "off", - - "no-unused-labels": "warn", - "no-useless-assignment": "warn", - "no-useless-call": "warn", - "no-useless-catch": "warn", - - /** The `enforceForClassMembers` option is enabled to make the rule stricter. */ - "no-useless-computed-key": [ - "warn", - { - enforceForClassMembers: true, - }, - ], - - "no-useless-concat": "warn", - - /** Superseded by the `@typescript-eslint/no-useless-constructor` rule. */ - "no-useless-constructor": "off", - - "no-useless-escape": "warn", - "no-useless-rename": "warn", - - /** - * Superseded by the `isaacscript/no-useless-return` rule (since the auto-fix is usually - * unwanted). - */ - "no-useless-return": "off", - - "no-var": "warn", - "no-void": "warn", - - /** Superseded by the `unicorn/expiring-todo-comments` rule. */ - "no-warning-comments": "off", - - "no-with": "warn", - - /** The `ignoreConstructors` option is disabled to make the rule stricter. */ - "object-shorthand": [ - "warn", - "always", - { - ignoreConstructors: false, - }, - ], - - /** - * The `never` option is provided to disallow multi-variable declarations (since they can be - * confusing). - */ - "one-var": ["warn", "never"], - - "one-var-declaration-per-line": "off", // eslint-config-prettier - "operator-assignment": "warn", - "prefer-arrow-callback": "warn", - - /** Superseded by the `isaacscript/prefer-const` rule (since the auto-fix is usually unwanted). */ - "prefer-const": "off", - - /** Superseded by the `@typescript-eslint/prefer-destructuring` rule. */ - "prefer-destructuring": "off", - - "prefer-exponentiation-operator": "warn", - - /** - * Disabled because it is common to have a regex with only a single match, in which case a named - * capture group can be needlessly verbose (and cause extra type narrowing). - */ - "prefer-named-capture-group": "off", - - "prefer-numeric-literals": "warn", - "prefer-object-has-own": "warn", - "prefer-object-spread": "warn", - - /** Superseded by the `@typescript-eslint/prefer-promise-reject-errors` rule. */ - "prefer-promise-reject-errors": "off", - - /** The `disallowRedundantWrapping` option is enabled to make the rule stricter. */ - "prefer-regex-literals": [ - "warn", - { - disallowRedundantWrapping: true, - }, - ], - - "prefer-rest-params": "warn", - "prefer-spread": "warn", - "prefer-template": "warn", - "quote-props": "off", // eslint-config-prettier - radix: "warn", - - /** Superseded by the `@typescript-eslint/require-await` rule. */ - "require-await": "off", - - /** - * Disabled because requiring the `u` or the `v` flag for ASCII text is verbose and cumbersome. - * (Even though these flags would also enable regex strict mode, the marginal benefit is not worth - * the verbosity.) - */ - "require-unicode-regexp": "off", - - "require-yield": "warn", - - /** Disabled since this is automatically handled by `prettier-plugin-organize-imports`. */ - "sort-imports": "off", - - /** Disabled because object keys are often not meant to be sorted in alphabetical order. */ - "sort-keys": "off", - - /** - * Disabled because variable declarations are often not meant to be sorted in alphabetical order. - */ - "sort-vars": "off", - - /** - * Partially superseded by `isaacscript/format-jsdoc-comments` and - * `isaacscript/format-line-comments`, but those rules do not handle trailing line comments. - * - * The `markers` option is provided to make this rule ignore lines that start with "///". - */ - "spaced-comment": [ - "warn", - "always", - { - markers: ["/"], - }, - ], - - /** The `never` option is provided to make the rule stricter. */ - strict: ["warn", "never"], - - "symbol-description": "warn", - "vars-on-top": "warn", - yoda: "warn", -}; - -/** @type {Record} */ -const LAYOUT_AND_FORMATTING = { - "unicode-bom": "warn", -}; - -/** @type {Record} */ -const DEPRECATED = { - /** Disabled since the rule is deprecated. */ - "array-bracket-newline": "off", - - /** Disabled since the rule is deprecated. */ - "array-bracket-spacing": "off", - - /** Disabled since the rule is deprecated. */ - "array-element-newline": "off", - - /** Disabled since the rule is deprecated. */ - "arrow-parens": "off", - - /** Disabled since the rule is deprecated. */ - "arrow-spacing": "off", - - /** Disabled since the rule is deprecated. */ - "block-spacing": "off", - - /** Disabled since the rule is deprecated. */ - "brace-style": "off", - - /** Disabled since the rule is deprecated. */ - "comma-dangle": "off", - - /** Disabled since the rule is deprecated. */ - "comma-spacing": "off", - - /** Disabled since the rule is deprecated. */ - "comma-style": "off", - - /** Disabled since the rule is deprecated. */ - "computed-property-spacing": "off", - - /** Disabled since the rule is deprecated. */ - "dot-location": "off", - - /** Disabled since the rule is deprecated. */ - "eol-last": "off", - - /** Disabled since the rule is deprecated. */ - "func-call-spacing": "off", - - /** Disabled since the rule is deprecated. */ - "function-call-argument-newline": "off", - - /** Disabled since the rule is deprecated. */ - "function-paren-newline": "off", - - /** Disabled since the rule is deprecated. */ - "generator-star-spacing": "off", - - /** Disabled since the rule is deprecated. */ - "implicit-arrow-linebreak": "off", - - /** Disabled since the rule is deprecated. */ - indent: "off", - - /** Disabled since the rule is deprecated. */ - "jsx-quotes": "off", - - /** Disabled since the rule is deprecated. */ - "key-spacing": "off", - - /** Disabled since the rule is deprecated. */ - "keyword-spacing": "off", - - /** Disabled since the rule is deprecated. */ - "line-comment-position": "off", - - /** Disabled since the rule is deprecated. */ - "linebreak-style": "off", - - /** Disabled since the rule is deprecated. */ - "lines-around-comment": "off", - - /** Disabled since the rule is deprecated. */ - "lines-between-class-members": "off", - - /** Disabled since the rule is deprecated. */ - "max-len": "off", - - /** Disabled since the rule is deprecated. */ - "max-statements-per-line": "off", - - /** Disabled since the rule is deprecated. */ - "multiline-ternary": "off", - - /** Disabled since the rule is deprecated. */ - "new-parens": "off", - - /** Disabled since the rule is deprecated. */ - "newline-per-chained-call": "off", - - /** Disabled since the rule is deprecated. */ - "no-extra-parens": "off", - - /** Disabled since the rule is deprecated. */ - "no-mixed-spaces-and-tabs": "off", - - /** Disabled since the rule is deprecated. */ - "no-multi-spaces": "off", - - /** Disabled since the rule is deprecated. */ - "no-multiple-empty-lines": "off", - - /** Disabled since the rule is deprecated. */ - "no-tabs": "off", - - /** Disabled since the rule is deprecated. */ - "no-trailing-spaces": "off", - - /** Disabled since the rule is deprecated. */ - "no-whitespace-before-property": "off", - - /** Disabled since the rule is deprecated. */ - "nonblock-statement-body-position": "off", - - /** Disabled since the rule is deprecated. */ - "object-curly-newline": "off", - - /** Disabled since the rule is deprecated. */ - "object-curly-spacing": "off", - - /** Disabled since the rule is deprecated. */ - "object-property-newline": "off", - - /** Disabled since the rule is deprecated. */ - "operator-linebreak": "off", - - /** Disabled since the rule is deprecated. */ - "padded-blocks": "off", - - /** Disabled since the rule is deprecated. */ - "padding-line-between-statements": "off", - - /** Disabled since the rule is deprecated. */ - quotes: "off", - - /** Disabled since the rule is deprecated. */ - "rest-spread-spacing": "off", - - /** Disabled since the rule is deprecated. */ - semi: "off", - - /** Disabled since the rule is deprecated. */ - "semi-spacing": "off", - - /** Disabled since the rule is deprecated. */ - "semi-style": "off", - - /** Disabled since the rule is deprecated. */ - "space-before-blocks": "off", - - /** Disabled since the rule is deprecated. */ - "space-before-function-paren": "off", - - /** Disabled since the rule is deprecated. */ - "space-in-parens": "off", - - /** Disabled since the rule is deprecated. */ - "space-infix-ops": "off", - - /** Disabled since the rule is deprecated. */ - "space-unary-ops": "off", - - /** Disabled since the rule is deprecated. */ - "switch-colon-spacing": "off", - - /** Disabled since the rule is deprecated. */ - "template-curly-spacing": "off", - - /** Disabled since the rule is deprecated. */ - "template-tag-spacing": "off", - - /** Disabled since the rule is deprecated. */ - "wrap-iife": "off", - - /** Disabled since the rule is deprecated. */ - "wrap-regex": "off", - - /** Disabled since the rule is deprecated. */ - "yield-star-spacing": "off", -}; - -/** - * This ESLint config only contains built-in rules from ESLint itself: - * https://eslint.org/docs/latest/rules/ - * - * Rules are separated into categories: - * 1) Possible Problems - * 2) Suggestions - * 3) Layout & Formatting - * 4) Deprecated - */ -export const baseESLint = tseslint.config({ - rules: { - ...POSSIBLE_PROBLEMS, - ...SUGGESTIONS, - ...LAYOUT_AND_FORMATTING, - ...DEPRECATED, - }, -}); diff --git a/packages/eslint-config-isaacscript/configs/base-import-x.js b/packages/eslint-config-isaacscript/configs/base-import-x.js deleted file mode 100644 index 3d922c2c5..000000000 --- a/packages/eslint-config-isaacscript/configs/base-import-x.js +++ /dev/null @@ -1,300 +0,0 @@ -import ESLintPluginImportX from "eslint-plugin-import-x"; -import tseslint from "typescript-eslint"; - -/** @type {Record} */ -const HELPFUL_WARNINGS = { - "import-x/export": "warn", - - /** - * Superseded by the `deprecation/deprecation` rule. (That rule is better because it catches - * deprecated usage that does not come from import statements specifically.) - */ - "import-x/no-deprecated": "off", - - "import-x/no-empty-named-blocks": "warn", - - /** - * The options are [copied from - * Airbnb](https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/import.js). - * - * We also add a "scripts" directory entry for "devDependencies". - */ - "import-x/no-extraneous-dependencies": [ - "warn", - { - devDependencies: [ - "test/**", // tape, common npm pattern - "tests/**", // also common npm pattern - "spec/**", // mocha, rspec-like pattern - "**/__tests__/**", // jest pattern - "**/__mocks__/**", // jest pattern - "test.{js,jsx}", // repos with a single test file - "test-*.{js,jsx}", // repos with multiple top-level test files - "**/*{.,_}{test,spec}.{js,jsx}", // tests where the extension or filename suffix denotes that it is a test - "**/jest.config.js", // jest config - "**/jest.setup.js", // jest setup - "**/vue.config.js", // vue-cli config - "**/webpack.config.js", // webpack config - "**/webpack.config.*.js", // webpack config - "**/rollup.config.js", // rollup config - "**/rollup.config.*.js", // rollup config - "**/gulpfile.js", // gulp config - "**/gulpfile.*.js", // gulp config - "**/Gruntfile{,.js}", // grunt config - "**/protractor.conf.js", // protractor config - "**/protractor.conf.*.js", // protractor config - "**/karma.conf.js", // karma config - "**/.eslintrc.js", // eslint config - - "**/scripts/*.{js,cjs,mjs,ts,cts,mts}", // Files inside of a "scripts" directory. - ], - optionalDependencies: false, - }, - ], - - "import-x/no-mutable-exports": "warn", - - /** - * Disabled because it results in [too many false - * positives](https://github.com/un-ts/eslint-plugin-import-x/issues/123) when importing from - * 3rd-party libraries such as TypeScript itself. - */ - "import-x/no-named-as-default": "off", - - /** - * Disabled because this is [already handled by the TypeScript - * compiler](https://typescript-eslint.io/linting/troubleshooting/performance-troubleshooting/#eslint-plugin-import). - */ - "import-x/no-named-as-default-member": "off", - - /** - * Disabled since this check is better performed by the [`knip`](https://github.com/webpro/knip) - * tool. - */ - "import-x/no-unused-modules": "off", -}; - -/** @type {Record} */ -const MODULE_SYSTEMS = { - "import-x/no-amd": "warn", - "import-x/no-commonjs": "warn", - "import-x/no-import-module-exports": "warn", - - /** Disabled because it is only used in specific environments (like the browser). */ - "import-x/no-nodejs-modules": "off", - - /** Disabled because this is already handled by the TypeScript compiler. */ - "import-x/unambiguous": "off", -}; - -/** @type {Record} */ -const STATIC_ANALYSIS = { - /** - * Disabled because this is [already handled by the TypeScript - * compiler](https://typescript-eslint.io/linting/troubleshooting/performance-troubleshooting/#eslint-plugin-import). - */ - "import-x/default": "off", - - /** - * Disabled because this is [already handled by the TypeScript - * compiler](https://typescript-eslint.io/linting/troubleshooting/performance-troubleshooting/#eslint-plugin-import). - */ - "import-x/named": "off", - - /** - * Disabled because this is [already handled by the TypeScript - * compiler](https://typescript-eslint.io/linting/troubleshooting/performance-troubleshooting/#eslint-plugin-import). - */ - "import-x/namespace": "off", - - "import-x/no-absolute-path": "warn", - "import-x/no-cycle": "warn", - "import-x/no-dynamic-require": "warn", - - /** Disabled since a prescribed import pattern is not generalizable enough across projects. */ - "import-x/no-internal-modules": "off", - - "import-x/no-relative-packages": "warn", - - /** - * Disabled since a forward import direction pattern is not generalizable enough across projects. - */ - "import-x/no-relative-parent-imports": "off", - - /** Disabled since this rule should only contain a project-specific path restriction. */ - "import-x/no-restricted-paths": "off", - - "import-x/no-self-import": "warn", - - /** - * Disabled because this is [already handled by the TypeScript - * compiler](https://github.com/iamturns/eslint-config-airbnb-typescript/blob/master/lib/shared.js). - */ - "import-x/no-unresolved": "off", - - "import-x/no-useless-path-segments": "warn", - "import-x/no-webpack-loader-syntax": "warn", -}; - -/** @type {Record} */ -const STYLE_GUIDE = { - "import-x/consistent-type-specifier-style": "warn", - - /** Disabled because it is only useful in environments that use webpack. */ - "import-x/dynamic-import-chunkname": "off", - - /** Disabled because this style is not generally used. */ - "import-x/exports-last": "off", - - /** Disabled because this is already handled by the TypeScript compiler. */ - "import-x/extensions": "off", - - "import-x/first": "warn", - - /** Disabled because this style is not generally used. */ - "import-x/group-exports": "off", - - /** Disabled because this rule is deprecated. */ - "import-x/imports-first": "off", - - /** Disabled since it will trigger false positives in codebases that prefer smaller files. */ - "import-x/max-dependencies": "off", - - "import-x/newline-after-import": "warn", - - /** - * Disabled since we disallow default exports elsewhere in this config (in favor of named - * exports). - */ - "import-x/no-anonymous-default-export": "off", - - /** - * The case against default exports is [laid out by Basarat Ali - * Syed](https://basarat.gitbook.io/typescript/main-1/defaultisbad). - */ - "import-x/no-default-export": "warn", - - "import-x/no-duplicates": "warn", - "import-x/no-named-default": "warn", - - /** - * Disabled since we disallow default exports elsewhere in this config (in favor of named - * exports). - */ - "import-x/no-named-export": "off", - - /** - * Disabled since it is too prescriptive for a general audience. (Using `import * as` is common.) - */ - "import-x/no-namespace": "off", - - "import-x/no-unassigned-import": "warn", - - /** Disabled because this is automatically handled by `prettier-plugin-organize-imports`. */ - "import-x/order": "off", - - /** - * Disabled because we disallow default exports elsewhere in this config (in favor of named - * exports). - */ - "import-x/prefer-default-export": "off", -}; - -/** - * Omit `.d.ts` because: - * 1. TypeScript compilation already confirms that types are resolved. - * 2. It would mask an unresolved `.ts`/`.tsx`/`.js`/`.jsx` implementation. - */ -const TYPESCRIPT_EXTENSIONS = [".ts", ".cts", ".mts", ".tsx"]; - -const ALL_EXTENSIONS = [ - ...TYPESCRIPT_EXTENSIONS, - ".js", - ".cjs", - ".mjs", - ".jsx", -]; - -/** - * This ESLint config only contains rules from `eslint-plugin-import-x`: - * https://github.com/un-ts/eslint-plugin-import-x - * - * Rules are separated into categories: - * 1) Helpful warnings - * 2) Module systems - * 3) Static analysis - * 4) Style guide - */ -export const baseImportX = tseslint.config( - { - plugins: { - "import-x": ESLintPluginImportX, - }, - - // Beyond just specifying the plugin, additional configuration is necessary to make the plugin - // work properly with TypeScript: - - // - First, the "eslint-import-resolver-typescript" package needs to be installed, or else an - // error will appear: "Resolve error: typescript with invalid interface loaded as resolver" - // - However, it is discussed in this issue to include that dep as part of - // "eslint-plugin-import-x" itself: - // https://github.com/un-ts/eslint-plugin-import-x/pull/122 - // - Second, we extend the upstream TypeScript configuration: - // https://github.com/un-ts/eslint-plugin-import-x/blob/master/src/config/typescript.ts - // - Third, we need to specify "typescript: true" under the resolver, as documented here: - // https://github.com/un-ts/eslint-plugin-import-x/issues/29 - // (Otherwise, the "no-cycle" rule will not work.) - settings: { - "import-x/extensions": ALL_EXTENSIONS, - "import-x/external-module-folders": [ - "node_modules", - "node_modules/@types", - ], - "import-x/parsers": { - "@typescript-eslint/parser": TYPESCRIPT_EXTENSIONS, - }, - "import-x/resolver": { - typescript: true, - node: { - extensions: ALL_EXTENSIONS, - }, - }, - }, - - rules: { - ...HELPFUL_WARNINGS, - ...MODULE_SYSTEMS, - ...STATIC_ANALYSIS, - ...STYLE_GUIDE, - }, - }, - - // Disable some TypeScript-specific rules in JavaScript files. - { - files: ["**/*.js", "**/*.cjs", "**/*.mjs", "**/*.jsx"], - rules: { - "import-x/no-commonjs": "off", - }, - }, - - // Some configuration files must export a default object as a design limitation. - { - files: [ - ".remarkrc.js", - ".remarkrc.mjs", - "eslint.config.js", - "eslint.config.mjs", - "jest.config.js", - "jest.config.mjs", - "prettier.config.js", - "prettier.config.mjs", - "typedoc.config.js", - "typedoc.config.mjs", - "vite.config.js", - "vite.config.mjs", - ], - rules: { - "import-x/no-default-export": "off", - }, - }, -); diff --git a/packages/eslint-config-isaacscript/configs/base-jsdoc.js b/packages/eslint-config-isaacscript/configs/base-jsdoc.js deleted file mode 100644 index da8b1cbfd..000000000 --- a/packages/eslint-config-isaacscript/configs/base-jsdoc.js +++ /dev/null @@ -1,276 +0,0 @@ -import ESLintPluginJSDoc from "eslint-plugin-jsdoc"; -import tseslint from "typescript-eslint"; - -/** - * This ESLint config only contains rules from `eslint-plugin-jsdoc`: - * https://github.com/gajus/eslint-plugin-jsdoc - */ -export const baseJSDoc = tseslint.config( - { - plugins: { - jsdoc: ESLintPluginJSDoc, - }, - - rules: { - /** Disabled because it is not needed in TypeScript. */ - "jsdoc/check-access": "off", - - /** Superseded by the `isaacscript/limit-jsdoc-comments` rule. */ - "jsdoc/check-alignment": "off", - - /** - * Disabled since it [does not work with ESLint - * 8](https://github.com/eslint/eslint/issues/14745). - */ - "jsdoc/check-examples": "off", - - /** Superseded by the `isaacscript/limit-jsdoc-comments` rule. */ - "jsdoc/check-indentation": "off", - - /** - * Disabled since this is not a common formatting scheme. It is also not recommended by the - * plugin authors. - */ - "jsdoc/check-line-alignment": "off", - - "jsdoc/check-param-names": "warn", - - /** Disabled because it is not needed in TypeScript. */ - "jsdoc/check-property-names": "off", - - /** Disabled because it is not needed in TypeScript. */ - "jsdoc/check-syntax": "off", - - "jsdoc/check-tag-names": [ - "warn", - { - definedTags: [ - // Ignore tags used by the TypeScript compiler: - // https://www.typescriptlang.org/tsconfig#stripInternal - "internal", // Used by TypeScript - - // Ignore tags used in TypeDoc: - // https://typedoc.org/guides/doccomments/ - "category", - "hidden", - "notExported", // From: typedoc-plugin-not-exported - "rename", // From: typedoc-plugin-rename - - // Ignore tags used in TypeScriptToLua: - // https://typescripttolua.github.io/docs/advanced/compiler-annotations - "customName", - "noResolution", - "noSelf", - "noSelfInFile", - - // Ignore tags used in `ts-json-schema-generator`: - // https://github.com/vega/ts-json-schema-generator - "minimum", - "maximum", - - // Ignore tags used in `eslint-plugin-isaacscript`: - // https://github.com/IsaacScript/isaacscript/blob/main/packages/eslint-plugin-isaacscript/docs/rules/require-variadic-function-argument.md - "allowEmptyVariadic", - ], - }, - ], - - "jsdoc/check-template-names": "warn", - - /** Disabled because it is not needed in TypeScript. */ - "jsdoc/check-types": "off", - - "jsdoc/check-values": "warn", - - /** - * Disabled since it is idiomatic in the TypeScript ecosystem to use a mixture of both JSDoc - * and non-JSDoc comments. - */ - "jsdoc/convert-to-jsdoc-comments": "off", - - "jsdoc/empty-tags": "warn", - "jsdoc/implements-on-classes": "warn", - - /** Disabled since you cannot configure it with a path to the correct "package.json" file. */ - "jsdoc/imports-as-dependencies": "off", - - "jsdoc/informative-docs": "warn", - - /** - * Disabled since it is [currently - * bugged](https://github.com/gajus/eslint-plugin-jsdoc/issues/1296). - */ - "jsdoc/lines-before-block": "off", - - /** Superseded by the `isaacscript/jsdoc-full-sentences` rule. */ - "jsdoc/match-description": "off", - - /** Disabled because it is only needed for projects with specific JSDoc requirements. */ - "jsdoc/match-name": "off", - - /** Superseded by the `isaacscript/limit-jsdoc-comments` rule. */ - "jsdoc/multiline-blocks": "off", - - /** Superseded by the `isaacscript/limit-jsdoc-comments` rule. */ - "jsdoc/newline-after-description": "off", - - /** - * Disabled because it provides little value; it only detects JSDoc comments with tags in - * them. - */ - "jsdoc/no-bad-blocks": "off", - - /** Superseded by the `isaacscript/format-jsdoc-comments` rule. */ - "jsdoc/no-blank-block-descriptions": "off", - - /** Superseded by the `isaacscript/no-empty-jsdoc` rule. */ - "jsdoc/no-blank-blocks": "off", - - /** Disabled because it provides little value; the `@default` tag is rare. */ - "jsdoc/no-defaults": "off", - - /** Disabled because it is too project-specific. */ - "jsdoc/no-missing-syntax": "off", - - /** Superseded by the `isaacscript/limit-jsdoc-comments` rule. */ - "jsdoc/no-multi-asterisks": "off", - - /** - * Disabled because it is intended for disabling of specific language features per-project. - */ - "jsdoc/no-restricted-syntax": "off", - - /** The `contexts` option is set to `any` to make the rule stricter. */ - "jsdoc/no-types": [ - "warn", - { - contexts: ["any"], - }, - ], - - /** Disabled because it is not needed in TypeScript. */ - "jsdoc/no-undefined-types": "off", - - "jsdoc/require-asterisk-prefix": "warn", - - /** Superseded by the `isaacscript/jsdoc-complete-sentences` rule. */ - "jsdoc/require-description-complete-sentence": "off", - - /** Disabled because it is overboard for every function to have a description. */ - "jsdoc/require-description": "off", - - /** Disabled because it is overboard for every function to require an example. */ - "jsdoc/require-example": "off", - - /** Disabled because it is overboard for every file to require an overview. */ - "jsdoc/require-file-overview": "off", - - /** - * The `never` option is provided to make the rule match the format of the official TypeScript - * codebase. - */ - "jsdoc/require-hyphen-before-param-description": ["warn", "never"], - - /** Disabled since it is overboard for every function to have a JSDoc comment. */ - "jsdoc/require-jsdoc": "off", - - /** The `contexts` option is set to `any` to make the rule stricter. */ - "jsdoc/require-param-description": [ - "warn", - { - contexts: ["any"], - }, - ], - - /** The `contexts` option is set to `any` to make the rule stricter. */ - "jsdoc/require-param-name": [ - "warn", - { - contexts: ["any"], - }, - ], - - /** Disabled because it is not needed in TypeScript. */ - "jsdoc/require-param-type": "off", - - /** Configured to only apply when there are one or more parameters. */ - "jsdoc/require-param": [ - "warn", - { - contexts: [ - { - context: "FunctionDeclaration", - comment: 'JsdocBlock:has(JsdocTag[tag="param"])', - }, - ], - }, - ], - - /** Disabled because it is not needed in TypeScript. */ - "jsdoc/require-property": "off", - - "jsdoc/require-property-description": "warn", - "jsdoc/require-property-name": "warn", - - /** Disabled because it is not needed in TypeScript. */ - "jsdoc/require-property-type": "off", - - /** Disabled because it is overboard for every function to document every return value. */ - "jsdoc/require-returns-check": "off", - - /** The `contexts` option is set to `any` to make the rule stricter. */ - "jsdoc/require-returns-description": [ - "warn", - { - contexts: ["any"], - }, - ], - - /** Disabled because it is not needed in TypeScript. */ - "jsdoc/require-returns-type": "off", - - /** Disabled because it is overboard for every function to document every return value. */ - "jsdoc/require-returns": "off", - - /** Disabled because it is overboard to document every generic type variable. */ - "jsdoc/require-template": "off", - - /** Disabled because it is overboard to document every throw statement. */ - "jsdoc/require-throws": "off", - - /** Disabled because it is overboard to document every yield. */ - "jsdoc/require-yields": "off", - - /** Disabled because it is overboard to document every yield. */ - "jsdoc/require-yields-check": "off", - - /** - * Disabled because it is not very useful. In most cases, a function will only have `@param` - * and `@return` tags, making sorting unnecessary. - */ - "jsdoc/sort-tags": "off", - - /** Superseded by the `isaacscript/format-jsdoc-comments` rule. */ - "jsdoc/tag-lines": "off", - - /** - * Disabled since it is only useful in certain environments (e.g. when your project converts - * JSDoc comments to Markdown). - */ - "jsdoc/text-escaping": "off", - - /** Disabled because it is not needed in TypeScript. */ - "jsdoc/valid-types": "off", - }, - }, - - // Disable some TypeScript-specific rules in JavaScript files. - { - files: ["**/*.js", "**/*.cjs", "**/*.mjs", "**/*.jsx"], - rules: { - "jsdoc/no-types": "off", - "jsdoc/require-param-description": "off", - "jsdoc/require-returns-description": "off", - }, - }, -); diff --git a/packages/eslint-config-isaacscript/configs/base-n.js b/packages/eslint-config-isaacscript/configs/base-n.js deleted file mode 100644 index 8cc4c2bd3..000000000 --- a/packages/eslint-config-isaacscript/configs/base-n.js +++ /dev/null @@ -1,150 +0,0 @@ -import ESLintPluginN from "eslint-plugin-n"; -import tseslint from "typescript-eslint"; - -/** - * This ESLint config only contains rules from `eslint-plugin-n`: - * https://github.com/eslint-community/eslint-plugin-n - * (This is a forked version of `eslint-plugin-node`.) - */ -export const baseN = tseslint.config( - { - plugins: { - n: ESLintPluginN, - }, - - rules: { - /** Disabled since stylistic rules from this plugin are not used. */ - "n/callback-return": "off", - - /** - * This rule is helpful to automatically fix file extensions in import statements throughout - * an entire codebase. - */ - "n/file-extension-in-import": ["warn", "always"], - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/exports-style": "off", - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/global-require": "off", - - "n/handle-callback-err": "warn", - - /** - * Disabled since it does not work very well with TypeScript. (It needs project-specific - * configuration depending on where the output directory is located.) - */ - "n/hashbang": "off", // cspell:disable-line - - "n/no-callback-literal": "warn", - "n/no-deprecated-api": "warn", - "n/no-exports-assign": "warn", - - /** Disabled since it is handled by the TypeScript compiler. */ - "n/no-extraneous-import": "off", - - /** Disabled since require statements are not used in TypeScript code. */ - "n/no-extraneous-require": "off", - - /** Disabled because this rule is deprecated. */ - "n/no-hide-core-modules": "off", - - /** Disabled since it is handled by the TypeScript compiler. */ - "n/no-missing-import": "off", - - "n/no-missing-require": "warn", - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/no-mixed-requires": "off", - - "n/no-new-require": "warn", - "n/no-path-concat": "warn", - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/no-process-env": "off", - - /** - * Disabled because using `process.exit` is common to exit command-line applications without - * verbose output. - */ - "n/no-process-exit": "off", - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/no-restricted-import": "off", - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/no-restricted-require": "off", - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/no-sync": "off", - - "n/no-unpublished-bin": "warn", - - /** - * An exception is made for files in a "scripts" directory, since those should be allowed to - * import from "devDependencies". - */ - "n/no-unpublished-import": "warn", - - "n/no-unpublished-require": "warn", - - /** Disabled because this rule is deprecated. */ - "n/no-unsupported-features": "off", - - /** Disabled because it is assumed that we are running on modern versions of Node.js. */ - "n/no-unsupported-features/es-builtins": "off", - - /** - * Disabled because it is assumed that our transpiler or runtime has support for the latest - * version of ESM. - */ - "n/no-unsupported-features/es-syntax": "off", - - /** Disabled since it is handled by the TypeScript compiler. */ - "n/no-unsupported-features/node-builtins": "off", - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/prefer-global/buffer": "off", - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/prefer-global/console": "off", - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/prefer-global/process": "off", - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/prefer-global/text-decoder": "off", - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/prefer-global/text-encoder": "off", - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/prefer-global/url": "off", - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/prefer-global/url-search-params": "off", - - /** Superseded by the `unicorn/prefer-node-protocol` rule. */ - "n/prefer-node-protocol": "off", - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/prefer-promises/dns": "off", - - /** Disabled since stylistic rules from this plugin are not used. */ - "n/prefer-promises/fs": "off", - - "n/process-exit-as-throw": "warn", - - /** Superseded by the `n/hashbang` rule. */ - "n/shebang": "off", - }, - }, - - // Imports in a "scripts" directory can use "devDependencies". - { - files: ["**/scripts/*.{js,cjs,mjs,ts,cts,mts}"], - rules: { - "n/no-unpublished-import": "off", - }, - }, -); diff --git a/packages/eslint-config-isaacscript/configs/base-stylistic.js b/packages/eslint-config-isaacscript/configs/base-stylistic.js deleted file mode 100644 index cfa285943..000000000 --- a/packages/eslint-config-isaacscript/configs/base-stylistic.js +++ /dev/null @@ -1,58 +0,0 @@ -import ESLintPluginStylistic from "@stylistic/eslint-plugin"; -import tseslint from "typescript-eslint"; - -/** - * This ESLint config only contains rules from `@stylistic/eslint-plugin`: - * https://eslint.style/ - */ -export const baseStylistic = tseslint.config({ - plugins: { - // @ts-expect-error https://github.com/eslint-stylistic/eslint-stylistic/issues/506 - "@stylistic": ESLintPluginStylistic, - }, - - rules: { - /** This rule is not handled by Prettier, so we must use ESLint to enforce it. */ - "@stylistic/lines-around-comment": [ - "warn", - { - // From the JavaScript version of the rule: - // https://eslint.style/rules/js/lines-around-comment#options - allowBlockStart: true, - allowObjectStart: true, - allowArrayStart: true, - allowClassStart: true, - - // From the TypeScript version of the rule: - // https://eslint.style/rules/ts/lines-around-comment#options - allowEnumStart: true, - allowInterfaceStart: true, - allowModuleStart: true, - allowTypeStart: true, - }, - ], - - /** This rule is not handled by Prettier, so we must use ESLint to enforce it. */ - "@stylistic/lines-between-class-members": [ - "warn", - "always", - { - exceptAfterSingleLine: true, - }, - ], - - /** - * We forbid unnecessary backticks by using the options specified in [the - * `eslint-config-prettier` - * documentation](https://github.com/prettier/eslint-config-prettier#enforce-backticks). - */ - "@stylistic/quotes": [ - "warn", - "double", - { - avoidEscape: true, - allowTemplateLiterals: false, - }, - ], - }, -}); diff --git a/packages/eslint-config-isaacscript/configs/base-typescript-eslint.js b/packages/eslint-config-isaacscript/configs/base-typescript-eslint.js deleted file mode 100644 index b5e427b44..000000000 --- a/packages/eslint-config-isaacscript/configs/base-typescript-eslint.js +++ /dev/null @@ -1,549 +0,0 @@ -import tseslint from "typescript-eslint"; - -/** - * This ESLint config only contains rules from `@typescript-eslint/eslint-plugin`: - * https://typescript-eslint.io/rules/ - */ -export const baseTypeScriptESLint = tseslint.config( - { - plugins: { - "@typescript-eslint": tseslint.plugin, - }, - - // We need to provide some special configuration to ESLint in order for it to parse TypeScript - // files. From: - // https://typescript-eslint.io/packages/typescript-eslint/#advanced-usage - languageOptions: { - parser: tseslint.parser, - parserOptions: { - projectService: { - // We whitelist some specific configuration files that downstream users may have in their - // projects. These files should be linted but should not be included in compiled output. - allowDefaultProject: [ - "babel.config.js", - "babel.config.cjs", - "babel.config.mjs", - "eslint.config.js", - "eslint.config.cjs", - "eslint.config.mjs", - "jest.config.js", - "jest.config.cjs", - "jest.config.mjs", - "prettier.config.js", - "prettier.config.cjs", - "prettier.config.mjs", - "typedoc.config.js", - "typedoc.config.cjs", - "typedoc.config.mjs", - ], - - // By default, the whitelisted files above will use the default TypeScript compiler - // options. However, certain ESLint rules such as - // "@typescript-eslint/no-unnecessary-condition" and - // "@typescript-eslint/prefer-nullish-coalescing" require "strictNullChecks", which is not - // a default option. Thus, we need to specify that whitelisted files should use the - // "tsconfig.json" file that is beside the file in the same directory. - defaultProject: "tsconfig.json", - }, - }, - }, - - rules: { - "@typescript-eslint/adjacent-overload-signatures": "warn", - - /** - * The default value is `array`. We choose `array-simple` because it makes complicated arrays - * easier to understand. This is worth the cost of deviating from the base rule configuration. - */ - "@typescript-eslint/array-type": [ - "warn", - { - default: "array-simple", - }, - ], - - "@typescript-eslint/await-thenable": "warn", - "@typescript-eslint/ban-ts-comment": "warn", - "@typescript-eslint/ban-tslint-comment": "warn", - "@typescript-eslint/class-literal-property-style": "warn", - "@typescript-eslint/consistent-generic-constructors": "warn", - "@typescript-eslint/consistent-indexed-object-style": "warn", - "@typescript-eslint/consistent-type-assertions": "warn", - "@typescript-eslint/consistent-type-definitions": "warn", - "@typescript-eslint/consistent-type-exports": "warn", - "@typescript-eslint/consistent-type-imports": "warn", - - /** - * Disabled since it would be to cumbersome to require return types for non-exported - * functions. (It is more reasonable to require it for exported functions only, since it - * speeds up the type-checker in large codebases.) - */ - "@typescript-eslint/explicit-function-return-type": "off", - - /** - * Disabled since many programs may have internal-only classes that would not benefit from an - * explicit public/private distinction. - */ - "@typescript-eslint/explicit-member-accessibility": "off", - - "@typescript-eslint/explicit-module-boundary-types": "warn", - - /** - * Disabled because enforcing an arbitrary parameter number threshold for every function in a - * project does not provide much value. (Additionally, using TypeScript reduces the value of - * such a check.) - */ - "@typescript-eslint/max-params": "off", - - "@typescript-eslint/member-delimiter-style": "off", // eslint-config-prettier - - /** Disabled since prescribed class ordering is too project-specific. */ - "@typescript-eslint/member-ordering": "off", - - "@typescript-eslint/method-signature-style": "warn", - - /** - * The options are [copied from - * Airbnb](https://github.com/iamturns/eslint-config-airbnb-typescript/blob/master/lib/shared.js). - * We also allow a leading underscore, which signifies that the element is temporarily not - * being used. - */ - "@typescript-eslint/naming-convention": [ - "warn", - // Allow camelCase variables (23.2), PascalCase variables (23.8), and UPPER_CASE variables - // (23.10). - { - selector: "variable", - format: ["camelCase", "PascalCase", "UPPER_CASE"], - leadingUnderscore: "allow", - }, - // Allow camelCase functions (23.2), and PascalCase functions (23.8). - { - selector: "function", - format: ["camelCase", "PascalCase"], - leadingUnderscore: "allow", - }, - // Airbnb recommends PascalCase for classes (23.3), and although Airbnb does not make - // TypeScript recommendations, we are assuming this rule would similarly apply to anything - // "type like", including interfaces, type aliases, and enums. - { - selector: "typeLike", - format: ["PascalCase"], - leadingUnderscore: "allow", - }, - ], - - "@typescript-eslint/no-base-to-string": "warn", - "@typescript-eslint/no-confusing-non-null-assertion": "warn", - "@typescript-eslint/no-confusing-void-expression": "warn", - "@typescript-eslint/no-duplicate-enum-values": "warn", - "@typescript-eslint/no-duplicate-type-constituents": "warn", - "@typescript-eslint/no-dynamic-delete": "warn", - - /** - * The `allowSingleExtends` option is enabled to allow for the common pattern of using using - * interfaces to provide an opaque type. (This can be useful with type-builders such as Zod, - * since `z.infer` uses `Expand`, which is sometimes not desired since it can lead to - * verbose/confusing mouseover tooltips and TypeScript errors.) - */ - "@typescript-eslint/no-empty-interface": [ - "warn", - { - allowSingleExtends: true, - }, - ], - - "@typescript-eslint/no-empty-object-type": "warn", - "@typescript-eslint/no-explicit-any": "warn", - "@typescript-eslint/no-extra-non-null-assertion": "warn", - "@typescript-eslint/no-extraneous-class": "warn", - - /** - * - The `ignoreVoid` option is disabled to make the rule stricter. - * - The rule is disabled in "*.test.ts" files because the built-in Node test runner returns a - * promise that is not meant to be awaited. - */ - "@typescript-eslint/no-floating-promises": [ - "warn", - { - ignoreVoid: false, - }, - ], - - "@typescript-eslint/no-for-in-array": "warn", - "@typescript-eslint/no-import-type-side-effects": "warn", - "@typescript-eslint/no-inferrable-types": "warn", - "@typescript-eslint/no-invalid-void-type": "warn", - "@typescript-eslint/no-meaningless-void-operator": "warn", - "@typescript-eslint/no-misused-new": "warn", - "@typescript-eslint/no-misused-promises": "warn", - "@typescript-eslint/no-mixed-enums": "warn", - "@typescript-eslint/no-namespace": "warn", - "@typescript-eslint/no-non-null-asserted-nullish-coalescing": "warn", - "@typescript-eslint/no-non-null-asserted-optional-chain": "warn", - "@typescript-eslint/no-non-null-assertion": "warn", - "@typescript-eslint/no-redundant-type-constituents": "warn", - "@typescript-eslint/no-require-imports": "warn", - - /** Disabled since this rule is intended to be used for project-specific types. */ - "@typescript-eslint/no-restricted-types": "off", - - "@typescript-eslint/no-this-alias": "warn", - - /** Disabled because this rule is deprecated. */ - "@typescript-eslint/no-type-alias": "off", - - "@typescript-eslint/no-unnecessary-boolean-literal-compare": "warn", - "@typescript-eslint/no-unnecessary-condition": "warn", - "@typescript-eslint/no-unnecessary-parameter-property-assignment": "warn", - "@typescript-eslint/no-unnecessary-qualifier": "warn", - "@typescript-eslint/no-unnecessary-template-expression": "warn", - "@typescript-eslint/no-unnecessary-type-arguments": "warn", - "@typescript-eslint/no-unnecessary-type-assertion": "warn", - "@typescript-eslint/no-unnecessary-type-constraint": "warn", - "@typescript-eslint/no-unnecessary-type-parameters": "warn", - "@typescript-eslint/no-unsafe-argument": "warn", - "@typescript-eslint/no-unsafe-assignment": "warn", - "@typescript-eslint/no-unsafe-call": "warn", - "@typescript-eslint/no-unsafe-declaration-merging": "warn", - "@typescript-eslint/no-unsafe-enum-comparison": "warn", - "@typescript-eslint/no-unsafe-function-type": "warn", - "@typescript-eslint/no-unsafe-member-access": "warn", - "@typescript-eslint/no-unsafe-return": "warn", - "@typescript-eslint/no-unsafe-unary-minus": "warn", - "@typescript-eslint/no-useless-empty-export": "warn", - "@typescript-eslint/no-var-requires": "warn", - "@typescript-eslint/no-wrapper-object-types": "warn", - "@typescript-eslint/non-nullable-type-assertion-style": "warn", - "@typescript-eslint/only-throw-error": "warn", - "@typescript-eslint/parameter-properties": "warn", - "@typescript-eslint/prefer-as-const": "warn", - - /** - * Object destructuring is enforced but array destructuring is not. This matches usage in the - * general TypeScript ecosystem. - */ - "@typescript-eslint/prefer-destructuring": [ - "warn", - { - VariableDeclarator: { - array: false, - object: true, - }, - AssignmentExpression: { - array: false, - object: true, - }, - }, - { - // We disable this for renamed properties, since code like the following should be valid: - // `const someSpecificMyEnum = MyEnum.Value1;` - enforceForRenamedProperties: false, - }, - ], - - "@typescript-eslint/prefer-enum-initializers": "warn", - "@typescript-eslint/prefer-find": "warn", - "@typescript-eslint/prefer-for-of": "warn", - "@typescript-eslint/prefer-function-type": "warn", - "@typescript-eslint/prefer-includes": "warn", - "@typescript-eslint/prefer-literal-enum-member": "warn", - "@typescript-eslint/prefer-namespace-keyword": "warn", - "@typescript-eslint/prefer-nullish-coalescing": "warn", - - /** - * Disabled because it can modify the type of `boolean` declarations, which is [undesired in - * some - * circumstances](https://github.com/typescript-eslint/typescript-eslint/issues/5269). - */ - "@typescript-eslint/prefer-optional-chain": "off", - - "@typescript-eslint/prefer-readonly": "warn", - - /** Superseded by the `isaacscript/prefer-readonly-parameter-types` rule. */ - "@typescript-eslint/prefer-readonly-parameter-types": "off", - - "@typescript-eslint/prefer-reduce-type-parameter": "warn", - - /** Disabled since using the `String.match` form might make code easier to read. */ - "@typescript-eslint/prefer-regexp-exec": "off", - - "@typescript-eslint/prefer-return-this-type": "warn", - "@typescript-eslint/prefer-string-starts-ends-with": "warn", - "@typescript-eslint/prefer-ts-expect-error": "warn", - "@typescript-eslint/promise-function-async": "warn", - "@typescript-eslint/require-array-sort-compare": "warn", - - /** The various "allow" options are disabled to make the rule stricter. */ - "@typescript-eslint/restrict-plus-operands": [ - "warn", - { - allowAny: false, - allowBoolean: false, - allowNullish: false, - allowNumberAndString: false, - allowRegExp: false, - }, - ], - - /** - * Disabled since a common use-case of template strings is to coerce everything to a string. - */ - "@typescript-eslint/restrict-template-expressions": "off", - - /** Disabled since in it does not make sense to sort a union alphabetically in many cases. */ - "@typescript-eslint/sort-type-constituents": "off", - - /** The `allowString` and `allowNumber` options are disabled to make the rule stricter. */ - "@typescript-eslint/strict-boolean-expressions": [ - "warn", - { - allowString: false, - allowNumber: false, - allowNullableObject: true, - allowNullableBoolean: false, - allowNullableString: false, - allowNullableNumber: false, - allowNullableEnum: false, - allowAny: false, - allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing: false, - }, - ], - - /** - * The `allowDefaultCaseForExhaustiveSwitch` option is disabled and the - * `requireDefaultForNonUnion` option is enabled to make the rule stricter. - */ - "@typescript-eslint/switch-exhaustiveness-check": [ - "warn", - { - allowDefaultCaseForExhaustiveSwitch: false, - requireDefaultForNonUnion: true, - }, - ], - - "@typescript-eslint/triple-slash-reference": "warn", - "@typescript-eslint/type-annotation-spacing": "off", // eslint-config-prettier - - /** - * Disabled since it is not recommended by the `typescript-eslint` team. (They recommend using - * the `noImplicitAny` and `strictPropertyInitialization` TypeScript compiler options - * instead.) - */ - "@typescript-eslint/typedef": "off", - - "@typescript-eslint/unbound-method": "warn", - "@typescript-eslint/unified-signatures": "warn", - "@typescript-eslint/use-unknown-in-catch-callback-variable": "warn", - - "@typescript-eslint/block-spacing": "off", // eslint-config-prettier - "@typescript-eslint/brace-style": "off", // eslint-config-prettier - "@typescript-eslint/class-methods-use-this": "warn", - "@typescript-eslint/comma-dangle": "off", // eslint-config-prettier - "@typescript-eslint/comma-spacing": "off", // eslint-config-prettier - - /** Disabled since this is handled by the `noImplicitReturns` TypeScript compiler flag. */ - "@typescript-eslint/consistent-return": "off", - - "@typescript-eslint/default-param-last": "warn", - "@typescript-eslint/dot-notation": "warn", - "@typescript-eslint/func-call-spacing": "off", // eslint-config-prettier - "@typescript-eslint/indent": "off", // eslint-config-prettier - - /** - * Disabled since it is superfluous to require an `= undefined` during variable initialization - * (and TypeScript will take care of the non-undefined cases). - */ - "@typescript-eslint/init-declarations": "off", - - "@typescript-eslint/key-spacing": "off", // eslint-config-prettier - "@typescript-eslint/keyword-spacing": "off", // eslint-config-prettier - "@typescript-eslint/no-array-constructor": "warn", - "@typescript-eslint/no-array-delete": "warn", - - /** - * Disabled since it is superfluous when using TypeScript according to [the ESLint - * documentation](https://eslint.org/docs/latest/rules/no-dupe-class-members#when-not-to-use-it). - */ - "@typescript-eslint/no-dupe-class-members": "off", - - "@typescript-eslint/no-empty-function": "warn", - "@typescript-eslint/no-extra-parens": "off", // eslint-config-prettier - "@typescript-eslint/no-extra-semi": "off", // eslint-config-prettier - "@typescript-eslint/no-implied-eval": "warn", - - /** The `capIsConstructor` option is disabled to make the rule stricter. */ - "@typescript-eslint/no-invalid-this": [ - "warn", - { - capIsConstructor: false, - }, - ], - - "@typescript-eslint/no-loop-func": "warn", - "@typescript-eslint/no-loss-of-precision": "warn", - - /** Disabled since it results in too many false positives. */ - "@typescript-eslint/no-magic-numbers": "off", - - /** - * Disabled since it is handled by the combination of the TypeScript compiler and the `no-var` - * ESLint rule. - */ - "@typescript-eslint/no-redeclare": "off", - - /** - * Configured to prevent importing with some common patterns that are almost always a mistake: - * - * - "src" directories (but allowed in test files that are in a separate "tests" directory) - * - "dist" directories - * - "index" files (things in the same package should directly import instead of use the - * public API) - */ - "@typescript-eslint/no-restricted-imports": [ - "warn", - { - patterns: [ - // Some "src" directories have an "index.ts" file, which means that importing from the - // directory is valid. Thus, we check for the "src" directory with no suffix. - { - group: ["**/src"], - message: - 'You cannot import from a "src" directory. If this is a monorepo, import using the package name like you would in a non-monorepo project.', - }, - - { - group: ["**/src/**"], - message: - 'You cannot import from a "src" directory. If this is a monorepo, import using the package name like you would in a non-monorepo project.', - }, - - // Some "dist" directories have an "index.ts" file, which means that importing from the - // directory is valid. Thus, we check for the "dist" directory with no suffix. - { - group: ["**/dist"], - message: - 'You cannot import from a "dist" directory. If this is a monorepo, import using the package name like you would in a non-monorepo project.', - }, - - { - group: ["**/dist/**"], - message: - 'You cannot import from a "dist" directory. If this is a monorepo, import using the package name like you would in a non-monorepo project.', - }, - - { - group: ["**/index"], - message: - "You cannot import from a package index. Instead, import directly from the file where the code is located.", - }, - - { - group: ["**/index.{js,cjs,mjs,ts,cts,mts}"], - message: - "You cannot import from a package index. Instead, import directly from the file where the code is located.", - }, - ], - }, - ], - - "@typescript-eslint/no-shadow": "warn", - - /** - * The `allowTaggedTemplates` option is enabled to allow the rule to work with libraries like - * `execa`. - */ - "@typescript-eslint/no-unused-expressions": [ - "warn", - { - allowTaggedTemplates: true, - }, - ], - - /** - * The `args` option is set to `all` make the rule stricter. Additionally, we ignore things - * that begin with an underscore, since this matches the behavior of the `--noUnusedLocals` - * TypeScript compiler flag. - */ - "@typescript-eslint/no-unused-vars": [ - "warn", - { - args: "all", // "after-used" is the default. - argsIgnorePattern: "^_", - varsIgnorePattern: "^_", - }, - ], - - /** Disabled because it can prevent code from being structured sequentially. */ - "@typescript-eslint/no-use-before-define": "off", - - "@typescript-eslint/no-useless-constructor": "warn", - "@typescript-eslint/object-curly-spacing": "off", // eslint-config-prettier - - /** - * Disabled since it is for inserting extra newlines between specific kinds of statements, - * which would be project-dependant. (This kind of formatting is not handled by Prettier.) - */ - "@typescript-eslint/padding-line-between-statements": "off", - - /** The `allowEmptyReject` option is enabled since this is a common pattern. */ - "@typescript-eslint/prefer-promise-reject-errors": [ - "warn", - { - allowEmptyReject: true, - }, - ], - - "@typescript-eslint/require-await": "warn", - - /** - * Even though the core rule was deprecated, the extended rule uses type information, so it is - * much better. - */ - "@typescript-eslint/return-await": "warn", - - "@typescript-eslint/semi": "off", // eslint-config-prettier - "@typescript-eslint/space-before-blocks": "off", // eslint-config-prettier - "@typescript-eslint/space-before-function-paren": "off", // eslint-config-prettier - "@typescript-eslint/space-infix-ops": "off", // eslint-config-prettier - }, - }, - - // Enable linting on TypeScript file extensions. - { - files: ["**/*.ts", "**/*.tsx", "**/*.mts", "**/*.cts"], - }, - - // Disable some TypeScript-specific rules in JavaScript files. - { - files: ["**/*.js", "**/*.cjs", "**/*.mjs", "**/*.jsx"], - rules: { - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/no-require-imports": "off", - "@typescript-eslint/no-unsafe-argument": "off", - "@typescript-eslint/no-unsafe-assignment": "off", - "@typescript-eslint/no-unsafe-call": "off", - "@typescript-eslint/no-unsafe-member-access": "off", - "@typescript-eslint/no-unsafe-return": "off", - "@typescript-eslint/no-var-requires": "off", - "@typescript-eslint/strict-boolean-expressions": "off", - }, - }, - - // The built-in Node.js test-runner returns a promise which is not meant to be awaited. - { - files: ["**/*.test.{js,cjs,mjs,ts,cts,mts}"], - rules: { - "@typescript-eslint/no-floating-promises": "off", - }, - }, - - // We want to be allowed to import from the "src" directory in test files that are located in a - // separate "tests" directory. - { - files: ["**/tests/**"], - rules: { - "@typescript-eslint/no-restricted-imports": "off", - }, - }, -); diff --git a/packages/eslint-config-isaacscript/configs/base-unicorn.js b/packages/eslint-config-isaacscript/configs/base-unicorn.js deleted file mode 100644 index fa951d64f..000000000 --- a/packages/eslint-config-isaacscript/configs/base-unicorn.js +++ /dev/null @@ -1,240 +0,0 @@ -import ESLintPluginUnicorn from "eslint-plugin-unicorn"; -import tseslint from "typescript-eslint"; - -/** @type {Record} */ -const NORMAL_RULES = { - "unicorn/better-regex": "warn", - "unicorn/catch-error-name": "warn", - - /** Disabled because it has too many false positives. */ - "unicorn/consistent-destructuring": "off", - - "unicorn/consistent-empty-array-spread": "warn", - "unicorn/consistent-function-scoping": "warn", - "unicorn/custom-error-definition": "warn", - "unicorn/empty-brace-spaces": "off", // eslint-config-prettier - "unicorn/error-message": "warn", - "unicorn/escape-case": "warn", - "unicorn/expiring-todo-comments": "warn", - "unicorn/explicit-length-check": "warn", - - /** Disabled since projects may use different file naming conventions. */ - "unicorn/filename-case": "off", - - "unicorn/import-style": "warn", - "unicorn/new-for-builtins": "warn", - - /** - * Disabled because if a line breaks three or more ESLint rules, then it is useful to use a single - * "eslint-disable" comment to make things more concise. - */ - "unicorn/no-abusive-eslint-disable": "off", - - "unicorn/no-anonymous-default-export": "warn", - - /** Disabled since it is not helpful when using TypeScript. */ - "unicorn/no-array-callback-reference": "off", - - "unicorn/no-array-for-each": "warn", - "unicorn/no-array-method-this-argument": "warn", - "unicorn/no-array-push-push": "warn", - "unicorn/no-array-reduce": "warn", - "unicorn/no-await-expression-member": "warn", - "unicorn/no-await-in-promise-methods": "warn", - "unicorn/no-console-spaces": "warn", - "unicorn/no-document-cookie": "warn", - "unicorn/no-empty-file": "warn", - "unicorn/no-for-loop": "warn", - "unicorn/no-hex-escape": "warn", - "unicorn/no-instanceof-array": "warn", - "unicorn/no-invalid-fetch-options": "warn", - "unicorn/no-invalid-remove-event-listener": "warn", - - /** Disabled because it is common to prefix variables with "new". */ - "unicorn/no-keyword-prefix": "off", - - "unicorn/no-length-as-slice-end": "warn", - "unicorn/no-lonely-if": "warn", - "unicorn/no-magic-array-flat-depth": "warn", - "unicorn/no-negated-condition": "warn", - "unicorn/no-negation-in-equality-check": "warn", - "unicorn/no-nested-ternary": "off", // eslint-config-prettier - "unicorn/no-new-array": "warn", - "unicorn/no-new-buffer": "warn", - "unicorn/no-null": "warn", - "unicorn/no-object-as-default-parameter": "warn", - - /** - * Disabled because using `process.exit` is common to exit command-line applications without - * verbose output. - */ - "unicorn/no-process-exit": "off", - - "unicorn/no-single-promise-in-promise-methods": "warn", - "unicorn/no-static-only-class": "warn", - "unicorn/no-thenable": "warn", - - /** Superseded by the `@typescript-eslint/no-this-alias` rule. */ - "unicorn/no-this-assignment": "off", - - "unicorn/no-typeof-undefined": "warn", - "unicorn/no-unnecessary-await": "warn", - "unicorn/no-unnecessary-polyfills": "warn", - "unicorn/no-unreadable-array-destructuring": "warn", - "unicorn/no-unreadable-iife": "warn", - "unicorn/no-unused-properties": "warn", - "unicorn/no-useless-fallback-in-spread": "warn", - "unicorn/no-useless-length-check": "warn", - "unicorn/no-useless-promise-resolve-reject": "warn", - "unicorn/no-useless-spread": "warn", - "unicorn/no-useless-switch-case": "warn", - - /** Disabled since it does not work properly with TypeScript. */ - "unicorn/no-useless-undefined": "off", - - "unicorn/no-zero-fractions": "warn", - "unicorn/number-literal-case": "off", // eslint-config-prettier - "unicorn/numeric-separators-style": "warn", - "unicorn/prefer-add-event-listener": "warn", - "unicorn/prefer-array-find": "warn", - "unicorn/prefer-array-flat": "warn", - "unicorn/prefer-array-flat-map": "warn", - "unicorn/prefer-array-index-of": "warn", - "unicorn/prefer-array-some": "warn", - "unicorn/prefer-at": "warn", - "unicorn/prefer-blob-reading-methods": "warn", - "unicorn/prefer-code-point": "warn", - "unicorn/prefer-date-now": "warn", - "unicorn/prefer-default-parameters": "warn", - "unicorn/prefer-dom-node-append": "warn", - "unicorn/prefer-dom-node-dataset": "warn", - "unicorn/prefer-dom-node-remove": "warn", - "unicorn/prefer-dom-node-text-content": "warn", - "unicorn/prefer-event-target": "warn", - "unicorn/prefer-export-from": "warn", - "unicorn/prefer-includes": "warn", - - /** Disabled because the rule is not compatible with TypeScript. */ - "unicorn/prefer-json-parse-buffer": "off", - - "unicorn/prefer-keyboard-event-key": "warn", - "unicorn/prefer-logical-operator-over-ternary": "warn", - "unicorn/prefer-math-trunc": "warn", - "unicorn/prefer-modern-dom-apis": "warn", - "unicorn/prefer-modern-math-apis": "warn", - "unicorn/prefer-module": "warn", - "unicorn/prefer-native-coercion-functions": "warn", - "unicorn/prefer-negative-index": "warn", - "unicorn/prefer-node-protocol": "warn", - "unicorn/prefer-number-properties": "warn", - "unicorn/prefer-object-from-entries": "warn", - "unicorn/prefer-optional-catch-binding": "warn", - "unicorn/prefer-prototype-methods": "warn", - "unicorn/prefer-query-selector": "warn", - "unicorn/prefer-reflect-apply": "warn", - "unicorn/prefer-regexp-test": "warn", - "unicorn/prefer-set-has": "warn", - "unicorn/prefer-set-size": "warn", - "unicorn/prefer-spread": "warn", - "unicorn/prefer-string-raw": "warn", - "unicorn/prefer-string-replace-all": "warn", - "unicorn/prefer-string-slice": "warn", - "unicorn/prefer-string-starts-ends-with": "warn", - "unicorn/prefer-string-trim-start-end": "warn", - "unicorn/prefer-structured-clone": "warn", - "unicorn/prefer-switch": "warn", - "unicorn/prefer-ternary": "warn", - "unicorn/prefer-top-level-await": "warn", - "unicorn/prefer-type-error": "warn", - - /** Disabled since it is common to use the variable name of "i". */ - "unicorn/prevent-abbreviations": "off", - - "unicorn/relative-url-style": "warn", - "unicorn/require-array-join-separator": "warn", - "unicorn/require-number-to-fixed-digits-argument": "warn", - - /** Disabled since it is not recommended by the plugin authors. */ - "unicorn/require-post-message-target-origin": "off", - - /** Disabled since string content enforcement is too project-specific. */ - "unicorn/string-content": "off", - - "unicorn/switch-case-braces": "warn", - "unicorn/template-indent": "warn", - "unicorn/text-encoding-identifier-case": "warn", - "unicorn/throw-new-error": "warn", -}; - -/** @type {Record} */ -const DEPRECATED_RULES = { - /** Disabled because this rule is deprecated. */ - "unicorn/import-index": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/no-array-instanceof": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/no-fn-reference-in-iterator": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/no-reduce": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/no-unsafe-regex": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/prefer-dataset": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/prefer-event-key": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/prefer-exponentiation-operator": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/prefer-flat-map": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/prefer-node-append": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/prefer-node-remove": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/prefer-object-has-own": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/prefer-replace-all": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/prefer-starts-ends-with": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/prefer-text-content": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/prefer-trim-start-end": "off", - - /** Disabled because this rule is deprecated. */ - "unicorn/regex-shorthand": "off", -}; - -/** - * This ESLint config only contains rules from `eslint-plugin-unicorn`: - * https://github.com/sindresorhus/eslint-plugin-unicorn - * - * Rules are separated into categories: - * 1) Normal rules - * 2) Deprecated rules - */ -export const baseUnicorn = tseslint.config({ - plugins: { - unicorn: ESLintPluginUnicorn, - }, - - rules: { - ...NORMAL_RULES, - ...DEPRECATED_RULES, - }, -}); diff --git a/packages/eslint-config-isaacscript/eslint.config.mjs b/packages/eslint-config-isaacscript/eslint.config.mjs index cf932e591..46f20dbb9 100644 --- a/packages/eslint-config-isaacscript/eslint.config.mjs +++ b/packages/eslint-config-isaacscript/eslint.config.mjs @@ -1,5 +1,6 @@ -import tseslint from "typescript-eslint"; -import { base } from "./base.js"; -import { monorepo } from "./monorepo.js"; +// @ts-check -export default tseslint.config(...base, ...monorepo); +import { completeConfigBase } from "eslint-config-complete"; +import { defineConfig } from "eslint/config"; + +export default defineConfig(...completeConfigBase); diff --git a/packages/eslint-config-isaacscript/mod.js b/packages/eslint-config-isaacscript/mod.js deleted file mode 100644 index c5a902778..000000000 --- a/packages/eslint-config-isaacscript/mod.js +++ /dev/null @@ -1,213 +0,0 @@ -import tseslint from "typescript-eslint"; - -/** - * This ESLint config is meant to be used as a base for IsaacScript mods (or TypeScriptToLua - * projects). - */ -export const mod = tseslint.config({ - rules: { - /** - * Defined at: base-typescript-eslint.js - * - * It is conventional in IsaacScript mods to put the "v" object outside of the class, which - * makes it likely that some methods will not use any internal class variables. - */ - "@typescript-eslint/class-methods-use-this": "off", - - /** - * Defined at: base-typescript-eslint.js - * - * We expand the original definition to ensure that all enums match the Isaac convention of - * using UPPER_CASE. - */ - "@typescript-eslint/naming-convention": [ - "warn", - // Allow camelCase variables (23.2), PascalCase variables (23.8), and UPPER_CASE variables - // (23.10). - { - selector: "variable", - format: ["camelCase", "PascalCase", "UPPER_CASE"], - leadingUnderscore: "allow", - }, - // Allow camelCase functions (23.2), and PascalCase functions (23.8). - { - selector: "function", - format: ["camelCase", "PascalCase"], - leadingUnderscore: "allow", - }, - // Airbnb recommends PascalCase for classes (23.3), and although Airbnb does not make - // TypeScript recommendations, we are assuming this rule would similarly apply to anything - // "type like", including interfaces, type aliases, and enums. - { - selector: "typeLike", - format: ["PascalCase"], - leadingUnderscore: "allow", - }, - // The vanilla Isaac enums all use UPPER_CASE: - // https://wofsauge.github.io/IsaacDocs/rep/enums/CollectibleType.html - { - selector: "enumMember", - format: ["UPPER_CASE"], - }, - ], - - /** - * Defined at: base-typescript-eslint.js - * - * The `Vector` object has a `tostring` meta-method, so it can be properly printed without - * explicitly specifying the X and Y values. - */ - "@typescript-eslint/no-base-to-string": [ - "warn", - { - ignoredTypeNames: ["Vector"], - }, - ], - - /** - * Defined at: base-typescript-eslint.js - * - * TSTL has special behavior with respect to `this: void`, so we need to configure this rule to - * allow the `this` parameter. - */ - "@typescript-eslint/no-invalid-void-type": [ - "warn", - { - allowAsThisParameter: true, - }, - ], - - /** - * Defined at: base-typescript-eslint.js - * - * This rule throws false positives with Isaac API functions. It can be worked around by - * supplying lists of globals to ESLint, but this is ugly. See: - * https://github.com/typescript-eslint/typescript-eslint/issues/2780 - */ - "@typescript-eslint/no-loop-func": "off", - - /** - * Defined at: base-typescript-eslint.js - * - * Enums that are used with the API must be numbers since that is what the API expects. We also - * prefer that unofficial enums are also number enums for consistency. - */ - "@typescript-eslint/prefer-enum-initializers": "off", - - /** - * Defined at: base-typescript-eslint.js - * - * It is common to initialize enums with the `Isaac.GetEntityVariantByName` method. - */ - "@typescript-eslint/prefer-literal-enum-member": "off", - - /** - * Defined at: base-typescript-eslint.js - * - * The `Number.sort` method transpiles to use `table.sort`, which does not have the - * coercion-based bugs of the JavaScript implementation. Thus, this lint rule is unnecessary. - */ - "@typescript-eslint/require-array-sort-compare": "off", - - /** - * Defined in "isaacscript/recommended". - * - * Enums that are used with the API use upper case letters. We also prefer that unofficial enums - * are also use upper case letters for consistency. - */ - "isaacscript/consistent-enum-values": "off", - - /** - * Not defined in the parent configs. - * - * Since Isaac enums use the `SHOUTING_SNAKE_CASE` convention, this rule ensures correctness. - */ - "isaacscript/enum-member-number-separation": "warn", - - /** - * Defined in "isaacscript/recommended". - * - * Enums that are used with the API must be numbers since that is what the API expects. We also - * prefer that unofficial enums are also number enums for consistency. - */ - "isaacscript/no-number-enums": "off", - - /** - * Not defined in the parent configs. - * - * Prevents misuse of the custom `DefaultMap` class in the standard library. - */ - "isaacscript/no-invalid-default-map": "warn", - - /** - * Not defined in the parent configs. - * - * The `throw` keyword should never be used in Isaac mods. - */ - "isaacscript/no-throw": "warn", - - /** - * Not defined in the parent configs. - * - * We must explicitly enable this rule, since it should only apply to IsaacScript mods. - */ - "isaacscript/require-v-registration": "warn", - - /** - * Defined at: base-n.js - * - * IsaacScript mods to not use ESM, so we must turn this rule off. - */ - "n/file-extension-in-import": "off", - - /** - * Defined at: base-unicorn.js - * - * `null` values are conventionally used with the `isaacscript-common` save data manager (even - * though they are transpiled to `nil`). - */ - "unicorn/no-null": "off", - - /** - * Defined at: base-unicorn.js - * - * IsaacScript mods use Lua bitwise operators, which are safe. - */ - "unicorn/prefer-math-trunc": "off", - - /** - * Defined at: base-eslint.js - * - * Isaac API methods use capital letters, so we must make the options for the rule less strict. - */ - "new-cap": [ - "warn", - { - newIsCap: true, - capIsNew: false, - properties: true, - }, - ], - - /** - * Defined at: base-eslint.js - * - * Isaac enums use bitwise operators (e.g. "EntityFlag"). - */ - "no-bitwise": "off", - - /** - * Defined at: base-eslint.js - * - * The Isaac API callback functions expect you to modify the provided object. - */ - "no-param-reassign": "off", - - /** - * Defined at: base-eslint.js - * - * "print" is used with Lua mods. - */ - "no-restricted-globals": "off", - }, -}); diff --git a/packages/eslint-config-isaacscript/monorepo.js b/packages/eslint-config-isaacscript/monorepo.js deleted file mode 100644 index 34d30b7a0..000000000 --- a/packages/eslint-config-isaacscript/monorepo.js +++ /dev/null @@ -1,27 +0,0 @@ -import tseslint from "typescript-eslint"; - -/** This config is meant to be used in the IsaacScript monorepo. */ -export const monorepo = tseslint.config( - // The "isaacscript-common-node" dependency is used in scripts and should never appear in a - // "package.json" file (if it is only used in script files). This has to be a monorepo disable - // because in a normal project, "isaacscript-common-node" should be required in "devDependencies". - { - files: ["**/scripts/*.{js,cjs,mjs,ts,cts,mts}"], - rules: { - "import-x/no-extraneous-dependencies": "off", - }, - }, - - { - files: ["eslint.config.mjs"], - rules: { - // ESLint configs in this monorepo intentionally import from the "packages" subdirectory - // (because we do not want the complexity of ESLint having to use tsconfig-paths). - "import-x/no-relative-packages": "off", - - // ESLint configs import from "typescript-eslint", but this is installed at the monorepo root - // instead of in the individual package "package.json" file. - "import-x/no-extraneous-dependencies": "off", - }, - }, -); diff --git a/packages/eslint-config-isaacscript/package.json b/packages/eslint-config-isaacscript/package.json index 03ac34907..70ecb56b3 100644 --- a/packages/eslint-config-isaacscript/package.json +++ b/packages/eslint-config-isaacscript/package.json @@ -1,7 +1,7 @@ { "name": "eslint-config-isaacscript", - "version": "4.20.0", - "description": "A sharable ESLint config for TypeScript and IsaacScript projects.", + "version": "6.0.1", + "description": "A sharable ESLint config for IsaacScript projects.", "keywords": [ "eslint", "config", @@ -22,28 +22,21 @@ "license": "MIT", "author": "Zamiell", "type": "module", + "main": "./src/index.js", "files": [ - "configs", - "base.js", - "LICENSE", - "mod.js", - "package.json", - "README.md" + "src" ], "scripts": { "lint": "tsx ./scripts/lint.ts" }, "dependencies": { - "@eslint/compat": "^1.1.1", - "@stylistic/eslint-plugin": "^2.6.4", - "confusing-browser-globals": "^1.0.11", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-deprecation": "^3.0.0", - "eslint-plugin-import-x": "^3.1.0", - "eslint-plugin-isaacscript": "^3.12.2", - "eslint-plugin-jsdoc": "^50.2.2", - "eslint-plugin-n": "^17.10.2", - "eslint-plugin-unicorn": "^55.0.0", - "typescript-eslint": "^8.1.0" + "eslint-plugin-isaacscript": "4.0.0", + "typescript-eslint": "8.57.1" + }, + "devDependencies": { + "complete-node": "16.4.0" + }, + "peerDependencies": { + "eslint": ">= 9.0.0" } } diff --git a/packages/eslint-config-isaacscript/scripts/lint.ts b/packages/eslint-config-isaacscript/scripts/lint.ts index 290fcfe0d..d828f8792 100644 --- a/packages/eslint-config-isaacscript/scripts/lint.ts +++ b/packages/eslint-config-isaacscript/scripts/lint.ts @@ -1,10 +1,7 @@ -import { $, lintScript } from "isaacscript-common-node"; +import { lintCommands } from "complete-node"; -await lintScript(async () => { - const promises = [ - $`tsc --noEmit`, - $`tsc --noEmit --project ./scripts/tsconfig.json`, - $`eslint --max-warnings 0 .`, - ]; - await Promise.all(promises); -}); +await lintCommands(import.meta.dirname, [ + "tsc --noEmit", + "tsc --noEmit --project ./scripts/tsconfig.json", + "eslint --max-warnings 0 .", +]); diff --git a/packages/eslint-config-isaacscript/scripts/tsconfig.json b/packages/eslint-config-isaacscript/scripts/tsconfig.json index 5afad029c..81e995789 100644 --- a/packages/eslint-config-isaacscript/scripts/tsconfig.json +++ b/packages/eslint-config-isaacscript/scripts/tsconfig.json @@ -1,10 +1,12 @@ { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../../isaacscript-tsconfig/tsconfig.base.json", - "../../isaacscript-tsconfig/tsconfig.node.json", - "../../../tsconfig.monorepo.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], "include": ["*.ts"], diff --git a/packages/eslint-config-isaacscript/src/index.js b/packages/eslint-config-isaacscript/src/index.js new file mode 100644 index 000000000..66f3b6cbf --- /dev/null +++ b/packages/eslint-config-isaacscript/src/index.js @@ -0,0 +1 @@ +export { isaacScriptModConfigBase } from "./mod.js"; diff --git a/packages/eslint-config-isaacscript/src/mod.js b/packages/eslint-config-isaacscript/src/mod.js new file mode 100644 index 000000000..0e2df844e --- /dev/null +++ b/packages/eslint-config-isaacscript/src/mod.js @@ -0,0 +1,249 @@ +import ESLintPluginIsaacScript from "eslint-plugin-isaacscript"; +import { defineConfig } from "eslint/config"; + +/** + * This ESLint config is meant to be used as a base for IsaacScript mods (or TypeScriptToLua + * projects). + */ +export const isaacScriptModConfigBase = defineConfig( + { + plugins: { + // TODO: The `defineConfig` helper function is bugged. + // @ts-expect-error https://github.com/typescript-eslint/typescript-eslint/issues/11543 + isaacscript: ESLintPluginIsaacScript, + }, + + rules: { + "isaacscript/enum-member-number-separation": "warn", + "isaacscript/no-invalid-default-map": "warn", + "isaacscript/no-throw": "warn", + "isaacscript/require-v-registration": "warn", + }, + + // Rules that require type information will throw an error on ".json" files. (This is needed + // when using `eslint-plugin-package-json`. Even though this config does not currently use the + // plugin, we include it here defensively.) + ignores: ["*.json", "*.jsonc"], + }, + + { + rules: { + /** + * Defined at: base-typescript-eslint.js + * + * It is conventional in IsaacScript mods to put the "v" object outside of the class, which + * makes it likely that some methods will not use any internal class variables. + */ + "@typescript-eslint/class-methods-use-this": "off", + + /** + * Defined at: base-typescript-eslint.js + * + * We expand the original definition to ensure that all enums match the Isaac convention of + * using UPPER_CASE. + */ + "@typescript-eslint/naming-convention": [ + "warn", + // Allow camelCase variables (23.2), PascalCase variables (23.8), and UPPER_CASE variables + // (23.10). + { + selector: "variable", + format: ["camelCase", "PascalCase", "UPPER_CASE"], + leadingUnderscore: "allow", + }, + // Allow camelCase functions (23.2), and PascalCase functions (23.8). + { + selector: "function", + format: ["camelCase", "PascalCase"], + leadingUnderscore: "allow", + }, + // Airbnb recommends PascalCase for classes (23.3), and although Airbnb does not make + // TypeScript recommendations, we are assuming this rule would similarly apply to anything + // "type like", including interfaces, type aliases, and enums. + { + selector: "typeLike", + format: ["PascalCase"], + leadingUnderscore: "allow", + }, + // The vanilla Isaac enums all use UPPER_CASE: + // https://wofsauge.github.io/IsaacDocs/rep/enums/CollectibleType.html + { + selector: "enumMember", + format: ["UPPER_CASE"], + }, + ], + + /** + * Defined at: base-typescript-eslint.js + * + * The `Vector` object has a `tostring` meta-method, so it can be properly printed without + * explicitly specifying the X and Y values. + */ + "@typescript-eslint/no-base-to-string": [ + "warn", + { + ignoredTypeNames: ["Vector"], + }, + ], + + /** + * Defined at: base-typescript-eslint.js + * + * TSTL has special behavior with respect to `this: void`, so we need to configure this rule + * to allow the `this` parameter. + */ + "@typescript-eslint/no-invalid-void-type": [ + "warn", + { + allowAsThisParameter: true, + }, + ], + + /** + * Defined at: base-typescript-eslint.js + * + * This rule throws false positives with Isaac API functions. It can be worked around by + * supplying lists of globals to ESLint, but this is ugly. See: + * https://github.com/typescript-eslint/typescript-eslint/issues/2780 + */ + "@typescript-eslint/no-loop-func": "off", + + /** + * Defined at: base-typescript-eslint.js + * + * Enums that are used with the API must be numbers since that is what the API expects. We + * also prefer that unofficial enums are also number enums for consistency. + */ + "@typescript-eslint/prefer-enum-initializers": "off", + + /** + * Defined at: base-typescript-eslint.js + * + * It is common to initialize enums with the `Isaac.GetEntityVariantByName` method. + */ + "@typescript-eslint/prefer-literal-enum-member": "off", + + /** + * Defined at: base-typescript-eslint.js + * + * The `Number.sort` method transpiles to use `table.sort`, which does not have the + * coercion-based bugs of the JavaScript implementation. Thus, this lint rule is unnecessary. + */ + "@typescript-eslint/require-array-sort-compare": "off", + + /** + * Defined in "complete/recommended". + * + * Enums that are used with the API use upper case letters. We also prefer that unofficial + * enums are also use upper case letters for consistency. + */ + "complete/consistent-enum-values": "off", + + /** + * Defined in "complete/recommended". + * + * Enums that are used with the API must be numbers since that is what the API expects. We + * also prefer that unofficial enums are also number enums for consistency. + */ + "complete/no-number-enums": "off", + + /** + * Defined at: base-n.js + * + * IsaacScript mods to not use ESM, so we must turn this rule off. + */ + "n/file-extension-in-import": "off", + + /** + * Defined at: base-unicorn.js + * + * `null` values are conventionally used with the `isaacscript-common` save data manager (even + * though they are transpiled to `nil`). + */ + "unicorn/no-null": "off", + + /** + * Defined at: base-unicorn.js + * + * IsaacScript mods use Lua bitwise operators, which are safe. + */ + "unicorn/prefer-math-trunc": "off", + + /** + * Defined at: base-eslint.js + * + * Isaac API methods use capital letters, so we must make the options for the rule less + * strict. + */ + "new-cap": [ + "warn", + { + newIsCap: true, + capIsNew: false, + properties: true, + }, + ], + + /** + * Defined at: base-eslint.js + * + * Isaac enums use bitwise operators (e.g. "EntityFlag"). + */ + "no-bitwise": "off", + + /** + * Defined at: base-eslint.js + * + * The Isaac API callback functions expect you to modify the provided object. + */ + "no-param-reassign": "off", + + /** + * Defined at: base-eslint.js + * + * "print" is used with Lua mods. + */ + "no-restricted-globals": "off", + }, + + // Rules that require type information will throw an error on ".json" files. (This is needed + // when using `eslint-plugin-package-json`. Even though this config does not currently use the + // plugin, we include it here defensively.) + ignores: ["*.json", "*.jsonc"], + }, + + { + files: [ + "eslint.config.js", + "eslint.config.cjs", + "eslint.config.mjs", + "eslint.config.ts", + "eslint.config.cts", + "eslint.config.mts", + ], + rules: { + // TypeScript projects that use "complete-lint" have a false positive when importing + // "defineConfig" from "eslint/config", because "eslint" is a transitive dependency in + // "complete-lint". Similarly, importing "completeConfigBase" from "eslint-config-complete" + // fails, because "eslint-config-complete" is a transitive dependency in "complete-lint". (We + // extend the logic from "eslint-config-complete" and add a new value for + // "eslint-config-isaacscript.") + "import-x/no-extraneous-dependencies": [ + "warn", + { + devDependencies: ["**/eslint.config.{js,cjs,mjs,ts,cts,mts}"], + optionalDependencies: false, + whitelist: [ + "eslint", + "eslint-config-complete", + "eslint-config-isaacscript", + ], + }, + ], + + // ESLint configuration files in monorepos often intentionally import from the "packages" + // subdirectory, because the config files are JavaScript so they cannot use tsconfig-paths. + "import-x/no-relative-packages": "off", + }, + }, +); diff --git a/packages/eslint-config-isaacscript/tsconfig.json b/packages/eslint-config-isaacscript/tsconfig.json index b65228dc9..b6782b337 100644 --- a/packages/eslint-config-isaacscript/tsconfig.json +++ b/packages/eslint-config-isaacscript/tsconfig.json @@ -1,11 +1,13 @@ { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../isaacscript-tsconfig/tsconfig.base.json", - "../isaacscript-tsconfig/tsconfig.node.json", - "../../tsconfig.monorepo.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], - "include": ["./**/*.js"], + "include": ["./src/**/*.js"], } diff --git a/packages/eslint-plugin-isaacscript/LICENSE b/packages/eslint-plugin-isaacscript/LICENSE index b2cf86336..968812d65 100644 --- a/packages/eslint-plugin-isaacscript/LICENSE +++ b/packages/eslint-plugin-isaacscript/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2022 IsaacScript +Copyright (c) 2022 The IsaacScript Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/packages/eslint-plugin-isaacscript/README.md b/packages/eslint-plugin-isaacscript/README.md index 458bae2c9..ee134fc32 100644 --- a/packages/eslint-plugin-isaacscript/README.md +++ b/packages/eslint-plugin-isaacscript/README.md @@ -1,28 +1,12 @@ -# eslint-plugin-isaacscript +# `eslint-plugin-isaacscript` Magic Mushroom -`eslint-plugin-isaacscript` is a collection of miscellaneous [ESLint](https://eslint.org/) rules that can help make your TypeScript code more safe or more strict. - -If you already have ESLint set up in your project, then you can try enabling the [`isaacscript/recommend`](#configs) config to get all of the goodness from this plugin in your project at once. Alternatively, if you want more control, feel free to enable the specific rules that you need. - -Alternatively, if you want to get off the ground and running with ESLint + TypeScript in a new project, then you should check out the [`isaacscript-lint`](https://github.com/IsaacScript/isaacscript/tree/main/packages/isaacscript-lint) meta-package. - -
- -## Install / Usage - -- `npm install --save-dev eslint eslint-plugin-isaacscript` -- Add `"plugin:isaacscript/recommended"` to the `extends` section of your `.eslintrc.cjs` file. (This will automatically add the plugin and add all of the recommended rules.) - - Alternatively, if you want to only enable some specific rules, then add `"isaacscript"` to the `plugins` section of your `.eslintrc.cjs` file, and then add the specific rules that you want in the `rules` section. - -
+`eslint-plugin-isaacscript` is a collection of [ESLint](https://eslint.org/) rules for IsaacScript mods. (By default, IsaacScript mods are automatically configured to use these rules.) ## Configs -- `recommended` - Enables just the recommended rules. (Some rules are not recommended since they are intended for very specific environments.) - -
+- `recommended` - Currently, every rule in this plugin is recommended. ## Rules @@ -35,97 +19,11 @@ Each rule has emojis denoting: -| Name | Description | :white_check_mark: | :wrench: | :thought_balloon: | -| -------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ------------------ | -------- | ----------------- | -| [`isaacscript/complete-sentences-jsdoc`](docs/rules/complete-sentences-jsdoc.md) | Requires complete sentences for JSDoc comments | :white_check_mark: | | | -| [`isaacscript/complete-sentences-line-comments`](docs/rules/complete-sentences-line-comments.md) | Requires complete sentences for multi-line leading line comments | :white_check_mark: | | | -| [`isaacscript/consistent-enum-values`](docs/rules/consistent-enum-values.md) | Requires consistent enum values | :white_check_mark: | | | -| [`isaacscript/consistent-named-tuples`](docs/rules/consistent-named-tuples.md) | Requires that if one or more tuple elements are named, all of them are named | :white_check_mark: | | | -| [`isaacscript/enum-member-number-separation`](docs/rules/enum-member-number-separation.md) | Disallows numbers next to letters in enum members | | | | -| [`isaacscript/eqeqeq-fix`](docs/rules/eqeqeq-fix.md) | Requires the use of `===` and `!==` (and automatically fixes) | :white_check_mark: | :wrench: | | -| [`isaacscript/format-jsdoc-comments`](docs/rules/format-jsdoc-comments.md) | Disallows `/**` comments longer than N characters and multi-line comments that can be merged together | :white_check_mark: | :wrench: | | -| [`isaacscript/format-line-comments`](docs/rules/format-line-comments.md) | Disallows `//` comments longer than N characters and multi-line comments that can be merged together | :white_check_mark: | :wrench: | | -| [`isaacscript/jsdoc-code-block-language`](docs/rules/jsdoc-code-block-language.md) | Requires a language specification for every JSDoc code block | :white_check_mark: | | | -| [`isaacscript/newline-between-switch-case`](docs/rules/newline-between-switch-case.md) | Requires newlines between switch cases | :white_check_mark: | :wrench: | | -| [`isaacscript/no-confusing-set-methods`](docs/rules/no-confusing-set-methods.md) | Disallows confusing methods for sets | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/no-empty-jsdoc`](docs/rules/no-empty-jsdoc.md) | Disallows empty JSDoc comments | :white_check_mark: | :wrench: | | -| [`isaacscript/no-empty-line-comments`](docs/rules/no-empty-line-comments.md) | Disallows empty line comments | :white_check_mark: | :wrench: | | -| [`isaacscript/no-explicit-array-loops`](docs/rules/no-explicit-array-loops.md) | Disallows explicit iteration for arrays | :white_check_mark: | :wrench: | :thought_balloon: | -| [`isaacscript/no-explicit-map-set-loops`](docs/rules/no-explicit-map-set-loops.md) | Disallows explicit iteration for maps and sets | :white_check_mark: | :wrench: | :thought_balloon: | -| [`isaacscript/no-for-in`](docs/rules/no-for-in.md) | Disallows "for x in y" statements | :white_check_mark: | | | -| [`isaacscript/no-invalid-default-map`](docs/rules/no-invalid-default-map.md) | Disallows invalid constructors for the DefaultMap class | | | :thought_balloon: | -| [`isaacscript/no-let-any`](docs/rules/no-let-any.md) | Disallows declaring variables with let that do not have a type | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/no-mutable-return`](docs/rules/no-mutable-return.md) | Disallows returning mutable arrays, maps, and sets from functions | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/no-number-enums`](docs/rules/no-number-enums.md) | Disallows number enums | :white_check_mark: | | | -| [`isaacscript/no-object-any`](docs/rules/no-object-any.md) | Disallows declaring objects and arrays that do not have a type | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/no-object-methods-with-map-set`](docs/rules/no-object-methods-with-map-set.md) | Disallows using object methods with maps and sets | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/no-string-length-0`](docs/rules/no-string-length-0.md) | Disallows checking for empty strings via the length method in favor of direct comparison to an empty string | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/no-template-curly-in-string-fix`](docs/rules/no-template-curly-in-string-fix.md) | Disallows template literal placeholder syntax in regular strings (and automatically fixes) | :white_check_mark: | :wrench: | | -| [`isaacscript/no-throw`](docs/rules/no-throw.md) | Disallows the usage of "throw" | | | | -| [`isaacscript/no-undefined-return-type`](docs/rules/no-undefined-return-type.md) | Disallows `undefined` return types on functions | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/no-unnecessary-assignment`](docs/rules/no-unnecessary-assignment.md) | Disallows useless assignments | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/no-unsafe-plusplus`](docs/rules/no-unsafe-plusplus.md) | Disallow unsafe and confusing uses of the "++" and "--" operators | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/no-useless-return`](docs/rules/no-useless-return.md) | Disallow redundant return statements (with no autofixer) | :white_check_mark: | | | -| [`isaacscript/no-void-return-type`](docs/rules/no-void-return-type.md) | Disallows `void` return types on non-exported functions | :white_check_mark: | :wrench: | | -| [`isaacscript/prefer-const`](docs/rules/prefer-const.md) | Require `const` declarations for variables that are never reassigned after declared (with no autofixer) | :white_check_mark: | | | -| [`isaacscript/prefer-plusplus`](docs/rules/prefer-plusplus.md) | Require "++" or "--" operators instead of assignment operators where applicable | :white_check_mark: | :wrench: | | -| [`isaacscript/prefer-postfix-plusplus`](docs/rules/prefer-postfix-plusplus.md) | Require "i++" instead of "++i" | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/prefer-readonly-parameter-types`](docs/rules/prefer-readonly-parameter-types.md) | Require function parameters to be typed as `readonly` to prevent accidental mutation of inputs | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/require-break`](docs/rules/require-break.md) | Requires that each case of a switch statement has a `break` statement | :white_check_mark: | | | -| [`isaacscript/require-capital-const-assertions`](docs/rules/require-capital-const-assertions.md) | Requires a capital letter for named objects and arrays that have a const assertion | :white_check_mark: | :wrench: | | -| [`isaacscript/require-capital-read-only`](docs/rules/require-capital-read-only.md) | Requires maps/sets/arrays with a capital letter to be read-only | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/require-unannotated-const-assertions`](docs/rules/require-unannotated-const-assertions.md) | Disallows explicit type annotations for variables that have a const assertion | :white_check_mark: | | | -| [`isaacscript/require-v-registration`](docs/rules/require-v-registration.md) | Require variables named "v" to be registered with the save data manager | | | | -| [`isaacscript/require-variadic-function-argument`](docs/rules/require-variadic-function-argument.md) | Requires that variadic functions must be supplied with at least one argument | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/strict-array-methods`](docs/rules/strict-array-methods.md) | Requires boolean return types on array method functions | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/strict-enums`](docs/rules/strict-enums.md) | Disallows the usage of unsafe enum patterns | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/strict-undefined-functions`](docs/rules/strict-undefined-functions.md) | Disallows empty return statements in functions annotated as returning undefined | :white_check_mark: | | :thought_balloon: | -| [`isaacscript/strict-void-functions`](docs/rules/strict-void-functions.md) | Disallows non-empty return statements in functions annotated as returning void | :white_check_mark: | | | +| Name | Description | :white_check_mark: | :wrench: | :thought_balloon: | +| ------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------- | ------------------ | -------- | ----------------- | +| [`isaacscript/enum-member-number-separation`](docs/rules/enum-member-number-separation.md) | Disallows numbers next to letters in enum members | :white_check_mark: | | | +| [`isaacscript/no-invalid-default-map`](docs/rules/no-invalid-default-map.md) | Disallows invalid constructors for the DefaultMap class | :white_check_mark: | | :thought_balloon: | +| [`isaacscript/no-throw`](docs/rules/no-throw.md) | Disallows the usage of "throw" | :white_check_mark: | | | +| [`isaacscript/require-v-registration`](docs/rules/require-v-registration.md) | Require variables named "v" to be registered with the save data manager | :white_check_mark: | | | - -
- -## Automatic Fixing - -You probably already use [Prettier](https://prettier.io/), which is helpful to automatically format files. You probably even have your IDE set up to run Prettier every time your save a file. This kind of thing saves you a tremendous amount of time - you can type out a bunch of code completely unformatted, and then press `Ctrl + s` at the end to automatically fix everything. (Alternatively, you could press `Ctrl + shift + f` to format the file without saving it, but it's simpler to just use one hotkey for everything.) - -In a similar way to Prettier, this ESLint plugin contains several rules that are designed to automatically apply whenever you save the file (like the [`format-jsdoc-comments`](docs/rules/format-jsdoc-comments.md) rule). These rules are "fixers", which are applied when ESLint is executed with the "--fix" flag. So, in the same way that you configure Prettier to run on save, you should also configure `eslint --fix` to run on save. - -For example, if you use [VSCode](https://code.visualstudio.com/), and you have the [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) and the [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) extensions installed, you can add the following to your repository's `.vscode/settings.json` file: - -```jsonc -{ - // Automatically run the formatter when certain files are saved. - "[javascript][typescript][javascriptreact][typescriptreact]": { - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit", - }, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true, - }, -} -``` - -
- -## Comment Formatting - -For a discussion around comments and the motivations for some of the comment rules in the plugin, see [this page](docs/comments.md). - -
- -## Contributing - -Thanks for helping out with this open-source project! - -If you are adding a new rule, start by using the `create-rule` script to automate a few things: - -```sh -npm run create-rule foo "This is a description of the foo rule." -git status # Show what the script did. -``` - -Additionally, You can contact me [on Discord](https://discord.gg/KapmKQ2gUD) if you are doing a PR and have questions. - -
diff --git a/packages/eslint-plugin-isaacscript/babel.config.cjs b/packages/eslint-plugin-isaacscript/babel.config.cjs index 94f583df2..90b10a49d 100644 --- a/packages/eslint-plugin-isaacscript/babel.config.cjs +++ b/packages/eslint-plugin-isaacscript/babel.config.cjs @@ -2,6 +2,8 @@ // https://jestjs.io/docs/getting-started#using-typescript // (Babel does not support ESM config files as of August 2024, so this file must remain as CJS.) +// @ts-check + module.exports = { presets: [ ["@babel/preset-env", { targets: { node: "current" } }], diff --git a/packages/eslint-plugin-isaacscript/docs/comments.md b/packages/eslint-plugin-isaacscript/docs/comments.md deleted file mode 100644 index 9302916bc..000000000 --- a/packages/eslint-plugin-isaacscript/docs/comments.md +++ /dev/null @@ -1,231 +0,0 @@ -# Comments - -`eslint-plugin-isaacscript` contains several rules that make working with comments very strict. Why would anyone want to subject themselves to that? - -Let's have a short discussion on the motivation for these rules. - -
- -## The Types of Comments - -First, some jargon: - -- The `//` characters represent a "line" comment. -- The `/*` characters represent a "block" comment. (It is ended with `*/`.) -- The `/**` characters represent a "[JSDoc](https://jsdoc.app/)" comment. (It is also ended with `*/`.) - -### Line Comments - -When line comments are on the same line as code, they are called _trailing line comments_. For example: - -```ts -foo(); // hello world -``` - -When line comments are on their own line, they are called _leading line comments_. For example: - -```ts -// hello world -foo(); -``` - -_Leading line comments_ can be either be single-line, or multi-line: - -```ts -// This is a single-line line comment! - -// This is a multi-line line comment! It's so long that -// it spills over on to the next line! -``` - -### Block Comments - -Block comments are ignored by the rules of this plugin, since they are typically used to comment out blocks of code. For example: - -```ts -/* -foo(); -bar(); -*/ -``` - -### JSDoc Comments - -JSDoc is a type of block comment that has a [strictly defined format](https://jsdoc.app/about-getting-started.html). - -Like line comments, JSDoc comments can either be single-line or multi-line: - -```ts -/** This is a single-line comment! */ - -/** - * This is a multi-line line comment! It's so long that - * it spills over on to the next line! - */ -``` - -Multi-line JSDoc comments use asterisks to denote the beginning of each line. - -
- -## Ignoring In-Line Comments - -With the definitions out of the way, let's talk about how we use the different kinds of comments. It is common to use _trailing line comments_ to write quick annotations: - -```ts -foo(); // initialize the data -bar(); // probably not needed but just in case -``` - -In this circumstance, it would probably be a waste of time to force the programmer to write the comments in complete sentences, like this: - -```ts -foo(); // We call this function to initialize the data. -bar(); // Calling this function is probably not needed, but we call it just in case. -``` - -Thus, _trailing line comments_ are ignored by the rules in this plugin. - -
- -## Annotating Information on Variables and Functions - -In contrast to _trailing line comments_, _leading line comments_ are usually longer and more detailed. For example, say that we want to document something about the `foo` variable: - -```ts -// matches the USS design document, section D -const foo = 100; -``` - -This is a good start. But the problem with annotating this information with a line comment is that it doesn't get "attached" to the variable. For example, in VSCode, if we hover over the `foo` variable (either at the declaration or elsewhere in the code), we would see that it has a value of 84, but we wouldn't see what the comment is. - -To fix this problem, we can annotate the information as a JSDoc comment instead: - -```ts -/** matches the USS design document, section D */ -const foo = 100; -``` - -Now, wherever we happen to be in the code, we can always mouse over `foo` to see the comment. Nice! (And if we use a documentation generator like [TypeDoc](https://github.com/TypeStrong/typedoc), it would automatically go in the generated documentation.) - -However, one problem remains. You are [supposed to use complete sentences in JSDoc comments](https://jsdoc.app/about-getting-started.html), because it represents official information that will be extracted out and put on a documentation webpage. So we should update the comment to be like this: - -```ts -/** Matches the USS design document, section D. */ -const foo = 100; -``` - -Subsequently, it makes sense to have a linting rule to ensure that all JSDoc comments have complete sentences in them. This is the point of the [`isaacscript/complete-sentences-jsdoc`](docs/rules/complete-sentences-jsdoc.md) rule. (It is much smarter than the similar [`jsdoc/require-description-complete-sentence`](https://github.com/gajus/eslint-plugin-jsdoc/blob/master/.README/rules/require-description-complete-sentence.md) rule.) - -
- -## Using a Ruler - -Many code projects have conventions to prevent lines from getting over a certain amount of characters. This kind of thing ensures that code is easy to read. It also is helpful to people with seeing disabilities, and for developers who prefer to open two files side by side. - -In JavaScript/TypeScript, ESLint provides the [`max-len`](https://eslint.org/docs/latest/rules/max-len) lint rule. This lint rule is often accompanied by an on-screen ruler inside of the IDE. Having the ruler on-screen is very nice, as it can accurately show when a line is over the limit. For example, to enable the ruler in VSCode: - -```json -{ - "editor.rulers": [100] -} -``` - -Formatters such as [Prettier](https://prettier.io/) have taken this concept to the next level. Prettier automatically reformats your code to stay within the line limit. Since it happens automatically, using Prettier is a huge timer-saver! - -
- -## Using JSDoc With a Ruler - -Code comments should stay to the left of the ruler for the exact same reasons that normal code should. Unfortunately, Prettier does not automatically reformat JSDoc comments. This makes working with them a real pain. - -For example, say that you have the following JSDoc comment: - -```ts -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - * born and I will give you a complete account of the system, and expound the actual teachings of - * the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, - * or avoids pleasure itself, because it is pleasure, but because those who do not know how to - * pursue pleasure rationally encounter consequences that are extremely painful. - */ -``` - -This comment is aligned with a ruler of 100 characters. Imagine that I need to add some new information before the "No one rejects" sentence: - -```ts -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - * born and I will give you a complete account of the system, and expound the actual teachings of - * the great explorer of the truth, the master-builder of human happiness. ADDING SOME INFORMATION HERE. No one rejects, dislikes, - * or avoids pleasure itself, because it is pleasure, but because those who do not know how to - * pursue pleasure rationally encounter consequences that are extremely painful. - */ -``` - -Oh no! Now we have to manually re-adjust the next N lines of the block in order to keep everything aligned. - -This annoying problem is why the [`isaacscript/format-jsdoc-comments`](docs/rules/complete-sentences-jsdoc.md) rule exists. After adding the "ADDING SOME INFORMATION HERE", all we have to do is save the file, and all of the subsequent lines will be automatically adjusted. - -
- -## Using Line Comments With a Ruler - -The same problem happens with multi-line _leading line comments_: - -```ts -// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was -// born and I will give you a complete account of the system, and expound the actual teachings of -// the great explorer of the truth, the master-builder of human happiness. ADDING SOME INFORMATION HERE. No one rejects, dislikes, -// or avoids pleasure itself, because it is pleasure, but because those who do not know how to -// pursue pleasure rationally encounter consequences that are extremely painful. -``` - -After adding "ADDING INFORMATION HERE", we have to manually re-adjust the next N lines of the block in order to keep everything aligned. - -Similar to the `format-jsdoc-comments` rule, the [`isaacscript/format-line-comments`](rules/format-line-comments.md) rule saves us from the tedium of manually formatting. - -
- -## Consistency With Line Comments and JSDoc Comments - -You might notice that in general, there is a bit of asymmetry between JSDoc comments and _leading line comments_. - -Specifically, you might already know that you are supposed to use complete sentences for JSDoc comments. But you might not use complete sentences for your _leading line comments_. For example: - -```ts -// This is how we do things here -// I don't know why -// It's just the way it is -``` - -In this style, line breaks are used instead of periods. This kind of style can look nice under certain circumstances. But once we are committed to using the `format-line-comments` rule, this style becomes an anti-pattern, because the rule will change it to this: - -```ts -// This is how we do things here I don't know why It's just the way it is -``` - -In order to prevent this from happening, the [`isaacscript/complete-sentences-line-comments`](rules/complete-sentences-line-comments.md) rule forces you to use complete sentences for any _leading line comment_. In the previous example, once we use complete sentences, it gets auto-formatted to this: - -```ts -// This is how we do things here. I don't know why. It's just the way it is. -``` - -Much better! - -Even if you don't use the `format-line-comments` rule, having consistency between JSDoc comments and line comments is a good thing. Why should JSDoc comments be styled one way (with complete sentences) and _leading line comments_ styled another way (without complete sentences)? Having a mismatch here is distracting for someone reading the code, and confusing for someone trying to work on the code: "Am I supposed to use punctuation here or not?" Better to make things always consistent. - -Finally, note that complete-sentences are not enforced for certain kinds of single-line _leading line comments_. For example, the rule allows you to make quick annotations like this: - -```ts -// Local variables -let a; -let b; -let c; - -// Constants -const foo = 123; -const bar = 456; -``` - -All of the rules in this plugin are designed to try and be as smart as possible. They are trying to hit the sweet spot between false positives and false negatives. You can open a GitHub issue if you find a situation where this rule should be smarter. diff --git a/packages/eslint-plugin-isaacscript/docs/rules/complete-sentences-jsdoc.md b/packages/eslint-plugin-isaacscript/docs/rules/complete-sentences-jsdoc.md deleted file mode 100644 index 7971f5390..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/complete-sentences-jsdoc.md +++ /dev/null @@ -1,88 +0,0 @@ -# `complete-sentences-jsdoc` - -Requires complete sentences for JSDoc comments. - -This rule is similar to the [`jsdoc/require-description-complete-sentence`](https://github.com/gajus/eslint-plugin-jsdoc#require-description-complete-sentence) rule, but it is smarter in that it will -generate less false positives. (See the cases outlined below.) - -For more information on why you should use this rule, see the [comment formatting discussion](../comments.md). - -## Rule Details - -```ts -// Bad -/** sometimes I forget to capitalize my sentences. */ - -// Good -/** Sometimes I forget to capitalize my sentences. */ -``` - -```ts -// Bad -/** Sometimes I forget to put a period on my comments */ - -// Good -/** Sometimes I forget to put a period on my comments. */ -``` - -```ts -// Good -/** - * - This JSDoc comment has a bullet and that's fine as far as this lint rule is concerned. - */ -``` - -```ts -// Good -/** - * Ending a sentence with a colon is okay: - * - * - Because there might be a list coming afterwards. - */ -``` - -```ts -// Good -/** - * URLS are ignored. - * https://github.com/IsaacScript/isaacscript/tree/main/packages/eslint-plugin-isaacscript/ - */ -``` - -````ts -// Good -/** - * Putting code blocks inside a JSDoc comment is okay: - * - * ```ts - * function foo() {} - * ``` - */ -```` - -```ts -// Good -/** - * Asking questions is okay. What is the meaning of life? - */ -``` - -The rule tries to be as smart as possible. You can open a GitHub issue if you find a situation where this rule should be smarter. - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/complete-sentences-jsdoc": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/complete-sentences-jsdoc.ts) -- [Test source](../../tests/rules/complete-sentences-jsdoc.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/complete-sentences-line-comments.md b/packages/eslint-plugin-isaacscript/docs/rules/complete-sentences-line-comments.md deleted file mode 100644 index 1712aa37a..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/complete-sentences-line-comments.md +++ /dev/null @@ -1,29 +0,0 @@ -# `complete-sentences-line-comments` - -Requires complete sentences for multi-line leading line comments. - -## Rule Details - -```ts -// Bad - -// Good -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/complete-sentences-line-comments": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/complete-sentences-line-comments.ts) -- [Test source](../../tests/rules/complete-sentences-line-comments.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/consistent-enum-values.md b/packages/eslint-plugin-isaacscript/docs/rules/consistent-enum-values.md deleted file mode 100644 index 9da2eb2c7..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/consistent-enum-values.md +++ /dev/null @@ -1,65 +0,0 @@ -# `consistent-enum-values` - -Requires that all enum values exactly match the enum name, like this: - -```ts -enum Foo { - Value1 = "Value1", - Value2 = "Value2", - Value3 = "Value3", -} -``` - -## Rule Details - -Use this rule to enforce a consistent enum style throughout your codebase. - -This rule only enforces the naming style for string enums. Thus, you should use this rule in conjunction with the [`isaacscript/no-number-enums`](no-number-enums.md) rule and the [`@typescript-eslint/prefer-enum-initializers`](https://typescript-eslint.io/rules/prefer-enum-initializers/) rule to prevent all number enums. - -```ts -// Bad -enum Foo { - Value1 = "VALUE1", -} - -// Good -enum Foo { - Value1 = "Value1", -} -``` - -## Justification - -In pure TypeScript programs, the values of an enum are superfluous: they should not affect the runtime behavior of the program in any way. Thus, the values that you select for your enums are purely be a stylistic concern. - -Thus, it follows that the simplest and most maintainable solution would be to use the "computed" enum value feature of TypeScript, like this: - -```ts -enum Foo { - Value1, - Value2, - Value3, -} -``` - -Unfortunately, this feature results in numeric values instead of string values. And the TypeScript compiler is not as strict with number enums as it is with string enums. Thus, in order to get the maximum guarantees of safety in our programs, we want to use string enums instead of number enums, and therefore cannot use the computed values feature. - -The next simplest and easiest-to-maintain solution is to simply copy the values of the the enum exactly. Thus, this lint rule enforces this style. - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/consistent-enum-values": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/consistent-enum-values.ts) -- [Test source](../../tests/rules/consistent-enum-values.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/consistent-named-tuples.md b/packages/eslint-plugin-isaacscript/docs/rules/consistent-named-tuples.md deleted file mode 100644 index c099fd678..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/consistent-named-tuples.md +++ /dev/null @@ -1,31 +0,0 @@ -# `consistent-named-tuples` - -Requires that if one or more tuple elements are named, all of them are named. - -## Rule Details - -```ts -// Bad -type MyTuple = [arg1: string, number]; - -// Good -type MyTuple = [arg1: string, arg2: number]; -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/consistent-named-tuples": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/consistent-named-tuples.ts) -- [Test source](../../tests/rules/consistent-named-tuples.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/eqeqeq-fix.md b/packages/eslint-plugin-isaacscript/docs/rules/eqeqeq-fix.md deleted file mode 100644 index c4184b0a0..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/eqeqeq-fix.md +++ /dev/null @@ -1,57 +0,0 @@ -# `eqeqeq-fix` - -Requires the use of `===` and `!==` (and automatically fixes). - -This is a replacement for the ESLint [`eqeqeq`](https://eslint.org/docs/latest/rules/eqeqeq) rule that includes the ability for `--fix` to work properly. - -## Rule Details - -The official ESLint [`eqeqeq`](https://eslint.org/docs/latest/rules/eqeqeq) rule works like this: - -```ts -// Bad -if (foo == bar) { -} - -// Good -if (foo === bar) { -} -``` - -This is a fantastic rule, as the use of `==` is almost always a bug. However, ESLint will not automatically fix this for you when using the `--fix` flag, unlike other rules. This is because ESLint does not want to break code in the rare case where the programmer did this intentionally. - -To get around this, use this rule instead. - -## Gotchas - -If you use this rule, make sure to turn off the vanilla ESLint rule, like this: - -```json -{ - "rules": { - "eqeqeq": "off" - } -} -``` - -Otherwise, the two rules will conflict with each other. - -Note that if you use the `recommended` config that comes with this plugin, then the vanilla ESLint rule will be turned off automatically. - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/eqeqeq-fix": "error" - } -} -``` - -This rule is not configurable. (All of the unsafe options from the original have been removed.) - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/eqeqeq-fix.ts) -- [Test source](../../tests/rules/eqeqeq-fix.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/format-jsdoc-comments.md b/packages/eslint-plugin-isaacscript/docs/rules/format-jsdoc-comments.md deleted file mode 100644 index 3fdb5f7cd..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/format-jsdoc-comments.md +++ /dev/null @@ -1,97 +0,0 @@ -# `format-jsdoc-comments` - -Disallows `/**` comments longer than N characters and multi-line comments that can be merged together. - -Much like [Prettier](https://prettier.io/), this rule is designed to auto-format your comments so that you don't have to think about it. Try [configuring your IDE](../../README.md#automatic-fixing) to run `eslint --fix` on save. - -Also see the [`format-line-comments`](format-line-comments.md) rule. - -For more information on why you should use this rule, see the [comment formatting discussion](../comments.md). - -## Rule Details - - - -Lines that are too long will be split to the next line: - -```ts -// Bad -/** - * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. - */ - -// Good -/** - * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut - * labore et dolore magna aliqua. - */ -``` - -Similarly, lines that are too long in a single-line JSDoc will be converted to a multi-line JSDoc: - -```ts -// Bad -/** Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. */ - -// Good -/** - * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut - * labore et dolore magna aliqua. - */ -``` - -Lines that are too short will be merged together. And, if possible, JSDoc will be converted to a single-line: - -```ts -// Bad -/** - * I love cookies. - * But not cake. - */ - -// Good -/** I love cookies. But not cake. */ -``` - -The rule tries to be as smart as possible. For example, it won't complain about a bulleted list: - -```ts -// Good -/** - * These are my favorite things: - * - cookies - * - pie - * - definitely not cake - */ -``` - -You can open a GitHub issue if you find a situation where this rule should be smarter. - -Non JSDoc-style comments (i.e. lines that begin with `/*` followed by a space) are ignored, since they are commonly-used to comment-out large blocks of code. - -For example: - -```ts -/* This is a single-line comment. This is a single-line comment. This is a single-line comment. This is a single-line comment. */ -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/format-jsdoc-comments": [ - "error", - { - "maxLength": 100 - } - ] - } -} -``` - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/format-jsdoc-comments.ts) -- [Test source](../../tests/rules/format-jsdoc-comments.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/format-line-comments.md b/packages/eslint-plugin-isaacscript/docs/rules/format-line-comments.md deleted file mode 100644 index e6e850efc..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/format-line-comments.md +++ /dev/null @@ -1,64 +0,0 @@ -# `format-line-comments` - -Disallows `//` comments longer than N characters and multi-line comments that can be merged together. - -Much like [Prettier](https://prettier.io/), this rule is designed to auto-format your comments so that you don't have to think about it. Try [configuring your IDE](../../README.md#automatic-fixing) to run `eslint --fix` on save. - -Also see the [`format-jsdoc-comments`](format-jsdoc-comments.md) rule. - -For more information on why you should use this rule, see the [comment formatting discussion](../comments.md). - -## Rule Details - - - -Lines that are too long will be split to the next line: - -```ts -// Bad -// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. - -// Good -// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut -// labore et dolore magna aliqua. -``` - -Lines that are too short will be merged together: - -```ts -// Bad -// Lorem ipsum dolor sit amet, -// consectetur adipiscing elit - -// Good -// Lorem ipsum dolor sit amet, consectetur adipiscing elit -``` - -The rule tries to be as smart as possible. For example, it won't complain about TypeScript [triple slash directives](https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html): - -```ts -/// -``` - -You can open a GitHub issue if you find a situation where this rule should be smarter. - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/format-line-comments": [ - "error", - { - "maxLength": 100 - } - ] - } -} -``` - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/format-line-comments.ts) -- [Test source](../../tests/rules/format-line-comments.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/jsdoc-code-block-language.md b/packages/eslint-plugin-isaacscript/docs/rules/jsdoc-code-block-language.md deleted file mode 100644 index 11f5ac582..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/jsdoc-code-block-language.md +++ /dev/null @@ -1,49 +0,0 @@ -# `jsdoc-code-block-language` - -Requires a language specification for every JSDoc code block. - -## Rule Details - -This rule is the same thing as the [`markdownlint`](https://github.com/DavidAnson/markdownlint) rule [MD040](https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md040): fenced code blocks should have a language specified. The only difference is that this is for JSDoc comments instead of Markdown. - -The purpose of this rule is to always ensure that your code blocks will have proper syntax highlighting. For example, it is common to write code examples in the JSDoc comment for functions, and then have a tool like [TypeDoc](https://typedoc.org/) automatically generate documentation from the JSDoc comments. However, if there isn't a language specified for the code block, the resulting webpage may not be able to properly syntax-highlight the code. - -````ts -// Bad -/** - * Use `foo` like this: - * - * ``` - * foo(); - * ``` - */ -function foo() {} - -// Good -/** - * Use `foo` like this: - * - * ```ts - * foo(); - * ``` - */ -function foo() {} -```` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/jsdoc-code-block-language": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/jsdoc-code-block-language.ts) -- [Test source](../../tests/rules/jsdoc-code-block-language.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/newline-between-switch-case.md b/packages/eslint-plugin-isaacscript/docs/rules/newline-between-switch-case.md deleted file mode 100644 index 018eb2ec2..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/newline-between-switch-case.md +++ /dev/null @@ -1,58 +0,0 @@ -# `newline-between-switch-case` - -Requires newlines between switch cases. Having newlines between each case can make code easier to read, as it better delineates each block. - -Based on [this rule](https://github.com/lukeapage/eslint-plugin-switch-case/blob/master/docs/rules/newline-between-switch-case.md). - -## Rule Details - -This rule does not apply to "fall through" switch cases; those should be squished together with the other cases. See below for an example. - -```ts -// Bad -switch (foo) { - case 1: - case 2: - case 3: { - doSomething(); - break; - } - case 4: { - doSomething(); - break; - } -} - -// Good -switch (foo) { - case 1: - case 2: - case 3: { - doSomething(); - break; - } - - case 4: { - doSomething(); - break; - } -} -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/newline-between-switch-case": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/newline-between-switch-case.ts) -- [Test source](../../tests/rules/newline-between-switch-case.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-confusing-set-methods.md b/packages/eslint-plugin-isaacscript/docs/rules/no-confusing-set-methods.md deleted file mode 100644 index 5efa77cc5..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-confusing-set-methods.md +++ /dev/null @@ -1,37 +0,0 @@ -# `no-confusing-set-methods` - -Disallows the `Set.keys` and the `Set.entries` methods. - -These methods serve no purpose and should instead be replaced with the `Set.values` method (or implicit iteration if the set is being used inside of a for loop). - -## Rule Details - -```ts -// Bad -for (const key of mySet.keys()) { -} -for (const [key, value] of mySet.entries()) { -} - -// Good -for (const value of mySet) { -} -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-confusing-set-methods": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-confusing-set-methods.ts) -- [Test source](../../tests/rules/no-confusing-set-methods.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-empty-jsdoc.md b/packages/eslint-plugin-isaacscript/docs/rules/no-empty-jsdoc.md deleted file mode 100644 index dff055afa..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-empty-jsdoc.md +++ /dev/null @@ -1,49 +0,0 @@ -# `no-empty-jsdoc` - -Disallows empty JSDoc comments (and automatically removes them). - -## Rule Details - -```ts -// Bad -/** */ -``` - -```ts -// Bad -/** */ -``` - -```ts -// Bad -/** - * - */ -``` - -```ts -// Bad -/** - * - * - * - */ -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-empty-jsdoc": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-empty-jsdoc.ts) -- [Test source](../../tests/rules/no-empty-jsdoc.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-empty-line-comments.md b/packages/eslint-plugin-isaacscript/docs/rules/no-empty-line-comments.md deleted file mode 100644 index ce6a23734..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-empty-line-comments.md +++ /dev/null @@ -1,35 +0,0 @@ -# `no-empty-line-comments` - -Disallows empty line comments (and automatically removes them). - -## Rule Details - -```ts -// Bad -// - -// Bad -// -// - -// Good -// This is an non-empty comment. Empty comments are indicative of a mistake. -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-empty-line-comments": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-empty-line-comments.ts) -- [Test source](../../tests/rules/no-empty-line-comments.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-explicit-array-loops.md b/packages/eslint-plugin-isaacscript/docs/rules/no-explicit-array-loops.md deleted file mode 100644 index 22b218475..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-explicit-array-loops.md +++ /dev/null @@ -1,43 +0,0 @@ -# `no-explicit-array-loops` - -Disallows explicit iteration for arrays. - -In this case, "explicit iteration" means using the `values` method (or `Object.values`) in a for loop. Forbidding this can make code easier to read. - -Also see the [`no-explicit-map-set-loops`](no-explicit-map-set-loops.md) rule. - -## Rule Details - -In JavaScript/TypeScript, you can iterate over array elements implicitly: - -```ts -for (const element of myArray) { -} -``` - -Or, you can iterate over array elements explicitly: - -```ts -for (const element of myArray.values()) { -} -``` - -Idiomatic TypeScript code iterates implicitly. Explicit iteration is rare because it is needlessly verbose. Thus, it is recommended to forbid this pattern in your codebase to prevent confusion and ensure consistency. - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-explicit-array-loops": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-explicit-array-loops.ts) -- [Test source](../../tests/rules/no-explicit-array-loops.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-explicit-map-set-loops.md b/packages/eslint-plugin-isaacscript/docs/rules/no-explicit-map-set-loops.md deleted file mode 100644 index b438cd04d..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-explicit-map-set-loops.md +++ /dev/null @@ -1,49 +0,0 @@ -# `no-explicit-map-set-loops` - -Disallows explicit iteration for maps and sets. - -In this case, "explicit iteration" means using a method like `entries` or `values` in a for loop, where omitting the method would result in equivalent code. Forbidding this can make code easier to read. - -Also see the [`no-explicit-array-loops`](no-explicit-array-loops.md) rule. - -## Rule Details - -In JavaScript/TypeScript, you can iterate over map or set elements implicitly: - -```ts -for (const [key, value] of myMap) { -} - -for (const value of mySet) { -} -``` - -Or, you can iterate over map or set elements explicitly: - -```ts -for (const [key, value] of myMap.entries()) { -} - -for (const value of mySet.values()) { -} -``` - -Idiomatic TypeScript code iterates implicitly. Explicit iteration is rare because it is needlessly verbose. Thus, it is recommended to forbid this pattern in your codebase to prevent confusion and ensure consistency. - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-explicit-map-set-loops": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-explicit-map-set-loops.ts) -- [Test source](../../tests/rules/no-explicit-map-set-loops.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-for-in.md b/packages/eslint-plugin-isaacscript/docs/rules/no-for-in.md deleted file mode 100644 index 2fb1671b3..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-for-in.md +++ /dev/null @@ -1,47 +0,0 @@ -# `no-for-in` - -Disallows "for x in y" statements. - -## Rule Details - -"for in" loops iterate over the entire prototype chain, which is virtually never what you want. Use a "for of" loop or instead. - -```ts -// Bad -const array = [1, 2, 3]; -for (const element in array) { -} - -// Good -const array = [1, 2, 3]; -for (const element of array) { -} - -// Bad -const object = { foo: "bar" }; -for (const key in object) { -} - -// Good -const object = { foo: "bar" }; -for (const key of Object.keys(object)) { -} -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-for-in": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-for-in.ts) -- [Test source](../../tests/rules/no-for-in.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-let-any.md b/packages/eslint-plugin-isaacscript/docs/rules/no-let-any.md deleted file mode 100644 index 4f0b75ea3..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-let-any.md +++ /dev/null @@ -1,33 +0,0 @@ -# `no-let-any` - -Disallows declaring variables with let that do not have a type. - -This is useful because the `noImplicitAny` TypeScript compiler flag does not always catch this pattern. If you want to purge all of the `any` from your codebase, you need this rule. - -## Rule Details - -```ts -// Bad -let foo; - -// Good -let foo: string; -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-let-any": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-let-any.ts) -- [Test source](../../tests/rules/no-let-any.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-mutable-array-return.md b/packages/eslint-plugin-isaacscript/docs/rules/no-mutable-array-return.md deleted file mode 100644 index 9b04b2851..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-mutable-array-return.md +++ /dev/null @@ -1,61 +0,0 @@ -# `no-mutable-return` - -Disallows returning mutable arrays, maps, and sets from functions. - -Arrays, maps, and sets are mutable by default in TypeScript, unlike safer languages like Rust. In general, code is [much easier to reason about when data structures are immutable](https://stackoverflow.com/questions/441309/why-are-mutable-structs-evil). Thus, this lint rule helps ensure a stricter boundary between functions to make data flows easier to understand. - -The consequence of working with read-only data structures is that if a function callee needs to mutate the resulting data structure, they should make a copy of it (with e.g. the spread operator if it is an array). This makes it explicit that they are creating a new, non-vanilla thing. This pattern has the downside of a performance penalty, but in most real-world applications that are not using huge data structures, this is a micro-penalty and cannot be measured. - -Of course, there are some cases where a function really does need to return a mutable data structure, like when an array is really big and the cost of copying it would be too great. In these cases, use the "eslint-ignore-next-line" directive. - -## Rule Details - -```ts -// Bad -function getArray(): number[] { - return []; -} - -// Good -function getArray(): readonly number[] { - return []; -} - -// Bad -function getMap(): Map { - return new Map(); -} - -// Good -function getMap(): ReadonlyMap[] { - return new Map(); -} - -// Bad -function getSet(): Set { - return new Set(); -} - -// Good -function getSet(): ReadonlySet[] { - return new Set(); -} -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-mutable-return": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-mutable-return.ts) -- [Test source](../../tests/rules/no-mutable-return.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-number-enums.md b/packages/eslint-plugin-isaacscript/docs/rules/no-number-enums.md deleted file mode 100644 index d9021c9a5..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-number-enums.md +++ /dev/null @@ -1,45 +0,0 @@ -# `no-number-enums` - -Disallows number enums. - -## Rule Details - -The TypeScript compiler has looser checks for number enums than it does for string enums. For this reason, the TypeScript ecosystem has preferred string enums over number enums. - -Note that this rule does not trigger on [computed number enums](https://www.typescriptlang.org/docs/handbook/enums.html#computed-and-constant-members), so it must be used in conjunction with the [`@typescript-eslint/prefer-enum-initializers`](https://typescript-eslint.io/rules/prefer-enum-initializers/) rule. - -```ts -// Bad -enum Foo { - Value1 = 1, -} - -// Good -enum Foo { - Value1 = "Value1", -} -``` - -## Why? - -For pure TypeScript programs, the actual value of enums should never matter. Thus, whether they are strings or numbers at runtime is just be an implementation detail. The performance of string enums versus number enums is roughly equivalent and would depend on the specific program. The memory requirement of string enums is slightly more than number enums, but this would be negligible for all but the most extreme cases. For these reasons, you can generally convert all of your number enums to string enums in order to get better safety guarantees from the TypeScript compiler. - -Obviously, there are [some cases where number enums are superior](strict-enums.md#number-enums-vs-string-enums). If you are in a codebase that needs to use number enums, then you should disable this rule and make sure that you use the [`strict-enums`](strict-enums.md) rule, which makes working with number enums about as safe as string enums. - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-number-enums": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-number-enums.ts) -- [Test source](../../tests/rules/no-number-enums.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-object-any.md b/packages/eslint-plugin-isaacscript/docs/rules/no-object-any.md deleted file mode 100644 index 23a22ed39..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-object-any.md +++ /dev/null @@ -1,41 +0,0 @@ -# `no-object-any` - -Disallows declaring objects and arrays that do not have a type. - -This is useful because the `noImplicitAny` TypeScript compiler flag does not always catch this pattern. If you want to purge all of the `any` from your codebase, you need this rule. - -## Rule Details - -```ts -// Bad -const myMap = new Map(); - -// Good -const myMap = new Map(); -``` - -```ts -// Bad -const myArray = []; - -// Good -const myArray: string[] = []; -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-object-any": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-object-any.ts) -- [Test source](../../tests/rules/no-object-any.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-object-methods-with-map-set.md b/packages/eslint-plugin-isaacscript/docs/rules/no-object-methods-with-map-set.md deleted file mode 100644 index 941a03989..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-object-methods-with-map-set.md +++ /dev/null @@ -1,73 +0,0 @@ -# `no-object-methods-with-map-set` - -Disallows using the `Object.entries`, `Object.keys`, and `Object.values` methods with maps and sets, since doing this is virtually always a bug. - -## Rule Details - -In order to iterate over a JavaScript object, you might have some code like this: - -```ts -for (const [key, value] of Object.entries(foo)) { - // Do something. -} -``` - -However, it is common to refactor objects to [maps](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map), since they are [more performant and provide a nicer API](https://claritydev.net/blog/simplifying-code-with-maps-in-javascript/). After such a refactor, the above code block would still pass the TypeScript compiler, but would not work at all. - -This rule prevents the use of specific `Object` methods with maps and sets. - -```ts -declare const myMap: Map; - -// Bad -for (const [key, value] of Object.entries(myMap)) { -} -for (const key of Object.keys(myMap)) { -} -for (const value of Object.values(myMap)) { -} - -// Good -for (const [key, value] of myMap.entries()) { -} -for (const key of myMap.keys()) { -} -for (const value of myMap.values()) { -} - -declare const mySet: Set; - -// Bad -for (const entry of Object.entries(mySet)) { -} -for (const key of Object.keys(mySet)) { -} -for (const value of Object.values(mySet)) { -} - -// Good -for (const entry of mySet.entries()) { -} -for (const key of mySet.keys()) { -} -for (const value of mySet.values()) { -} -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-object-methods-with-map-set": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-object-methods-with-map-set.ts) -- [Test source](../../tests/rules/no-object-methods-with-map-set.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-string-length-0.md b/packages/eslint-plugin-isaacscript/docs/rules/no-string-length-0.md deleted file mode 100644 index 2a2c3e72a..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-string-length-0.md +++ /dev/null @@ -1,35 +0,0 @@ -# `no-string-length-0` - -Disallows checking for empty strings via the length method in favor of direct comparison to an empty string, since the latter is shorter and easier to read. - -## Rule Details - -```ts -// Bad -declare const foo: string; -if (foo.length === 0) { -} - -// Good -declare const foo: string; -if (foo === "") { -} -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-string-length-0": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-string-length-0.ts) -- [Test source](../../tests/rules/no-string-length-0.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-template-curly-in-string-fix.md b/packages/eslint-plugin-isaacscript/docs/rules/no-template-curly-in-string-fix.md deleted file mode 100644 index 0161e30a0..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-template-curly-in-string-fix.md +++ /dev/null @@ -1,55 +0,0 @@ -# `no-template-curly-in-string-fix` - -Disallows template literal placeholder syntax in regular strings (and automatically fixes). - -This is a replacement for the ESLint [`no-template-curly-in-string`](https://eslint.org/docs/latest/rules/no-template-curly-in-string) rule that includes the ability for `--fix` to work properly. - -## Rule Details - -The official ESLint [`no-template-curly-in-string`](https://eslint.org/docs/latest/rules/no-template-curly-in-string) rule works like this: - -```ts -// Bad -const fooString = "foo: ${foo}"; - -// Good -const fooString = `foo: ${foo}`; -``` - -This is a fantastic rule, as the use of quotes in this situation is almost always a bug. However, ESLint will not automatically fix this for you when using the `--fix` flag, unlike other rules. This is because ESLint does not want to break code in the extremely rare case where the programmer did this intentionally. - -To get around this, use this rule instead. - -## Gotchas - -If you use this rule, make sure to turn off the vanilla ESLint rule, like this: - -```json -{ - "rules": { - "no-template-curly-in-string": "off" - } -} -``` - -Otherwise, the two rules will conflict with each other. - -Note that if you use the `recommended` config that comes with this plugin, then the vanilla ESLint rule will be turned off automatically. - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-template-curly-in-string-fix": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-template-curly-in-string-fix.ts) -- [Test source](../../tests/rules/no-template-curly-in-string-fix.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-undefined-return-type.md b/packages/eslint-plugin-isaacscript/docs/rules/no-undefined-return-type.md deleted file mode 100644 index 51126cc2e..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-undefined-return-type.md +++ /dev/null @@ -1,47 +0,0 @@ -# `no-undefined-return-type` - -Disallows `undefined` return types on functions. - -## Rule Details - -A function that only returns `undefined` is confusing and likely to be a mistake, since a function that returns nothing should have a return type of `void`. - -```ts -// Bad -function foo(): undefined { - return; -} - -// Good -function foo(): void { - return; -} - -// Bad -function foo() { - return undefined; -} - -// Good -function foo() { - return; -} -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-undefined-return-type": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-undefined-return-type.ts) -- [Test source](../../tests/rules/no-undefined-return-type.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-unnecessary-assignment.md b/packages/eslint-plugin-isaacscript/docs/rules/no-unnecessary-assignment.md deleted file mode 100644 index 644edc564..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-unnecessary-assignment.md +++ /dev/null @@ -1,63 +0,0 @@ -# `no-unnecessary-assignment` - -Disallows useless assignments. - -## Rule Details - -Sometimes, refactoring can lead to assignment statements that were once useful but are now redundant. This rule helps you clean up the dead code in a similar way that the [`@typescript-eslint/no-unnecessary-condition`](https://typescript-eslint.io/rules/no-unnecessary-condition/) rule does. - -```ts -// Bad -declare let foo: 1; -declare let bar: 1; -foo = bar; - -// Bad -declare let foo: number; -foo += 0; - -// Bad -declare let foo: string; -foo += ""; - -// Bad -declare const foo: boolean; -const bar = foo || false; -const baz = foo && true; - -// Bad -declare const foo: number; -const bar = foo || 0; - -// Bad -declare const foo: string; -const bar = foo || ""; - -// Bad -declare const foo: string | null; -const bar = foo ?? null; - -// Bad -declare const foo: string | undefined; -const bar = foo ?? undefined; -``` - -Note that while "<<" is technically a useless operator when combined with 0, this rule will not report on it so that bit flag enums will not cause false positives. - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-unnecessary-assignment": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-unnecessary-assignment.ts) -- [Test source](../../tests/rules/no-unnecessary-assignment.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-unsafe-plusplus.md b/packages/eslint-plugin-isaacscript/docs/rules/no-unsafe-plusplus.md deleted file mode 100644 index 3abfe7f18..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-unsafe-plusplus.md +++ /dev/null @@ -1,46 +0,0 @@ -# `no-unsafe-plusplus` - -Disallow unsafe and confusing uses of the `++` and `--` operators. - -## Rule Details - -This rule heavily restricts the usage of the `++` and `--` operators. Essentially, you are only allowed to use "foo++" in places where swapping it to "++foo" or "foo += 1" would have no functional change in the program. - -This rule is meant to be used in conjunction with this [`prefer-plusplus`](prefer-plusplus.md) and [`prefer-postfix-plusplus`](prefer-postfix-plusplus.md) ESLint rules. - -```ts -// Bad -foo++, foo++, foo++; -for (foo++; ; ) {} -for (; foo++; ) {} -foo++ + foo++; -array[foo++]; - -// Good -foo++; -void foo++; -foo++, foo++, 0; -for (; ; foo++) {} -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-unsafe-plusplus": "error" - } -} -``` - -This rule is not configurable. - -## Credits - -This rule was originally created by webstrand in the TypeScript Discord. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-unsafe-plusplus.ts) -- [Test source](../../tests/rules/no-unsafe-plusplus.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-useless-return.md b/packages/eslint-plugin-isaacscript/docs/rules/no-useless-return.md deleted file mode 100644 index 708aec125..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-useless-return.md +++ /dev/null @@ -1,43 +0,0 @@ -# `no-useless-return` - -Disallows redundant return statements. - -This is the exact same thing as the ESLint [`no-useless-return`](https://eslint.org/docs/latest/rules/no-useless-return) rule, except the auto-fixer is disabled. - -## Rule Details - -This version of the rule without an autofixer is useful because it is common during development to comment out code after an [early return](https://medium.com/swlh/return-early-pattern-3d18a41bba8). In these cases, the auto-fixer is harmful, since it would require us to manually go put the return statement back after uncommenting the code. - -## Gotchas - -If you use this rule, make sure to turn off the vanilla ESLint rule, like this: - -```json -{ - "rules": { - "no-useless-return": "off" - } -} -``` - -Otherwise, the two rules will conflict with each other. - -Note that if you use the `recommended` config that comes with this plugin, then the vanilla ESLint rule will be turned off automatically. - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-useless-return": "error" - } -} -``` - -This rule is not configurable. (All of the unsafe options from the original have been removed.) - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-useless-return.ts) -- [Test source](../../tests/rules/no-useless-return.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/no-void-return-type.md b/packages/eslint-plugin-isaacscript/docs/rules/no-void-return-type.md deleted file mode 100644 index 8a259b799..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/no-void-return-type.md +++ /dev/null @@ -1,39 +0,0 @@ -# `no-void-return-type` - -Disallows `void` return types on non-exported functions. - -## Rule Details - -Most of the time, programmers do not bother typing `void` after the functions that they write, since this return type is implied by default. Adding the `void` annotation to every function would clutter the code. - -With that said, some codebases use the [`explicit-module-boundary-types`](https://typescript-eslint.io/rules/explicit-module-boundary-types/) ESLint rule, which requires that you annotate the type for every exported function. So in this case, typing the `void` is required for some functions. - -However, from time to time, programmers will refactor exported functions to non-exported functions. After doing this, the largely-superfluous `void` annotation will remain in the code, causing clutter. - -To solve the problem, use this lint rule to automatically remove void return types on non-exported functions. - -```ts -// Bad -function foo(): void {} - -// Good -function foo() {} -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/no-void-return-type": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/no-void-return-type.ts) -- [Test source](../../tests/rules/no-void-return-type.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/prefer-const.md b/packages/eslint-plugin-isaacscript/docs/rules/prefer-const.md deleted file mode 100644 index b736f85b8..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/prefer-const.md +++ /dev/null @@ -1,43 +0,0 @@ -# `prefer-const` - -Requires `const` declarations for variables that are never reassigned after declared. - -This is the exact same thing as the ESLint [`prefer-const`](https://eslint.org/docs/latest/rules/prefer-const) rule, except the auto-fixer is disabled. - -## Rule Details - -This version of the rule without an autofixer is useful because it is common during development to comment out code that modifies a `let` variable. In these cases, the auto-fixer is harmful, since it would require us to manually go change the `const` back to a `let` after uncommenting the code to put it back the way it way. - -## Gotchas - -If you use this rule, make sure to turn off the vanilla ESLint rule, like this: - -```json -{ - "rules": { - "prefer-const": "off" - } -} -``` - -Otherwise, the two rules will conflict with each other. - -Note that if you use the `recommended` config that comes with this plugin, then the vanilla ESLint rule will be turned off automatically. - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/prefer-const": "error" - } -} -``` - -This rule is not configurable. (All of the unsafe options from the original have been removed.) - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/prefer-const.ts) -- [Test source](../../tests/rules/prefer-const.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/prefer-plusplus.md b/packages/eslint-plugin-isaacscript/docs/rules/prefer-plusplus.md deleted file mode 100644 index 8bcdf2188..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/prefer-plusplus.md +++ /dev/null @@ -1,47 +0,0 @@ -# `prefer-plusplus` - -Require `++` or `--` operators instead of assignment operators where applicable. - -## Rule Details - -The [`operator-assignment`](https://eslint.org/docs/latest/rules/operator-assignment) ESLint rule converts `x = x + 1` to `x += 1`. This is a fantastic rule because it makes code more concise and easier to read. (Technically, the code would be more confusing for people who don't know what the "+=" operator does, but this is not an issue in most cases.) - -Building on this logic, it also makes sense to convert `x += 1` to `x++`, which is even more concise and easier to read. (Again, we make the assumption that everyone knows what the "++" operator does, which should be a pretty safe bet.) - -However, the `++` operator is historically controversial in JavaScript. For example, [the Airbnb style guide gives this justification](https://github.com/airbnb/javascript#variables--unary-increment-decrement): - -> Why? Per the eslint documentation, unary increment and decrement statements are subject to automatic semicolon insertion and can cause silent errors with incrementing or decrementing values within an application. It is also more expressive to mutate your values with statements like `num += 1` instead of `num++` or `num ++`. Disallowing unary increment and decrement statements also prevents you from pre-incrementing/pre-decrementing values unintentionally which can also cause unexpected behavior in your programs. - -This justification does not apply if you use the combination of: - -- The [Prettier](https://prettier.io/) autoformatter (which automatically inserts semicolons for you) -- The [`isaacscript/no-unsafe-plusplus`](no-unsafe-plusplus.md) rule (which prevents usage of `++i` where swapping it to `i++` would change the functionality of the program) -- The [`isaacscript/prefer-postfix-plusplus`](prefer-postfix-plusplus) rule (which prevents usage of `++i` in favor of `i++`) - -Together, these heavily restrict the usage of the operator, making the only legal usage equal to that of "+= 1". - -```ts -// Bad -i += 1; - -// Good -i++; -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/prefer-plusplus": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/prefer-plusplus.ts) -- [Test source](../../tests/rules/prefer-plusplus.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/prefer-postfix-plusplus.md b/packages/eslint-plugin-isaacscript/docs/rules/prefer-postfix-plusplus.md deleted file mode 100644 index c0684d1c9..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/prefer-postfix-plusplus.md +++ /dev/null @@ -1,39 +0,0 @@ -# `prefer-postfix-plusplus` - -Require `i++` instead of `++i` (and `i--` instead of `--i`). - -## Rule Details - -Most of the time, the `++` operator is used inside of a for loop, which is pretty easy to understand. In this simple case, switching `i++` to `++i` does not functionally change the program in any way. However, this is not always the case. In some situations, changing `++i` to `i++` _does_ result in functionally different code. In these cases, it is usually done specifically by the programmer to take take advantage of the prefix functionality. - -Sometimes, using prefix `++` and `--` is the most concise way to write code. But since this usage is so rare in JavaScript/TypeScript, other people reading the code can get confused. So, it can be a good idea to replace prefix operators with more standard code, which can make things a bit less arcane at the cost of a little verbosity. - -Thus, this rule is meant to be used with the [`no-unsafe-plusplus`](no-unsafe-plusplus.md) ESLint rule, which ensures that code like in the previous example can be identified and removed. The remaining cases of `++i` in your code-base can be safety converted to the more-standard `i++`, which will make your code more uniform. - -```ts -// Bad -++foo; ---foo; - -// Good -foo++; -foo--; -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/prefer-postfix-plusplus": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/prefer-postfix-plusplus.ts) -- [Test source](../../tests/rules/prefer-postfix-plusplus.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin-isaacscript/docs/rules/prefer-readonly-parameter-types.md deleted file mode 100644 index 30befc322..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/prefer-readonly-parameter-types.md +++ /dev/null @@ -1,14 +0,0 @@ -# `prefer-readonly-parameter-types` - -Require function parameters to be typed as `readonly` to prevent accidental mutation of inputs. - -This is the same thing as the [`@typescript-eslint/prefer-readonly-parameter-types`](https://typescript-eslint.io/rules/prefer-readonly-parameter-types/) rule, with the follow changes: - -- The `allow` array is hard-coded to always contain `ReadonlyMap` and `ReadonlySet`. -- An additional option of "onlyRecordsArraysMapsSet" is added. This option will make the rule only examine a function parameter if it is a record, an array, a tuple, a map, or a set. (In other words, only "simple" types.) The option defaults to true. The motivation behind this option is that it reduces a ton of false positives, which still retaining the core value of the rule. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/prefer-readonly-parameter-types.ts) -- [Test source](../../tests/rules/prefer-readonly-parameter-types.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/require-break.md b/packages/eslint-plugin-isaacscript/docs/rules/require-break.md deleted file mode 100644 index c4e2042dc..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/require-break.md +++ /dev/null @@ -1,58 +0,0 @@ -# `require-break` - -Requires that each non-fallthrough case of a switch statement has a `break` statement. - -## Rule Details - -The [`no-fallthrough`](https://eslint.org/docs/latest/rules/no-fallthrough) core ESLint rule helps to ensure that switch statements do not accidentally "fall through", which is a common mistake. It does this by ensuring that you put a break statement (or a `return`/`throw`) in every non-empty switch case. - -However, it does not enforce a `break` statement on the final case. This makes sense, because there is nothing that the final case could ever fallthrough to. With that said, it can still be desirable to enforce a `break` statement for the final case. Doing this makes switch arms look more consistent, makes switch arms more resilient to reorganization, and reduces Git noise when a new switch case is added at the bottom. (This is similar to the benefits provided by trailing commas.) - -This rule enforces `break` statements on the final case. - -Note that this rule will still apply even if the final case is a `default` case, and this is intentional. Assuming that `default` cases are always at the bottom of a switch statement (using the [`default-case-last`](default-case-last) rule), `default` cases are distinct from other case statements in that they would not ever need to be reorganized or have something added underneath. So, the reasons for wanting a `break` statement in a `default` case are less intuitive. First, having "empty" `default` cases are sometimes required in order to satisfy the [`@typescript-eslint/switch-exhaustiveness-check`](https://typescript-eslint.io/rules/switch-exhaustiveness-check/) rule (e.g. when you only want to define behavior for 2 out of 10 enum members). In these cases, a `break` statement is useful to order to avoid triggering the [`no-empty`](no-empty) rule and to avoid the appearance of the arm being unfinished. Thus, since `break` statements might be desired for otherwise-empty `default` cases, it can make sense to enforce them in every `default` case across a codebase for consistency. - -```ts -// Bad -switch (foo) { - case 1: { - doSomething1(); - break; - } - - case 2: { - doSomething2(); - } -} - -// Good -switch (foo) { - case 1: { - doSomething1(); - break; - } - - case 2: { - doSomething2(); - break; - } -} -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/require-break": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/require-break.ts) -- [Test source](../../tests/rules/require-break.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/require-capital-const-assertions.md b/packages/eslint-plugin-isaacscript/docs/rules/require-capital-const-assertions.md deleted file mode 100644 index 9dbfbb39e..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/require-capital-const-assertions.md +++ /dev/null @@ -1,81 +0,0 @@ -# `require-capital-const-assertions` - -Requires a capital letter for named objects and arrays that have a [const assertion](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions). - -## Rule Details - -In TypeScript: - -- Variables are usually typed with [camelCase](https://en.wikipedia.org/wiki/Camel_case) names. -- Types, interfaces, enums, and classes are usually typed with [PascalCase](https://techterms.com/definition/pascalcase) names. -- Static constants are usually typed with [SCREAMING_SNAKE_CASE](https://en.wikipedia.org/wiki/Snake_case) names. - -Thus, when a variable is typed with a capital letter, it is heavily implied that it is acting as an enum, some other type-like value, or a read-only constant. - -The `enum` construct that is built-in to TypeScript makes things immutable by default. However, not everyone uses the built-in enums for various reasons. And in some cases, like when the enum values are the results of a function, you can't use the built-in enums at all. Thus, it is common to see plain objects representing enums in both JavaScript and TypeScript code. - -Since enums should never be modified, it almost always makes sense to use the [const assertions](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) feature of TypeScript on objects that are representing an enum. Doing so will automatically make every property read-only without having to manually type it on every single field. - -Similarly, the same logic applies to objects or arrays that are representing a static, read-only constant - they should also always have a const assertion. - -Use this rule to ensure read-only fields on all of the enums and constants throughout your codebase to keep things as safe as possible. - -```ts -// Bad -// (object acting as a number enum) -const Foo = { - Value1: 1, - Value2: 2, - Value3: 3, -}; - -// Good -// (object acting as a number enum) -const Foo = { - Value1: 1, - Value2: 2, - Value3: 3, -} as const; - -// Bad -// (object acting as a static map) -const FOO = { - [MyEnum.Value1]: "something1", - [MyEnum.Value2]: "something2", - [MyEnum.Value3]: "something3", -}; - -// Good -// (object acting as a static map) -const FOO = { - [MyEnum.Value1]: "something1", - [MyEnum.Value2]: "something2", - [MyEnum.Value3]: "something3", -} as const; - -// Bad -// (array acting as a static constant) -const FOO = [1, 2, 3]; - -// Good -// (array acting as a static constant) -const FOO = [1, 2, 3] as const; -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/require-capital-const-assertions": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/require-capital-const-assertions.ts) -- [Test source](../../tests/rules/require-capital-const-assertions.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/require-capital-read-only.md b/packages/eslint-plugin-isaacscript/docs/rules/require-capital-read-only.md deleted file mode 100644 index 231bea17c..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/require-capital-read-only.md +++ /dev/null @@ -1,78 +0,0 @@ -# `require-capital-read-only` - -Requires maps/sets/arrays with a capital letter to be read-only. - -## Rule Details - -In TypeScript: - -- Variables are usually typed with [camelCase](https://en.wikipedia.org/wiki/Camel_case) names. -- Static constants are usually typed with [SCREAMING_SNAKE_CASE](https://en.wikipedia.org/wiki/Snake_case) names. - -Thus, when a map, set, array, or object is typed with a capital letter, it is heavily implied that it is acting as a static constant. Since maps, sets, and arrays are writable by default, it is common to explicitly type these kinds of constants with `ReadonlyMap` or `ReadonlySet` or `readonly Foo[]` or `Readonly` to enforce that they can never be modified later on, which prevents bugs. However, it can be difficult to remember to do this every single time. - -Use this rule to ensure that the SCREAMING_SNAKE_CASE variables are read-only throughout your codebase to keep things as safe as possible. - -Also see the [`require-capital-const-assertions` rule](require-capital-const-assertions.md). - -```ts -// Bad -const MY_MAP = new Map([ - [1, 2], - [3, 4], - [5, 6], -]); - -// Good -const MY_MAP: ReadonlyMap = new Map([ - [1, 2], - [3, 4], - [5, 6], -]); - -// Bad -const MY_SET = new Set([1, 2, 3]); - -// Good -const MY_SET: ReadonlySet = new Set([1, 2, 3]); - -// Bad -const MY_ARRAY = [1, 2, 3]; - -// Good -const MY_ARRAY: readonly number[] = [1, 2, 3]; - -// Bad -const MY_OBJECT = { - foo: 123, - bar: 456, -}; - -// Good -interface Foo { - foo: number; - bar: number; -} -const MY_OBJECT: Readonly = { - foo: 123, - bar: 456, -}; -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/require-capital-read-only": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/require-capital-read-only.ts) -- [Test source](../../tests/rules/require-capital-read-only.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/require-unannotated-const-assertions.md b/packages/eslint-plugin-isaacscript/docs/rules/require-unannotated-const-assertions.md deleted file mode 100644 index 822c441c0..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/require-unannotated-const-assertions.md +++ /dev/null @@ -1,35 +0,0 @@ -# `require-unannotated-const-assertions` - -Disallows explicit type annotations for variables that have a [const assertion](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions). - -## Rule Details - -A "const assertion" is a useful feature of TypeScript that changes the type to the narrowest possible setting. Good TypeScript codebases will make heavy use of this feature in order to make their variables as safe as possible. - -However, if a variable has both an explicit type annotation and a const assertion, then the const assertion will be ignored and the type annotation will take precedence. Thus, this situation is almost always a mistake, and you should choose to have _either_ a type annotation or a const assertion (with the latter being the generally safer option). - -```ts -// Bad -const array: number[] = [1, 2, 3] as const; - -// Good -const array = [1, 2, 3] as const; -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/require-unannotated-const-assertions": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/require-unannotated-const-assertions.ts) -- [Test source](../../tests/rules/require-unannotated-const-assertions.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/require-variadic-function-argument.md b/packages/eslint-plugin-isaacscript/docs/rules/require-variadic-function-argument.md deleted file mode 100644 index dc6ec05ef..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/require-variadic-function-argument.md +++ /dev/null @@ -1,61 +0,0 @@ -# `require-variadic-function-argument` - -Requires that variadic functions must be supplied with at least one argument. - -## Rule Details - -[Variadic functions](https://en.wikipedia.org/wiki/Variadic_function) are functions that take a variable amount of arguments. However, as far as the TypeScript compiler is concerned, passing no arguments at all to a variadic function is legal. But doing this is usually a bug. For example: - -```ts -const myArray = [1, 2, 3]; -myArray.push(); // Oops! -``` - -Here, the author of the code made a typo and forgot to supply the thing to be inserted into the array. Thus, the `myArray.push` line is a no-op. - -To protect against these kinds of errors, this rule requires that you always pass at least one argument to a variadic function. - -## Hard-Coded Exceptions - -This rule is hard-coded to not throw an error with `console` methods (such as `console.log` or `console.error`), since: - -1. It is relatively common to use these functions with no arguments in order to print a newline. -2. The TypeScript signatures for those functions are weird in that they have a rest parameter as the second parameter instead of the first one. - -Additionally, this rule will not be flagged for `setTimeout` or `setInterval`, since those rest parameters are optional. - -## JSDoc Exceptions - -Sometimes, a variadic function can be written to intentionally allow for zero arguments. If this is the case, you can use a `@allowEmptyVariadic` JSDoc tag inside of the JSDoc comment for the function. Then, this rule will ignore any calls of that function. - -For example, something like the following: - -```ts -/** - * Helper function to get all of the cars in the database. By default, it will return every car. - * - * You can optionally specify one or more car types to return only the cars that match the specified - * car types. - * - * @allowEmptyVariadic - */ -function getCars(...carTypes: CarType[]) {} -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/require-variadic-function-argument": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/require-variadic-function-argument.ts) -- [Test source](../../tests/rules/require-variadic-function-argument.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/strict-array-methods.md b/packages/eslint-plugin-isaacscript/docs/rules/strict-array-methods.md deleted file mode 100644 index 4c8113e75..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/strict-array-methods.md +++ /dev/null @@ -1,49 +0,0 @@ -# `strict-array-methods` - -Requires boolean return types on the following array method functions: - -- [`Array.prototype.every`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every) -- [`Array.prototype.filter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) -- [`Array.prototype.find`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find) -- [`Array.prototype.findIndex`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex) -- [`Array.prototype.findLast`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findLast) -- [`Array.prototype.findLastIndex`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findLastIndex) -- [`Array.prototype.some`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some) - -## Rule Details - -Normally, the [`@typescript-eslint/strict-boolean-expressions`](https://typescript-eslint.io/rules/strict-boolean-expressions/) ESLint rule catches bugs where you are supposed to put a boolean value but accidentally put something else. Unfortunately, [that rule does not catch this mistake when using array methods](https://github.com/typescript-eslint/typescript-eslint/issues/8016). - -Thus, an additional ESLint rule is necessary to handle this. - -```ts -// Bad -const numbers: number[] = []; -const filteredNumbers = numbers.filter((element) => { - return element; -}); - -// Good -const numbers: number[] = []; -const filteredNumbers = numbers.filter((element) => { - return element !== 0; -}); -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/strict-array-methods": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/strict-array-methods.ts) -- [Test source](../../tests/rules/strict-array-methods.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/strict-enums.md b/packages/eslint-plugin-isaacscript/docs/rules/strict-enums.md deleted file mode 100644 index 4f03baecb..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/strict-enums.md +++ /dev/null @@ -1,146 +0,0 @@ -# `strict-enums` - -Disallows the usage of unsafe enum patterns. Designed to be used in addition to [`@typescript-eslint/no-unsafe-enum-comparison`](https://typescript-eslint.io/rules/no-unsafe-enum-comparison). - -## Rule Details - -Horrifyingly, the TypeScript compiler will allow you to use number literals interchangeably with number enums. For example: - -```ts -enum Fruit { - Apple, - Banana, -} - -let fruit = Fruit.Apple; -fruit = 1; // No error! -``` - -The above code snippet should instead be written as `fruit = Fruit.Banana`. Allowing raw numeric literals subverts the whole point of using enums in the first place. - -This type-checking looseness has resulted in many TypeScript programmers avoiding the use of enums altogether in favor of arrays and/or string unions. Other TypeScript programmers avoid number enums in favor of string enums (which have better safety guarantees from the TypeScript compiler). However, [numeric enums have some advantages over string enums](#number-enums-vs-string-enums). - -In the cases where you need to use number enums, you should use this lint rule to make number enums just as safe as string enums are. See the examples below for the types of patterns that are prevented. - -## Goals - -The goal of this rule is to make enums work like they do in other languages. One of the main benefits of enums is that they allow you to write code that is future-safe, because enums are supposed to be resilient to reorganization. If you arbitrarily change the values of an enum (or change the ordering of an enum with computed values), the idea is that nothing in your code-base should break. - -## Banned Patterns - -This rule bans: - -1. Enum incrementing/decrementing - `incorrectIncrement` -1. Mismatched enum declarations/assignments - `mismatchedAssignment` -1. Mismatched enum function arguments - `mismatchedFunctionArgument` - -(It does not ban mismatched enum comparisons, since that is handled by [`@typescript-eslint/no-unsafe-enum-comparison`](https://typescript-eslint.io/rules/no-unsafe-enum-comparison).) - - - -### ❌ Incorrect - -```ts -let fruit = Fruit.Apple; -fruit++; -``` - -```ts -const fruit: Fruit = 0; -``` - -```ts -function useFruit(fruit: Fruit) {} -useFruit(0); -``` - -### ✅ Correct - -```ts -let fruit = Fruit.Apple; -fruit = Fruit.Banana; -``` - -```ts -const fruit = Fruit.Apple; -``` - -```ts -let fruit = Fruit.Apple; -fruit = Fruit.Banana; -``` - -```ts -function useFruit(fruit: Fruit) {} -useFruit(Fruit.Apple); -``` - -## Error Information - -- `incorrectIncrement` - You cannot increment or decrement an enum type. - - Enums are supposed to be resilient to reorganization, so you should explicitly assign a new value instead. For example, if someone someone reassigned/reordered the values of the enum, then it could potentially break your code. -- `mismatchedAssignment` - The type of the assignment does not match the declared enum type of the variable. - - In other words, you are trying to assign a `Foo` enum value to a variable with a `Bar` type. Enums are supposed to be resilient to reorganization, so these kinds of assignments can be dangerous. -- `mismatchedFunctionArgument` - The argument in the function call does not match the declared enum type of the function signature. - - You might be trying to use a number literal, like `useFoo(1)`. Or, you might be trying to use a disparate enum type, like `useFoo(Bar.Value1)`. Either way, you need to use a value that corresponds to the correct enum, like `useFoo(Foo.Value1)`. Enums are supposed to be resilient to reorganization, so non-exact function calls like this can be dangerous. - -## Number Enums vs String Enums - -Surprisingly, the TypeScript compiler deals with string enums in a safer way than it does with number enums. If we duplicate the first example above by using a string enum, the TypeScript compiler will correctly throw an error: - -```ts -enum Vegetable { - Lettuce = "Lettuce", - Carrot = "Carrot", -} - -let vegetable = Vegetable.Lettuce; -vegetable = "Carrot"; // Type '"Carrot"' is not assignable to type 'Vegetable'. -``` - -Thus, the `isaacscript/strict-enums` rule is mostly concerned with throwing errors for misused number enums. (Note that even if you use string enums, you should still be using the [`@typescript-eslint/no-unsafe-enum-comparison`](https://typescript-eslint.io/rules/no-unsafe-enum-comparison) rule, since string enums are still bugged when using comparison operators or switch statements.) - -But why would you want to use numeric enums over string enums at all? Note that they have some advantages: - -- Numeric enums can use computed members, which allow for extremely concise and easy to read code. Additionally, when all of the enum members are computed, they can easily be reorganized without having to change N other lines, which causes lot of noise in Git. -- Numeric enums can save memory in the cases where the codebase has a huge amount of them (such as [the `@typescript-eslint` repository](https://github.com/typescript-eslint/typescript-eslint/)). -- Numeric enums can save bandwidth in the cases where they are serialized over the wire. This can matter in applications that do a lot of back and forth communication (with e.g. WebSockets) or in cases where you have millions of users and the tiny amount of bandwidth saved scales to big numbers. -- Numeric enums often have to be used when modelling upstream APIs that you don't have control over. - -For this reason, we recommend that use you the [`isaacscript/no-number-enums`](no-number-enums.md) rule by default in your TypeScript projects. But in the specific projects where you need number enums, you can disable that rule and rely on the `isaacscript/strict-enums` rule to keep you safe. - -## Limitations - -### The `satisfies` Operator - -The `strict-enums` rule cannot see through the `satisfies` operator. In other words, this rule will not be able to catch the following bug: - -```ts -enum Fruit { - Apple, - Banana, -} - -const FRUIT_PRICES = { - [Fruit.Apple]: 5, - [1]: 10, // Bug! -} as const satisfies Record; -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/strict-enums": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/strict-enums.ts) -- [Test source](../../tests/rules/strict-enums.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/strict-undefined-functions.md b/packages/eslint-plugin-isaacscript/docs/rules/strict-undefined-functions.md deleted file mode 100644 index 657bd713b..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/strict-undefined-functions.md +++ /dev/null @@ -1,40 +0,0 @@ -# `strict-undefined-functions` - -Disallows empty return statements in functions annotated as returning undefined. - -## Rule Details - -`void` is different from `undefined` in that `undefined` is a value and `void` is the lack of any value. Thus, it is confusing if someone is returning nothing from a function that is annotated as returning `undefined`. In general, this is indication that either the return type of the function should be changed to `void` or that `undefined` should be explicitly returned. - -```ts -// Bad -function foo(): undefined { - return; -} - -// Bad -function foo(): undefined {} - -// Good -function foo(): undefined { - return undefined; -} -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/strict-undefined-functions": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/strict-undefined-functions.ts) -- [Test source](../../tests/rules/strict-undefined-functions.test.ts) diff --git a/packages/eslint-plugin-isaacscript/docs/rules/strict-void-functions.md b/packages/eslint-plugin-isaacscript/docs/rules/strict-void-functions.md deleted file mode 100644 index 81c4c3872..000000000 --- a/packages/eslint-plugin-isaacscript/docs/rules/strict-void-functions.md +++ /dev/null @@ -1,42 +0,0 @@ -# `strict-void-functions` - -Disallows non-empty return statements in functions annotated as returning void. - -## Rule Details - -`void` is different from `undefined` in that `undefined` is a value and `void` is the lack of any value. Thus, it is confusing if someone is explicitly returning `undefined` from a function that is annotated as returning `void`. In general, this is indication that either the return type of the function should be changed to `undefined` or the predicate of the `return` statement is superfluous. - -```ts -// Bad -function foo(): void { - return undefined; -} - -// Good -function foo(): void { - return; -} - -// Good -function foo(): undefined { - return undefined; -} -``` - -## Options and Defaults - -```json -{ - "rules": { - "isaacscript/strict-void-functions": "error" - } -} -``` - -This rule is not configurable. - -## Resources - -- [How to use this rule](../../README.md#install--usage) -- [Rule source](../../src/rules/strict-void-functions.ts) -- [Test source](../../tests/rules/strict-void-functions.test.ts) diff --git a/packages/eslint-plugin-isaacscript/eslint.config.mjs b/packages/eslint-plugin-isaacscript/eslint.config.mjs index 6275ba3c5..b383264f6 100644 --- a/packages/eslint-plugin-isaacscript/eslint.config.mjs +++ b/packages/eslint-plugin-isaacscript/eslint.config.mjs @@ -1,39 +1,20 @@ -import tseslint from "typescript-eslint"; -import { base } from "../eslint-config-isaacscript/base.js"; -import { monorepo } from "../eslint-config-isaacscript/monorepo.js"; +// @ts-check -export default tseslint.config( - ...base, - ...monorepo, +import { completeConfigBase } from "eslint-config-complete"; +import { defineConfig } from "eslint/config"; + +export default defineConfig( + ...completeConfigBase, { rules: { - /** - * Defined at: base-unicorn.js - * - * This is a common pattern in the testing files. - */ - "unicorn/no-array-push-push": "off", - - /** - * Defined at: base-unicorn.js - * - * The ESLint API uses `null`. - */ - "unicorn/no-null": "off", + /** This rule conflicts with this plugin's testing style. */ + "unicorn/prefer-single-call": "off", - /** - * Defined at: base-eslint.js - * - * Some rules use bitwise operators to deal with TypeScript bit flags. - */ + /** Some rules use bitwise operators to deal with TypeScript bit flags. */ "no-bitwise": "off", - /** - * Defined at: base-eslint.js - * - * We commonly trim the incoming text. - */ + /** We commonly trim the incoming text. */ "no-param-reassign": "off", }, }, diff --git a/packages/eslint-plugin-isaacscript/jest.config.mjs b/packages/eslint-plugin-isaacscript/jest.config.mjs index 351e76015..87e4f469a 100644 --- a/packages/eslint-plugin-isaacscript/jest.config.mjs +++ b/packages/eslint-plugin-isaacscript/jest.config.mjs @@ -1,4 +1,7 @@ +// @ts-check + export default { + // Even though we are not using `ts-jest`, we must apply the same ESM fix as documented here: // https://github.com/swc-project/jest/issues/64#issuecomment-1029753225 moduleNameMapper: { "^(\\.{1,2}/.*)\\.js$": "$1", diff --git a/packages/eslint-plugin-isaacscript/package.json b/packages/eslint-plugin-isaacscript/package.json index 5c86d6733..1b585f077 100644 --- a/packages/eslint-plugin-isaacscript/package.json +++ b/packages/eslint-plugin-isaacscript/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-isaacscript", - "version": "3.12.2", + "version": "4.0.0", "description": "An ESLint plugin that contains useful rules.", "keywords": [ "eslint", @@ -30,12 +30,9 @@ "license": "MIT", "author": "Zamiell", "type": "module", - "main": "./dist/index.js", + "main": "./dist/src/index.js", "files": [ - "dist", - "LICENSE", - "package.json", - "README.md" + "dist" ], "scripts": { "build": "tsx ./scripts/build.ts", @@ -45,9 +42,20 @@ "test": "jest" }, "dependencies": { - "@typescript-eslint/type-utils": "^8.1.0", - "@typescript-eslint/utils": "^8.1.0", - "typescript-eslint": "^8.1.0" + "@typescript-eslint/type-utils": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "typescript-eslint": "8.57.1" + }, + "devDependencies": { + "@babel/core": "7.29.0", + "@babel/preset-env": "7.29.2", + "@babel/preset-typescript": "7.28.5", + "@types/jest": "30.0.0", + "@typescript-eslint/rule-tester": "8.57.1", + "complete-common": "2.21.0", + "complete-node": "16.4.0", + "jest": "30.3.0", + "prettier": "3.8.1" }, "peerDependencies": { "eslint": ">= 9.0.0", diff --git a/packages/eslint-plugin-isaacscript/scripts/build.ts b/packages/eslint-plugin-isaacscript/scripts/build.ts index deebddf28..a961ea59d 100644 --- a/packages/eslint-plugin-isaacscript/scripts/build.ts +++ b/packages/eslint-plugin-isaacscript/scripts/build.ts @@ -1,42 +1,6 @@ -import { - $s, - PACKAGE_JSON, - buildScript, - cp, - mkdir, - rm, -} from "isaacscript-common-node"; -import { assertDefined } from "isaacscript-common-ts"; -import path from "node:path"; +import { $, buildScript, copyToMonorepoNodeModules } from "complete-node"; -await buildScript(({ outDir, packageRoot }) => { - assertDefined( - outDir, - 'Failed to get the "outDir" from the "tsconfig.json" file.', - ); - - $s`tsc`; - copyToMonorepoNodeModules(packageRoot, outDir); +await buildScript(import.meta.dirname, async (packageRoot) => { + await $`tsc`; + await copyToMonorepoNodeModules(packageRoot); }); - -/** - * We copy the build output to the "node_modules" folder at the root of the monorepo. This obviates - * the need for the monorepo to consume the actual npm package. (The ESLint config for the monorepo - * needs the compiled JavaScript in order to work properly.) - */ -function copyToMonorepoNodeModules(packageRoot: string, outDir: string) { - const monorepoRoot = path.join(packageRoot, "..", ".."); - const monorepoPluginDir = path.join( - monorepoRoot, - "node_modules", - "eslint-plugin-isaacscript", - ); - rm(monorepoPluginDir); - - mkdir(monorepoPluginDir); - const newPackageJSONPath = path.join(monorepoPluginDir, PACKAGE_JSON); - cp(PACKAGE_JSON, newPackageJSONPath); - - const monorepoPluginDistDir = path.join(monorepoPluginDir, "dist"); - cp(outDir, monorepoPluginDistDir); -} diff --git a/packages/eslint-plugin-isaacscript/scripts/constants.ts b/packages/eslint-plugin-isaacscript/scripts/constants.ts index 35f958352..093627891 100644 --- a/packages/eslint-plugin-isaacscript/scripts/constants.ts +++ b/packages/eslint-plugin-isaacscript/scripts/constants.ts @@ -1,5 +1,13 @@ import path from "node:path"; -export const PLUGIN_NAME = "isaacscript"; -export const PACKAGE_ROOT = path.join(import.meta.dirname, ".."); -export const REPO_ROOT = path.join(PACKAGE_ROOT, "..", ".."); +const packageRoot = path.resolve(import.meta.dirname, ".."); +const packageName = path.basename(packageRoot); +const packageNameWords = packageName.split("-"); +const pluginName = packageNameWords.at(-1); +if (pluginName === undefined || pluginName === "") { + throw new Error("Failed to parse the plugin name from the package name."); +} + +export const PLUGIN_NAME = pluginName; +export const PACKAGE_ROOT = path.resolve(import.meta.dirname, ".."); +export const REPO_ROOT = path.resolve(PACKAGE_ROOT, "..", ".."); diff --git a/packages/eslint-plugin-isaacscript/scripts/createRule.ts b/packages/eslint-plugin-isaacscript/scripts/createRule.ts index aa29b2517..d92b6da39 100644 --- a/packages/eslint-plugin-isaacscript/scripts/createRule.ts +++ b/packages/eslint-plugin-isaacscript/scripts/createRule.ts @@ -1,5 +1,5 @@ -import { echo, readFile, writeFile } from "isaacscript-common-node"; -import { isKebabCase, trimSuffix } from "isaacscript-common-ts"; +import { isKebabCase, trimSuffix } from "complete-common"; +import { echo, readFile, writeFile } from "complete-node"; import path from "node:path"; import { PACKAGE_ROOT, PLUGIN_NAME } from "./constants.js"; import { generateAll } from "./generate.js"; @@ -45,23 +45,23 @@ async function createRule() { throw new Error("The rule description cannot end with a period."); } - createDocFile(ruleName, description); - createSourceFile(ruleName, description); - createTestFile(ruleName, description); + await createDocFile(ruleName, description); + await createSourceFile(ruleName, description); + await createTestFile(ruleName, description); await generateAll(); echo(`Successfully created rule: ${ruleName}`); } -function createDocFile(ruleName: string, description: string) { - const templateMDContent = readFile(TEMPLATE_MD_PATH); +async function createDocFile(ruleName: string, description: string) { + const templateMDContent = await readFile(TEMPLATE_MD_PATH); const content = replaceTemplateText(templateMDContent, ruleName, description); const ruleMDPath = path.join(DOCS_PATH, "rules", `${ruleName}.md`); - writeFile(ruleMDPath, content); + await writeFile(ruleMDPath, content); } -function createSourceFile(ruleName: string, description: string) { - const templateSourceContent = readFile(TEMPLATE_SRC_PATH); +async function createSourceFile(ruleName: string, description: string) { + const templateSourceContent = await readFile(TEMPLATE_SRC_PATH); const content = replaceTemplateText( templateSourceContent, ruleName, @@ -69,11 +69,11 @@ function createSourceFile(ruleName: string, description: string) { ); const contentWithoutComments = removeFirstAndLastLine(content); const ruleSourcePath = path.join(SRC_PATH, "rules", `${ruleName}.ts`); - writeFile(ruleSourcePath, contentWithoutComments); + await writeFile(ruleSourcePath, contentWithoutComments); } -function createTestFile(ruleName: string, description: string) { - const templateTestContent = readFile(TEMPLATE_TEST_PATH); +async function createTestFile(ruleName: string, description: string) { + const templateTestContent = await readFile(TEMPLATE_TEST_PATH); const content = replaceTemplateText( templateTestContent, ruleName, @@ -81,7 +81,7 @@ function createTestFile(ruleName: string, description: string) { ); const contentWithoutComments = removeFirstAndLastLine(content); const ruleTestPath = path.join(TESTS_PATH, "rules", `${ruleName}.test.ts`); - writeFile(ruleTestPath, contentWithoutComments); + await writeFile(ruleTestPath, contentWithoutComments); } function replaceTemplateText( diff --git a/packages/eslint-plugin-isaacscript/scripts/generate.ts b/packages/eslint-plugin-isaacscript/scripts/generate.ts index e1b2a1886..e31966568 100644 --- a/packages/eslint-plugin-isaacscript/scripts/generate.ts +++ b/packages/eslint-plugin-isaacscript/scripts/generate.ts @@ -1,9 +1,9 @@ -import { echo, isMain } from "isaacscript-common-node"; +import { echo, isMain } from "complete-node"; import { generateConfigs } from "./generateConfigs.js"; import { generateReadme } from "./generateReadme.js"; import { generateRules } from "./generateRules.js"; -if (isMain()) { +if (isMain(import.meta.filename)) { await generateAll(); } diff --git a/packages/eslint-plugin-isaacscript/scripts/generateConfigs.ts b/packages/eslint-plugin-isaacscript/scripts/generateConfigs.ts index 4680ac1f4..6bd9cfacd 100644 --- a/packages/eslint-plugin-isaacscript/scripts/generateConfigs.ts +++ b/packages/eslint-plugin-isaacscript/scripts/generateConfigs.ts @@ -1,7 +1,7 @@ // This generates the files in the "src/configs" directory. import type { TSESLint } from "@typescript-eslint/utils"; -import { writeFile } from "isaacscript-common-node"; +import { writeFile } from "complete-node"; import path from "node:path"; import { PACKAGE_ROOT } from "./constants.js"; import type { RuleDefinition } from "./utils.js"; @@ -26,25 +26,8 @@ const BASE_CONFIG = [ // The "plugins" property is populated in the "index.ts" file. plugins: {}, - rules: { - // The ESLint "eqeqeq" rule will conflict with the "isaacscript/eqeqeq-fix" rule. - eqeqeq: "off", - - // The ESLint "no-template-curly-in-string" rule will conflict with the - // "isaacscript/no-template-curly-in-string-fix" rule. - "no-template-curly-in-string": "off", - }, - }, - - // Disable some TypeScript-specific rules in JavaScript files. - { - files: ["**/*.js", "**/*.cjs", "**/*.mjs", "**/*.jsx"], - rules: { - "isaacscript/no-let-any": "off", - "isaacscript/no-object-any": "off", - "isaacscript/require-capital-const-assertions": "off", - "isaacscript/require-capital-read-only": "off", - }, + // The "rules" property is populated below. + rules: {}, }, ] as const satisfies TSESLint.FlatConfig.ConfigArray; @@ -69,7 +52,7 @@ async function recommended() { async function writeConfig( name: string, - config: TSESLint.FlatConfig.ConfigArray, + config: readonly TSESLint.FlatConfig.Config[], ) { const comment = getAutoGeneratedComment(); const code = `import type { TSESLint } from "@typescript-eslint/utils";\n\nexport const ${name}: TSESLint.FlatConfig.ConfigArray = ${JSON.stringify(config)};`; @@ -78,7 +61,7 @@ async function writeConfig( const fileName = `${name}.ts`; const filePath = path.join(CONFIGS_DIRECTORY_PATH, fileName); - writeFile(filePath, content); + await writeFile(filePath, content); } /** Reduces records to key/value pairs. */ diff --git a/packages/eslint-plugin-isaacscript/scripts/generateReadme.ts b/packages/eslint-plugin-isaacscript/scripts/generateReadme.ts index bd3ef30ba..190597ee0 100644 --- a/packages/eslint-plugin-isaacscript/scripts/generateReadme.ts +++ b/packages/eslint-plugin-isaacscript/scripts/generateReadme.ts @@ -1,7 +1,7 @@ // Generates the rules table in "README.md". -import { readFile, writeFile } from "isaacscript-common-node"; -import { assertDefined } from "isaacscript-common-ts"; +import { assertDefined } from "complete-common"; +import { readFile, writeFile } from "complete-node"; import path from "node:path"; import { PACKAGE_ROOT } from "./constants.js"; import type { RuleDefinition } from "./utils.js"; @@ -73,8 +73,8 @@ function getRuleTableRow(ruleEntry: [string, RuleDefinition]) { const isRecommended = isRecommendedRule(rule) ? EMOJI_RECOMMENDED : ""; const isFixable = rule.meta.fixable === undefined ? "" : EMOJI_FIXABLE; const requiresTypeInformation = - "requiresTypeChecking" in rule.meta.docs && - rule.meta.docs.requiresTypeChecking === true + "requiresTypeChecking" in rule.meta.docs + && rule.meta.docs.requiresTypeChecking === true ? EMOJI_REQUIRES_TYPE_INFORMATION : ""; @@ -100,7 +100,7 @@ async function updateFileContentInsideMark( text: string, marker: Marker, ) { - const originalFileText = readFile(filePath); + const originalFileText = await readFile(filePath); const modifiedFileText = replaceContentInsideMark( originalFileText, text, @@ -116,7 +116,7 @@ async function updateFileContentInsideMark( return; } - writeFile(filePath, formattedModifiedFileText); + await writeFile(filePath, formattedModifiedFileText); } function replaceContentInsideMark( diff --git a/packages/eslint-plugin-isaacscript/scripts/generateRules.ts b/packages/eslint-plugin-isaacscript/scripts/generateRules.ts index c501ba55b..a0d72775b 100644 --- a/packages/eslint-plugin-isaacscript/scripts/generateRules.ts +++ b/packages/eslint-plugin-isaacscript/scripts/generateRules.ts @@ -1,6 +1,6 @@ // Generates the "src/rules.ts" file. -import { getFileNamesInDirectory, writeFile } from "isaacscript-common-node"; +import { getFileNamesInDirectory, writeFile } from "complete-node"; import path from "node:path"; import { PACKAGE_ROOT } from "./constants.js"; import { @@ -14,17 +14,17 @@ const RULES_DIRECTORY_PATH = path.join(SRC_DIRECTORY_PATH, "rules"); export const RULES_TS_PATH = path.join(SRC_DIRECTORY_PATH, "rules.ts"); export async function generateRules(): Promise { - const ruleNames = getRuleNames(); + const ruleNames = await getRuleNames(); const comment = getAutoGeneratedComment(); const code = getRulesCode(ruleNames); const combined = comment + code; const content = await formatWithPrettier(combined, "typescript"); - writeFile(RULES_TS_PATH, content); + await writeFile(RULES_TS_PATH, content); } -function getRuleNames(): readonly string[] { - const fileNames = getFileNamesInDirectory(RULES_DIRECTORY_PATH); +async function getRuleNames(): Promise { + const fileNames = await getFileNamesInDirectory(RULES_DIRECTORY_PATH); const ruleNames = fileNames.map((fileName) => fileName.replace(/\.ts$/, "")); ruleNames.sort(); diff --git a/packages/eslint-plugin-isaacscript/scripts/lint.ts b/packages/eslint-plugin-isaacscript/scripts/lint.ts index 140788c26..0ade6ea8d 100644 --- a/packages/eslint-plugin-isaacscript/scripts/lint.ts +++ b/packages/eslint-plugin-isaacscript/scripts/lint.ts @@ -1,6 +1,5 @@ -import chalk from "chalk"; -import { $, echo, exit, lintScript, readFile } from "isaacscript-common-node"; -import { assertDefined } from "isaacscript-common-ts"; +import { assertDefined } from "complete-common"; +import { echo, exit, lintCommands, readFile } from "complete-node"; import path from "node:path"; import { generateAll } from "./generate.js"; import { CONFIGS_DIRECTORY_PATH } from "./generateConfigs.js"; @@ -16,24 +15,22 @@ const FILE_PATHS_TOUCHED_BY_GENERATE_SCRIPT = [ README_MD_PATH, ] as const; -await lintScript(async () => { - const promises = [ - $`tsc --noEmit`, - $`tsc --noEmit --project ./scripts/tsconfig.json`, - $`tsc --noEmit --project ./tests/tsconfig.json`, - $`eslint --max-warnings 0 .`, - ]; - await Promise.all(promises); +await lintCommands(import.meta.dirname, [ + "tsc --noEmit", + "tsc --noEmit --project ./scripts/tsconfig.json", + "tsc --noEmit --project ./tests/tsconfig.json", + "eslint --max-warnings 0 .", +]); - // We cannot do generation at the same time as the other linting because it changes the - // compilation output, creating a race condition. - await checkGenerateChangedFiles(); -}); +// We cannot do generation at the same time as the other linting because it changes the compilation +// output, creating a race condition. +await checkGenerateChangedFiles(); async function checkGenerateChangedFiles() { const fileContentsMap = new Map(); for (const filePath of FILE_PATHS_TOUCHED_BY_GENERATE_SCRIPT) { - const fileContents = readFile(filePath); + // eslint-disable-next-line no-await-in-loop + const fileContents = await readFile(filePath); fileContentsMap.set(filePath, fileContents); } @@ -41,7 +38,8 @@ async function checkGenerateChangedFiles() { let changed = false; for (const filePath of FILE_PATHS_TOUCHED_BY_GENERATE_SCRIPT) { - const newFileContents = readFile(filePath); + // eslint-disable-next-line no-await-in-loop + const newFileContents = await readFile(filePath); const oldFileContents = fileContentsMap.get(filePath); assertDefined( oldFileContents, @@ -49,16 +47,12 @@ async function checkGenerateChangedFiles() { ); if (oldFileContents !== newFileContents) { changed = true; - echo( - `The "${chalk.green( - "generate.ts", - )}" script changed the following file: ${chalk.green(filePath)}`, - ); - echo(`Run: ${chalk.green("npm run generate")}`); + echo(`The "generate.ts" script changed the following file: ${filePath}`); } } if (changed) { + echo('Run "npm run generate" and commit the changes.'); exit(1); } } diff --git a/packages/eslint-plugin-isaacscript/scripts/tsconfig.json b/packages/eslint-plugin-isaacscript/scripts/tsconfig.json index 5afad029c..81e995789 100644 --- a/packages/eslint-plugin-isaacscript/scripts/tsconfig.json +++ b/packages/eslint-plugin-isaacscript/scripts/tsconfig.json @@ -1,10 +1,12 @@ { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../../isaacscript-tsconfig/tsconfig.base.json", - "../../isaacscript-tsconfig/tsconfig.node.json", - "../../../tsconfig.monorepo.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], "include": ["*.ts"], diff --git a/packages/eslint-plugin-isaacscript/scripts/utils.ts b/packages/eslint-plugin-isaacscript/scripts/utils.ts index 156dee4a1..7cee5d247 100644 --- a/packages/eslint-plugin-isaacscript/scripts/utils.ts +++ b/packages/eslint-plugin-isaacscript/scripts/utils.ts @@ -1,5 +1,5 @@ import type { TSESLint } from "@typescript-eslint/utils"; -import { kebabCaseToCamelCase } from "isaacscript-common-ts"; +import { kebabCaseToCamelCase } from "complete-common"; import * as prettier from "prettier"; import { PLUGIN_NAME, REPO_ROOT } from "./constants.js"; @@ -13,7 +13,7 @@ export async function formatWithPrettier( ): Promise { const prettierConfig = await prettier.resolveConfig(REPO_ROOT); - return prettier.format(text, { + return await prettier.format(text, { parser: language, ...prettierConfig, }); @@ -27,7 +27,7 @@ export async function getRuleEntries(): Promise< const rulesFiles = await import("../src/rules.js"); const { rules } = rulesFiles; - return Object.entries(rules).sort((a, b) => a[0].localeCompare(b[0])); + return Object.entries(rules).toSorted((a, b) => a[0].localeCompare(b[0])); } export function getAutoGeneratedComment(): string { diff --git a/packages/eslint-plugin-isaacscript/src/comments.ts b/packages/eslint-plugin-isaacscript/src/comments.ts deleted file mode 100644 index 9681145cc..000000000 --- a/packages/eslint-plugin-isaacscript/src/comments.ts +++ /dev/null @@ -1,83 +0,0 @@ -import type { TSESLint, TSESTree } from "@typescript-eslint/utils"; - -/** - * Returns false for trailing comments like: - * - * ```ts - * const abc = 123; // Foo - * ``` - */ -export function isCommentOnOwnLine( - sourceCode: TSESLint.SourceCode, - comment: TSESTree.Comment, -): boolean { - const startLine = comment.loc.start.line; - const endLine = comment.loc.end.line; - - const previousToken = sourceCode.getTokenBefore(comment); - const previousTokenEndLine = - previousToken === null ? null : previousToken.loc.end.line; - const nextToken = sourceCode.getTokenAfter(comment); - const nextTokenStartLine = - nextToken === null ? null : nextToken.loc.start.line; - - return startLine !== previousTokenEndLine && endLine !== nextTokenStartLine; -} - -export function isEnumBlockLabel(text: string): boolean { - text = text.trim(); - - return ( - // e.g. CollectibleType.SAD_ONION - /^\w+\.\w+$/.test(text) || - // e.g. CollectibleType.SAD_ONION (1) - /^\w+\.\w+ \(\d+\)$/.test(text) || - // e.g. CacheFlag.FIRE_DELAY (1 << 1) - /^\w+\.\w+ \(\d+ << \d+\)$/.test(text) || - // e.g. 1 - /^\d+$/.test(text) || - // e.g. 1.0 - /^\d+\.\d+$/.test(text) || - // e.g. 1 << 1 - /^\d+ << \d+$/.test(text) || - // e.g. 1, 2, 3, 4, 5 - /^\d+, \d+$/.test(text) || - /^\d+, \d+, \d+$/.test(text) || - /^(?:\d+, ){3}\d+$/.test(text) || - /^(?:\d+, ){4}\d+$/.test(text) || - // e.g. 1.0, 2.0, 3.0, 4.0, 5.0 - /^\d+\.\d+, \d+\.\d+$/.test(text) || - /^(?:\d+\.\d+, ){2}\d+\.\d+$/.test(text) || - /^(?:\d+\.\d+, ){3}\d+\.\d+$/.test(text) || - /^(?:\d+\.\d+, ){4}\d+\.\d+$/.test(text) - ); -} - -/** - * A "separator" line is a line with all hyphens like the following: - * - * ```ts - * // ---------------- - * // Getter functions - * // ---------------- - * ``` - */ -export function isSeparatorLine(text: string): boolean { - return /^\s*-+\s*$/.test(text); -} - -export function isSpecialComment(text: string): boolean { - text = text.trim(); - - return ( - text.startsWith("eslint-") || - text.startsWith("prettier-") || - text.startsWith("cspell:") || - text.startsWith("ts-prune-") || // e.g. ts-prune-ignore-next - text.startsWith("@ts-") || - text.startsWith("TODO:") || - text.startsWith("FIXME:") || - text === "TODO" || - text === "FIXME" - ); -} diff --git a/packages/eslint-plugin-isaacscript/src/completeSentence.ts b/packages/eslint-plugin-isaacscript/src/completeSentence.ts deleted file mode 100644 index 305a0440f..000000000 --- a/packages/eslint-plugin-isaacscript/src/completeSentence.ts +++ /dev/null @@ -1,354 +0,0 @@ -import { isEnumBlockLabel, isSpecialComment } from "./comments.js"; -import type { List } from "./list.js"; -import { getAdjustedList, reachedNewList } from "./list.js"; -import { hasURL } from "./utils.js"; - -export type CompleteSentenceMessageIds = - | "missingCapital" - | "missingPeriod" - | "doublePeriod"; - -interface IncompleteSentence { - sentence: string; - messageId: CompleteSentenceMessageIds; -} - -/** - * From: - * https://stackoverflow.com/questions/23571013/how-to-remove-url-from-a-string-completely-in-javascript - */ -const FULL_URL_REGEX = /(?:https?|ftp):\/\/[\S\n]+/g; - -/** - * From: - * https://stackoverflow.com/questions/11761563/javascript-regexp-for-splitting-text-into-sentences-and-keeping-the-delimiter - */ -const SENTENCE_REGEX = - /(?=[^])(?:\P{Sentence_Terminal}|\p{Sentence_Terminal}(?!['"`\p{Close_Punctuation}\p{Final_Punctuation}\s]))*(?:\p{Sentence_Terminal}+['"`\p{Close_Punctuation}\p{Final_Punctuation}]*|$)/guy; - -const SENTENCE_SEPARATOR_IDENTIFIER = "___sentence_separator_identifier___"; -const IN_LINE_CODE_IDENTIFIER = "___in_line_code_identifier___"; -const LIST_ELEMENT_IDENTIFIER = "___list_element_identifier___"; - -export function getIncompleteSentences( - text: string, -): readonly IncompleteSentence[] { - const incompleteSentences: IncompleteSentence[] = []; - - const textBlocks = splitOnSpecialText(text); - for (const textBlock of textBlocks) { - // Handle text that "spills over" to the next line by simply converting all newlines to spaces. - const squishedText = textBlock.split("\n").join(" ").trim(); - - // Handling all edge cases for "e.g." or "i.e." is very difficult, since sometimes it is correct - // to put a period after them, and sometimes not. Thus, ignore all text that contains them. - if (squishedText.includes("e.g.") || squishedText.includes("i.e.")) { - continue; - } - - // Whitelist markdown links. - if (squishedText.endsWith("](")) { - continue; - } - - const sentences = getSentences(squishedText); - const loneSentence = sentences.length === 1; - for (const sentence of sentences) { - const messageId = getIncompleteSentenceKind(sentence, loneSentence); - if (messageId !== undefined) { - incompleteSentences.push({ - sentence, - messageId, - }); - } - } - } - - return incompleteSentences; -} - -/** - * Before parsing a multi-line string to get the sentences, we first need to mutate the input to - * handle some problematic situations. - */ -function splitOnSpecialText(text: string): readonly string[] { - // Below, we avoid replacing certain things to an empty string because that can potentially cause - // subsequent text to be considered to be part of the previous sentence. - - // Remove multi-line code blocks. - text = text.replaceAll(/```[\S\s]*```/gm, SENTENCE_SEPARATOR_IDENTIFIER); - - // Remove example tag blocks. An example tag might be followed by another tag, so first look for - // that situation. Then, handle the situation where the example tag is the final tag. - text = text.replaceAll( - // We use `[\s\S]` instead of `.` because the latter does not match a new line. - /@example[\S\s]*?@/gm, - `${SENTENCE_SEPARATOR_IDENTIFIER}@`, - ); - text = text.replaceAll(/@example[\S\s]*/gm, ""); - - // Remove see tag blocks. A see tag might be followed by another tag, so first look for that - // situation. Then, handle the situation where the see tag is the final tag. (This is copy-pasted - // from the code that handles example tags above.) - text = text.replaceAll( - // We use `[\s\S]` instead of `.` because the latter does not match a new line. - /@see[\S\s]*?@/gm, - `${SENTENCE_SEPARATOR_IDENTIFIER}@`, - ); - text = text.replaceAll(/@see[\S\s]*/gm, ""); - - // Replace the link tags with the link text. Note that if we replace them with a sentence - // separator instead, then the following sentence would fail: Get the name of a peripheral wrapped - // with {@link peripheral.wrap}. - // https://regex101.com/r/0u8hQG/1 - // https://jsdoc.app/tags-inline-link.html - text = text.replaceAll( - /\[([^\]]*)]{@link [^ |}]+}|{@link ([^ |}]+)[ |]?}|{@link [^ |}]+[ |]([^}]+)}/gm, - "$1$2$3", - ); - - // Remove Markdown headers. - text = text.replaceAll(/^\n\s*#.*\n\n/gm, SENTENCE_SEPARATOR_IDENTIFIER); - if (text.trimStart().startsWith("#")) { - // Also handle if the first line is a Markdown header. - text = text.replace(/^\s*#.*\n\n/m, SENTENCE_SEPARATOR_IDENTIFIER); - } - - // Remove pipes (which indicate a Markdown table). - text = text.replaceAll("|", SENTENCE_SEPARATOR_IDENTIFIER); - - // Handle "blocks" indicated by a double newline. We don't want sentences to be parsed/combined - // past blocks, so we manually insert a sentence separator. - text = text.replaceAll("\n\n", `\n${SENTENCE_SEPARATOR_IDENTIFIER}\n`); - - // Handle quoted question marks. - // e.g. This text contains "???" in the middle. - text = text.replaceAll(/'\?+'/g, ""); - text = text.replaceAll(/"\?+"/g, ""); - - const lines = text.split("\n"); - const newLines: string[] = []; - let insideList: List | undefined; - - for (const [i, originalLine] of lines.entries()) { - let line = originalLine; - - // Ignore "@type" JSDoc tags, since they contain a code type instead of English text. - // https://jsdoc.app/tags-type.html - line = line.replace(/^\s*@type .+$/, SENTENCE_SEPARATOR_IDENTIFIER); - - // Remove any JSDoc tags. (But leave the descriptions following the tags, if any.) "@param" tags - // are followed by variable names, which will not be part of the sentence. - line = line.replace(/^\s*@param \w+ /, SENTENCE_SEPARATOR_IDENTIFIER); - // This is "\S+" instead of "\w+" because we need to match things like "@ts-expect-error". - line = line.replace(/^\s*@\S+/, SENTENCE_SEPARATOR_IDENTIFIER); - - // Replace any single-line code snippets with custom text. The custom text begins with an - // underscore, which means that it will count towards the sentence starting with a capital - // letter. (This is only relevant if the code block is the first word in the sentence.) - line = line.replaceAll(/`.+`/g, IN_LINE_CODE_IDENTIFIER); - - // Remove any URLs present in the string, as the periods will count as sentence terminators. - // e.g. "This is my URL: https://stackoverflow." - line = line.replaceAll(FULL_URL_REGEX, ""); - - // Remove the periods from some common abbreviations so that they do not mess up the sentence - // parsing. - line = line.replaceAll(/\bDr\.\s+/g, "Dr"); - line = line.replaceAll(/\bJr\.\s+/g, "Jr"); - line = line.replaceAll(/\bMr\.\s+/g, "Mr"); - line = line.replaceAll(/\bMrs\.\s+/g, "Mrs"); - line = line.replaceAll(/\bMs\.\s+/g, "Ms"); - line = line.replaceAll(/\bSr\.\s+/g, "Sr"); - line = line.replaceAll(/\bSt\.\s+/g, "St"); - line = line.replaceAll(/\betc\.\s+/g, "etc"); - - // Replace list bullet headers, since they are never part of a sentence. We also need to mark - // that this sentence is a list element for the purposes of ignoring any incomplete sentences. - // Doing this allows short lists like: - // - apple - // - banana - const previousLine = lines[i - 1]; - const previousLineWasBlank = - previousLine === undefined || previousLine.trim() === ""; - const previousLineEndedInColon = - previousLine !== undefined && previousLine.trimEnd().endsWith(":"); - const list = getAdjustedList( - line, - previousLineWasBlank, - previousLineEndedInColon, - insideList, - ); - if (reachedNewList(insideList, list)) { - // Keep track that we have begun a list (or a new sub-list). - insideList = list; - } - if (list !== undefined) { - line = line.slice(list.markerSize); - line = SENTENCE_SEPARATOR_IDENTIFIER + LIST_ELEMENT_IDENTIFIER + line; - } - - // Split enum block labels. - if (isEnumBlockLabel(line)) { - line += SENTENCE_SEPARATOR_IDENTIFIER; - } - - newLines.push(line); - } - - const textBlocks = newLines.join("\n").split(SENTENCE_SEPARATOR_IDENTIFIER); - - return textBlocks.filter((textBlock) => !isEnumBlockLabel(textBlock)); -} - -export function getSentences(text: string): readonly string[] { - const match = text.match(SENTENCE_REGEX); - if (match === null) { - return []; - } - - return match; -} - -function getIncompleteSentenceKind( - sentence: string, - loneSentence: boolean, -): CompleteSentenceMessageIds | undefined { - let text = sentence; - - // Trim the parenthesis surrounding the sentence, if any. - let textBeforeModifications: string; - do { - textBeforeModifications = text; - text = text.trim().replace(/^\(*/, "").replace(/\)*$/, "").trim(); - } while (text !== textBeforeModifications); - - // Ignore / whitelist some specific things. - if ( - // Blank text. - text === "" || - // Sentences that do not contain any letters. - !/[A-Za-z]/.test(text) || - // Sentences with an arrow, like: "Alice --> Bob" - text.includes("-->") || - // Placeholder text. - text === "n/a" || - // Special comments. - isSpecialComment(text) || - // Dates. - isDate(text) || - // URLS. - hasURL(text) || - // Single JSDoc tags. - /^@\w+$/.test(text) || - // Lists. - text.startsWith(LIST_ELEMENT_IDENTIFIER) || - // Code blocks. - text.includes("```") || - // Sentences that end with a number in parenthesis (which indicates some kind of expression). - // This must check the original text. - / \(\d+\)$/.test(sentence.trimEnd()) - ) { - return undefined; - } - - // First, check for a double period. - if (text.endsWith("..") && text.length >= 3) { - const characterBeforePeriods = text.at(-3); - if (characterBeforePeriods !== ".") { - return "doublePeriod"; - } - } - - if ( - loneSentence && - // Single words, double words, and triple words. - (/^\S+$/.test(text) || /^\S+ \S+$/.test(text) || /^\S+ \S+ \S+$/.test(text)) - ) { - return undefined; - } - - if (/^[a-z]/.test(text) && !isCapitalizedWordException(text)) { - return "missingCapital"; - } - - if ( - // Allow normal end-of-line punctuation. - !text.endsWith(".") && - !text.endsWith("!") && - !text.endsWith("?") && - // Allow ending with a period inside of a single quote or double quote, since it is implied that - // this is a fully quoted sentence. - !text.endsWith('."') && - !text.endsWith('!"') && - !text.endsWith('?"') && - !text.endsWith(".'") && - !text.endsWith("!'") && - !text.endsWith("?'") && - // Allow ending with a colon, since it is implied that there is an example of something on the - // subsequent block. - !text.endsWith(":") && - // Allow ending with anything if there is a colon in the middle of the sentence, since it is - // implied that this is an example of something. - !text.includes(": ") - ) { - return "missingPeriod"; - } - - return undefined; -} - -const CAPITALIZED_WORD_EXCEPTIONS = ["iPad", "iPhone", "iPod"] as const; - -function isCapitalizedWordException(text: string): boolean { - return CAPITALIZED_WORD_EXCEPTIONS.some((word) => text.startsWith(word)); -} - -const MONTHS_SET: ReadonlySet = new Set([ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", -]); - -const ORDINALS_SET: ReadonlySet = new Set(["st", "nd", "rd", "th"]); - -function isDate(text: string) { - text = text.trim(); - - const match1 = text.match(/^(?\w+) \d+(?\w+)$/); - if (match1 !== null && match1.groups !== undefined) { - const { month, ordinal } = match1.groups; - if ( - month !== undefined && - MONTHS_SET.has(month) && - ordinal !== undefined && - ORDINALS_SET.has(ordinal) - ) { - return true; - } - } - - const match2 = text.match(/^(?\w+) \d+(?\w+), \d+$/); - if (match2 !== null && match2.groups !== undefined) { - const { month, ordinal } = match2.groups; - if ( - month !== undefined && - MONTHS_SET.has(month) && - ordinal !== undefined && - ORDINALS_SET.has(ordinal) - ) { - return true; - } - } - - return false; -} diff --git a/packages/eslint-plugin-isaacscript/src/configs/recommended.ts b/packages/eslint-plugin-isaacscript/src/configs/recommended.ts index 9e9dd874c..4c194e1ab 100644 --- a/packages/eslint-plugin-isaacscript/src/configs/recommended.ts +++ b/packages/eslint-plugin-isaacscript/src/configs/recommended.ts @@ -8,57 +8,10 @@ export const recommended: TSESLint.FlatConfig.ConfigArray = [ { plugins: {}, rules: { - eqeqeq: "off", - "no-template-curly-in-string": "off", - "isaacscript/complete-sentences-jsdoc": "error", - "isaacscript/complete-sentences-line-comments": "error", - "isaacscript/consistent-enum-values": "error", - "isaacscript/consistent-named-tuples": "error", - "isaacscript/eqeqeq-fix": "error", - "isaacscript/format-jsdoc-comments": "error", - "isaacscript/format-line-comments": "error", - "isaacscript/jsdoc-code-block-language": "error", - "isaacscript/newline-between-switch-case": "error", - "isaacscript/no-confusing-set-methods": "error", - "isaacscript/no-empty-jsdoc": "error", - "isaacscript/no-empty-line-comments": "error", - "isaacscript/no-explicit-array-loops": "error", - "isaacscript/no-explicit-map-set-loops": "error", - "isaacscript/no-for-in": "error", - "isaacscript/no-let-any": "error", - "isaacscript/no-mutable-return": "error", - "isaacscript/no-number-enums": "error", - "isaacscript/no-object-any": "error", - "isaacscript/no-object-methods-with-map-set": "error", - "isaacscript/no-string-length-0": "error", - "isaacscript/no-template-curly-in-string-fix": "error", - "isaacscript/no-undefined-return-type": "error", - "isaacscript/no-unnecessary-assignment": "error", - "isaacscript/no-unsafe-plusplus": "error", - "isaacscript/no-useless-return": "error", - "isaacscript/no-void-return-type": "error", - "isaacscript/prefer-const": "error", - "isaacscript/prefer-plusplus": "error", - "isaacscript/prefer-postfix-plusplus": "error", - "isaacscript/prefer-readonly-parameter-types": "error", - "isaacscript/require-break": "error", - "isaacscript/require-capital-const-assertions": "error", - "isaacscript/require-capital-read-only": "error", - "isaacscript/require-unannotated-const-assertions": "error", - "isaacscript/require-variadic-function-argument": "error", - "isaacscript/strict-array-methods": "error", - "isaacscript/strict-enums": "error", - "isaacscript/strict-undefined-functions": "error", - "isaacscript/strict-void-functions": "error", - }, - }, - { - files: ["**/*.js", "**/*.cjs", "**/*.mjs", "**/*.jsx"], - rules: { - "isaacscript/no-let-any": "off", - "isaacscript/no-object-any": "off", - "isaacscript/require-capital-const-assertions": "off", - "isaacscript/require-capital-read-only": "off", + "isaacscript/enum-member-number-separation": "error", + "isaacscript/no-invalid-default-map": "error", + "isaacscript/no-throw": "error", + "isaacscript/require-v-registration": "error", }, }, ]; diff --git a/packages/eslint-plugin-isaacscript/src/constants.ts b/packages/eslint-plugin-isaacscript/src/constants.ts deleted file mode 100644 index 733221ee5..000000000 --- a/packages/eslint-plugin-isaacscript/src/constants.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * From: https://www.w3schools.com/js/js_reserved.asp - * - * - Some words that would not typically start a line are manually removed. - * - `console` is added. - */ -export const JAVASCRIPT_RESERVED_WORDS_SET: ReadonlySet = new Set([ - "abstract", - // "arguments", - "await", - // "boolean", - "break", - // "byte", - "case", - "catch", - // "char", - "class", - "console", // Manually added. - "const", - "continue", - "debugger", - // "default", - // "delete", - "do", - // "double", - "else", - "enum", - // "eval", - "export", - // "extends", - // "false", - // "final", - "finally", - // - "float", - "for", - "function", - "goto", - "if", - // "implements", - "import", - // "in", - // "instanceof", - // "int", - "interface", - "let", - // "long", - // "native", - "new", - // "null", - // "package", - "private", - "protected", - "public", - "return", - // "short", - "static", - "super", - "switch", - // "synchronized", - // "this", - "throw", - // "throws", - // "transient", - // "true", - "try", - // "typeof", - // "var", - // "void", - // "volatile", - "while", - // "with", - "yield", -]); diff --git a/packages/eslint-plugin-isaacscript/src/format.ts b/packages/eslint-plugin-isaacscript/src/format.ts deleted file mode 100644 index 96c7eaba6..000000000 --- a/packages/eslint-plugin-isaacscript/src/format.ts +++ /dev/null @@ -1,371 +0,0 @@ -import { - isEnumBlockLabel, - isSeparatorLine, - isSpecialComment, -} from "./comments.js"; -import type { List } from "./list.js"; -import { ListKind, getAdjustedList, reachedNewList } from "./list.js"; -import { hasURL } from "./utils.js"; - -/** - * Feed this function a string that contains one or more lines of text. It will combine all of the - * lines and return a string with lines that do not exceed the maximum line length. - * - * For obvious reasons, this function works best on text that is composed of complete sentences. - * Otherwise, it would incorrectly combine together two disparate sentences. - * - * This function tries to be as smart as possible in that it will not merge specific kinds of lines, - * like bullet points, "eslint-disable" comments, and so on. - * - * @param text One or more lines of text, separated by newlines. - * @param maxLength The ruler cutoff for the formatted text. - * @param shouldParseJSDocTags Whether to make formatting decisions based on the presence of JSDoc - * tags. True by default. Pass false if working with leading line - * comments or other non-JSDoc text. - */ -export function formatText( - text: string, - maxLength: number, - shouldParseJSDocTags = true, -): string { - // First, replace any whitespace that is not a newline or a space with a space (like e.g. tabs). - text = text.replaceAll(/[^\S\n ]+/g, " "); - - let formattedText = ""; - let formattedLine = ""; - let insideList: List | undefined; - let insideCodeBlock = false; - let insideExampleTagBlock = false; - let encounteredJSDocTags = false; - - const lines = text.split("\n"); - for (const [i, line] of lines.entries()) { - // Gather information about this line. - const lineIsBlank = line.trim() === ""; - const hasCodeBlock = line.includes("```"); - const previousLineInsideCodeBlock = insideCodeBlock; - if (hasCodeBlock) { - insideCodeBlock = !insideCodeBlock; - } - - const previousLineInsideExampleTagBlock = insideExampleTagBlock; - if (shouldParseJSDocTags) { - const hasExampleTag = line.includes("@example"); - if (hasExampleTag) { - insideExampleTagBlock = true; - } else if (insideExampleTagBlock && line.trimStart().startsWith("@")) { - insideExampleTagBlock = false; - } - } - - const lineHasURL = hasURL(line); - const hasExample = startsWithExample(line); - const separatorLine = isSeparatorLine(line); - const specialComment = isSpecialComment(line); - const enumBlockLabel = isEnumBlockLabel(line); - const beginsWithPipe = line.trimStart().startsWith("|"); - - // Gather information about the previous line. - const previousLine = lines[i - 1]; - const previousLineWasBlank = - previousLine === undefined || previousLine.trim() === ""; - const previousLineHasCodeBlock = - previousLine !== undefined && previousLine.includes("```"); - const previousLineHadURL = - previousLine !== undefined && hasURL(previousLine); - const previousLineEndedInColon = - previousLine !== undefined && previousLine.trimEnd().endsWith(":"); - const previousLineWasSeparatorLine = - previousLine !== undefined && isSeparatorLine(previousLine); - const previousLineWasEnumBlockLabel = - previousLine !== undefined && isEnumBlockLabel(previousLine); - - // Handle blank lines. - if (lineIsBlank) { - // Append the partial line that we were building, if any. - [formattedLine, formattedText] = appendLineToText( - formattedLine, - formattedText, - ); - - // Append the blank line, but ignore multiple blank lines in a row (unless we are inside of a - // code block). - const lastCharacter = formattedText.at(-1); - if ( - (lastCharacter !== undefined && lastCharacter !== "\n") || - insideCodeBlock - ) { - formattedText += "\n"; - } - - insideList = undefined; - continue; - } - - // Handle code blocks. This case is simple because we need to exactly preserve the text. - if ( - hasCodeBlock || - previousLineHasCodeBlock || - insideCodeBlock || - insideExampleTagBlock - ) { - // Append the partial line that we were building, if any. - [formattedLine, formattedText] = appendLineToText( - formattedLine, - formattedText, - ); - - // Enforce newlines before the beginning of code blocks. (But not inside of an example code - // block, because there should not be newlines between tags.) - if ( - hasCodeBlock && - !previousLineInsideCodeBlock && - !previousLineWasBlank && - !insideExampleTagBlock - ) { - formattedText += "\n"; - } - - // Copy the line exactly. - formattedLine += line; - - // Enforce newlines after the end of code blocks. (But not inside of an example code block, - // because there should not be newlines between tags.) - const nextLine = lines[i + 1]; - const nextLineIsBlank = nextLine === undefined || nextLine.trim() === ""; - if ( - hasCodeBlock && - previousLineInsideCodeBlock && - !nextLineIsBlank && - !insideExampleTagBlock - ) { - // Append the partial line that we were building, if any. - [formattedLine, formattedText] = appendLineToText( - formattedLine, - formattedText, - ); - - formattedText += "\n"; - } - - insideList = undefined; - continue; - } - - // Handle lines that begin with a pipe, which indicate a Markdown table. This case is simple - // because we need to exactly preserve the text. - if (beginsWithPipe) { - // Append the partial line that we were building, if any. - [formattedLine, formattedText] = appendLineToText( - formattedLine, - formattedText, - ); - - // Copy the line exactly. - formattedLine += line; - - continue; - } - - // Handle special comments. - if (specialComment) { - // Append the partial line that we were building, if any. - [formattedLine, formattedText] = appendLineToText( - formattedLine, - formattedText, - ); - - // Copy the line exactly. - formattedLine += line; - - [formattedLine, formattedText] = appendLineToText( - formattedLine, - formattedText, - ); - - continue; - } - - // Handle lists. (JSDoc tags also count as lists.) - const list = getAdjustedList( - line, - previousLineWasBlank, - previousLineEndedInColon, - insideList, - ); - if (reachedNewList(insideList, list)) { - // Keep track that we have begun a list (or a new sub-list). - insideList = list; - } - - // Lists and some other specific text elements indicate that we should always insert a new line, - // even if the text has no wrapped to the end of the ruler yet. - if ( - list !== undefined || - lineHasURL || - previousLineHadURL || - hasExample || - separatorLine || - previousLineWasSeparatorLine || - enumBlockLabel || - previousLineWasEnumBlockLabel - ) { - // Append the partial line that we were building, if any. - [formattedLine, formattedText] = appendLineToText( - formattedLine, - formattedText, - ); - } - - // Keep track of when we first encounter JSDoc tags. (JSDoc comments can be thought of as having - // an "description" or "introductory" section at the top, and then a list of JSDoc tags at the - // bottom.) - if ( - shouldParseJSDocTags && - !encounteredJSDocTags && - list !== undefined && - list.kind === ListKind.JSDocTag - ) { - encounteredJSDocTags = true; - - // Enforce a newline between a JSDoc description (i.e. introductory text) and the first JSDoc - // tag. - if ( - !stringContainsOnlyWhitespace(formattedText) && - !previousLineWasBlank && - !previousLineInsideExampleTagBlock - ) { - // Append the partial line that we were building, if any. - [formattedLine, formattedText] = appendLineToText( - formattedLine, - formattedText, - ); - - formattedText += "\n"; - } - } - - const words = getWordsFromLine(line); - - for (const word of words) { - // Words can be blank strings in certain cases. For example: "dog cat" - if (word === "") { - continue; - } - - // Handle splitting to a new line. - const splitToNewLine = shouldSplitToNewLine( - formattedLine, - word, - maxLength, - ); - if (splitToNewLine) { - // Append the partial line that we were building, if any. - [formattedLine, formattedText] = appendLineToText( - formattedLine, - formattedText, - ); - - // Overflowed lists should be indented so that the list items can be more easily - // distinguished. - if (insideList !== undefined) { - // It is possible for JSDoc comments to have really long variable names, which would make - // the indent be really big. Thus, we arbitrarily hard-cap the effective marker size at a - // third of the width of the remaining space. - const amountOfSpacesToWorkWith = - maxLength - insideList.numLeadingSpaces; - const thirdOfRemainingSpace = Math.floor( - amountOfSpacesToWorkWith / 3, - ); - const effectiveMarkerSize = Math.min( - insideList.markerSize, - thirdOfRemainingSpace, - ); - - // We subtract one since we will add an extra space below when adding the first word. - const numSpacesToAdd = - insideList.numLeadingSpaces + effectiveMarkerSize - 1; - formattedLine += " ".repeat(numSpacesToAdd); - } - } - - // Add the word. (`numLeadingSpaces` will be set if this is a line with a sub-bullet point.) - const atBeginningOfLine = formattedLine === ""; - const numLeadingSpaces = list === undefined ? 0 : list.numLeadingSpaces; - const leadingSpaces = " ".repeat(numLeadingSpaces); - const textToAdd = atBeginningOfLine - ? `${leadingSpaces}${word}` - : ` ${word}`; - formattedLine += textToAdd; - } - } - - // Append the partial line that we were building, if any. - // eslint-disable-next-line no-useless-assignment - [formattedLine, formattedText] = appendLineToText( - formattedLine, - formattedText, - ); - - return formattedText; -} - -/** - * We split to a new line if: - * 1. adding the word would make it overflow past the maximum length - * 2. and there is at least one word on the current line - * - * For example, there could be a very long URL that exceeds the maximum length, but since there are - * no spaces in the URL, it can't be split up and has to exceed the maximum length. - */ -function shouldSplitToNewLine( - formattedLine: string, - word: string, - effectiveLength: number, -) { - const atBeginningOfLine = formattedLine === ""; - const textToAdd = atBeginningOfLine ? word : ` ${word}`; - const lineLengthIfAdded = formattedLine.length + textToAdd.length; - return lineLengthIfAdded > effectiveLength && !atBeginningOfLine; -} - -function appendLineToText( - formattedLine: string, - formattedText: string, -): [formattedLine: string, formattedText: string] { - if (formattedLine !== "") { - if (formattedText !== "") { - formattedText += "\n"; - } - formattedText += formattedLine; - formattedLine = ""; - } - - return [formattedLine, formattedText]; -} - -function startsWithExample(text: string): boolean { - const trimmedText = text.trimStart(); - - return ( - trimmedText.startsWith("e.g. ") || - trimmedText.startsWith("(e.g. ") || - trimmedText.startsWith("i.e. ") || - trimmedText.startsWith("(i.e. ") - ); -} - -function stringContainsOnlyWhitespace(string: string) { - return string.trim() === ""; -} - -/** - * For most cases, we can get the words on a line by splitting on a space. - * - * However, we don't want to split up a fragment like "{@link foo}" between lines, because it breaks - * the parsing inside VSCode. Thus, anything matching this pattern should be considered its own - * word, even if it has spaces inside of it. - */ -function getWordsFromLine(line: string): readonly string[] { - return line.match(/(?:{@link .+?}|\S)+/g) ?? []; -} diff --git a/packages/eslint-plugin-isaacscript/src/index.ts b/packages/eslint-plugin-isaacscript/src/index.ts index 6511fd365..54c41b3ad 100644 --- a/packages/eslint-plugin-isaacscript/src/index.ts +++ b/packages/eslint-plugin-isaacscript/src/index.ts @@ -1,11 +1,10 @@ import type { TSESLint } from "@typescript-eslint/utils"; -import fs from "node:fs"; -import path from "node:path"; +import type { ReadonlyRecord } from "complete-common"; +import packageJSON from "../package.json" with { type: "json" }; import { configs } from "./configs.js"; -import type { ReadonlyRecord } from "./isaacScriptCommon.js"; import { rules } from "./rules.js"; -const { name, version } = getPackageJSON(); +const { name, version } = packageJSON; const plugin = { meta: { @@ -16,33 +15,34 @@ const plugin = { rules, }; -addPluginToConfigs(configs); +addPluginToConfigs(configs, name); +// ESLint plugins must provide a default export by design. +// eslint-disable-next-line export default plugin; -/** - * We parse the package JSON manually since importing JSON files directly in Node is experimental. - */ -function getPackageJSON(): Record { - const PACKAGE_ROOT = path.join(import.meta.dirname, ".."); - const packageJSONPath = path.join(PACKAGE_ROOT, "package.json"); - try { - const packageJSONString = fs.readFileSync(packageJSONPath, "utf8"); - return JSON.parse(packageJSONString) as Record; - } catch (error) { - throw new Error(`Failed to read the "${packageJSONPath}" file: ${error}`); - } -} - /** @see https://eslint.org/docs/latest/extend/plugins#configs-in-plugins */ function addPluginToConfigs( configsToMutate: ReadonlyRecord, + packageName: unknown, ) { + if (typeof packageName !== "string") { + throw new TypeError( + 'Failed to parse the plugin name from the "package.json" file.', + ); + } + + const packageNameWords = packageName.split("-"); + const pluginName = packageNameWords.at(-1); + if (pluginName === undefined || pluginName === "") { + throw new Error("Failed to parse the plugin name from the package name."); + } + for (const configArray of Object.values(configsToMutate)) { for (const config of configArray) { if (config.plugins !== undefined) { Object.assign(config.plugins, { - isaacscript: plugin, + [pluginName]: plugin, }); } } diff --git a/packages/eslint-plugin-isaacscript/src/isaacScriptCommon.ts b/packages/eslint-plugin-isaacscript/src/isaacScriptCommon.ts deleted file mode 100644 index 1838be0b2..000000000 --- a/packages/eslint-plugin-isaacscript/src/isaacScriptCommon.ts +++ /dev/null @@ -1,78 +0,0 @@ -// We do not want "eslint-plugin-isaacscript" to depend on "isaacscript-common-ts" because it -// complicates the usage of the plugin inside of the monorepo. Specifically, since we manually copy -// the compiled output to the monorepo "node_modules" directory, it would cause errors if the -// "isaacscript-common-ts" directory did not also exist there. To fix this, we could also compile -// and copy "isaacscript-common-ts" in the build script for this plugin. However, that is -// undesirable for two reasons: -// 1) It increases the complexity of the build script. -// 2) If "isaacscript-common-ts" exists in the monorepo's "node_modules" directory, it can cause -// bugs due to tooling preferring the "real" directory over the tsconfig "paths" resolution. - -export type ReadonlyRecord = Readonly< - Record ->; - -const FIRST_LETTER_CAPITALIZED_REGEX = /^\p{Lu}/u; - -/** - * Helper function to throw an error if the provided value is equal to `undefined`. - * - * This is useful to have TypeScript narrow a `T | undefined` value to `T` in a concise way. - */ -export function assertDefined( - value: T, - ...[msg]: [undefined] extends [T] - ? [string] - : [ - "The assertion is useless because the provided value does not contain undefined.", - ] -): asserts value is Exclude { - if (value === undefined) { - throw new TypeError(msg); - } -} - -export function capitalizeFirstLetter(string: string): string { - if (string === "") { - return string; - } - - const firstCharacter = string.charAt(0); - const capitalizedFirstLetter = firstCharacter.toUpperCase(); - const restOfString = string.slice(1); - - return `${capitalizedFirstLetter}${restOfString}`; -} - -/** - * From: - * https://stackoverflow.com/questions/8334606/check-if-first-letter-of-word-is-a-capital-letter - */ -export function isFirstLetterCapitalized(string: string): boolean { - return FIRST_LETTER_CAPITALIZED_REGEX.test(string); -} - -/** - * Helper function to trim a prefix from a string, if it exists. Returns the trimmed string. - * - * @param string The string to trim. - * @param prefix The prefix to trim. - * @param trimAll Whether to remove multiple instances of the prefix, if they exist. If this is set - * to true, the prefix must only be a single character. - */ -export function trimPrefix( - string: string, - prefix: string, - trimAll = false, -): string { - if (trimAll) { - const regExp = new RegExp(`^${prefix}+`, "g"); - return string.replaceAll(regExp, ""); - } - - if (!string.startsWith(prefix)) { - return string; - } - - return string.slice(prefix.length); -} diff --git a/packages/eslint-plugin-isaacscript/src/jsdoc.ts b/packages/eslint-plugin-isaacscript/src/jsdoc.ts deleted file mode 100644 index 7f0f52076..000000000 --- a/packages/eslint-plugin-isaacscript/src/jsdoc.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { TSESTree } from "@typescript-eslint/utils"; - -export function getJSDocComments( - comments: readonly TSESTree.Comment[], -): readonly TSESTree.Comment[] { - return comments.filter( - (comment) => - comment.type === TSESTree.AST_TOKEN_TYPES.Block && // i.e. a "/*" comment - comment.value.startsWith("*"), // i.e. a "/**" comment - ); -} - -export function getTextFromJSDocComment(comment: string): string { - comment = comment.trim(); - - const lines = comment.split("\n"); - const linesWithRemovedAsterisks = lines.map((line) => { - // First, if the line contains only spaces and/or asterisks, it can be deleted. - if (/^[\s*]*$/.test(line)) { - return ""; - } - - // We have to be careful not to trim all of the whitespace from the line here because whitespace - // must be preserved while inside of code blocks. - line = line.replace(/^\s*\* /, ""); - - // Remove any duplicate asterisks, like "* * Foo". - while (line.startsWith("* ")) { - line = line.replace(/^\* /, ""); - } - - return line; - }); - - return linesWithRemovedAsterisks.join("\n").trim(); -} diff --git a/packages/eslint-plugin-isaacscript/src/leadingLineComments.ts b/packages/eslint-plugin-isaacscript/src/leadingLineComments.ts deleted file mode 100644 index 8a2e624f4..000000000 --- a/packages/eslint-plugin-isaacscript/src/leadingLineComments.ts +++ /dev/null @@ -1,118 +0,0 @@ -import type { TSESLint } from "@typescript-eslint/utils"; -import { TSESTree } from "@typescript-eslint/utils"; -import { isCommentOnOwnLine, isSeparatorLine } from "./comments.js"; - -export function getLeadingLineComments( - sourceCode: TSESLint.SourceCode, - comments: readonly TSESTree.Comment[], -): readonly TSESTree.Comment[] { - return comments.filter( - (comment) => - comment.type === TSESTree.AST_TOKEN_TYPES.Line && // i.e. a "//" comment - comment.value.trim() !== "" && - !comment.value.startsWith("/") && // Filter out triple slash directives - isCommentOnOwnLine(sourceCode, comment), - ); -} - -/** - * An object containing one or more contiguous leading line comments. For example: - * - * ```ts - * // The first line of the block. - * // The second line of the block. - * ``` - */ -interface LeadingLineCommentBlock { - mergedText: string; - originalComments: TSESTree.Comment[]; -} - -/** - * Returns an array of grouped comments. For example, the following code would return an array of - * three comment blocks: - * - * ```ts - * // This is the first block. - * - * // This is the second block. - * // We are still in the second block, because there has not been a newline separator yet. - * - * // This is the third block. - * ``` - */ -export function getCommentBlocks( - comments: readonly TSESTree.Comment[], -): readonly LeadingLineCommentBlock[] { - const commentBlocks: LeadingLineCommentBlock[] = []; - - // We cannot use the `comments.entries` method because we mutate `i`. - for (let i = 0; i < comments.length; i++) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const comment = comments[i]!; - - /** - * Remove the initial space that will always live in front of comment line. - * - * For example, the comment of: - * - * ```ts - * // Foo. - * ``` - * - * Has a comment value of: " Foo." - */ - const firstCharacter = comment.value[0]; - const firstCharacterIsSpace = - firstCharacter !== undefined && firstCharacter === " "; - const text = firstCharacterIsSpace ? comment.value.slice(1) : comment.value; - - const commentBlock: LeadingLineCommentBlock = { - mergedText: text, - originalComments: [comment], - }; - - const commentIndex = i; // Make a copy of the comment index since we will mutate i later. - const firstCommentStartLine = comment.loc.start.line; - - // Look for one or more "connecting" comments on the next subsequent lines. - for (let j = i + 1; j < comments.length; j++) { - const nextComment = comments[j]; - if (nextComment === undefined) { - break; - } - - // Break if we are on a non-contiguous line. - const nextCommentStartLine = nextComment.loc.start.line; - const lineDelta = j - commentIndex; - if (nextCommentStartLine !== firstCommentStartLine + lineDelta) { - break; - } - - // Break if this is a "separator" line. - if (isSeparatorLine(nextComment.value)) { - break; - } - - commentBlock.mergedText += "\n"; - const nextText = nextComment.value.slice(1); - commentBlock.mergedText += nextText; - commentBlock.originalComments.push(nextComment); - - // Since we merged this comment, we can skip over examining it in the parent loop. - i++; - } - - commentBlocks.push(commentBlock); - } - - return commentBlocks; -} - -export function allCommentsInBlockAreCommentedOutArrayElements( - commentBlock: LeadingLineCommentBlock, -): boolean { - return commentBlock.originalComments.every( - (comment) => comment.value.match(/^\s*"[^"]*",\s*$/) !== null, - ); -} diff --git a/packages/eslint-plugin-isaacscript/src/list.ts b/packages/eslint-plugin-isaacscript/src/list.ts deleted file mode 100644 index 9119b1b6b..000000000 --- a/packages/eslint-plugin-isaacscript/src/list.ts +++ /dev/null @@ -1,207 +0,0 @@ -/** - * A description of the kind of list that is currently being iterated over. For example, the - * following text is a list: - * - * ```text - * 1. Apple - * 2. Banana - * 3. Pear - * ``` - */ -export interface List { - kind: ListKind; - - // eslint-disable-next-line isaacscript/format-jsdoc-comments - /** - * The size of the whitespace prior to the marker. - * e.g. " 1. Foo" would be 2. - */ - numLeadingSpaces: number; - - /** - * The size of the characters that make up the bullet point. - * e.g. "1. Foo" would be 3. - */ - markerSize: number; - - /** - * The contents of JSDoc tag header, if any. - * e.g. "@param foo This is foo." would be "@param foo". - */ - jsDocTagName?: string; -} - -export enum ListKind { - Hyphen = "Hyphen", - NumberParenthesis = "NumberParenthesis", - NumberPeriod = "NumberPeriod", - JSDocTag = "JSDocTag", -} - -/** - * When using the `getList` function, the returned list may not be accurate if this is a line that - * is continuing from the previous line. For example: - * - * ```text - * This method will crash the game if you provide it an invalid number, such as 10000000000000000 or - * 43. (Using 0 will not cause a crash.) - * ``` - * - * Here, "43. " is incorrectly interpreted as the beginning of a list. In order to work around this - * problem, use the `getAdjustedList` function instead. - */ -export function getAdjustedList( - line: string, - previousLineWasBlank: boolean, - previousLineEndedInColon: boolean, - insideList: List | undefined, -): List | undefined { - const list = getList(line); - if (list === undefined) { - return undefined; - } - - switch (list.kind) { - case ListKind.Hyphen: { - return list; - } - - case ListKind.NumberPeriod: - case ListKind.NumberParenthesis: { - // If we are already inside of a numbered list, then do not require blank lines in between the - // bullets. - if (list.kind === insideList?.kind) { - return list; - } - - // If the previous line had a colon, then do not require blank lines in between the bullets. - if (previousLineEndedInColon) { - return list; - } - - // Otherwise, only interpret this as a bulleted list if the previous line was blank. - return previousLineWasBlank ? list : undefined; - } - - case ListKind.JSDocTag: { - return list; - } - } -} - -function getList(line: string): List | undefined { - const originalLength = line.length; - line = line.trimStart(); - const trimmedLength = line.length; - const numLeadingSpaces = originalLength - trimmedLength; - - // e.g. "- A bullet point can start with a hyphen." - if (line.startsWith("- ")) { - return { - kind: ListKind.Hyphen, - numLeadingSpaces, - markerSize: "- ".length, - }; - } - - /** e.g. "1. A bullet point can start with a number and a period." */ - const numberPeriodMatch = line.match(/^(\d+)\. /); - if ( - numberPeriodMatch !== null && - numberPeriodMatch[1] !== undefined && - numberPeriodMatch[1] !== "0" - ) { - return { - kind: ListKind.NumberPeriod, - numLeadingSpaces, - markerSize: numberPeriodMatch[1].length + ". ".length, - }; - } - - /** e.g. "1) A bullet point can start with a number and a parenthesis." */ - const numberParenthesisMatch = line.match(/^(\d+)\) /); - if ( - numberParenthesisMatch !== null && - numberParenthesisMatch[1] !== undefined && - numberParenthesisMatch[1] !== "0" - ) { - return { - kind: ListKind.NumberParenthesis, - numLeadingSpaces, - markerSize: numberParenthesisMatch[1].length + ") ".length, - }; - } - - const jsDocTagName = getJSDocTagName(line); - if (jsDocTagName !== undefined) { - return { - kind: ListKind.JSDocTag, - numLeadingSpaces, - markerSize: jsDocTagName.length + " ".length, - jsDocTagName, - }; - } - - return undefined; -} - -/** - * Returns a string containing the param header, if any. For example, "@returns Foo" would return - * "@returns". - * - * For "@param" tags, the returned tag string will include the variable name, if any. For example, - * "@param foo Foo" would return "@param foo". - */ -function getJSDocTagName(text: string): string | undefined { - text = text.trimStart(); - - if (!text.startsWith("@")) { - return undefined; - } - - const tagMatch = text.match(/^@(?\w+)/); - if (tagMatch === null || tagMatch.groups === undefined) { - return undefined; - } - - const { tagName } = tagMatch.groups; - if (tagName === undefined) { - return undefined; - } - - // Specific JSDoc tags have words after them that should be part of the tag for indenting - // purposes. - if (tagName === "param") { - const paramMatch = text.match(/^(?@\w+ \w+)/); - if (paramMatch === null || paramMatch.groups === undefined) { - return "@param"; - } - - const { tagWithVariableName } = paramMatch.groups; - if (tagWithVariableName === undefined) { - return "@param"; - } - - return tagWithVariableName; - } - - return `@${tagName}`; -} - -/** - * When iterating over lines of text, by default, we want to keep the existing list object, if any. - */ -export function reachedNewList( - insideList: List | undefined, - list: List | undefined, -): boolean { - if (list === undefined) { - return false; - } - - return ( - insideList === undefined || // Going from a non-list to list - insideList.numLeadingSpaces !== list.numLeadingSpaces || // Going from a list to a sub-list - insideList.jsDocTagName !== list.jsDocTagName // Going from a JSDoc to a different JSDoc tag - ); -} diff --git a/packages/eslint-plugin-isaacscript/src/rules.ts b/packages/eslint-plugin-isaacscript/src/rules.ts index c86f6bc5a..0c9c15a90 100644 --- a/packages/eslint-plugin-isaacscript/src/rules.ts +++ b/packages/eslint-plugin-isaacscript/src/rules.ts @@ -2,94 +2,14 @@ /// DO NOT EDIT THIS FILE! YOU CAN REGENERATE IT WITH: /// npm run generate -import { completeSentencesJSDoc } from "./rules/complete-sentences-jsdoc.js"; -import { completeSentencesLineComments } from "./rules/complete-sentences-line-comments.js"; -import { consistentEnumValues } from "./rules/consistent-enum-values.js"; -import { consistentNamedTuples } from "./rules/consistent-named-tuples.js"; import { enumMemberNumberSeparation } from "./rules/enum-member-number-separation.js"; -import { eqeqeqFix } from "./rules/eqeqeq-fix.js"; -import { formatJSDocComments } from "./rules/format-jsdoc-comments.js"; -import { formatLineComments } from "./rules/format-line-comments.js"; -import { jsdocCodeBlockLanguage } from "./rules/jsdoc-code-block-language.js"; -import { newlineBetweenSwitchCase } from "./rules/newline-between-switch-case.js"; -import { noConfusingSetMethods } from "./rules/no-confusing-set-methods.js"; -import { noEmptyJSDoc } from "./rules/no-empty-jsdoc.js"; -import { noEmptyLineComments } from "./rules/no-empty-line-comments.js"; -import { noExplicitArrayLoops } from "./rules/no-explicit-array-loops.js"; -import { noExplicitMapSetLoops } from "./rules/no-explicit-map-set-loops.js"; -import { noForIn } from "./rules/no-for-in.js"; import { noInvalidDefaultMap } from "./rules/no-invalid-default-map.js"; -import { noLetAny } from "./rules/no-let-any.js"; -import { noMutableReturn } from "./rules/no-mutable-return.js"; -import { noNumberEnums } from "./rules/no-number-enums.js"; -import { noObjectAny } from "./rules/no-object-any.js"; -import { noObjectMethodsWithMapSet } from "./rules/no-object-methods-with-map-set.js"; -import { noStringLength0 } from "./rules/no-string-length-0.js"; -import { noTemplateCurlyInStringFix } from "./rules/no-template-curly-in-string-fix.js"; import { noThrow } from "./rules/no-throw.js"; -import { noUndefinedReturnType } from "./rules/no-undefined-return-type.js"; -import { noUnnecessaryAssignment } from "./rules/no-unnecessary-assignment.js"; -import { noUnsafePlusplus } from "./rules/no-unsafe-plusplus.js"; -import { noUselessReturn } from "./rules/no-useless-return.js"; -import { noVoidReturnType } from "./rules/no-void-return-type.js"; -import { preferConst } from "./rules/prefer-const.js"; -import { preferPlusplus } from "./rules/prefer-plusplus.js"; -import { preferPostfixPlusplus } from "./rules/prefer-postfix-plusplus.js"; -import { preferReadonlyParameterTypes } from "./rules/prefer-readonly-parameter-types.js"; -import { requireBreak } from "./rules/require-break.js"; -import { requireCapitalConstAssertions } from "./rules/require-capital-const-assertions.js"; -import { requireCapitalReadOnly } from "./rules/require-capital-read-only.js"; -import { requireUnannotatedConstAssertions } from "./rules/require-unannotated-const-assertions.js"; import { requireVRegistration } from "./rules/require-v-registration.js"; -import { requireVariadicFunctionArgument } from "./rules/require-variadic-function-argument.js"; -import { strictArrayMethods } from "./rules/strict-array-methods.js"; -import { strictEnums } from "./rules/strict-enums.js"; -import { strictUndefinedFunctions } from "./rules/strict-undefined-functions.js"; -import { strictVoidFunctions } from "./rules/strict-void-functions.js"; export const rules = { - "complete-sentences-jsdoc": completeSentencesJSDoc, - "complete-sentences-line-comments": completeSentencesLineComments, - "consistent-enum-values": consistentEnumValues, - "consistent-named-tuples": consistentNamedTuples, "enum-member-number-separation": enumMemberNumberSeparation, - "eqeqeq-fix": eqeqeqFix, - "format-jsdoc-comments": formatJSDocComments, - "format-line-comments": formatLineComments, - "jsdoc-code-block-language": jsdocCodeBlockLanguage, - "newline-between-switch-case": newlineBetweenSwitchCase, - "no-confusing-set-methods": noConfusingSetMethods, - "no-empty-jsdoc": noEmptyJSDoc, - "no-empty-line-comments": noEmptyLineComments, - "no-explicit-array-loops": noExplicitArrayLoops, - "no-explicit-map-set-loops": noExplicitMapSetLoops, - "no-for-in": noForIn, "no-invalid-default-map": noInvalidDefaultMap, - "no-let-any": noLetAny, - "no-mutable-return": noMutableReturn, - "no-number-enums": noNumberEnums, - "no-object-any": noObjectAny, - "no-object-methods-with-map-set": noObjectMethodsWithMapSet, - "no-string-length-0": noStringLength0, - "no-template-curly-in-string-fix": noTemplateCurlyInStringFix, "no-throw": noThrow, - "no-undefined-return-type": noUndefinedReturnType, - "no-unnecessary-assignment": noUnnecessaryAssignment, - "no-unsafe-plusplus": noUnsafePlusplus, - "no-useless-return": noUselessReturn, - "no-void-return-type": noVoidReturnType, - "prefer-const": preferConst, - "prefer-plusplus": preferPlusplus, - "prefer-postfix-plusplus": preferPostfixPlusplus, - "prefer-readonly-parameter-types": preferReadonlyParameterTypes, - "require-break": requireBreak, - "require-capital-const-assertions": requireCapitalConstAssertions, - "require-capital-read-only": requireCapitalReadOnly, - "require-unannotated-const-assertions": requireUnannotatedConstAssertions, "require-v-registration": requireVRegistration, - "require-variadic-function-argument": requireVariadicFunctionArgument, - "strict-array-methods": strictArrayMethods, - "strict-enums": strictEnums, - "strict-undefined-functions": strictUndefinedFunctions, - "strict-void-functions": strictVoidFunctions, }; diff --git a/packages/eslint-plugin-isaacscript/src/rules/complete-sentences-jsdoc.ts b/packages/eslint-plugin-isaacscript/src/rules/complete-sentences-jsdoc.ts deleted file mode 100644 index 668a497f0..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/complete-sentences-jsdoc.ts +++ /dev/null @@ -1,63 +0,0 @@ -import type { CompleteSentenceMessageIds } from "../completeSentence.js"; -import { getIncompleteSentences } from "../completeSentence.js"; -import { getJSDocComments, getTextFromJSDocComment } from "../jsdoc.js"; -import { createRule } from "../utils.js"; - -export type Options = []; - -export const completeSentencesJSDoc = createRule< - Options, - CompleteSentenceMessageIds ->({ - name: "complete-sentences-jsdoc", - meta: { - type: "problem", - docs: { - description: "Requires complete sentences for JSDoc comments", - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - missingCapital: - "JSDoc comments must contain complete sentences with a capital letter.\n{{ sentence }}", - missingPeriod: - "JSDoc comments must contain complete sentences with a trailing period.\n{{ sentence }}", - doublePeriod: - "JSDoc comments must not end with a double period. Did you make a typo?.\n{{ sentence }}", - }, - }, - defaultOptions: [], - - /** - * We need to write the rule in such a way that it operates on the entire source code instead of - * individual AST nodes: - * https://stackoverflow.com/questions/47429792/is-it-possible-to-get-comments-as-nodes-in-the-ast-using-the-typescript-compiler - */ - create(context) { - const comments = context.sourceCode.getAllComments(); - - // We only look at `/**` style comments. - const jsDocComments = getJSDocComments(comments); - - for (const comment of jsDocComments) { - const text = getTextFromJSDocComment(comment.value); - const incompleteSentences = getIncompleteSentences(text); - - for (const incompleteSentence of incompleteSentences) { - context.report({ - loc: { - start: comment.loc.start, - end: comment.loc.end, - }, - messageId: incompleteSentence.messageId, - data: { - sentence: incompleteSentence.sentence, - }, - }); - } - } - - return {}; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/complete-sentences-line-comments.ts b/packages/eslint-plugin-isaacscript/src/rules/complete-sentences-line-comments.ts deleted file mode 100644 index 7222c857f..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/complete-sentences-line-comments.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { isSeparatorLine } from "../comments.js"; -import type { CompleteSentenceMessageIds } from "../completeSentence.js"; -import { getIncompleteSentences } from "../completeSentence.js"; -import { JAVASCRIPT_RESERVED_WORDS_SET } from "../constants.js"; -import { assertDefined } from "../isaacScriptCommon.js"; -import { - allCommentsInBlockAreCommentedOutArrayElements, - getCommentBlocks, - getLeadingLineComments, -} from "../leadingLineComments.js"; -import { createRule } from "../utils.js"; - -export type Options = []; - -export const completeSentencesLineComments = createRule< - Options, - CompleteSentenceMessageIds ->({ - name: "complete-sentences-line-comments", - meta: { - type: "problem", - docs: { - description: - "Requires complete sentences for multi-line leading line comments", - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - missingCapital: - "Leading line comments must contain complete sentences with a capital letter.\n{{ sentence }}", - missingPeriod: - "Leading line comments must contain complete sentences with a trailing period.\n{{ sentence }}", - doublePeriod: - "Leading line comments must not end with a double period. Did you make a typo?\n{{ sentence }}", - }, - }, - defaultOptions: [], - create(context) { - const { sourceCode } = context; - const comments = sourceCode.getAllComments(); - - // We only look at `//` style comments on their own line. - const leadingLineComments = getLeadingLineComments(sourceCode, comments); - - // Sort the comments by blocks. - const commentBlocks = getCommentBlocks(leadingLineComments); - - for (const [i, commentBlock] of commentBlocks.entries()) { - const firstComment = commentBlock.originalComments.at(0); - assertDefined(firstComment, "Failed to get the first comment."); - - const lastComment = commentBlock.originalComments.at(-1); - assertDefined(lastComment, "Failed to get the last comment."); - - // Commented out array elements are whitelisted. - if (allCommentsInBlockAreCommentedOutArrayElements(commentBlock)) { - continue; - } - - // Comments in-between "separator lines" are whitelisted. - const previousCommentBlock = commentBlocks[i - 1]; - if ( - previousCommentBlock !== undefined && - isSeparatorLine(previousCommentBlock.mergedText) - ) { - continue; - } - const nextCommentBlock = commentBlocks[i + 1]; - if ( - nextCommentBlock !== undefined && - isSeparatorLine(nextCommentBlock.mergedText) - ) { - continue; - } - - // Unlike JSDoc comments, we want to whitelist comment blocks that begin with JavaScript - // keywords. This is to make commenting out code less painful. e.g. `// const foo = 123;` - const text = commentBlock.mergedText; - const firstWord = getFirstWord(text); - if (JAVASCRIPT_RESERVED_WORDS_SET.has(firstWord)) { - continue; - } - - const incompleteSentences = getIncompleteSentences(text); - for (const incompleteSentence of incompleteSentences) { - context.report({ - loc: { - start: firstComment.loc.start, - end: lastComment.loc.end, - }, - messageId: incompleteSentence.messageId, - data: { - sentence: incompleteSentence.sentence, - }, - }); - } - } - - return {}; - }, -}); - -function getFirstWord(text: string): string { - const words = text.split(" "); - const firstWord = words[0]; - if (firstWord === undefined) { - return ""; - } - - // We want to match e.g. `console.log`. - const parts = firstWord.split("."); - const firstPart = parts[0]; - if (firstPart === undefined) { - return ""; - } - - return firstPart; -} diff --git a/packages/eslint-plugin-isaacscript/src/rules/consistent-enum-values.ts b/packages/eslint-plugin-isaacscript/src/rules/consistent-enum-values.ts deleted file mode 100644 index e7bc4d387..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/consistent-enum-values.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { createRule } from "../utils.js"; - -export const consistentEnumValues = createRule({ - name: "consistent-enum-values", - meta: { - type: "problem", - docs: { - description: "Requires consistent enum values", - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - inconsistentValue: - "The value of an enum member must be a string that exactly matches the enum name.", - }, - }, - defaultOptions: [], - create(context) { - return { - TSEnumMember(node) { - // Ignore computed enums; those are intended to be checked with the - // `@typescript-eslint/prefer-enum-initializers` rule. - const { initializer } = node; - if (initializer === undefined || !("value" in initializer)) { - return; - } - - // Ignore number enums; those are intended to be checked with the - // `isaacscript/no-number-enums` rule. - const enumValue = initializer.value; - if (typeof enumValue !== "string") { - return; - } - - const { id } = node; - if (!("name" in id)) { - return; - } - const enumName = id.name; - - if (enumValue !== enumName) { - context.report({ - node, - messageId: "inconsistentValue", - }); - } - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/consistent-named-tuples.ts b/packages/eslint-plugin-isaacscript/src/rules/consistent-named-tuples.ts deleted file mode 100644 index 55e360ce2..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/consistent-named-tuples.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { AST_NODE_TYPES } from "@typescript-eslint/utils"; -import { createRule } from "../utils.js"; - -export const consistentNamedTuples = createRule({ - name: "consistent-named-tuples", - meta: { - type: "problem", - docs: { - description: - "Requires that if one or more tuple elements are named, all of them are named", - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - notNamed: - "If one element in a tuple has a label, then all of them must have a label.", - }, - }, - defaultOptions: [], - create(context) { - return { - TSTupleType(node) { - const hasNamedElements = node.elementTypes.some( - (typeNode) => typeNode.type === AST_NODE_TYPES.TSNamedTupleMember, - ); - if (hasNamedElements) { - const hasAllNamedElements = node.elementTypes.every( - (typeNode) => typeNode.type === AST_NODE_TYPES.TSNamedTupleMember, - ); - if (!hasAllNamedElements) { - context.report({ - loc: node.loc, - messageId: "notNamed", - }); - } - } - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/enum-member-number-separation.ts b/packages/eslint-plugin-isaacscript/src/rules/enum-member-number-separation.ts index a442d0593..0fcc8e97a 100644 --- a/packages/eslint-plugin-isaacscript/src/rules/enum-member-number-separation.ts +++ b/packages/eslint-plugin-isaacscript/src/rules/enum-member-number-separation.ts @@ -7,7 +7,7 @@ export const enumMemberNumberSeparation = createRule({ type: "problem", docs: { description: "Disallows numbers next to letters in enum members", - recommended: false, + recommended: true, requiresTypeChecking: false, }, schema: [], @@ -46,12 +46,12 @@ export const enumMemberNumberSeparation = createRule({ const lastCharacter = name[i - 1]; const nextCharacter = name[i + 1]; if ( - (lastCharacter !== undefined && - !isNumber(lastCharacter) && - lastCharacter !== "_") || - (nextCharacter !== undefined && - !isNumber(nextCharacter) && - nextCharacter !== "_") + (lastCharacter !== undefined + && !isNumber(lastCharacter) + && lastCharacter !== "_") + || (nextCharacter !== undefined + && !isNumber(nextCharacter) + && nextCharacter !== "_") ) { context.report({ loc: node.loc, diff --git a/packages/eslint-plugin-isaacscript/src/rules/eqeqeq-fix.ts b/packages/eslint-plugin-isaacscript/src/rules/eqeqeq-fix.ts deleted file mode 100644 index 610fe5328..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/eqeqeq-fix.ts +++ /dev/null @@ -1,205 +0,0 @@ -/* eslint-disable */ -// @ts-nocheck -// cspell:ignore Zakas - -/** - * This rule is slightly modified from the original ESLint version in order to always apply the fix: - * https://github.com/eslint/eslint/blob/main/lib/rules/eqeqeq.js - * - * We disable type-checking, linting, and formatting in this file in order to keep the code as close - * as possible to the original. - */ - -import { createRule } from "../utils.js"; - -/** - * @fileoverview Rule to flag statements that use != and == instead of !== and === - * @author Nicholas C. Zakas - */ - -"use strict"; - -//------------------------------------------------------------------------------ -// External code (copy pasted from elsewhere in the ESLint repository) -//------------------------------------------------------------------------------ - -/** - * Determines whether the given node is a `null` literal. - * @param {ASTNode} node The node to check - * @returns {boolean} `true` if the node is a `null` literal - */ -function isNullLiteral(node) { - - /* - * Checking `node.value === null` does not guarantee that a literal is a null literal. - * When parsing values that cannot be represented in the current environment (e.g. unicode - * regexes in Node 4), `node.value` is set to `null` because it wouldn't be possible to - * set `node.value` to a unicode regex. To make sure a literal is actually `null`, check - * `node.regex` instead. Also see: https://github.com/eslint/eslint/issues/8020 - */ - return node.type === "Literal" && node.value === null && !node.regex && !node.bigint; -} - -export const eqeqeqFix = createRule({ - name: "eqeqeq-fix", // Added - defaultOptions: [], // Added; necessary for the `ruleCreator` helper function - - meta: { - type: "suggestion", - - docs: { - description: "Requires the use of `===` and `!==` (and automatically fixes)", - recommended: true, // Changed from false - // url: "https://eslint.org/docs/latest/rules/eqeqeq" - }, - - schema: { - anyOf: [ - { - type: "array", - items: [ - { - enum: ["always"] - }, - { - type: "object", - properties: { - null: { - enum: ["always", "never", "ignore"] - } - }, - additionalProperties: false - } - ], - additionalItems: false - }, - { - type: "array", - items: [ - { - enum: ["smart", "allow-null"] - } - ], - additionalItems: false - } - ] - }, - - fixable: "code", - - messages: { - unexpected: "Expected '{{expectedOperator}}' and instead saw '{{actualOperator}}'.", - }, - }, - - create(context) { - const config = context.options[0] || "always"; - const options = context.options[1] || {}; - const sourceCode = context.sourceCode; - - const nullOption = (config === "always") - ? options.null || "always" - : "ignore"; - const enforceRuleForNull = (nullOption === "always"); - const enforceInverseRuleForNull = (nullOption === "never"); - - /** - * Checks if an expression is a typeof expression - * @param {ASTNode} node The node to check - * @returns {boolean} if the node is a typeof expression - */ - function isTypeOf(node) { - return node.type === "UnaryExpression" && node.operator === "typeof"; - } - - /** - * Checks if either operand of a binary expression is a typeof operation - * @param {ASTNode} node The node to check - * @returns {boolean} if one of the operands is typeof - * @private - */ - function isTypeOfBinary(node) { - return isTypeOf(node.left) || isTypeOf(node.right); - } - - /** - * Checks if operands are literals of the same type (via typeof) - * @param {ASTNode} node The node to check - * @returns {boolean} if operands are of same type - * @private - */ - function areLiteralsAndSameType(node) { - return node.left.type === "Literal" && node.right.type === "Literal" && - typeof node.left.value === typeof node.right.value; - } - - /** - * Checks if one of the operands is a literal null - * @param {ASTNode} node The node to check - * @returns {boolean} if operands are null - * @private - */ - function isNullCheck(node) { - return isNullLiteral(node.right) || isNullLiteral(node.left); - } - - /** - * Reports a message for this rule. - * @param {ASTNode} node The binary expression node that was checked - * @param {string} expectedOperator The operator that was expected (either '==', '!=', '===', or '!==') - * @returns {void} - * @private - */ - function report(node, expectedOperator) { - const operatorToken = sourceCode.getFirstTokenBetween( - node.left, - node.right, - token => token.value === node.operator - ); - - context.report({ - node, - loc: operatorToken.loc, - messageId: "unexpected", - data: { expectedOperator, actualOperator: node.operator }, - fix(fixer) { - /* - // If the comparison is a `typeof` comparison or both sides are literals with the same type, then it's safe to fix. - if (isTypeOfBinary(node) || areLiteralsAndSameType(node)) { - return fixer.replaceText(operatorToken, expectedOperator); - } - return null; - */ - - // Fix everything regardless of whether it is safe to fix. - return fixer.replaceText(operatorToken, expectedOperator); - } - }); - } - - return { - BinaryExpression(node) { - const isNull = isNullCheck(node); - - if (node.operator !== "==" && node.operator !== "!=") { - if (enforceInverseRuleForNull && isNull) { - report(node, node.operator.slice(0, -1)); - } - return; - } - - if (config === "smart" && (isTypeOfBinary(node) || - areLiteralsAndSameType(node) || isNull)) { - return; - } - - if (!enforceRuleForNull && isNull) { - return; - } - - report(node, `${node.operator}=`); - } - }; - - } -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/format-jsdoc-comments.ts b/packages/eslint-plugin-isaacscript/src/rules/format-jsdoc-comments.ts deleted file mode 100644 index a4ef9ecac..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/format-jsdoc-comments.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { formatText } from "../format.js"; -import { trimPrefix } from "../isaacScriptCommon.js"; -import { getJSDocComments, getTextFromJSDocComment } from "../jsdoc.js"; -import { - areStringsEqualExcludingTrailingSpaces, - createRule, -} from "../utils.js"; - -const EXTRA_NUM_CHARACTERS_TO_FIT_ON_JSDOC_SINGLE_LINE = 4; -const DEBUG = false as boolean; - -export type Options = [ - { - maxLength: number; - }, -]; - -export type MessageIds = "incorrectlyFormatted"; - -export const formatJSDocComments = createRule({ - name: "format-jsdoc-comments", - meta: { - type: "layout", - docs: { - description: - "Disallows `/**` comments longer than N characters and multi-line comments that can be merged together", - recommended: true, - requiresTypeChecking: false, - }, - schema: [ - { - type: "object", - properties: { - maxLength: { type: "number" }, - }, - additionalProperties: false, - }, - ], - messages: { - incorrectlyFormatted: "Comment is not formatted correctly.", - }, - fixable: "whitespace", - }, - defaultOptions: [ - { - /** - * Matches the Airbnb style guide, which is the most popular JavaScript style guide in the - * world. - */ - maxLength: 100, - }, - ], - - /** - * We need to write the rule in such a way that it operates on the entire source code instead of - * individual AST nodes: - * https://stackoverflow.com/questions/47429792/is-it-possible-to-get-comments-as-nodes-in-the-ast-using-the-typescript-compiler - */ - create(context, [options]) { - const { maxLength } = options; - - const comments = context.sourceCode.getAllComments(); - - // We only look at `/**` style comments on their own line. - const jsDocComments = getJSDocComments(comments); - - for (const comment of jsDocComments) { - const leftWhitespaceLength = comment.loc.start.column; - const leftWhitespace = " ".repeat(leftWhitespaceLength); - const originalComment = `${leftWhitespace}/*${comment.value}*/`; - - const text = getTextFromJSDocComment(comment.value); - const effectiveMaxLength = - maxLength - leftWhitespaceLength - " * ".length; - let formattedText = formatText(text, effectiveMaxLength); - - // - Disallow comments like: `/** *foo */` - // - We must escape the asterisk to avoid a run-time error. - formattedText = trimPrefix(formattedText, String.raw`\*`, true); - - const canFitOnSingleLine = canFitOnSingleJSDocLine( - formattedText, - effectiveMaxLength, - ); - - const formattedComment = canFitOnSingleLine - ? getJSDocCommentSingleLine(formattedText, leftWhitespace) - : getJSDocCommentMultiLine(formattedText, leftWhitespace); - - if (DEBUG && originalComment !== formattedComment) { - console.log("originalComment:"); - console.log(originalComment); - console.log("formattedComment:"); - console.log(formattedComment); - } - - if ( - !areStringsEqualExcludingTrailingSpaces( - originalComment, - formattedComment, - ) - ) { - context.report({ - loc: { - start: comment.loc.start, - end: comment.loc.end, - }, - messageId: "incorrectlyFormatted", - fix: (fixer) => { - const [commentStart, commentEnd] = comment.range; - const commentBeginningOfLine = - commentStart - comment.loc.start.column; - const range = [commentBeginningOfLine, commentEnd] as const; - - return fixer.replaceTextRange(range, formattedComment); - }, - }); - } - } - - return {}; - }, -}); - -/** - * JSDoc can be either single-line or multi-line. For example: - * - * ```ts - * /** This is a single-line JSDoc comment. * / - * - * /** - * * This is a multi-line JSDoc comment. - * * / - * ``` - */ -function canFitOnSingleJSDocLine(text: string, effectiveMaxLength: number) { - const textLines = text.split("\n"); - return ( - textLines.length === 1 && - text.length + EXTRA_NUM_CHARACTERS_TO_FIT_ON_JSDOC_SINGLE_LINE <= - effectiveMaxLength - ); -} - -function getJSDocCommentSingleLine(text: string, leftWhitespace: string) { - return `${leftWhitespace}/** ${text} */`; -} - -function getJSDocCommentMultiLine(text: string, leftWhitespace: string) { - const header = `${leftWhitespace}/**`; - const emptyLine = `${leftWhitespace} *`; - const footer = `${leftWhitespace} */`; - - const linePrefix = `${emptyLine} `; - - const lines = text.split("\n"); - const commentLines = lines.map((line) => - line.trim() === "" ? emptyLine : `${linePrefix}${line}`, - ); - const comments = commentLines.join("\n"); - - return `${header}\n${comments}\n${footer}`; -} diff --git a/packages/eslint-plugin-isaacscript/src/rules/format-line-comments.ts b/packages/eslint-plugin-isaacscript/src/rules/format-line-comments.ts deleted file mode 100644 index e9ee50f49..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/format-line-comments.ts +++ /dev/null @@ -1,176 +0,0 @@ -import type { TSESTree } from "@typescript-eslint/utils"; -import { formatText } from "../format.js"; -import { assertDefined } from "../isaacScriptCommon.js"; -import { - allCommentsInBlockAreCommentedOutArrayElements, - getCommentBlocks, - getLeadingLineComments, -} from "../leadingLineComments.js"; -import { - areStringsEqualExcludingTrailingSpaces, - createRule, -} from "../utils.js"; - -const SLASH_SLASH = "//"; -const DEBUG = false as boolean; - -export type Options = [ - { - maxLength: number; - }, -]; - -export type MessageIds = "incorrectlyFormatted"; - -export const formatLineComments = createRule({ - name: "format-line-comments", - meta: { - type: "layout", - docs: { - description: - "Disallows `//` comments longer than N characters and multi-line comments that can be merged together", - recommended: true, - requiresTypeChecking: false, - }, - schema: [ - { - type: "object", - properties: { - maxLength: { type: "number" }, - }, - additionalProperties: false, - }, - ], - messages: { - incorrectlyFormatted: "Comment is not formatted correctly.", - }, - fixable: "whitespace", - }, - defaultOptions: [ - { - /** - * Matches the Airbnb style guide, which is the most popular JavaScript style guide in the - * world. - */ - maxLength: 100, - }, - ], - - /** - * We need to write the rule in such a way that it operates on the entire source code instead of - * individual AST nodes: - * https://stackoverflow.com/questions/47429792/is-it-possible-to-get-comments-as-nodes-in-the-ast-using-the-typescript-compiler - */ - create(context, [options]) { - const { maxLength } = options; - - const { sourceCode } = context; - const comments = sourceCode.getAllComments(); - - // We only look at `//` style comments on their own line. - const leadingLineComments = getLeadingLineComments(sourceCode, comments); - - // Sort the comments by blocks. - const commentBlocks = getCommentBlocks(leadingLineComments); - - for (const commentBlock of commentBlocks) { - const firstComment = commentBlock.originalComments.at(0); - assertDefined(firstComment, "Failed to get the first comment."); - - const lastComment = commentBlock.originalComments.at(-1); - assertDefined(lastComment, "Failed to get the last comment."); - - // Commented out array elements are whitelisted. - if (allCommentsInBlockAreCommentedOutArrayElements(commentBlock)) { - continue; - } - - const leftWhitespaceLength = firstComment.loc.start.column; - const leftWhitespace = " ".repeat(leftWhitespaceLength); - - const originalText = getTextFromComments( - commentBlock.originalComments, - leftWhitespace, - ); - - const effectiveMaxLength = - maxLength - leftWhitespaceLength - "// ".length; - const formattedTextRaw = formatText( - commentBlock.mergedText, - effectiveMaxLength, - false, - ); - const formattedText = convertTextToLeadingLineComments( - formattedTextRaw, - leftWhitespace, - ); - - if (DEBUG && originalText !== formattedText) { - console.log("originalText:"); - console.log(originalText); - console.log("formattedText:"); - console.log(formattedText); - } - - if ( - !areStringsEqualExcludingTrailingSpaces(originalText, formattedText) - ) { - context.report({ - loc: { - start: firstComment.loc.start, - end: lastComment.loc.end, - }, - messageId: "incorrectlyFormatted", - fix: (fixer) => { - const [firstCommentStart, _firstCommentEnd] = firstComment.range; - const [_lastCommentStart, lastCommentEnd] = lastComment.range; - const firstCommentBeginningOfLine = - firstCommentStart - firstComment.loc.start.column; - const range = [ - firstCommentBeginningOfLine, - lastCommentEnd, - ] as const; - - return fixer.replaceTextRange(range, formattedText); - }, - }); - } - } - - return {}; - }, -}); - -/** - * Given an array of comments, transform the text back into how it would look in the real source - * code. - * - * Note that this should not include the left whitespace before the comment actually begins, because - * we need to compare the vanilla source code to the formatted source code without worrying about - * any leading whitespace. - */ -function getTextFromComments( - comments: readonly TSESTree.Comment[], - leftWhitespace: string, -): string { - const lines = comments.map( - // `comment.value` will almost always have a leading leading space, due to Prettier changing - // `//Comment` to `// Comment`. But it is also possible that the rule is running before Prettier - // has had a chance to format the code. Either way, we want this function to represent the text - // as it really is in the source code. - (comment) => `${leftWhitespace}${SLASH_SLASH}${comment.value}`, - ); - return lines.join("\n"); -} - -/** Converts "Foo" to "// Foo". */ -function convertTextToLeadingLineComments( - text: string, - leftWhitespace: string, -): string { - const lines = text.split("\n"); - const linesWithPrefix = lines.map( - (line) => `${leftWhitespace}${SLASH_SLASH} ${line}`, - ); - return linesWithPrefix.join("\n"); -} diff --git a/packages/eslint-plugin-isaacscript/src/rules/jsdoc-code-block-language.ts b/packages/eslint-plugin-isaacscript/src/rules/jsdoc-code-block-language.ts deleted file mode 100644 index 4281178b3..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/jsdoc-code-block-language.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { getJSDocComments, getTextFromJSDocComment } from "../jsdoc.js"; -import { createRule } from "../utils.js"; - -export const jsdocCodeBlockLanguage = createRule({ - name: "jsdoc-code-block-language", - meta: { - type: "problem", - docs: { - description: - "Requires a language specification for every JSDoc code block", - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - noLanguage: "You must specify a language for the code block.", - }, - }, - defaultOptions: [], - - /** - * We need to write the rule in such a way that it operates on the entire source code instead of - * individual AST nodes: - * https://stackoverflow.com/questions/47429792/is-it-possible-to-get-comments-as-nodes-in-the-ast-using-the-typescript-compiler - */ - create(context) { - const comments = context.sourceCode.getAllComments(); - - // We only look at `/**` style comments. - const jsDocComments = getJSDocComments(comments); - - for (const comment of jsDocComments) { - const text = getTextFromJSDocComment(comment.value); - const lines = text.split("\n"); - - // We only want to match the opening backticks of a code block. - let insideCodeBlock = false; - for (const line of lines) { - if (line.includes("```")) { - insideCodeBlock = !insideCodeBlock; - } - - if (!insideCodeBlock) { - continue; - } - - if (line.endsWith("```")) { - context.report({ - loc: { - start: comment.loc.start, - end: comment.loc.end, - }, - messageId: "noLanguage", - }); - } - } - } - - return {}; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/newline-between-switch-case.ts b/packages/eslint-plugin-isaacscript/src/rules/newline-between-switch-case.ts deleted file mode 100644 index 0545150a1..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/newline-between-switch-case.ts +++ /dev/null @@ -1,78 +0,0 @@ -// The code here needs to detect the "fall through" switch case. Thus, we borrow heavily from the -// source code for the "no-fallthrough" rule. - -import type { TSESTree } from "@typescript-eslint/utils"; -import { createRule } from "../utils.js"; - -export type Options = []; -export type MessageIds = "noNewline"; - -export const newlineBetweenSwitchCase = createRule({ - name: "newline-between-switch-case", - meta: { - type: "layout", - docs: { - description: "Requires newlines between switch cases", - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - noNewline: "Newline required between switch cases.", - }, - fixable: "whitespace", - }, - defaultOptions: [], - create(context) { - const { sourceCode } = context; - - return { - SwitchCase(node) { - const { parent } = node; - - // Ignore switch cases without a consequent (i.e. no brackets), as those should not have - // newlines after them. - if (node.consequent.length === 0) { - return; - } - - // Ignore the final case, as there should not be a newline between the final case and the - // end of the switch statement. - const finalCase = parent.cases.at(-1); - const isFinalCase = node === finalCase; - if (isFinalCase) { - return; - } - - const nextToken = sourceCode.getTokenAfter(node); - if (nextToken === null) { - return; - } - - if (!hasBlankLinesBetween(node, nextToken)) { - context.report({ - node, - fix(fixer) { - return fixer.insertTextAfter(node, "\n"); - }, - messageId: "noNewline", - }); - } - }, - }; - }, -}); - -/** - * Checks whether a node and a token are separated by blank lines. - * - * @param node The node to check. - * @param token The token to compare against. - * @returns `true` if there are blank lines between node and token. - */ -function hasBlankLinesBetween( - node: TSESTree.Node, - token: TSESTree.Token, -): boolean { - return token.loc.start.line > node.loc.end.line + 1; -} diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-confusing-set-methods.ts b/packages/eslint-plugin-isaacscript/src/rules/no-confusing-set-methods.ts deleted file mode 100644 index 60d5720f0..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-confusing-set-methods.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils"; -import { getTypeName } from "../typeUtils.js"; -import { createRule } from "../utils.js"; - -type Options = []; - -type MessageIds = "noKeys" | "noEntries"; - -const METHOD_NAME_TO_MESSAGE_ID: ReadonlyMap = new Map([ - ["keys", "noKeys"], - ["entries", "noEntries"], -]); - -export const noConfusingSetMethods = createRule({ - name: "no-confusing-set-methods", - meta: { - type: "problem", - docs: { - description: "Disallows confusing methods for sets", - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - noKeys: - "Using the `Set.keys` method is confusing, since sets do not have keys. Use the `Set.values` method instead.", - noEntries: - "Using the `Set.entries` method is confusing, since sets only have values. Use the `Set.values` method instead.", - }, - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - const checker = parserServices.program.getTypeChecker(); - - return { - MemberExpression(node) { - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node.object); - const type = checker.getTypeAtLocation(tsNode); - - const typeName = getTypeName(type); - if (typeName !== "Set" && typeName !== "ReadonlySet") { - return; - } - - const { property } = node; - if (property.type !== AST_NODE_TYPES.Identifier) { - return; - } - - const methodName = property.name; - const messageId = METHOD_NAME_TO_MESSAGE_ID.get(methodName); - if (messageId === undefined) { - return; - } - - context.report({ - loc: node.loc, - messageId, - }); - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-empty-jsdoc.ts b/packages/eslint-plugin-isaacscript/src/rules/no-empty-jsdoc.ts deleted file mode 100644 index b2ee09e53..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-empty-jsdoc.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { getJSDocComments } from "../jsdoc.js"; -import { createRule } from "../utils.js"; - -export const noEmptyJSDoc = createRule({ - name: "no-empty-jsdoc", - meta: { - type: "problem", - docs: { - description: "Disallows empty JSDoc comments", - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - isEmpty: "Empty JSDoc comments are not allowed.", - }, - fixable: "code", - }, - defaultOptions: [], - - /** - * We need to write the rule in such a way that it operates on the entire source code instead of - * individual AST nodes: - * https://stackoverflow.com/questions/47429792/is-it-possible-to-get-comments-as-nodes-in-the-ast-using-the-typescript-compiler - */ - create(context) { - const comments = context.sourceCode.getAllComments(); - - // We only look at `/**` style comments on their own line. - const jsDocComments = getJSDocComments(comments); - - for (const comment of jsDocComments) { - const text = comment.value.trim(); - const textWithoutAsterisks = text.replaceAll("*", ""); - const commentBody = textWithoutAsterisks.trim(); - - if (commentBody === "") { - context.report({ - loc: { - start: comment.loc.start, - end: comment.loc.end, - }, - messageId: "isEmpty", - fix: (fixer) => fixer.replaceTextRange(comment.range, ""), - }); - } - } - - return {}; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-empty-line-comments.ts b/packages/eslint-plugin-isaacscript/src/rules/no-empty-line-comments.ts deleted file mode 100644 index ba208501a..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-empty-line-comments.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { TSESTree } from "@typescript-eslint/utils"; -import { createRule } from "../utils.js"; - -export const noEmptyLineComments = createRule({ - name: "no-empty-line-comments", - meta: { - type: "problem", - docs: { - description: "Disallows empty line comments", - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - isEmpty: "Empty line comments comments are not allowed.", - }, - fixable: "code", - }, - defaultOptions: [], - - /** - * We need to write the rule in such a way that it operates on the entire source code instead of - * individual AST nodes: - * https://stackoverflow.com/questions/47429792/is-it-possible-to-get-comments-as-nodes-in-the-ast-using-the-typescript-compiler - */ - create(context) { - const comments = context.sourceCode.getAllComments(); - const emptyLeadingLineComments = comments.filter( - (comment) => - comment.type === TSESTree.AST_TOKEN_TYPES.Line && // i.e. a "//" comment - comment.value.trim() === "", - ); - - for (const comment of emptyLeadingLineComments) { - context.report({ - loc: { - start: comment.loc.start, - end: comment.loc.end, - }, - messageId: "isEmpty", - fix: (fixer) => fixer.replaceTextRange(comment.range, ""), - }); - } - - return {}; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-explicit-array-loops.ts b/packages/eslint-plugin-isaacscript/src/rules/no-explicit-array-loops.ts deleted file mode 100644 index eddf7aa16..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-explicit-array-loops.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { getConstrainedTypeAtLocation } from "@typescript-eslint/type-utils"; -import type { TSESTree } from "@typescript-eslint/utils"; -import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils"; -import { isTypeArrayTupleTypeOrUnionOfArrayTupleTypes } from "../typeUtils.js"; -import { createRule } from "../utils.js"; - -export type Options = []; -export type MessageIds = "noExplicitArray"; - -export const noExplicitArrayLoops = createRule({ - name: "no-explicit-array-loops", - meta: { - type: "problem", - docs: { - description: "Disallows explicit iteration for arrays", - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - noExplicitArray: - 'Explicit iteration over arrays is disallowed. (Get rid of the "Object.values()".)', - }, - fixable: "code", - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - const checker = parserServices.program.getTypeChecker(); - - /** Checks for `array.values()`. */ - function checkArrayValuesForm(node: TSESTree.ForOfStatement) { - const callExpression = node.right; - if (callExpression.type !== AST_NODE_TYPES.CallExpression) { - return; - } - - const memberExpression = callExpression.callee; - if (memberExpression.type !== AST_NODE_TYPES.MemberExpression) { - return; - } - - if (memberExpression.object.type !== AST_NODE_TYPES.Identifier) { - return; - } - - const potentialArrayType = getConstrainedTypeAtLocation( - parserServices, - memberExpression.object, - ); - if ( - !isTypeArrayTupleTypeOrUnionOfArrayTupleTypes( - potentialArrayType, - checker, - ) - ) { - return; - } - - const methodIdentifier = memberExpression.property; - if (methodIdentifier.type !== AST_NODE_TYPES.Identifier) { - return; - } - - const methodName = methodIdentifier.name; - if (methodName !== "values") { - return; - } - - const callExpressionEnd = callExpression.range[1]; - const replacementStart = callExpressionEnd - ".values()".length; - const replacementEnd = callExpressionEnd; - - context.report({ - loc: methodIdentifier.loc, - messageId: "noExplicitArray", - fix: (fixer) => - fixer.replaceTextRange([replacementStart, replacementEnd], ""), - }); - } - - /** Checks for `Object.values(array)`. */ - function checkObjectValuesForm(node: TSESTree.ForOfStatement) { - const callExpression = node.right; - if (callExpression.type !== AST_NODE_TYPES.CallExpression) { - return; - } - - const memberExpression = callExpression.callee; - if (memberExpression.type !== AST_NODE_TYPES.MemberExpression) { - return; - } - - if (memberExpression.object.type !== AST_NODE_TYPES.Identifier) { - return; - } - - if (memberExpression.object.name !== "Object") { - return; - } - - const methodIdentifier = memberExpression.property; - if (methodIdentifier.type !== AST_NODE_TYPES.Identifier) { - return; - } - - const methodName = methodIdentifier.name; - if (methodName !== "values") { - return; - } - - const firstArgument = callExpression.arguments[0]; - if (firstArgument === undefined) { - return; - } - - if (firstArgument.type !== AST_NODE_TYPES.Identifier) { - return; - } - - const potentialArrayType = getConstrainedTypeAtLocation( - parserServices, - firstArgument, - ); - if ( - !isTypeArrayTupleTypeOrUnionOfArrayTupleTypes( - potentialArrayType, - checker, - ) - ) { - return; - } - - const [callExpressionStart, callExpressionEnd] = callExpression.range; - const firstReplacementStart = callExpressionStart; - const firstReplacementEnd = callExpressionStart + "Object.values(".length; - const secondReplacementStart = callExpressionEnd - ")".length; - const secondReplacementEnd = callExpressionEnd; - - context.report({ - loc: methodIdentifier.loc, - messageId: "noExplicitArray", - fix: (fixer) => [ - fixer.replaceTextRange( - [firstReplacementStart, firstReplacementEnd], - "", - ), - fixer.replaceTextRange( - [secondReplacementStart, secondReplacementEnd], - "", - ), - ], - }); - } - - return { - ForOfStatement(node) { - checkObjectValuesForm(node); - checkArrayValuesForm(node); - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-explicit-map-set-loops.ts b/packages/eslint-plugin-isaacscript/src/rules/no-explicit-map-set-loops.ts deleted file mode 100644 index 132fb943a..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-explicit-map-set-loops.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils"; -import { getTypeName } from "../typeUtils.js"; -import { createRule } from "../utils.js"; - -type Options = []; -type MessageIds = "noExplicitMap" | "noExplicitSet"; - -export const noExplicitMapSetLoops = createRule({ - name: "no-explicit-map-set-loops", - meta: { - type: "problem", - docs: { - description: "Disallows explicit iteration for maps and sets", - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - noExplicitMap: - 'Explicit iteration over maps is disallowed. (Get rid of the ".entries()".)', - noExplicitSet: - 'Explicit iteration over sets is disallowed. (Get rid of the ".values()".)', - }, - fixable: "code", - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - const checker = parserServices.program.getTypeChecker(); - - return { - ForOfStatement(node) { - const callExpression = node.right; - if (callExpression.type !== AST_NODE_TYPES.CallExpression) { - return; - } - - const memberExpression = callExpression.callee; - if (memberExpression.type !== AST_NODE_TYPES.MemberExpression) { - return; - } - - const potentialMapOrSet = memberExpression.object; - const potentialMapOrSetTSNode = - parserServices.esTreeNodeToTSNodeMap.get(potentialMapOrSet); - const potentialMapOrSetType = checker.getTypeAtLocation( - potentialMapOrSetTSNode, - ); - - const potentialMapOrSetName = getTypeName(potentialMapOrSetType); - if (potentialMapOrSetName === undefined) { - return; - } - - const typeTuple = getTypeTuple(potentialMapOrSetName); - if (typeTuple === undefined) { - return; - } - const [messageId, expectedMethodName] = typeTuple; - - const methodIdentifier = memberExpression.property; - if (methodIdentifier.type !== AST_NODE_TYPES.Identifier) { - return; - } - - const methodName = methodIdentifier.name; - if (methodName !== expectedMethodName) { - return; - } - - const callExpressionEnd = callExpression.range[1]; - const replacementStart = - callExpressionEnd - `.${expectedMethodName}()`.length; - const replacementEnd = callExpressionEnd; - - context.report({ - loc: methodIdentifier.loc, - messageId, - fix: (fixer) => - fixer.replaceTextRange([replacementStart, replacementEnd], ""), - }); - }, - }; - }, -}); - -function getTypeTuple( - typeName: string, -): [messageId: MessageIds, expectedMethodName: string] | undefined { - if (typeName === "Map" || typeName === "ReadonlyMap") { - return ["noExplicitMap", "entries"]; - } - - if (typeName === "Set" || typeName === "ReadonlySet") { - return ["noExplicitSet", "values"]; - } - - return undefined; -} diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-for-in.ts b/packages/eslint-plugin-isaacscript/src/rules/no-for-in.ts deleted file mode 100644 index 935ee65e5..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-for-in.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { createRule } from "../utils.js"; - -export const noForIn = createRule({ - name: "no-for-in", - meta: { - type: "problem", - docs: { - description: 'Disallows "for x in y" statements', - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - noForIn: - 'for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use a "for of" loop instead.', - }, - }, - defaultOptions: [], - create(context) { - return { - ForInStatement(node) { - context.report({ - node, - messageId: "noForIn", - }); - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-invalid-default-map.ts b/packages/eslint-plugin-isaacscript/src/rules/no-invalid-default-map.ts index a61562e99..45f573ff3 100644 --- a/packages/eslint-plugin-isaacscript/src/rules/no-invalid-default-map.ts +++ b/packages/eslint-plugin-isaacscript/src/rules/no-invalid-default-map.ts @@ -15,7 +15,7 @@ export const noInvalidDefaultMap = createRule< type: "problem", docs: { description: "Disallows invalid constructors for the DefaultMap class", - recommended: false, + recommended: true, requiresTypeChecking: true, }, schema: [], diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-let-any.ts b/packages/eslint-plugin-isaacscript/src/rules/no-let-any.ts deleted file mode 100644 index 4292080c5..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-let-any.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { ESLintUtils } from "@typescript-eslint/utils"; -import { isAny } from "../typeUtils.js"; -import { createRule } from "../utils.js"; - -export const noLetAny = createRule({ - name: "no-let-any", - meta: { - type: "problem", - docs: { - description: - "Disallows declaring variables with let that do not have a type", - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - noType: "Variables must be declared with a type.", - }, - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - const checker = parserServices.program.getTypeChecker(); - - return { - VariableDeclaration(node) { - if (node.kind !== "let") { - return; - } - - for (const declaration of node.declarations) { - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(declaration); - - /** - * We have to use `leftTSNode.name` instead of `leftTSNode` to avoid run-time errors - * because the `typeChecker.getTypeAtLocation` method expects a `ts.BindingName` instead - * of a `ts.VariableDeclaration`: https://github.com/microsoft/TypeScript/issues/48878 - */ - const type = checker.getTypeAtLocation(tsNode.name); - - if (isAny(type)) { - context.report({ - node, - messageId: "noType", - }); - } - } - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-mutable-return.ts b/packages/eslint-plugin-isaacscript/src/rules/no-mutable-return.ts deleted file mode 100644 index 426711602..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-mutable-return.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { ESLintUtils } from "@typescript-eslint/utils"; -import type ts from "typescript"; -import { getTypeName, unionTypeParts } from "../typeUtils.js"; -import { createRule } from "../utils.js"; - -type Options = []; -type MessageIds = "mutableArray" | "mutableMap" | "mutableSet"; - -export const noMutableReturn = createRule({ - name: "no-mutable-return", - meta: { - type: "problem", - docs: { - description: - "Disallows returning mutable arrays, maps, and sets from functions", - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - mutableArray: - "Arrays that are returned from functions must be read-only. (Use the `readonly` keyword prefix or the `Readonly` utility type.)", - mutableMap: - "Maps that are returned from functions must be read-only. (Annotate the function using the `ReadonlyMap` type.)", - mutableSet: - "Sets that are returned from functions must be read-only. (Annotate the function using the `ReadonlySet` type.)", - }, - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - const checker = parserServices.program.getTypeChecker(); - - return { - FunctionDeclaration(node) { - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); - const type = checker.getTypeAtLocation(tsNode); - const signatures = type.getCallSignatures(); - for (const signature of signatures) { - const returnType = signature.getReturnType(); - for (const t of unionTypeParts(returnType)) { - const messageId = getErrorMessageId(t); - if (messageId !== undefined) { - context.report({ - loc: node.loc, - messageId, - }); - } - } - } - }, - }; - }, -}); - -function getErrorMessageId(type: ts.Type): MessageIds | undefined { - const typeName = getTypeName(type); - if (typeName === undefined) { - return undefined; - } - - // This would be "ReadonlyMap" if it was the read-only version. - if (typeName === "Map") { - return "mutableMap"; - } - - // This would be "ReadonlySet" if it was the read-only version. - if (typeName === "Set") { - return "mutableSet"; - } - - // This would be "ReadonlyArray" if it was the read-only version. - if (typeName === "Array") { - return "mutableArray"; - } - - return undefined; -} diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-number-enums.ts b/packages/eslint-plugin-isaacscript/src/rules/no-number-enums.ts deleted file mode 100644 index fc3405f55..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-number-enums.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { createRule } from "../utils.js"; - -export const noNumberEnums = createRule({ - name: "no-number-enums", - meta: { - type: "problem", - docs: { - description: "Disallows number enums", - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - noNumberEnums: - "Number enums are disallowed; use a string enum instead because they are safer.", - }, - }, - defaultOptions: [], - create(context) { - return { - "TSEnumMember > :matches(Literal[raw>=0].initializer, UnaryExpression.initializer)": - (node) => { - context.report({ - node, - messageId: "noNumberEnums", - }); - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-object-any.ts b/packages/eslint-plugin-isaacscript/src/rules/no-object-any.ts deleted file mode 100644 index 72a978524..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-object-any.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { isTypeReferenceType } from "@typescript-eslint/type-utils"; -import { ESLintUtils } from "@typescript-eslint/utils"; -import { isAny } from "../typeUtils.js"; -import { createRule, getOrdinalSuffix } from "../utils.js"; - -export const noObjectAny = createRule({ - name: "no-object-any", - meta: { - type: "problem", - docs: { - description: - "Disallows declaring objects and arrays that do not have a type", - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - noType: - "Objects/arrays must be declared with a type. (The {{ ordinal }} type parameter is `any`.)", - }, - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - const checker = parserServices.program.getTypeChecker(); - - return { - VariableDeclarator(node) { - // From: https://github.com/typescript-eslint/typescript-eslint/issues/781 - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); - - /** - * We have to use `leftTSNode.name` instead of `leftTSNode` to avoid run-time errors because - * the `typeChecker.getTypeAtLocation` method expects a `ts.BindingName` instead - * of a`ts.VariableDeclaration`: https://github.com/microsoft/TypeScript/issues/48878 - */ - const type = checker.getTypeAtLocation(tsNode.name); - - if (!isTypeReferenceType(type)) { - return; - } - - const typeArguments = checker.getTypeArguments(type); - for (const [i, typeArgument] of typeArguments.entries()) { - if (isAny(typeArgument)) { - context.report({ - node, - messageId: "noType", - data: { - ordinal: getOrdinalSuffix(i + 1), // e.g. 0 --> 1st - }, - }); - } - } - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-object-methods-with-map-set.ts b/packages/eslint-plugin-isaacscript/src/rules/no-object-methods-with-map-set.ts deleted file mode 100644 index 6cef6b76e..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-object-methods-with-map-set.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils"; -import { capitalizeFirstLetter, trimPrefix } from "../isaacScriptCommon.js"; -import { getTypeName } from "../typeUtils.js"; -import { createRule } from "../utils.js"; - -type Options = []; - -type MessageIds = - | "noObjectEntriesMap" - | "noObjectKeysMap" - | "noObjectValuesMap" - | "noObjectEntriesSet" - | "noObjectKeysSet" - | "noObjectValuesSet"; - -const PROBLEM_METHODS: ReadonlySet = new Set([ - "entries", - "keys", - "values", -]); - -const PROBLEM_TYPES: ReadonlySet = new Set([ - "Map", - "Set", - "ReadonlyMap", - "ReadonlySet", -]); - -export const noObjectMethodsWithMapSet = createRule({ - name: "no-object-methods-with-map-set", - meta: { - type: "problem", - docs: { - description: "Disallows using object methods with maps and sets", - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - noObjectEntriesMap: - "You cannot use the `Object.entries` method with a map. Consider using the `entries` method on the map instead.", - noObjectKeysMap: - "You cannot use the `Object.keys` method with a map. Consider using the `keys` method on the map instead.", - noObjectValuesMap: - "You cannot use the `Object.values` method with a map. Consider using the `values` method on the map instead.", - noObjectEntriesSet: - "You cannot use the `Object.entries` method with a set. Consider using the `entries` method on the set instead.", - noObjectKeysSet: - "You cannot use the `Object.keys` method with a set. Consider using the `keys` method on the set instead.", - noObjectValuesSet: - "You cannot use the `Object.values` method with a set. Consider using the `values` method on the set instead.", - }, - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - const checker = parserServices.program.getTypeChecker(); - - return { - /** When a function or method is called. */ - CallExpression(node) { - // First, check if this is invoking a method on an object. - const { callee } = node; - if (callee.type !== AST_NODE_TYPES.MemberExpression) { - return; - } - - // Second, check if the object is `Object`. - const { object } = callee; - if ( - object.type !== AST_NODE_TYPES.Identifier || - object.name !== "Object" - ) { - return; - } - - // Third, check if this is one of the problem methods. - const { property } = callee; - if ( - property.type !== AST_NODE_TYPES.Identifier || - !PROBLEM_METHODS.has(property.name) - ) { - return; - } - const methodName = property.name; - - // Fourth, check the type of the thing being passed. - const firstArgument = node.arguments[0]; - if (firstArgument === undefined) { - return; - } - - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(firstArgument); - const type = checker.getTypeAtLocation(tsNode); - - const typeName = getTypeName(type); - if (typeName === undefined) { - return; - } - - if (!PROBLEM_TYPES.has(typeName)) { - return; - } - - const capitalMethodName = capitalizeFirstLetter(methodName); - const trimmedTypeName = trimPrefix(typeName, "Readonly"); - const messageId = - `noObject${capitalMethodName}${trimmedTypeName}` as MessageIds; - - context.report({ - loc: node.loc, - messageId, - }); - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-string-length-0.ts b/packages/eslint-plugin-isaacscript/src/rules/no-string-length-0.ts deleted file mode 100644 index 802165704..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-string-length-0.ts +++ /dev/null @@ -1,68 +0,0 @@ -import type { TSESTree } from "@typescript-eslint/utils"; -import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils"; -import ts from "typescript"; -import { isFlagSet } from "../typeUtils.js"; -import { createRule } from "../utils.js"; - -export const noStringLength0 = createRule({ - name: "no-string-length-0", - meta: { - type: "problem", - docs: { - description: - "Disallows checking for empty strings via the length method in favor of direct comparison to an empty string", - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - noStringLength0: - "Compare to an empty string directly instead of using the length method, as it is shorter and easier to read.", - }, - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - const checker = parserServices.program.getTypeChecker(); - - function isStringLength( - node: TSESTree.PrivateIdentifier | TSESTree.Expression, - ): boolean { - if (node.type !== AST_NODE_TYPES.MemberExpression) { - return false; - } - - if ( - node.property.type !== AST_NODE_TYPES.Identifier || - node.property.name !== "length" - ) { - return false; - } - - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node.object); - const type = checker.getTypeAtLocation(tsNode); - - // We don't use `isTypeFlagSet` because we don't want to iterate through any unions; we only - // want to match exactly `string`. - return isFlagSet(type.flags, ts.TypeFlags.String); - } - - return { - BinaryExpression(node) { - if ( - (is0(node.left) && isStringLength(node.right)) || - (is0(node.right) && isStringLength(node.left)) - ) { - context.report({ - node, - messageId: "noStringLength0", - }); - } - }, - }; - }, -}); - -function is0(node: TSESTree.PrivateIdentifier | TSESTree.Expression): boolean { - return node.type === AST_NODE_TYPES.Literal && node.raw === "0"; -} diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-template-curly-in-string-fix.ts b/packages/eslint-plugin-isaacscript/src/rules/no-template-curly-in-string-fix.ts deleted file mode 100644 index d4b9ad838..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-template-curly-in-string-fix.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * This rule is slightly modified from the original ESLint version: - * https://github.com/eslint/eslint/blob/main/lib/rules/no-template-curly-in-string.js - */ - -import { createRule } from "../utils.js"; - -const ERRONEOUS_TEMPLATE_STRING_REGEX = /\$\{[^}]+\}/u; - -export const noTemplateCurlyInStringFix = createRule({ - name: "no-template-curly-in-string-fix", - meta: { - type: "problem", - docs: { - description: - "Disallows template literal placeholder syntax in regular strings (and automatically fixes)", - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - unexpectedTemplateExpression: "Unexpected template string expression.", - }, - fixable: "code", - }, - defaultOptions: [], - create(context) { - return { - Literal(node) { - if ( - typeof node.value === "string" && - ERRONEOUS_TEMPLATE_STRING_REGEX.test(node.value) - ) { - context.report({ - node, - messageId: "unexpectedTemplateExpression", - fix(fixer) { - return fixer.replaceText(node, `\`${node.value}\``); - }, - }); - } - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-throw.ts b/packages/eslint-plugin-isaacscript/src/rules/no-throw.ts index 289ba61f0..7f9d55203 100644 --- a/packages/eslint-plugin-isaacscript/src/rules/no-throw.ts +++ b/packages/eslint-plugin-isaacscript/src/rules/no-throw.ts @@ -6,7 +6,7 @@ export const noThrow = createRule({ type: "problem", docs: { description: 'Disallows the usage of "throw"', - recommended: false, + recommended: true, requiresTypeChecking: false, }, schema: [], diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-undefined-return-type.ts b/packages/eslint-plugin-isaacscript/src/rules/no-undefined-return-type.ts deleted file mode 100644 index 304c51ad7..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-undefined-return-type.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { ESLintUtils } from "@typescript-eslint/utils"; -import { getTypeName } from "../typeUtils.js"; -import { createRule } from "../utils.js"; - -export const noUndefinedReturnType = createRule({ - name: "no-undefined-return-type", - meta: { - type: "problem", - docs: { - description: "Disallows `undefined` return types on functions", - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - undefinedReturnType: - "Functions cannot have an `undefined` return type. Change the return type to `void` instead.", - }, - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - const checker = parserServices.program.getTypeChecker(); - - return { - FunctionDeclaration(node) { - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); - const type = checker.getTypeAtLocation(tsNode); - const signatures = type.getCallSignatures(); - for (const signature of signatures) { - const returnType = signature.getReturnType(); - const typeName = getTypeName(returnType); - if (typeName === "undefined") { - context.report({ - loc: node.loc, - messageId: "undefinedReturnType", - }); - } - } - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-unnecessary-assignment.ts b/packages/eslint-plugin-isaacscript/src/rules/no-unnecessary-assignment.ts deleted file mode 100644 index 37f36ade5..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-unnecessary-assignment.ts +++ /dev/null @@ -1,340 +0,0 @@ -import type { TSESTree } from "@typescript-eslint/utils"; -import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils"; -import ts from "typescript"; -import { isFlagSet, unionTypeParts } from "../typeUtils.js"; -import { createRule } from "../utils.js"; - -const USELESS_OPERATORS_WITH_ZERO: ReadonlySet = new Set([ - "+", - "-", - "|", - // "<<" is technically a useless operator, but we whitelist it so that bit flag enums will not - // cause false positives. - ">>", - ">>>", -]); - -const USELESS_ASSIGNMENT_OPERATORS_WITH_ZERO: ReadonlySet = new Set( - [...USELESS_OPERATORS_WITH_ZERO].map((value) => `${value}=`), -); - -export type Options = []; - -export type MessageIds = - | "unnecessary" - | "unnecessaryZero" - | "unnecessaryEmptyString" - | "unnecessaryShortCircuit"; - -export const noUnnecessaryAssignment = createRule({ - name: "no-unnecessary-assignment", - meta: { - type: "problem", - docs: { - description: "Disallows useless assignments", - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - unnecessary: - "This assignment is unnecessary because it would have no effect on the variable.", - unnecessaryZero: - 'This assignment is unnecessary because the "{{ operator }}" operator in combination with 0 would have no effect on a number variable.', - unnecessaryEmptyString: - "This assignment is unnecessary because adding an empty string would have no effect on a string variable.", - unnecessaryShortCircuit: - 'This short circuit assignment using the "{{operator}}" operator is unnecessary because it would have no effect on the variable.', - }, - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - const checker = parserServices.program.getTypeChecker(); - - function nodeHasFlagSet(node: TSESTree.Node, flag: ts.TypeFlags): boolean { - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); - const type = checker.getTypeAtLocation(tsNode); - - // We cannot use `isTypeFlagSet` because we do not want to penetrate unions. - return isFlagSet(type.flags, flag); - } - - function isBoolean(node: TSESTree.Node): boolean { - return nodeHasFlagSet(node, ts.TypeFlags.BooleanLike); - } - - function isNumber(node: TSESTree.Node): boolean { - return nodeHasFlagSet(node, ts.TypeFlags.NumberLike); - } - - function isString(node: TSESTree.Node): boolean { - return nodeHasFlagSet(node, ts.TypeFlags.StringLike); - } - - function isNull(node: TSESTree.Node): boolean { - return nodeHasFlagSet(node, ts.TypeFlags.Null); - } - - function isUndefined(node: TSESTree.Node): boolean { - return nodeHasFlagSet(node, ts.TypeFlags.Undefined); - } - - function isTrue(node: TSESTree.Expression): boolean { - // Checking for the literal value is fast, so we do that first. - if (node.type === AST_NODE_TYPES.Literal && node.value === true) { - return true; - } - - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); - const type = checker.getTypeAtLocation(tsNode); - return "intrinsicName" in type && type.intrinsicName === "true"; - } - - function isFalse(node: TSESTree.Expression): boolean { - // Checking for the literal value is fast, so we do that first. - if (node.type === AST_NODE_TYPES.Literal && node.value === false) { - return true; - } - - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); - const type = checker.getTypeAtLocation(tsNode); - return "intrinsicName" in type && type.intrinsicName === "false"; - } - - function isZero( - node: TSESTree.PrivateIdentifier | TSESTree.Expression, - ): boolean { - // Checking for the literal value is fast, so we do that first. - if (isLiteralZero(node)) { - return true; - } - - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); - const type = checker.getTypeAtLocation(tsNode); - return "value" in type && type.value === 0; - } - - function isEmptyString( - node: TSESTree.PrivateIdentifier | TSESTree.Expression, - ): boolean { - // Checking for the literal value is fast, so we do that first. - if (isLiteralEmptyString(node)) { - return true; - } - - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); - const type = checker.getTypeAtLocation(tsNode); - return "value" in type && type.value === ""; - } - - function hasNullAndNotUndefined(node: TSESTree.Expression): boolean { - if (isNull(node)) { - return true; - } - - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); - const type = checker.getTypeAtLocation(tsNode); - const types = unionTypeParts(type); - return ( - types.some((t) => isFlagSet(t.flags, ts.TypeFlags.Null)) && - !types.some((t) => isFlagSet(t.flags, ts.TypeFlags.Undefined)) - ); - } - - function hasUndefinedAndNotNull(node: TSESTree.Expression): boolean { - if (isUndefined(node)) { - return true; - } - - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); - const type = checker.getTypeAtLocation(tsNode); - const types = unionTypeParts(type); - return ( - types.some((t) => isFlagSet(t.flags, ts.TypeFlags.Undefined)) && - !types.some((t) => isFlagSet(t.flags, ts.TypeFlags.Null)) - ); - } - - function checkEqualSign(node: TSESTree.AssignmentExpression) { - const leftTSNode = parserServices.esTreeNodeToTSNodeMap.get(node.left); - const rightTSNode = parserServices.esTreeNodeToTSNodeMap.get(node.right); - - const leftType = checker.getTypeAtLocation(leftTSNode); - const rightType = checker.getTypeAtLocation(rightTSNode); - - const isLeftLiteral = isFlagSet(leftType.flags, ts.TypeFlags.Literal); - const isRightLiteral = isFlagSet(rightType.flags, ts.TypeFlags.Literal); - - if (isLeftLiteral && isRightLiteral && leftType === rightType) { - context.report({ - loc: node.loc, - messageId: "unnecessary", - }); - } - } - - return { - AssignmentExpression(node) { - if (node.operator === "=") { - checkEqualSign(node); - } else if ( - USELESS_ASSIGNMENT_OPERATORS_WITH_ZERO.has(node.operator) && - isNumber(node.left) && - isLiteralZero(node.right) - ) { - context.report({ - loc: node.loc, - messageId: "unnecessaryZero", - data: { - operator: node.operator, - }, - }); - } else if ( - node.operator === "+=" && - isString(node.left) && - isLiteralEmptyString(node.right) - ) { - context.report({ - loc: node.loc, - messageId: "unnecessaryEmptyString", - }); - } - }, - - BinaryExpression(node) { - if ( - USELESS_OPERATORS_WITH_ZERO.has(node.operator) && - ((isNumber(node.left) && isLiteralZero(node.right)) || - (isNumber(node.right) && isLiteralZero(node.left))) - ) { - context.report({ - loc: node.loc, - messageId: "unnecessaryZero", - data: { - operator: node.operator, - }, - }); - } - - // Plus is the only operator valid for strings. - if ( - node.operator === "+" && - ((isString(node.left) && isLiteralEmptyString(node.right)) || - (isString(node.right) && isLiteralEmptyString(node.left))) - ) { - context.report({ - loc: node.loc, - messageId: "unnecessaryEmptyString", - }); - } - }, - - LogicalExpression(node) { - const { parent } = node; - if ( - parent.type !== AST_NODE_TYPES.AssignmentExpression && - parent.type !== AST_NODE_TYPES.VariableDeclarator - ) { - return; - } - - if ( - node.operator === "||" && - isBoolean(node.left) && - isFalse(node.right) - ) { - context.report({ - loc: node.loc, - messageId: "unnecessaryShortCircuit", - data: { - operator: node.operator, - }, - }); - } - - if ( - node.operator === "&&" && - isBoolean(node.left) && - isTrue(node.right) - ) { - context.report({ - loc: node.loc, - messageId: "unnecessaryShortCircuit", - data: { - operator: node.operator, - }, - }); - } - - if ( - node.operator === "||" && - isNumber(node.left) && - isZero(node.right) - ) { - context.report({ - loc: node.loc, - messageId: "unnecessaryShortCircuit", - data: { - operator: node.operator, - }, - }); - } - - if ( - node.operator === "||" && - isString(node.left) && - isEmptyString(node.right) - ) { - context.report({ - loc: node.loc, - messageId: "unnecessaryShortCircuit", - data: { - operator: node.operator, - }, - }); - } - - if ( - node.operator === "??" && - hasNullAndNotUndefined(node.left) && - isNull(node.right) - ) { - context.report({ - loc: node.loc, - messageId: "unnecessaryShortCircuit", - data: { - operator: node.operator, - }, - }); - } - - if ( - node.operator === "??" && - hasUndefinedAndNotNull(node.left) && - isUndefined(node.right) - ) { - context.report({ - loc: node.loc, - messageId: "unnecessaryShortCircuit", - data: { - operator: node.operator, - }, - }); - } - }, - }; - }, -}); - -function isLiteralZero( - node: TSESTree.PrivateIdentifier | TSESTree.Expression, -): boolean { - return node.type === AST_NODE_TYPES.Literal && node.value === 0; -} - -function isLiteralEmptyString( - node: TSESTree.PrivateIdentifier | TSESTree.Expression, -): boolean { - return node.type === AST_NODE_TYPES.Literal && node.raw === '""'; -} diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-unsafe-plusplus.ts b/packages/eslint-plugin-isaacscript/src/rules/no-unsafe-plusplus.ts deleted file mode 100644 index 90c27af99..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-unsafe-plusplus.ts +++ /dev/null @@ -1,44 +0,0 @@ -import type { TSESTree } from "@typescript-eslint/utils"; -import { createRule } from "../utils.js"; - -export const noUnsafePlusplus = createRule({ - name: "no-unsafe-plusplus", - meta: { - type: "problem", - docs: { - description: - 'Disallow unsafe and confusing uses of the "++" and "--" operators', - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - plusPlus: - 'Complex usages of the "++" operator can be confusing. You should only use it in contexts where it could be swapped with "+= 1".', - minusMinus: - 'Complex usages of the "--" operator can be confusing. You should only use it in contexts where it could be swapped with "-= 1".', - }, - }, - defaultOptions: [], - create(context) { - function unsafe(nodeNever: never) { - // The type of the node is "never" for some reason, so cast it to something we can work with. - const node = nodeNever as TSESTree.UpdateExpression; - const { operator } = node; - const messageId = operator === "--" ? "minusMinus" : "plusPlus"; - - context.report({ - loc: node.loc, - messageId, - }); - } - - return { - ":not(UnaryExpression[operator='void'],ExpressionStatement,SequenceExpression,ForStatement[update.type=UpdateExpression]) > UpdateExpression[prefix='false'], ForStatement[init.type=UpdateExpression] > UpdateExpression[prefix='false'], ForStatement[test.type=UpdateExpression] > UpdateExpression[prefix='false']": - unsafe, - - "SequenceExpression > UpdateExpression[prefix='false']:last-child": - unsafe, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-useless-return.ts b/packages/eslint-plugin-isaacscript/src/rules/no-useless-return.ts deleted file mode 100644 index e7f59911a..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-useless-return.ts +++ /dev/null @@ -1,418 +0,0 @@ -/* eslint-disable */ -// @ts-nocheck -// cspell:ignore Katz - -/** - * This rule is slightly modified from the original ESLint version in order to never apply the fix: - * https://github.com/eslint/eslint/blob/main/lib/rules/no-useless-return.js - * - * We disable type-checking, linting, and formatting in this file in order to keep the code as close - * as possible to the original. - */ - -import { createRule } from "../utils.js"; - -/** - * @fileoverview Disallow redundant return statements - * @author Teddy Katz - */ -"use strict"; - -//------------------------------------------------------------------------------ -// External code (copy pasted from elsewhere in the ESLint repository) -//------------------------------------------------------------------------------ - -// A set of node types that can contain a list of statements -const STATEMENT_LIST_PARENTS = new Set(["Program", "BlockStatement", "StaticBlock", "SwitchCase"]); - -const anyFunctionPattern = /^(?:Function(?:Declaration|Expression)|ArrowFunctionExpression)$/u; -const anyLoopPattern = /^(?:DoWhile|For|ForIn|ForOf|While)Statement$/u; - -/** - * Checks whether a given node is a function node or not. - * The following types are function nodes: - * - * - ArrowFunctionExpression - * - FunctionDeclaration - * - FunctionExpression - * @param {ASTNode|null} node A node to check. - * @returns {boolean} `true` if the node is a function node. - */ -function isFunction(node) { - return Boolean(node && anyFunctionPattern.test(node.type)); -} - -/** - * Checks whether a given node is a loop node or not. - * The following types are loop nodes: - * - * - DoWhileStatement - * - ForInStatement - * - ForOfStatement - * - ForStatement - * - WhileStatement - * @param {ASTNode|null} node A node to check. - * @returns {boolean} `true` if the node is a loop node. - */ -function isLoop(node) { - return Boolean(node && anyLoopPattern.test(node.type)); -} - -/** - * Checks whether the given node is in a loop or not. - * @param {ASTNode} node The node to check. - * @returns {boolean} `true` if the node is in a loop. - */ -function isInLoop(node) { - for (let currentNode = node; currentNode && !isFunction(currentNode); currentNode = currentNode.parent) { - if (isLoop(currentNode)) { - return true; - } - } - - return false; -} - -//------------------------------------------------------------------------------ -// Helpers -//------------------------------------------------------------------------------ - -/** - * Removes the given element from the array. - * @param {Array} array The source array to remove. - * @param {any} element The target item to remove. - * @returns {void} - */ -function remove(array, element) { - const index = array.indexOf(element); - - if (index !== -1) { - array.splice(index, 1); - } -} - -/** - * Checks whether it can remove the given return statement or not. - * @param {ASTNode} node The return statement node to check. - * @returns {boolean} `true` if the node is removable. - */ -function isRemovable(node) { - return STATEMENT_LIST_PARENTS.has(node.parent.type); -} - -/** - * Checks whether the given return statement is in a `finally` block or not. - * @param {ASTNode} node The return statement node to check. - * @returns {boolean} `true` if the node is in a `finally` block. - */ -function isInFinally(node) { - for ( - let currentNode = node; - currentNode && currentNode.parent && !isFunction(currentNode); - currentNode = currentNode.parent - ) { - if (currentNode.parent.type === "TryStatement" && currentNode.parent.finalizer === currentNode) { - return true; - } - } - - return false; -} - -/** - * Checks all segments in a set and returns true if any are reachable. - * @param {Set} segments The segments to check. - * @returns {boolean} True if any segment is reachable; false otherwise. - */ -function isAnySegmentReachable(segments) { - - for (const segment of segments) { - if (segment.reachable) { - return true; - } - } - - return false; -} - -//------------------------------------------------------------------------------ -// Rule Definition -//------------------------------------------------------------------------------ - -export const noUselessReturn = createRule({ - name: "no-useless-return", // Added - defaultOptions: [], // Added; necessary for the `ruleCreator` helper function - - meta: { - type: "suggestion", - - docs: { - description: "Disallow redundant return statements (with no autofixer)", // Changed to add extra description - recommended: true, // Changed from true - // url: "https://eslint.org/docs/latest/rules/no-useless-return" - }, - - // fixable: "code", - schema: [], - - messages: { - unnecessaryReturn: "Unnecessary return statement." - } - }, - - create(context) { - const segmentInfoMap = new WeakMap(); - const sourceCode = context.sourceCode; - let scopeInfo = null; - - /** - * Checks whether the given segment is terminated by a return statement or not. - * @param {CodePathSegment} segment The segment to check. - * @returns {boolean} `true` if the segment is terminated by a return statement, or if it's still a part of unreachable. - */ - function isReturned(segment) { - const info = segmentInfoMap.get(segment); - - return !info || info.returned; - } - - /** - * Collects useless return statements from the given previous segments. - * - * A previous segment may be an unreachable segment. - * In that case, the information object of the unreachable segment is not - * initialized because `onCodePathSegmentStart` event is not notified for - * unreachable segments. - * This goes to the previous segments of the unreachable segment recursively - * if the unreachable segment was generated by a return statement. Otherwise, - * this ignores the unreachable segment. - * - * This behavior would simulate code paths for the case that the return - * statement does not exist. - * @param {ASTNode[]} uselessReturns The collected return statements. - * @param {CodePathSegment[]} prevSegments The previous segments to traverse. - * @param {WeakSet} [providedTraversedSegments] A set of segments that have already been traversed in this call - * @returns {ASTNode[]} `uselessReturns`. - */ - function getUselessReturns(uselessReturns, prevSegments, providedTraversedSegments) { - const traversedSegments = providedTraversedSegments || new WeakSet(); - - for (const segment of prevSegments) { - if (!segment.reachable) { - if (!traversedSegments.has(segment)) { - traversedSegments.add(segment); - getUselessReturns( - uselessReturns, - segment.allPrevSegments.filter(isReturned), - traversedSegments - ); - } - continue; - } - - if (segmentInfoMap.has(segment)) { - uselessReturns.push(...segmentInfoMap.get(segment).uselessReturns); - } - } - - return uselessReturns; - } - - /** - * Removes the return statements on the given segment from the useless return - * statement list. - * - * This segment may be an unreachable segment. - * In that case, the information object of the unreachable segment is not - * initialized because `onCodePathSegmentStart` event is not notified for - * unreachable segments. - * This goes to the previous segments of the unreachable segment recursively - * if the unreachable segment was generated by a return statement. Otherwise, - * this ignores the unreachable segment. - * - * This behavior would simulate code paths for the case that the return - * statement does not exist. - * @param {CodePathSegment} segment The segment to get return statements. - * @param {Set} usedUnreachableSegments A set of segments that have already been traversed in this call. - * @returns {void} - */ - function markReturnStatementsOnSegmentAsUsed(segment, usedUnreachableSegments) { - if (!segment.reachable) { - usedUnreachableSegments.add(segment); - segment.allPrevSegments - .filter(isReturned) - .filter(prevSegment => !usedUnreachableSegments.has(prevSegment)) - .forEach(prevSegment => markReturnStatementsOnSegmentAsUsed(prevSegment, usedUnreachableSegments)); - return; - } - - const info = segmentInfoMap.get(segment); - - if (!info) { - return; - } - - info.uselessReturns = info.uselessReturns.filter(node => { - if (scopeInfo.traversedTryBlockStatements && scopeInfo.traversedTryBlockStatements.length > 0) { - const returnInitialRange = node.range[0]; - const returnFinalRange = node.range[1]; - - const areBlocksInRange = scopeInfo.traversedTryBlockStatements.some(tryBlockStatement => { - const blockInitialRange = tryBlockStatement.range[0]; - const blockFinalRange = tryBlockStatement.range[1]; - - return ( - returnInitialRange >= blockInitialRange && - returnFinalRange <= blockFinalRange - ); - }); - - if (areBlocksInRange) { - return true; - } - } - - remove(scopeInfo.uselessReturns, node); - return false; - }); - } - - /** - * Removes the return statements on the current segments from the useless - * return statement list. - * - * This function will be called at every statement except FunctionDeclaration, - * BlockStatement, and BreakStatement. - * - * - FunctionDeclarations are always executed whether it's returned or not. - * - BlockStatements do nothing. - * - BreakStatements go the next merely. - * @returns {void} - */ - function markReturnStatementsOnCurrentSegmentsAsUsed() { - scopeInfo - .currentSegments - .forEach(segment => markReturnStatementsOnSegmentAsUsed(segment, new Set())); - } - - //---------------------------------------------------------------------- - // Public - //---------------------------------------------------------------------- - - return { - - // Makes and pushes a new scope information. - onCodePathStart(codePath) { - scopeInfo = { - upper: scopeInfo, - uselessReturns: [], - traversedTryBlockStatements: [], - codePath, - currentSegments: new Set() - }; - }, - - // Reports useless return statements if exist. - onCodePathEnd() { - for (const node of scopeInfo.uselessReturns) { - context.report({ - node, - loc: node.loc, - messageId: "unnecessaryReturn", - }); - } - - scopeInfo = scopeInfo.upper; - }, - - /* - * Initializes segments. - * NOTE: This event is notified for only reachable segments. - */ - onCodePathSegmentStart(segment) { - scopeInfo.currentSegments.add(segment); - - const info = { - uselessReturns: getUselessReturns([], segment.allPrevSegments), - returned: false - }; - - // Stores the info. - segmentInfoMap.set(segment, info); - }, - - onUnreachableCodePathSegmentStart(segment) { - scopeInfo.currentSegments.add(segment); - }, - - onUnreachableCodePathSegmentEnd(segment) { - scopeInfo.currentSegments.delete(segment); - }, - - onCodePathSegmentEnd(segment) { - scopeInfo.currentSegments.delete(segment); - }, - - // Adds ReturnStatement node to check whether it's useless or not. - ReturnStatement(node) { - if (node.argument) { - markReturnStatementsOnCurrentSegmentsAsUsed(); - } - if ( - node.argument || - isInLoop(node) || - isInFinally(node) || - - // Ignore `return` statements in unreachable places (https://github.com/eslint/eslint/issues/11647). - !isAnySegmentReachable(scopeInfo.currentSegments) - ) { - return; - } - - for (const segment of scopeInfo.currentSegments) { - const info = segmentInfoMap.get(segment); - - if (info) { - info.uselessReturns.push(node); - info.returned = true; - } - } - scopeInfo.uselessReturns.push(node); - }, - - "TryStatement > BlockStatement.block:exit"(node) { - scopeInfo.traversedTryBlockStatements.push(node); - }, - - "TryStatement:exit"() { - scopeInfo.traversedTryBlockStatements.pop(); - }, - - /* - * Registers for all statement nodes except FunctionDeclaration, BlockStatement, BreakStatement. - * Removes return statements of the current segments from the useless return statement list. - */ - ClassDeclaration: markReturnStatementsOnCurrentSegmentsAsUsed, - ContinueStatement: markReturnStatementsOnCurrentSegmentsAsUsed, - DebuggerStatement: markReturnStatementsOnCurrentSegmentsAsUsed, - DoWhileStatement: markReturnStatementsOnCurrentSegmentsAsUsed, - EmptyStatement: markReturnStatementsOnCurrentSegmentsAsUsed, - ExpressionStatement: markReturnStatementsOnCurrentSegmentsAsUsed, - ForInStatement: markReturnStatementsOnCurrentSegmentsAsUsed, - ForOfStatement: markReturnStatementsOnCurrentSegmentsAsUsed, - ForStatement: markReturnStatementsOnCurrentSegmentsAsUsed, - IfStatement: markReturnStatementsOnCurrentSegmentsAsUsed, - ImportDeclaration: markReturnStatementsOnCurrentSegmentsAsUsed, - LabeledStatement: markReturnStatementsOnCurrentSegmentsAsUsed, - SwitchStatement: markReturnStatementsOnCurrentSegmentsAsUsed, - ThrowStatement: markReturnStatementsOnCurrentSegmentsAsUsed, - TryStatement: markReturnStatementsOnCurrentSegmentsAsUsed, - VariableDeclaration: markReturnStatementsOnCurrentSegmentsAsUsed, - WhileStatement: markReturnStatementsOnCurrentSegmentsAsUsed, - WithStatement: markReturnStatementsOnCurrentSegmentsAsUsed, - ExportNamedDeclaration: markReturnStatementsOnCurrentSegmentsAsUsed, - ExportDefaultDeclaration: markReturnStatementsOnCurrentSegmentsAsUsed, - ExportAllDeclaration: markReturnStatementsOnCurrentSegmentsAsUsed - }; - } -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/no-void-return-type.ts b/packages/eslint-plugin-isaacscript/src/rules/no-void-return-type.ts deleted file mode 100644 index 3ee5ec7e5..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/no-void-return-type.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { AST_NODE_TYPES } from "@typescript-eslint/utils"; -import { createRule } from "../utils.js"; - -export const noVoidReturnType = createRule({ - name: "no-void-return-type", - meta: { - type: "problem", - docs: { - description: "Disallows `void` return types on non-exported functions", - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - voidReturnType: - "Non-exported functions cannot have a `void` return type. Remove the `void` keyword.", - }, - fixable: "code", - }, - defaultOptions: [], - create(context) { - return { - FunctionDeclaration(node) { - // Exported functions are exempt from this rule. - const { parent } = node; - if ( - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - parent !== undefined && - (parent.type === AST_NODE_TYPES.ExportNamedDeclaration || - parent.type === AST_NODE_TYPES.ExportDefaultDeclaration) - ) { - return; - } - - const { returnType } = node; - if (returnType === undefined) { - return; - } - - const { typeAnnotation } = returnType; - if (typeAnnotation.type !== AST_NODE_TYPES.TSVoidKeyword) { - return; - } - - context.report({ - loc: typeAnnotation.loc, - messageId: "voidReturnType", - fix(fixer) { - return fixer.remove(returnType); - }, - }); - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/prefer-const.ts b/packages/eslint-plugin-isaacscript/src/rules/prefer-const.ts deleted file mode 100644 index cfa896d42..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/prefer-const.ts +++ /dev/null @@ -1,522 +0,0 @@ -/* eslint-disable */ -// @ts-nocheck -// cspell:ignore Toru Nagashima - -/** - * This rule is slightly modified from the original ESLint version in order to never apply the fix: - * https://github.com/eslint/eslint/blob/main/lib/rules/prefer-const.js - * - * We disable type-checking, linting, and formatting in this file in order to keep the code as close - * as possible to the original. - */ - -import { createRule } from "../utils.js"; - -/** - * @fileoverview A rule to suggest using of const declaration for variables that are never reassigned after declared. - * @author Toru Nagashima - */ - -"use strict"; - -//------------------------------------------------------------------------------ -// External code (copy pasted from elsewhere in the ESLint repository) -//------------------------------------------------------------------------------ - -/** - * Finds the variable by a given name in a given scope and its upper scopes. - * @param {eslint-scope.Scope} initScope A scope to start find. - * @param {string} name A variable name to find. - * @returns {eslint-scope.Variable|null} A found variable or `null`. - */ -function getVariableByName(initScope, name) { - let scope = initScope; - - while (scope) { - const variable = scope.set.get(name); - - if (variable) { - return variable; - } - - scope = scope.upper; - } - - return null; -} - -//------------------------------------------------------------------------------ -// Helpers -//------------------------------------------------------------------------------ - -const PATTERN_TYPE = /^(?:.+?Pattern|RestElement|SpreadProperty|ExperimentalRestProperty|Property)$/u; -const DECLARATION_HOST_TYPE = /^(?:Program|BlockStatement|StaticBlock|SwitchCase)$/u; -const DESTRUCTURING_HOST_TYPE = /^(?:VariableDeclarator|AssignmentExpression)$/u; - -/** - * Checks whether a given node is located at `ForStatement.init` or not. - * @param {ASTNode} node A node to check. - * @returns {boolean} `true` if the node is located at `ForStatement.init`. - */ -function isInitOfForStatement(node) { - return node.parent.type === "ForStatement" && node.parent.init === node; -} - -/** - * Checks whether a given Identifier node becomes a VariableDeclaration or not. - * @param {ASTNode} identifier An Identifier node to check. - * @returns {boolean} `true` if the node can become a VariableDeclaration. - */ -function canBecomeVariableDeclaration(identifier) { - let node = identifier.parent; - - while (PATTERN_TYPE.test(node.type)) { - node = node.parent; - } - - return ( - node.type === "VariableDeclarator" || - ( - node.type === "AssignmentExpression" && - node.parent.type === "ExpressionStatement" && - DECLARATION_HOST_TYPE.test(node.parent.parent.type) - ) - ); -} - -/** - * Checks if an property or element is from outer scope or function parameters - * in destructing pattern. - * @param {string} name A variable name to be checked. - * @param {eslint-scope.Scope} initScope A scope to start find. - * @returns {boolean} Indicates if the variable is from outer scope or function parameters. - */ -function isOuterVariableInDestructing(name, initScope) { - - if (initScope.through.some(ref => ref.resolved && ref.resolved.name === name)) { - return true; - } - - const variable = getVariableByName(initScope, name); - - if (variable !== null) { - return variable.defs.some(def => def.type === "Parameter"); - } - - return false; -} - -/** - * Gets the VariableDeclarator/AssignmentExpression node that a given reference - * belongs to. - * This is used to detect a mix of reassigned and never reassigned in a - * destructuring. - * @param {eslint-scope.Reference} reference A reference to get. - * @returns {ASTNode|null} A VariableDeclarator/AssignmentExpression node or - * null. - */ -function getDestructuringHost(reference) { - if (!reference.isWrite()) { - return null; - } - let node = reference.identifier.parent; - - while (PATTERN_TYPE.test(node.type)) { - node = node.parent; - } - - if (!DESTRUCTURING_HOST_TYPE.test(node.type)) { - return null; - } - return node; -} - -/** - * Determines if a destructuring assignment node contains - * any MemberExpression nodes. This is used to determine if a - * variable that is only written once using destructuring can be - * safely converted into a const declaration. - * @param {ASTNode} node The ObjectPattern or ArrayPattern node to check. - * @returns {boolean} True if the destructuring pattern contains - * a MemberExpression, false if not. - */ -function hasMemberExpressionAssignment(node) { - switch (node.type) { - case "ObjectPattern": - return node.properties.some(prop => { - if (prop) { - - /* - * Spread elements have an argument property while - * others have a value property. Because different - * parsers use different node types for spread elements, - * we just check if there is an argument property. - */ - return hasMemberExpressionAssignment(prop.argument || prop.value); - } - - return false; - }); - - case "ArrayPattern": - return node.elements.some(element => { - if (element) { - return hasMemberExpressionAssignment(element); - } - - return false; - }); - - case "AssignmentPattern": - return hasMemberExpressionAssignment(node.left); - - case "MemberExpression": - return true; - - // no default - } - - return false; -} - -/** - * Gets an identifier node of a given variable. - * - * If the initialization exists or one or more reading references exist before - * the first assignment, the identifier node is the node of the declaration. - * Otherwise, the identifier node is the node of the first assignment. - * - * If the variable should not change to const, this function returns null. - * - If the variable is reassigned. - * - If the variable is never initialized nor assigned. - * - If the variable is initialized in a different scope from the declaration. - * - If the unique assignment of the variable cannot change to a declaration. - * e.g. `if (a) b = 1` / `return (b = 1)` - * - If the variable is declared in the global scope and `eslintUsed` is `true`. - * `/*exported foo` directive comment makes such variables. This rule does not - * warn such variables because this rule cannot distinguish whether the - * exported variables are reassigned or not. - * @param {eslint-scope.Variable} variable A variable to get. - * @param {boolean} ignoreReadBeforeAssign - * The value of `ignoreReadBeforeAssign` option. - * @returns {ASTNode|null} - * An Identifier node if the variable should change to const. - * Otherwise, null. - */ -function getIdentifierIfShouldBeConst(variable, ignoreReadBeforeAssign) { - if (variable.eslintUsed && variable.scope.type === "global") { - return null; - } - - // Finds the unique WriteReference. - let writer = null; - let isReadBeforeInit = false; - const references = variable.references; - - for (let i = 0; i < references.length; ++i) { - const reference = references[i]; - - if (reference.isWrite()) { - const isReassigned = ( - writer !== null && - writer.identifier !== reference.identifier - ); - - if (isReassigned) { - return null; - } - - const destructuringHost = getDestructuringHost(reference); - - if (destructuringHost !== null && destructuringHost.left !== void 0) { - const leftNode = destructuringHost.left; - let hasOuterVariables = false, - hasNonIdentifiers = false; - - if (leftNode.type === "ObjectPattern") { - const properties = leftNode.properties; - - hasOuterVariables = properties - .filter(prop => prop.value) - .map(prop => prop.value.name) - .some(name => isOuterVariableInDestructing(name, variable.scope)); - - hasNonIdentifiers = hasMemberExpressionAssignment(leftNode); - - } else if (leftNode.type === "ArrayPattern") { - const elements = leftNode.elements; - - hasOuterVariables = elements - .map(element => element && element.name) - .some(name => isOuterVariableInDestructing(name, variable.scope)); - - hasNonIdentifiers = hasMemberExpressionAssignment(leftNode); - } - - if (hasOuterVariables || hasNonIdentifiers) { - return null; - } - - } - - writer = reference; - - } else if (reference.isRead() && writer === null) { - if (ignoreReadBeforeAssign) { - return null; - } - isReadBeforeInit = true; - } - } - - /* - * If the assignment is from a different scope, ignore it. - * If the assignment cannot change to a declaration, ignore it. - */ - const shouldBeConst = ( - writer !== null && - writer.from === variable.scope && - canBecomeVariableDeclaration(writer.identifier) - ); - - if (!shouldBeConst) { - return null; - } - - if (isReadBeforeInit) { - return variable.defs[0].name; - } - - return writer.identifier; -} - -/** - * Groups by the VariableDeclarator/AssignmentExpression node that each - * reference of given variables belongs to. - * This is used to detect a mix of reassigned and never reassigned in a - * destructuring. - * @param {eslint-scope.Variable[]} variables Variables to group by destructuring. - * @param {boolean} ignoreReadBeforeAssign - * The value of `ignoreReadBeforeAssign` option. - * @returns {Map} Grouped identifier nodes. - */ -function groupByDestructuring(variables, ignoreReadBeforeAssign) { - const identifierMap = new Map(); - - for (let i = 0; i < variables.length; ++i) { - const variable = variables[i]; - const references = variable.references; - const identifier = getIdentifierIfShouldBeConst(variable, ignoreReadBeforeAssign); - let prevId = null; - - for (let j = 0; j < references.length; ++j) { - const reference = references[j]; - const id = reference.identifier; - - /* - * Avoid counting a reference twice or more for default values of - * destructuring. - */ - if (id === prevId) { - continue; - } - prevId = id; - - // Add the identifier node into the destructuring group. - const group = getDestructuringHost(reference); - - if (group) { - if (identifierMap.has(group)) { - identifierMap.get(group).push(identifier); - } else { - identifierMap.set(group, [identifier]); - } - } - } - } - - return identifierMap; -} - -/** - * Finds the nearest parent of node with a given type. - * @param {ASTNode} node The node to search from. - * @param {string} type The type field of the parent node. - * @param {Function} shouldStop A predicate that returns true if the traversal should stop, and false otherwise. - * @returns {ASTNode} The closest ancestor with the specified type; null if no such ancestor exists. - */ -function findUp(node, type, shouldStop) { - if (!node || shouldStop(node)) { - return null; - } - if (node.type === type) { - return node; - } - return findUp(node.parent, type, shouldStop); -} - -//------------------------------------------------------------------------------ -// Rule Definition -//------------------------------------------------------------------------------ - -export const preferConst = createRule({ - name: "prefer-const", // Added - defaultOptions: [], // Added; necessary for the `ruleCreator` helper function - - meta: { - type: "suggestion", - - docs: { - description: "Require `const` declarations for variables that are never reassigned after declared (with no autofixer)", // Changed to add extra description - recommended: true, // Changed from false - // url: "https://eslint.org/docs/latest/rules/prefer-const" - }, - - // fixable: "code", - - schema: [ - { - type: "object", - properties: { - destructuring: { enum: ["any", "all"], default: "any" }, - ignoreReadBeforeAssign: { type: "boolean", default: false } - }, - additionalProperties: false - } - ], - messages: { - useConst: "'{{name}}' is never reassigned. Use 'const' instead." - } - }, - - create(context) { - const options = context.options[0] || {}; - const sourceCode = context.sourceCode; - const shouldMatchAnyDestructuredVariable = options.destructuring !== "all"; - const ignoreReadBeforeAssign = options.ignoreReadBeforeAssign === true; - const variables = []; - let reportCount = 0; - let checkedId = null; - let checkedName = ""; - - - /** - * Reports given identifier nodes if all of the nodes should be declared - * as const. - * - * The argument 'nodes' is an array of Identifier nodes. - * This node is the result of 'getIdentifierIfShouldBeConst()', so it's - * nullable. In simple declaration or assignment cases, the length of - * the array is 1. In destructuring cases, the length of the array can - * be 2 or more. - * @param {(eslint-scope.Reference|null)[]} nodes - * References which are grouped by destructuring to report. - * @returns {void} - */ - function checkGroup(nodes) { - const nodesToReport = nodes.filter(Boolean); - - if (nodes.length && (shouldMatchAnyDestructuredVariable || nodesToReport.length === nodes.length)) { - const varDeclParent = findUp(nodes[0], "VariableDeclaration", parentNode => parentNode.type.endsWith("Statement")); - const isVarDecParentNull = varDeclParent === null; - - if (!isVarDecParentNull && varDeclParent.declarations.length > 0) { - const firstDeclaration = varDeclParent.declarations[0]; - - if (firstDeclaration.init) { - const firstDecParent = firstDeclaration.init.parent; - - /* - * First we check the declaration type and then depending on - * if the type is a "VariableDeclarator" or its an "ObjectPattern" - * we compare the name and id from the first identifier, if the names are different - * we assign the new name, id and reset the count of reportCount and nodeCount in - * order to check each block for the number of reported errors and base our fix - * based on comparing nodes.length and nodesToReport.length. - */ - - if (firstDecParent.type === "VariableDeclarator") { - - if (firstDecParent.id.name !== checkedName) { - checkedName = firstDecParent.id.name; - reportCount = 0; - } - - if (firstDecParent.id.type === "ObjectPattern") { - if (firstDecParent.init.name !== checkedName) { - checkedName = firstDecParent.init.name; - reportCount = 0; - } - } - - if (firstDecParent.id !== checkedId) { - checkedId = firstDecParent.id; - reportCount = 0; - } - } - } - } - - let shouldFix = varDeclParent && - - // Don't do a fix unless all variables in the declarations are initialized (or it's in a for-in or for-of loop) - (varDeclParent.parent.type === "ForInStatement" || varDeclParent.parent.type === "ForOfStatement" || - varDeclParent.declarations.every(declaration => declaration.init)) && - - /* - * If options.destructuring is "all", then this warning will not occur unless - * every assignment in the destructuring should be const. In that case, it's safe - * to apply the fix. - */ - nodesToReport.length === nodes.length; - - if (!isVarDecParentNull && varDeclParent.declarations && varDeclParent.declarations.length !== 1) { - - if (varDeclParent && varDeclParent.declarations && varDeclParent.declarations.length >= 1) { - - /* - * Add nodesToReport.length to a count, then comparing the count to the length - * of the declarations in the current block. - */ - - reportCount += nodesToReport.length; - - let totalDeclarationsCount = 0; - - varDeclParent.declarations.forEach(declaration => { - if (declaration.id.type === "ObjectPattern") { - totalDeclarationsCount += declaration.id.properties.length; - } else if (declaration.id.type === "ArrayPattern") { - totalDeclarationsCount += declaration.id.elements.length; - } else { - totalDeclarationsCount += 1; - } - }); - - shouldFix = shouldFix && (reportCount === totalDeclarationsCount); - } - } - - nodesToReport.forEach(node => { - context.report({ - node, - messageId: "useConst", - data: node, - }); - }); - } - } - - return { - "Program:exit"() { - groupByDestructuring(variables, ignoreReadBeforeAssign).forEach(checkGroup); - }, - - VariableDeclaration(node) { - if (node.kind === "let" && !isInitOfForStatement(node)) { - variables.push(...sourceCode.getDeclaredVariables(node)); - } - } - }; - } -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/prefer-plusplus.ts b/packages/eslint-plugin-isaacscript/src/rules/prefer-plusplus.ts deleted file mode 100644 index 5f54a8ccf..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/prefer-plusplus.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { ESLintUtils } from "@typescript-eslint/utils"; -import ts from "typescript"; -import { createRule } from "../utils.js"; - -export type Options = []; -export type MessageIds = "plusPlus" | "minusMinus"; - -export const preferPlusplus = createRule({ - name: "prefer-plusplus", - meta: { - type: "problem", - docs: { - description: - 'Require "++" or "--" operators instead of assignment operators where applicable', - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - plusPlus: 'Use "++" instead, as it is more concise and easier to read.', - minusMinus: 'Use "--" instead, as it is more concise and easier to read.', - }, - fixable: "code", - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - - return { - AssignmentExpression(node) { - if (node.operator !== "+=" && node.operator !== "-=") { - return; - } - - const tsNodeRight = parserServices.esTreeNodeToTSNodeMap.get( - node.right, - ); - if (!ts.isNumericLiteral(tsNodeRight)) { - return; - } - - if (tsNodeRight.getText() !== "1") { - return; - } - - const messageId = node.operator === "+=" ? "plusPlus" : "minusMinus"; - - context.report({ - loc: node.loc, - messageId, - fix(fixer) { - const tsNodeLeft = parserServices.esTreeNodeToTSNodeMap.get( - node.left, - ); - const newOperator = node.operator === "+=" ? "++" : "--"; - const newExpression = tsNodeLeft.getText() + newOperator; - return fixer.replaceText(node, newExpression); - }, - }); - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/prefer-postfix-plusplus.ts b/packages/eslint-plugin-isaacscript/src/rules/prefer-postfix-plusplus.ts deleted file mode 100644 index bb3ecc84b..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/prefer-postfix-plusplus.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { createRule } from "../utils.js"; - -export const preferPostfixPlusplus = createRule({ - name: "prefer-postfix-plusplus", - meta: { - type: "problem", - docs: { - description: 'Require "i++" instead of "++i"', - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - plusPlus: 'You must use postfix "++" instead of prefix "++".', - minusMinus: 'You must use postfix "--" instead of prefix "--".', - }, - }, - defaultOptions: [], - create(context) { - return { - UpdateExpression(node) { - if (!node.prefix) { - return; - } - - const messageId = node.operator === "++" ? "plusPlus" : "minusMinus"; - context.report({ - loc: node.loc, - messageId, - }); - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin-isaacscript/src/rules/prefer-readonly-parameter-types.ts deleted file mode 100644 index 00cb241ce..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/prefer-readonly-parameter-types.ts +++ /dev/null @@ -1,205 +0,0 @@ -// cspell:ignore readonlyness - -import type { TypeOrValueSpecifier } from "@typescript-eslint/type-utils"; -import { - isTypeReadonly, - readonlynessOptionsDefaults, - readonlynessOptionsSchema, -} from "@typescript-eslint/type-utils"; -import type { TSESTree } from "@typescript-eslint/types"; -import { AST_NODE_TYPES } from "@typescript-eslint/utils"; -import { getParserServices } from "@typescript-eslint/utils/eslint-utils"; -import { getTypeName, unionTypeParts } from "../typeUtils.js"; -import { createRule } from "../utils.js"; - -type Options = [ - { - allow?: TypeOrValueSpecifier[]; - checkParameterProperties?: boolean; - ignoreInferredTypes?: boolean; - treatMethodsAsReadonly?: boolean; - onlyRecordsArraysMapsSet?: boolean; - }, -]; -type MessageIds = "shouldBeReadonly"; - -export const preferReadonlyParameterTypes = createRule({ - name: "prefer-readonly-parameter-types", - meta: { - type: "suggestion", - docs: { - description: - "Require function parameters to be typed as `readonly` to prevent accidental mutation of inputs", - recommended: true, - requiresTypeChecking: true, - }, - schema: [ - { - type: "object", - additionalProperties: false, - properties: { - allow: readonlynessOptionsSchema.properties.allow, - checkParameterProperties: { - type: "boolean", - }, - ignoreInferredTypes: { - type: "boolean", - }, - treatMethodsAsReadonly: - readonlynessOptionsSchema.properties.treatMethodsAsReadonly, - onlyRecordsArraysMapsSet: { - type: "boolean", - }, - }, - }, - ], - messages: { - shouldBeReadonly: "Parameter should be a read only type.", - }, - }, - defaultOptions: [ - { - allow: readonlynessOptionsDefaults.allow, - checkParameterProperties: true, - ignoreInferredTypes: false, - treatMethodsAsReadonly: - readonlynessOptionsDefaults.treatMethodsAsReadonly, - onlyRecordsArraysMapsSet: true, - }, - ], - create( - context, - [ - { - allow, - checkParameterProperties, - ignoreInferredTypes, - treatMethodsAsReadonly, - onlyRecordsArraysMapsSet, - }, - ], - ) { - const services = getParserServices(context); - - if (allow === undefined) { - allow = []; - } - - allow.push("ReadonlyMap", "ReadonlySet"); - - return { - [[ - AST_NODE_TYPES.ArrowFunctionExpression, - AST_NODE_TYPES.FunctionDeclaration, - AST_NODE_TYPES.FunctionExpression, - AST_NODE_TYPES.TSCallSignatureDeclaration, - AST_NODE_TYPES.TSConstructSignatureDeclaration, - AST_NODE_TYPES.TSDeclareFunction, - AST_NODE_TYPES.TSEmptyBodyFunctionExpression, - AST_NODE_TYPES.TSFunctionType, - AST_NODE_TYPES.TSMethodSignature, - ].join(", ")]( - node: - | TSESTree.ArrowFunctionExpression - | TSESTree.FunctionDeclaration - | TSESTree.FunctionExpression - | TSESTree.TSCallSignatureDeclaration - | TSESTree.TSConstructSignatureDeclaration - | TSESTree.TSDeclareFunction - | TSESTree.TSEmptyBodyFunctionExpression - | TSESTree.TSFunctionType - | TSESTree.TSMethodSignature, - ): void { - for (const param of node.params) { - if ( - checkParameterProperties === false && - param.type === AST_NODE_TYPES.TSParameterProperty - ) { - continue; - } - - const actualParam = - param.type === AST_NODE_TYPES.TSParameterProperty - ? param.parameter - : param; - - if ( - ignoreInferredTypes === true && - actualParam.typeAnnotation === undefined - ) { - continue; - } - - const type = services.getTypeAtLocation(actualParam); - - if (onlyRecordsArraysMapsSet === true) { - const parts = unionTypeParts(type); - const hasAllBasicDataStructures = parts.every((t) => { - const typeName = getTypeName(t); - return ( - typeName === "Array" || - typeName === "Map" || - typeName === "Set" || - typeName === "Record" - ); - }); - - if (!hasAllBasicDataStructures) { - return; - } - - // Handle the case of only checking records, arrays, maps, and sets. - for (const t of parts) { - const typeName = getTypeName(t); - - switch (typeName) { - case "Array": - case "Map": - case "Set": { - context.report({ - node: actualParam, - messageId: "shouldBeReadonly", - }); - break; - } - - case "Record": { - const isReadOnly = isTypeReadonly(services.program, type, { - treatMethodsAsReadonly, - allow, - }); - - if (!isReadOnly) { - context.report({ - node: actualParam, - messageId: "shouldBeReadonly", - }); - } - - break; - } - - default: { - break; - } - } - } - } else { - // Handle the standard case. - const isReadOnly = isTypeReadonly(services.program, type, { - treatMethodsAsReadonly, - allow, - }); - - if (!isReadOnly) { - context.report({ - node: actualParam, - messageId: "shouldBeReadonly", - }); - } - } - } - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/require-break.ts b/packages/eslint-plugin-isaacscript/src/rules/require-break.ts deleted file mode 100644 index 6dc4f4fbb..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/require-break.ts +++ /dev/null @@ -1,97 +0,0 @@ -// This rule is mostly copied from the `no-fallthrough` ESLint core rule: -// https://github.com/eslint/eslint/blob/main/lib/rules/no-fallthrough.js - -import type { TSESLint } from "@typescript-eslint/utils"; -import { createRule } from "../utils.js"; - -export type Options = []; -export type MessageIds = "noBreak"; - -export const requireBreak = createRule({ - name: "require-break", - meta: { - type: "layout", - docs: { - description: - "Requires that each case of a switch statement has a `break` statement", - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - noBreak: "Expected a 'break' statement.", - }, - }, - defaultOptions: [], - create(context) { - const codePathSegments: Array> = []; - let currentCodePathSegments = new Set(); - - return { - onCodePathStart() { - codePathSegments.push(currentCodePathSegments); - currentCodePathSegments = new Set(); - }, - - onCodePathEnd() { - const codePathSegmentsSet = codePathSegments.pop(); - if (codePathSegmentsSet !== undefined) { - currentCodePathSegments = codePathSegmentsSet; - } - }, - - onUnreachableCodePathSegmentStart(segment) { - currentCodePathSegments.add(segment); - }, - - onUnreachableCodePathSegmentEnd(segment) { - currentCodePathSegments.delete(segment); - }, - - onCodePathSegmentStart(segment) { - currentCodePathSegments.add(segment); - }, - - onCodePathSegmentEnd(segment) { - currentCodePathSegments.delete(segment); - }, - - "SwitchCase:exit"(node) { - /* - * `reachable` means fallthrough because statements preceded by - * `break`, `return`, or `throw` are unreachable. - * And allows empty cases and the last case. - */ - const thisNodeIsReachable = isAnySegmentReachable( - currentCodePathSegments, - ); - const thisNodeIsFinalCase = node === node.parent.cases.at(-1); - - if (thisNodeIsReachable && thisNodeIsFinalCase) { - context.report({ - messageId: "noBreak", - node, - }); - } - }, - }; - }, -}); - -/** - * Checks all segments in a set and returns true if any are reachable. - * - * @param segments The segments to check. - * @returns True if any segment is reachable; false otherwise. - */ -function isAnySegmentReachable( - segments: ReadonlySet, -): boolean { - for (const segment of segments) { - if (segment.reachable) { - return true; - } - } - - return false; -} diff --git a/packages/eslint-plugin-isaacscript/src/rules/require-capital-const-assertions.ts b/packages/eslint-plugin-isaacscript/src/rules/require-capital-const-assertions.ts deleted file mode 100644 index c153cc88a..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/require-capital-const-assertions.ts +++ /dev/null @@ -1,143 +0,0 @@ -import type { TSESTree } from "@typescript-eslint/types"; -import { AST_NODE_TYPES } from "@typescript-eslint/utils"; -import { isFirstLetterCapitalized } from "../isaacScriptCommon.js"; -import { createRule } from "../utils.js"; - -export type Options = []; -export type MessageIds = "noConstAssertion"; - -const ARRAY_OR_OBJECT_EXPRESSION_TYPES: ReadonlySet = new Set([ - AST_NODE_TYPES.ObjectExpression, - AST_NODE_TYPES.ArrayExpression, - AST_NODE_TYPES.TSSatisfiesExpression, -]); - -const AUTO_FIX_TYPE_BLACKLIST: ReadonlySet = new Set([ - // If the variable is already being casted to something with "as", then don't apply any fix to - // avoid stomping on the existing code. - AST_NODE_TYPES.TSAsExpression, - - // The `satisfies` keyword will mess up the auto-fixer, because "as const" will be placed after - // the satisfies part. - AST_NODE_TYPES.TSSatisfiesExpression, -]); - -export const requireCapitalConstAssertions = createRule({ - name: "require-capital-const-assertions", - meta: { - type: "problem", - docs: { - description: - "Requires a capital letter for named objects and arrays that have a const assertion", - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - noConstAssertion: - "Variables with capital letters that assign an object or array must use const assertions.", - }, - fixable: "code", - }, - defaultOptions: [], - create(context) { - return { - VariableDeclaration(node) { - if (node.kind !== "const") { - return; - } - - for (const declaration of node.declarations) { - const { id } = declaration; - if (id.type !== AST_NODE_TYPES.Identifier) { - continue; - } - - if (!isFirstLetterCapitalized(id.name)) { - continue; - } - - const { init } = declaration; - if (init === null) { - continue; - } - - // Do nothing if this is not an object or array expression. - if (!ARRAY_OR_OBJECT_EXPRESSION_TYPES.has(init.type)) { - continue; - } - - if (hasConstAssertion(init)) { - continue; - } - - context.report({ - loc: node.loc, - messageId: "noConstAssertion", - fix: (fixer) => { - // If this variable isn't being assigned to anything, then there is nothing we can - // fix. - if (declaration.init === null) { - return null; - } - - if (declaration.init.type === AST_NODE_TYPES.TSAsExpression) { - return null; - } - - if (AUTO_FIX_TYPE_BLACKLIST.has(declaration.init.type)) { - return null; - } - - return fixer.insertTextAfter(declaration.init, " as const"); - }, - }); - } - }, - }; - }, -}); - -function hasConstAssertion(init: TSESTree.Expression): boolean { - switch (init.type) { - case AST_NODE_TYPES.TSAsExpression: { - return hasConstAssertionWithoutSatisfies(init); - } - - case AST_NODE_TYPES.TSSatisfiesExpression: { - return hasConstAssertionWithSatisfies(init); - } - - default: { - return false; - } - } -} - -function hasConstAssertionWithoutSatisfies( - init: TSESTree.TSAsExpression, -): boolean { - const { typeAnnotation } = init; - if (typeAnnotation.type !== AST_NODE_TYPES.TSTypeReference) { - return false; - } - - const { typeName } = typeAnnotation; - if (typeName.type !== AST_NODE_TYPES.Identifier) { - return false; - } - - return typeName.name === "const"; -} - -/** The "as const" part is nested within the `TSSatisfiesExpression` node as another expression. */ -function hasConstAssertionWithSatisfies( - init: TSESTree.TSSatisfiesExpression, -): boolean { - const { expression } = init; - if (expression.type !== AST_NODE_TYPES.TSAsExpression) { - return false; - } - - return hasConstAssertionWithoutSatisfies(expression); -} diff --git a/packages/eslint-plugin-isaacscript/src/rules/require-capital-read-only.ts b/packages/eslint-plugin-isaacscript/src/rules/require-capital-read-only.ts deleted file mode 100644 index facfdb6be..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/require-capital-read-only.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils"; -import ts from "typescript"; -import { isFirstLetterCapitalized } from "../isaacScriptCommon.js"; -import { getTypeName } from "../typeUtils.js"; -import { createRule } from "../utils.js"; - -export type Options = []; - -export type MessageIds = - | "readOnlyMap" - | "readOnlySet" - | "readOnlyArray" - | "readOnlyObject"; - -export const requireCapitalReadOnly = createRule({ - name: "require-capital-read-only", - meta: { - type: "problem", - docs: { - description: - "Requires maps/sets/arrays with a capital letter to be read-only", - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - readOnlyMap: - 'Maps with a capital letter must be explicitly annotated as "ReadOnlyMap".', - readOnlySet: - 'Sets with a capital letter must be explicitly annotated as "ReadOnlySet".', - readOnlyArray: - 'Arrays with a capital letter must be explicitly annotated as "readonly" or "ReadonlyArray".', - readOnlyObject: - 'Objects with a capital letter must be read-only. Try using a type annotation with the "Readonly" helper type.', - }, - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - const checker = parserServices.program.getTypeChecker(); - - return { - VariableDeclaration(node) { - if (node.kind !== "const") { - return; - } - - for (const declaration of node.declarations) { - const { id } = declaration; - if (id.type !== AST_NODE_TYPES.Identifier) { - continue; - } - - const variableName = id.name; - if (!isFirstLetterCapitalized(variableName)) { - continue; - } - - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(declaration); - const type = checker.getTypeAtLocation(tsNode); - - const messageId = getErrorMessageId(type); - if (messageId === undefined) { - return; - } - - context.report({ - loc: node.loc, - messageId, - }); - } - }, - }; - }, -}); - -function getErrorMessageId(type: ts.Type): MessageIds | undefined { - const typeName = getTypeName(type); - if (typeName === undefined) { - return undefined; - } - - if (typeName === "__object" && !isReadOnlyObject(type)) { - return "readOnlyObject"; - } - - // This would be "ReadonlyMap" if it was the read-only version. - if (typeName === "Map") { - return "readOnlyMap"; - } - - // This would be "ReadonlySet" if it was the read-only version. - if (typeName === "Set") { - return "readOnlySet"; - } - - // This would be "ReadonlyArray" if it was the read-only version. - if (typeName === "Array") { - return "readOnlyArray"; - } - - return undefined; -} - -function isReadOnlyObject(type: ts.Type): boolean { - const symbols = type.getProperties(); - return symbols.every((symbol) => isReadonlySymbol(symbol)); -} - -/* eslint-disable */ -/** - * This is copied from TypeScript internally; it is not exported or exposed: - * https://github.com/microsoft/TypeScript/issues/31296 - */ -function isReadonlySymbol(symbol: ts.Symbol): boolean { - // The following symbols are considered read-only: - // - Properties with a 'readonly' modifier - // - Variables declared with 'const' - // - Get accessors without matching set accessors - // - Enum members - // - Object.defineProperty assignments with writable false or no setter - // - Unions and intersections of the above (unions and intersections eagerly set isReadonly on - // creation) - return !!( - // prettier-ignore - // @ts-expect-error Using internal functions. - (ts.getCheckFlags(symbol) & ts.CheckFlags.Readonly || - (symbol.flags & ts.SymbolFlags.Property && - // @ts-expect-error Using internal functions. - ts.getDeclarationModifierFlagsFromSymbol(symbol) & - ts.ModifierFlags.Readonly) || - (symbol.flags & ts.SymbolFlags.Variable && - // @ts-expect-error Using internal functions. - ts.getDeclarationNodeFlagsFromSymbol(symbol) & ts.NodeFlags.Const) || - (symbol.flags & ts.SymbolFlags.Accessor && - !(symbol.flags & ts.SymbolFlags.SetAccessor)) || - symbol.flags & ts.SymbolFlags.EnumMember) - ); -} -/* eslint-enable */ diff --git a/packages/eslint-plugin-isaacscript/src/rules/require-unannotated-const-assertions.ts b/packages/eslint-plugin-isaacscript/src/rules/require-unannotated-const-assertions.ts deleted file mode 100644 index 14e462b1a..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/require-unannotated-const-assertions.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { createRule } from "../utils.js"; - -export const requireUnannotatedConstAssertions = createRule({ - name: "require-unannotated-const-assertions", - meta: { - type: "problem", - docs: { - description: - "Disallows explicit type annotations for variables that have a const assertion", - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - annotatedConstAssertion: - "Don't use `as const` with a type annotated variable, since it widens the type.", - }, - }, - defaultOptions: [], - create(context) { - return { - 'VariableDeclarator[id.typeAnnotation] > :matches(TSTypeAssertion, TSAsExpression) > TSTypeReference.typeAnnotation > Identifier[name="const"]': - (node) => { - context.report({ - node, - messageId: "annotatedConstAssertion", - }); - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/require-v-registration.ts b/packages/eslint-plugin-isaacscript/src/rules/require-v-registration.ts index 9cefe0178..5eac5ebcf 100644 --- a/packages/eslint-plugin-isaacscript/src/rules/require-v-registration.ts +++ b/packages/eslint-plugin-isaacscript/src/rules/require-v-registration.ts @@ -10,7 +10,7 @@ export const requireVRegistration = createRule({ docs: { description: 'Require variables named "v" to be registered with the save data manager', - recommended: false, + recommended: true, requiresTypeChecking: false, }, schema: [], diff --git a/packages/eslint-plugin-isaacscript/src/rules/require-variadic-function-argument.ts b/packages/eslint-plugin-isaacscript/src/rules/require-variadic-function-argument.ts deleted file mode 100644 index a82db3eb0..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/require-variadic-function-argument.ts +++ /dev/null @@ -1,114 +0,0 @@ -import type { TSESTree } from "@typescript-eslint/utils"; -import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils"; -import ts from "typescript"; -import { createRule } from "../utils.js"; - -export type Options = []; -export type MessageIds = "noArgument"; - -const JSDOC_EXCEPTION_TAG = "allowEmptyVariadic"; - -export const requireVariadicFunctionArgument = createRule({ - name: "require-variadic-function-argument", - meta: { - type: "problem", - docs: { - description: - "Requires that variadic functions must be supplied with at least one argument", - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - noArgument: "You must pass at least one argument to a variadic function.", - }, - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - const checker = parserServices.program.getTypeChecker(); - - return { - CallExpression(node) { - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); - const signature = checker.getResolvedSignature(tsNode); - if (signature === undefined) { - return; - } - - const declaration = signature.getDeclaration(); - // The `getDeclaration` method actually returns `ts.SignatureDeclaration | undefined`, not - // `ts.SignatureDeclaration`. - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (declaration === undefined) { - return; - } - - if ( - isHardCodedException(node) || - hasJSDocExceptionTag(checker, declaration) - ) { - return; - } - - for (let i = 0; i < declaration.parameters.length; i++) { - const parameter = declaration.parameters[i]; - if (parameter === undefined) { - continue; - } - - if ( - ts.isRestParameter(parameter) && - node.arguments[i] === undefined - ) { - context.report({ - loc: node.loc, - messageId: "noArgument", - }); - } - } - }, - }; - }, -}); - -function isHardCodedException(node: TSESTree.CallExpression): boolean { - const { callee } = node; - return isConsoleOrWindowFunction(callee) || isTimeoutFunction(callee); -} - -function isConsoleOrWindowFunction(callee: TSESTree.Expression): boolean { - if (callee.type !== AST_NODE_TYPES.MemberExpression) { - return false; - } - - const { object } = callee; - if (object.type !== AST_NODE_TYPES.Identifier) { - return false; - } - - return object.name === "console" || object.name === "window"; -} - -function isTimeoutFunction(callee: TSESTree.Expression): boolean { - if (callee.type !== AST_NODE_TYPES.Identifier) { - return false; - } - - return callee.name === "setTimeout" || callee.name === "setInterval"; -} - -function hasJSDocExceptionTag( - checker: ts.TypeChecker, - declaration: ts.SignatureDeclaration, -): boolean { - const type = checker.getTypeAtLocation(declaration); - const symbol = type.getSymbol(); - if (symbol === undefined) { - return false; - } - const jsDocTagInfoArray = symbol.getJsDocTags(checker); - return jsDocTagInfoArray.some( - (tagInfo) => tagInfo.name === JSDOC_EXCEPTION_TAG, - ); -} diff --git a/packages/eslint-plugin-isaacscript/src/rules/strict-array-methods.ts b/packages/eslint-plugin-isaacscript/src/rules/strict-array-methods.ts deleted file mode 100644 index e885cee16..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/strict-array-methods.ts +++ /dev/null @@ -1,105 +0,0 @@ -import type { TSESTree } from "@typescript-eslint/utils"; -import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils"; -import { getTypeName } from "../typeUtils.js"; -import { createRule } from "../utils.js"; - -const ARRAY_METHODS_WITH_BOOLEAN_FUNCTIONS: ReadonlySet = new Set([ - "every", - "filter", - "find", - "findIndex", - "findLast", - "findLastIndex", - "some", -]); - -export const strictArrayMethods = createRule({ - name: "strict-array-methods", - meta: { - type: "problem", - docs: { - description: "Requires boolean return types on array method functions", - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - conditionError: - "Unexpected value in array method. A boolean expression is required.", - }, - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - const checker = parserServices.program.getTypeChecker(); - - function isArrayMethodInvocationWithBooleanFunction( - node: TSESTree.CallExpression, - ): boolean { - const { callee } = node; - if (callee.type !== AST_NODE_TYPES.MemberExpression) { - return false; - } - - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(callee.object); - const type = checker.getTypeAtLocation(tsNode); - - const typeName = getTypeName(type); - if (typeName !== "Array" && typeName !== "ReadonlyArray") { - return false; - } - - const { property } = callee; - if (property.type !== AST_NODE_TYPES.Identifier) { - return false; - } - - const methodName = property.name; - return ARRAY_METHODS_WITH_BOOLEAN_FUNCTIONS.has(methodName); - } - - function firstArgumentHasBooleanReturnType( - node: TSESTree.CallExpression, - ): boolean { - const argument = node.arguments[0]; - if (argument === undefined) { - return false; - } - - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(argument); - const type = checker.getTypeAtLocation(tsNode); - const callSignatures = type.getCallSignatures(); - if (callSignatures.length === 0) { - return false; - } - - for (const callSignature of callSignatures) { - const returnType = callSignature.getReturnType(); - const returnTypeName = getTypeName(returnType); - if ( - returnTypeName !== "boolean" && - returnTypeName !== "true" && - returnTypeName !== "false" - ) { - return false; - } - } - - return true; - } - - return { - CallExpression(node) { - if ( - isArrayMethodInvocationWithBooleanFunction(node) && - !firstArgumentHasBooleanReturnType(node) - ) { - context.report({ - loc: node.loc, - messageId: "conditionError", - }); - } - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/strict-enums.ts b/packages/eslint-plugin-isaacscript/src/rules/strict-enums.ts deleted file mode 100644 index c723cc17b..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/strict-enums.ts +++ /dev/null @@ -1,565 +0,0 @@ -import { - getTypeName, - isTypeReferenceType, -} from "@typescript-eslint/type-utils"; -import type { TSESTree } from "@typescript-eslint/utils"; -import { ESLintUtils } from "@typescript-eslint/utils"; -import ts from "typescript"; -import { - isSymbolFlagSet, - isTypeFlagSet, - unionTypeParts, -} from "../typeUtils.js"; -import { createRule } from "../utils.js"; - -const ALLOWED_TYPES_FOR_ANY_ENUM_ARGUMENT = - ts.TypeFlags.Any | - ts.TypeFlags.Unknown | - ts.TypeFlags.Number | - ts.TypeFlags.String; - -export type Options = []; - -export type MessageIds = - | "incorrectIncrement" - | "mismatchedAssignment" - | "mismatchedFunctionArgument"; - -export const strictEnums = createRule({ - name: "strict-enums", - meta: { - type: "problem", - docs: { - description: "Disallows the usage of unsafe enum patterns", - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - incorrectIncrement: "You cannot increment or decrement an enum type.", - mismatchedAssignment: - "The type of the enum assignment does not match the declared enum type of the variable.", - mismatchedFunctionArgument: - "The {{ ordinal }} argument in the function call does not match the declared enum type of the function signature.\nArgument: {{ type1 }}\nParameter: {{ type2 }}", - }, - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - const checker = parserServices.program.getTypeChecker(); - - // ---------------- - // Helper functions - // ---------------- - - /** - * If passed an enum member, returns the type of the parent. Otherwise, returns itself. - * - * For example: - * - `Fruit` --> `Fruit` - * - `Fruit.Apple` --> `Fruit` - */ - function getBaseEnumType(type: ts.Type): ts.Type { - const symbol = type.getSymbol(); - if (symbol === undefined) { - return type; - } - - if (!isSymbolFlagSet(symbol, ts.SymbolFlags.EnumMember)) { - return type; - } - - const { valueDeclaration } = symbol; - if (valueDeclaration === undefined) { - return type; - } - - const parentType = getTypeFromTSNode(valueDeclaration.parent); - return parentType; - } - - /** - * A thing can have 0 or more enum types. For example: - * - 123 --> [] - * - {} --> [] - * - Fruit.Apple --> [Fruit] - * - Fruit.Apple | Vegetable.Lettuce --> [Fruit, Vegetable] - * - Fruit.Apple | Vegetable.Lettuce | 123 --> [Fruit, Vegetable] - * - T extends Fruit --> [Fruit] - */ - function getEnumTypes(type: ts.Type): ReadonlySet { - /** - * First, we get all the parts of the union. For non-union types, this will be an array with - * the type in it. For example: - * - Fruit --> [Fruit] - * - Fruit | Vegetable --> [Fruit, Vegetable] - */ - const subTypes = unionTypeParts(type); - - /** - * Next, we must resolve generic types with constraints. For example: - * - Fruit --> Fruit - * - T extends Fruit --> Fruit - */ - const subTypesConstraints = subTypes.map((subType) => { - const constraint = subType.getConstraint(); - return constraint ?? subType; - }); - - const enumSubTypes = subTypesConstraints.filter((subType) => - isEnum(subType), - ); - const baseEnumSubTypes = enumSubTypes.map((subType) => - getBaseEnumType(subType), - ); - return new Set(baseEnumSubTypes); - } - - function getTypeFromNode(node: TSESTree.Node): ts.Type { - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); - return getTypeFromTSNode(tsNode); - } - - function getTypeFromTSNode(tsNode: ts.Node): ts.Type { - return checker.getTypeAtLocation(tsNode); - } - - function hasEnumTypes(type: ts.Type): boolean { - const enumTypes = getEnumTypes(type); - return enumTypes.size > 0; - } - - // -------------- - // Main functions - // -------------- - - function checkCallExpression( - node: TSESTree.CallExpression | TSESTree.NewExpression, - ) { - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); - const signature = checker.getResolvedSignature(tsNode); - if (signature === undefined) { - return; - } - - const declaration = signature.getDeclaration(); - // The `getDeclaration` method actually returns `ts.SignatureDeclaration | undefined`, not - // `ts.SignatureDeclaration`. - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (declaration === undefined) { - return; - } - - // First, determine if this is a function with a `this` parameter. - let firstParamIsThis = false; - const firstParameter = declaration.parameters[0]; - if (firstParameter !== undefined) { - const parameterName = firstParameter.name.getText(); - firstParamIsThis = parameterName === "this"; - } - - /** - * Iterate through the arguments provided to the call function and cross reference their types - * to the types of the "real" function parameters. - */ - for (const [i, argument] of node.arguments.entries()) { - const argumentType = getTypeFromNode(argument); - let parameterType = signature.getTypeParameterAtPosition(i); - - /** - * If this function parameter is a generic type that extends another type, we want to - * compare the calling argument to the constraint instead. - * - * For example: - * - * ```ts - * function useFruit(fruitType: FruitType) {} - * useFruit(0) - * ``` - * - * Here, we want to compare `Fruit.Apple` to `Fruit`, not `FruitType`, because `FruitType` - * would just be equal to 0 in this case (and would be unsafe). - * - * Finally, if the function has a `this` parameter, getting a constraint will mess things - * up, so we skip checking for a constraint if this is the case. - */ - if (!firstParamIsThis) { - const parameter = declaration.parameters[i]; - if (parameter !== undefined) { - const parameterTSNode = getTypeFromTSNode(parameter); - const constraint = parameterTSNode.getConstraint(); - if (constraint !== undefined) { - parameterType = constraint; - } - } - } - - /** - * Disallow mismatched function calls, like the following: - * - * ```ts - * function useFruit(fruit: Fruit) {} - * useFruit(0); - * ``` - */ - if (isMismatchedEnumFunctionArgument(argumentType, parameterType)) { - context.report({ - node: argument, - messageId: "mismatchedFunctionArgument", - data: { - ordinal: getOrdinalSuffix(i + 1), // e.g. 0 --> 1st - type1: getTypeName(checker, argumentType), - type2: getTypeName(checker, parameterType), - }, - }); - } - } - } - - function isAssigningNonEnumValueToEnumVariable( - leftType: ts.Type, - rightType: ts.Type, - ): boolean { - /** - * First, recursively check for containers like the following: - * - * ```ts - * declare let fruits: Fruit[]; - * fruits = [0, 1]; - * ``` - */ - if (isTypeReferenceType(leftType) && isTypeReferenceType(rightType)) { - const leftTypeArguments = checker.getTypeArguments(leftType); - const rightTypeArguments = checker.getTypeArguments(rightType); - - // eslint-disable-next-line unicorn/no-for-loop - for (let i = 0; i < leftTypeArguments.length; i++) { - const leftTypeArgument = leftTypeArguments[i]; - const rightTypeArgument = rightTypeArguments[i]; - if ( - leftTypeArgument === undefined || - rightTypeArgument === undefined - ) { - continue; - } - - if ( - isAssigningNonEnumValueToEnumVariable( - leftTypeArgument, - rightTypeArgument, - ) - ) { - return true; - } - } - - return false; - } - - const leftEnumTypes = getEnumTypes(leftType); - if (leftEnumTypes.size === 0) { - // This is not an enum assignment. - return false; - } - - /** - * As a special case, allow assignment of certain types that the TypeScript compiler should - * handle properly. - */ - if (isNullOrUndefinedOrAnyOrUnknownOrNever(rightType)) { - return false; - } - - const rightEnumTypes = getEnumTypes(rightType); - const intersectingTypes = getIntersectingSet( - leftEnumTypes, - rightEnumTypes, - ); - return intersectingTypes.size === 0; - } - - function isMismatchedEnumFunctionArgument( - argumentType: ts.Type, // From the function call - parameterType: ts.Type, // From the function itself - ): boolean { - /** - * First, recursively check for functions with type containers like the following: - * - * ```ts - * function useFruits(fruits: Fruit[]) {} - * useFruits([0, 1]); - * ``` - */ - if (isTypeReferenceType(argumentType)) { - const argumentTypeArguments = checker.getTypeArguments(argumentType); - - const parameterSubTypes = unionTypeParts(parameterType); - for (const parameterSubType of parameterSubTypes) { - if (!isTypeReferenceType(parameterSubType)) { - continue; - } - const parameterTypeArguments = - checker.getTypeArguments(parameterSubType); - - // eslint-disable-next-line unicorn/no-for-loop - for (let i = 0; i < argumentTypeArguments.length; i++) { - const argumentTypeArgument = argumentTypeArguments[i]; - const parameterTypeArgument = parameterTypeArguments[i]; - if ( - argumentTypeArgument === undefined || - parameterTypeArgument === undefined - ) { - continue; - } - - if ( - isMismatchedEnumFunctionArgument( - argumentTypeArgument, - parameterTypeArgument, - ) - ) { - return true; - } - } - } - - return false; - } - - /** - * Allow function calls that have nothing to do with enums, like the following: - * - * ```ts - * function useNumber(num: number) {} - * useNumber(0); - * ``` - */ - const argumentEnumTypes = getEnumTypes(argumentType); - const parameterEnumTypes = getEnumTypes(parameterType); - if (parameterEnumTypes.size === 0) { - return false; - } - - /** - * Allow passing enum values into functions that take in the "any" type and similar types that - * should basically match any enum, like the following: - * - * ```ts - * function useNumber(num: number) {} - * useNumber(Fruit.Apple); - * ``` - */ - const parameterSubTypes = unionTypeParts(parameterType); - for (const parameterSubType of parameterSubTypes) { - if ( - isTypeFlagSet(parameterSubType, ALLOWED_TYPES_FOR_ANY_ENUM_ARGUMENT) - ) { - return false; - } - } - - /** - * Disallow passing number literals or string literals into functions that take in an enum, - * like the following: - * - * ```ts - * function useFruit(fruit: Fruit) {} - * declare const fruit: Fruit.Apple | 1; - * useFruit(fruit) - * ``` - */ - const argumentSubTypes = unionTypeParts(argumentType); - for (const argumentSubType of argumentSubTypes) { - if ( - argumentSubType.isLiteral() && - !isEnum(argumentSubType) && - // Allow passing number literals if there are number literals in the actual function type. - !parameterSubTypes.includes(argumentSubType) - ) { - return true; - } - } - - /** - * Allow function calls that match one of the types in a union, like the following: - * - * ```ts - * function useApple(fruitOrNull: Fruit | null) {} - * useApple(null); - * ``` - */ - const argumentSubTypesSet = new Set(argumentSubTypes); - const parameterSubTypesSet = new Set(parameterSubTypes); - if (setHasAnyElementFromSet(argumentSubTypesSet, parameterSubTypesSet)) { - return false; - } - - /** - * Allow function calls that have a base enum that match the function type, like the - * following: - * - * ```ts - * function useFruit(fruit: Fruit) {} - * useFruit(Fruit.Apple); - * ``` - */ - if (setHasAnyElementFromSet(argumentEnumTypes, parameterEnumTypes)) { - return false; - } - - return true; - } - - // ------------------ - // AST node callbacks - // ------------------ - - return { - /** When something is assigned to a variable. */ - AssignmentExpression(node): void { - const leftType = getTypeFromNode(node.left); - const rightType = getTypeFromNode(node.right); - - if (isAssigningNonEnumValueToEnumVariable(leftType, rightType)) { - context.report({ - node, - messageId: "mismatchedAssignment", - }); - } - }, - - /** When a function is invoked or a class is instantiated. */ - "CallExpression, NewExpression": function callExpressionOrNewExpression( - node: TSESTree.CallExpression | TSESTree.NewExpression, - ): void { - checkCallExpression(node); - }, - - /** When a unary operator is invoked. */ - UpdateExpression(node): void { - const argumentType = getTypeFromNode(node.argument); - - /** - * Disallow using enums with unary operators, like the following: - * - * ```ts - * const fruit = Fruit.Apple; - * fruit++; - * ``` - */ - if (hasEnumTypes(argumentType)) { - context.report({ - node, - messageId: "incorrectIncrement", - }); - } - }, - - /** When a new variable is created. */ - VariableDeclarator(node): void { - /** - * Allow enum declarations without an initializer, like the following: - * - * ```ts - * let fruit: Fruit; - * if (something()) { - * fruit = Fruit.Apple; - * } else { - * fruit = Fruit.Banana; - * } - * ``` - */ - if (node.init === null) { - return; - } - - const leftTSNode = parserServices.esTreeNodeToTSNodeMap.get(node); - const rightNode = leftTSNode.initializer; - if (rightNode === undefined) { - return; - } - - /** - * We have to use `leftTSNode.name` instead of `leftTSNode` to avoid run-time errors because - * the `checker.getTypeAtLocation` method expects a `ts.BindingName` instead of a - * `ts.VariableDeclaration`. - * https://github.com/microsoft/TypeScript/issues/48878 - */ - const leftType = getTypeFromTSNode(leftTSNode.name); - const rightType = getTypeFromTSNode(rightNode); - - if (isAssigningNonEnumValueToEnumVariable(leftType, rightType)) { - context.report({ - node, - messageId: "mismatchedAssignment", - data: { - assignmentType: getTypeName(checker, rightType), - declaredType: getTypeName(checker, leftType), - }, - }); - } - }, - }; - }, -}); - -/** Given a set A and set B, return a set that contains only elements that are in both sets. */ -function getIntersectingSet( - a: ReadonlySet, - b: ReadonlySet, -): ReadonlySet { - const intersectingValues = [...a.values()].filter((value) => b.has(value)); - return new Set(intersectingValues); -} - -/** - * From: - * https://stackoverflow.com/questions/13627308/add-st-nd-rd-and-th-ordinal-suffix-to-a-number - */ -function getOrdinalSuffix(i: number): string { - const j = i % 10; - const k = i % 100; - if (j === 1 && k !== 11) { - return `${i}st`; - } - if (j === 2 && k !== 12) { - return `${i}nd`; - } - if (j === 3 && k !== 13) { - return `${i}rd`; - } - return `${i}th`; -} - -function isEnum(type: ts.Type): boolean { - /** The "EnumLiteral" flag will be set on both enum base types and enum members/values. */ - return isTypeFlagSet(type, ts.TypeFlags.EnumLiteral); -} - -function isNullOrUndefinedOrAnyOrUnknownOrNever( - ...types: readonly ts.Type[] -): boolean { - return types.some((type) => - isTypeFlagSet( - type, - ts.TypeFlags.Null | - ts.TypeFlags.Undefined | - ts.TypeFlags.Any | - ts.TypeFlags.Unknown | - ts.TypeFlags.Never, - ), - ); -} - -function setHasAnyElementFromSet( - set1: ReadonlySet, - set2: ReadonlySet, -): boolean { - for (const value of set2) { - if (set1.has(value)) { - return true; - } - } - - return false; -} diff --git a/packages/eslint-plugin-isaacscript/src/rules/strict-undefined-functions.ts b/packages/eslint-plugin-isaacscript/src/rules/strict-undefined-functions.ts deleted file mode 100644 index ac5827d68..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/strict-undefined-functions.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { ESLintUtils } from "@typescript-eslint/utils"; -import { getTypeName, unionTypeParts } from "../typeUtils.js"; -import { createRule, getParentFunction } from "../utils.js"; - -export type Options = []; -export type MessageIds = "mismatchedReturnType"; - -export const strictUndefinedFunctions = createRule({ - name: "strict-undefined-functions", - meta: { - type: "problem", - docs: { - description: - "Disallows empty return statements in functions annotated as returning undefined", - recommended: true, - requiresTypeChecking: true, - }, - schema: [], - messages: { - mismatchedReturnType: - "You must explicitly return `undefined` in in functions that can return `undefined`.", - }, - }, - defaultOptions: [], - create(context) { - const parserServices = ESLintUtils.getParserServices(context); - const checker = parserServices.program.getTypeChecker(); - - return { - ReturnStatement(node) { - if (node.argument !== null) { - return; - } - - const parentFunction = getParentFunction(node); - if (parentFunction === undefined) { - return; - } - - const tsNode = parserServices.esTreeNodeToTSNodeMap.get(parentFunction); - const type = checker.getTypeAtLocation(tsNode); - const signatures = type.getCallSignatures(); - for (const signature of signatures) { - const returnType = signature.getReturnType(); - for (const t of unionTypeParts(returnType)) { - const typeName = getTypeName(t); - if (typeName === "undefined") { - context.report({ - loc: node.loc, - messageId: "mismatchedReturnType", - }); - } - } - } - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/rules/strict-void-functions.ts b/packages/eslint-plugin-isaacscript/src/rules/strict-void-functions.ts deleted file mode 100644 index 3c557aac7..000000000 --- a/packages/eslint-plugin-isaacscript/src/rules/strict-void-functions.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { AST_NODE_TYPES } from "@typescript-eslint/utils"; -import { createRule, getParentFunction } from "../utils.js"; - -export const strictVoidFunctions = createRule({ - name: "strict-void-functions", - meta: { - type: "problem", - docs: { - description: - "Disallows non-empty return statements in functions annotated as returning void", - recommended: true, - requiresTypeChecking: false, - }, - schema: [], - messages: { - mismatchedReturnType: - "You cannot return values in functions annotated as returning `void`. Either remove the value after the `return` keyword or change the function return type annotation.", - }, - }, - defaultOptions: [], - create(context) { - return { - ReturnStatement(node) { - if (node.argument === null) { - return; - } - - const parentFunction = getParentFunction(node); - if (parentFunction === undefined) { - return; - } - - const { returnType } = parentFunction; - if (returnType === undefined) { - return; - } - - const { typeAnnotation } = returnType; - if (typeAnnotation.type !== AST_NODE_TYPES.TSVoidKeyword) { - return; - } - - context.report({ - loc: node.loc, - messageId: "mismatchedReturnType", - }); - }, - }; - }, -}); diff --git a/packages/eslint-plugin-isaacscript/src/typeUtils.ts b/packages/eslint-plugin-isaacscript/src/typeUtils.ts index c88b89b7b..a0d5b4548 100644 --- a/packages/eslint-plugin-isaacscript/src/typeUtils.ts +++ b/packages/eslint-plugin-isaacscript/src/typeUtils.ts @@ -43,43 +43,8 @@ export function isFunction(type: ts.Type, checker: ts.TypeChecker): boolean { return signatures.length > 0; } -/** - * @param symbol The symbol to check. - * @param flagsToCheck The composition of one or more `ts.SymbolFlags`. - */ -export function isSymbolFlagSet( - symbol: ts.Symbol, - flagsToCheck: number | ts.SymbolFlags, -): boolean { - return isFlagSet(symbol.flags, flagsToCheck); -} - -/** - * Checks if the given type is either an array/tuple type, or a union made up solely of array/tuple - * types. - * - * Based on the `isTypeArrayTypeOrUnionOfArrayTypes` from `typescript-eslint`, but modified to also - * match tuples. - */ -export function isTypeArrayTupleTypeOrUnionOfArrayTupleTypes( - type: ts.Type, - checker: ts.TypeChecker, -): boolean { - for (const t of unionTypeParts(type)) { - if (!checker.isArrayType(t) && !checker.isTupleType(t)) { - return false; - } - } - - return true; -} - -export function isAny(type: ts.Type): boolean { - return isTypeFlagSet(type, ts.TypeFlags.Any); -} - /** Returns all types of a union type or an array containing `type` itself if it's no union type. */ -export function unionTypeParts(type: ts.Type): readonly ts.Type[] { +function unionTypeParts(type: ts.Type): readonly ts.Type[] { return isUnion(type) ? type.types : [type]; } @@ -103,6 +68,6 @@ export function isTypeFlagSet( return isFlagSet(flags, flagsToCheck); } -export function isFlagSet(flags: number, flag: number): boolean { +function isFlagSet(flags: number, flag: number): boolean { return (flags & flag) !== 0; } diff --git a/packages/eslint-plugin-isaacscript/src/utils.ts b/packages/eslint-plugin-isaacscript/src/utils.ts index 774fb431d..f4e45ae86 100644 --- a/packages/eslint-plugin-isaacscript/src/utils.ts +++ b/packages/eslint-plugin-isaacscript/src/utils.ts @@ -1,82 +1,9 @@ -import type { TSESTree } from "@typescript-eslint/utils"; -import { ASTUtils, ESLintUtils } from "@typescript-eslint/utils"; +import { ESLintUtils } from "@typescript-eslint/utils"; import type { MyPluginDocs } from "./interfaces/MyPluginDocs.js"; -/** Taken from ESLint: https://github.com/eslint/eslint/blob/main/lib/rules/max-len.js */ -const URL_REGEXP = /[^:/?#]:\/\/[^?#]/u; - -export function areStringsEqualExcludingTrailingSpaces( - string1: string, - string2: string, -): boolean { - const string1Lines = string1.split("\n"); - const string2Lines = string2.split("\n"); - - if (string1Lines.length !== string2Lines.length) { - return false; - } - - // eslint-disable-next-line unicorn/no-for-loop - for (let i = 0; i < string1Lines.length; i++) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const line1 = string1Lines[i]!; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const line2 = string2Lines[i]!; - - if (line1.trimEnd() !== line2.trimEnd()) { - return false; - } - } - - return true; -} - /** @see https://typescript-eslint.io/developers/custom-rules#extra-rule-docs-types */ // eslint-disable-next-line new-cap export const createRule = ESLintUtils.RuleCreator( (ruleName) => `https://github.com/IsaacScript/isaacscript/blob/main/packages/eslint-plugin-isaacscript/docs/rules/${ruleName}.md`, ); - -/** - * From: https://stackoverflow.com/questions/13627308/add-st-nd-rd-and-th-ordinal-suffix-to-a-number - */ -export function getOrdinalSuffix(i: number): string { - const j = i % 10; - const k = i % 100; - if (j === 1 && k !== 11) { - return `${i}st`; - } - if (j === 2 && k !== 12) { - return `${i}nd`; - } - if (j === 3 && k !== 13) { - return `${i}rd`; - } - return `${i}th`; -} - -export function getParentFunction( - node: TSESTree.Node, -): - | TSESTree.ArrowFunctionExpression - | TSESTree.FunctionDeclarationWithName - | TSESTree.FunctionDeclarationWithOptionalName - | TSESTree.FunctionExpression - | undefined { - let parent: TSESTree.Node | undefined = node; - - while (parent !== undefined) { - parent = parent.parent; // eslint-disable-line @typescript-eslint/prefer-destructuring - - if (ASTUtils.isFunction(parent)) { - return parent; - } - } - - return undefined; -} - -export function hasURL(text: string): boolean { - return URL_REGEXP.test(text); -} diff --git a/packages/eslint-plugin-isaacscript/tests/completeSentences.test.ts b/packages/eslint-plugin-isaacscript/tests/completeSentences.test.ts deleted file mode 100644 index ad30e62c9..000000000 --- a/packages/eslint-plugin-isaacscript/tests/completeSentences.test.ts +++ /dev/null @@ -1,277 +0,0 @@ -import type { CompleteSentenceMessageIds } from "../src/completeSentence.js"; -import { - getIncompleteSentences, - getSentences, -} from "../src/completeSentence.js"; -import { assertDefined } from "../src/isaacScriptCommon.js"; - -function testSentences(text: string, numSentences: number) { - const sentences = getSentences(text); - expect(sentences.length).toBe(numSentences); -} - -test("Multiple kinds of punctuation", () => { - testSentences( - "I like turtles. Do you? Awesome! Amazing. lol!!! What's going on????", - 6, - ); -}); - -test("Parenthetical sentences", () => { - testSentences( - "(I like turtles.) Do you? (Awesome!) Amazing. (lol!!! What's going on????)", - 6, - ); -}); - -test("No ending punctuation", () => { - testSentences("Sentence 1. Sentence 2", 2); -}); - -test("Text after colon does not count as a sentence", () => { - testSentences("This is my fruit: banana", 1); -}); - -test("Enum does not count as a sentence", () => { - testSentences( - "This uses CollectibleType.SAD_ONION (1) as a value. We must do it this way.", - 2, - ); -}); - -function testIncompleteSentence( - text: string, - messageId: CompleteSentenceMessageIds | undefined, -) { - const incompleteSentences = getIncompleteSentences(text); - const expectedLength = messageId === undefined ? 0 : 1; - expect(incompleteSentences.length).toBe(expectedLength); - if (messageId === undefined) { - return; - } - - const firstIncompleteSentence = incompleteSentences[0]; - assertDefined( - firstIncompleteSentence, - "Failed to get the first incomplete sentence.", - ); - expect(firstIncompleteSentence.messageId).toBe(messageId); -} - -test("Standard sentences", () => { - testIncompleteSentence( - "This is the first sentence. This is the second sentence.", - undefined, - ); -}); - -test("Missing capital", () => { - testIncompleteSentence( - "sometimes I forget to capitalize my sentences.", - "missingCapital", - ); -}); - -test("Missing period", () => { - testIncompleteSentence( - "Sometimes I forget to put a period on my sentences", - "missingPeriod", - ); -}); - -test("Trailing word", () => { - testIncompleteSentence( - "Sometimes I add a trailing word. The", - "missingPeriod", - ); -}); - -test("Plain URL", () => { - testIncompleteSentence( - "https://github.com/eslint/eslint/blob/main/lib/rules/fake-rule.js", - undefined, - ); -}); - -test("Trailing URL", () => { - testIncompleteSentence( - "Taken from ESLint: https://github.com/eslint/eslint/blob/main/lib/rules/fake-rule.js", - undefined, - ); -}); - -test("URL between text", () => { - testIncompleteSentence( - "This is my URL https://stackoverflow.com/ and this sentence should have a period", - "missingPeriod", - ); -}); - -test("Text after colon is exempt", () => { - testIncompleteSentence("This is my example: foo", undefined); -}); - -test("Parenthetical e.g. does not count as sentence", () => { - testIncompleteSentence("I cannot eat certain foods (e.g. Apple).", undefined); -}); - -test("Parenthetical i.e. does not count as sentence", () => { - testIncompleteSentence("I cannot eat certain foods (i.e. Apple).", undefined); -}); - -test("e.g. on separate line does not count as sentence", () => { - testIncompleteSentence("I cannot eat certain foods.\ne.g. Apple", undefined); -}); - -test("i.e. on separate line does not count as sentence", () => { - testIncompleteSentence("I cannot eat certain foods.\ni.e. Apple", undefined); -}); - -test("Parenthetical e.g. on separate line does not count as sentence", () => { - testIncompleteSentence( - "I cannot eat certain foods.\n(e.g. Apple)", - undefined, - ); -}); - -test("Parenthetical i.e. on separate line does not count as sentence", () => { - testIncompleteSentence( - "I cannot eat certain foods.\n(i.e. Apple)", - undefined, - ); -}); - -test("Example on same line", () => { - const text = ` -A list of strings. This is only shown when the player does not know the room's type (e.g. -locked shop, dice room). - `; - testIncompleteSentence(text, undefined); -}); - -test("Date", () => { - testIncompleteSentence("January 1st", undefined); -}); - -test("Code block", () => { - const text = ` -This is a complete sentences. - -\`\`\` -this is not a complete sentence -\`\`\` - -This is also a complete sentences. - `; - testIncompleteSentence(text, undefined); -}); - -test("Parenthetical code", () => { - const text = ` -Add the word. (\`numLeadingSpaces\` will be set.) - `; - testIncompleteSentence(text, undefined); -}); - -test("Numbered list with incomplete sentences", () => { - const text = ` -We split to a new line if: -1. adding the word would make it overflow past the maximum length -2. and there is at least one word on the current line - `; - testIncompleteSentence(text, undefined); -}); - -test("Text that looks like a numbered list", () => { - const text = ` -This method will crash the game if you provide it an invalid type, such as -1, 0, or -500. Thus, it is safer to use the \`foo\` method instead. - `; - testIncompleteSentence(text, undefined); -}); - -test("ts-expect", () => { - const text = ` -@ts-expect-error The next line really is valid, I promise. - `; - testIncompleteSentence(text, undefined); -}); - -test("eslint-disable", () => { - const text = ` -eslint-disable-next-line isaacscript/complete-sentences-jsdoc - `; - testIncompleteSentence(text, undefined); -}); - -test("Text with Jr. in the middle of text", () => { - const text = ` -The player only changes to Esau Jr. on the frame after the item is used. - `; - testIncompleteSentence(text, undefined); -}); - -test("Text with Jr. at the end of text", () => { - const text = ` -Check to see if it is the frame after the player has used Esau Jr. - `; - testIncompleteSentence(text, undefined); -}); - -test("Text with etc. in the middle of text", () => { - const text = ` -This is the sprite for "1st", "2nd", etc. on the left side of the screen. - `; - testIncompleteSentence(text, undefined); -}); - -test("Text with etc. at the end of text", () => { - const text = ` -This is the sprite for "1st", "2nd", etc. - `; - testIncompleteSentence(text, undefined); -}); - -test("Short text with a non-word character", () => { - const text = ` -Racing+ items - `; - testIncompleteSentence(text, undefined); -}); - -test("Incomplete sentence at the end of a block", () => { - const text = ` -This is a sentence - -This is another sentence. - `; - testIncompleteSentence(text, "missingPeriod"); -}); - -test("Sentence with a double period", () => { - const text = ` -This is a sentence.. - `; - testIncompleteSentence(text, "doublePeriod"); -}); - -test("Sentence with question marks in single quotation marks", () => { - const text = ` -Note that this contains 'Blue Womb' instead of '???' for stage 9. - `; - testIncompleteSentence(text, undefined); -}); - -test("Sentence with question marks in double quotation marks", () => { - const text = ` -Note that this contains "Blue Womb" instead of "???" for stage 9. - `; - testIncompleteSentence(text, undefined); -}); - -test("Sentence with hard-coded allow words", () => { - const text = ` -iPad on iOS 13 detection. - `; - testIncompleteSentence(text, undefined); -}); diff --git a/packages/eslint-plugin-isaacscript/tests/fixtures/tsconfig.json b/packages/eslint-plugin-isaacscript/tests/fixtures/tsconfig.json index 335d8d786..79fc07da0 100644 --- a/packages/eslint-plugin-isaacscript/tests/fixtures/tsconfig.json +++ b/packages/eslint-plugin-isaacscript/tests/fixtures/tsconfig.json @@ -1,7 +1,7 @@ // Copied from: // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/tests/fixtures/tsconfig.json { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "compilerOptions": { "jsx": "preserve", diff --git a/packages/eslint-plugin-isaacscript/tests/format-list.test.ts b/packages/eslint-plugin-isaacscript/tests/format-list.test.ts deleted file mode 100644 index ebc54bf7d..000000000 --- a/packages/eslint-plugin-isaacscript/tests/format-list.test.ts +++ /dev/null @@ -1,253 +0,0 @@ -import { testFormatText } from "./format.js"; - -test("Hyphen list", () => { - const text = ` -List of fruits: -- Apple -- Banana -- Pear - `; - testFormatText(text); -}); - -test("Number period list", () => { - const text = ` -List of fruits: -1. Apple -2. Banana -3. Pear - `; - testFormatText(text); -}); - -test("Number parenthesis list", () => { - const text = ` -List of fruits: -1) Apple -2) Banana -3) Pear - `; - testFormatText(text); -}); - -test("Hyphen list with single overflow", () => { - const text = ` -List of things: -- But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will -give you a complete account of the system -- and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one -rejects, dislikes, or avoids pleasure itself, because it is pleasure - `; - const formattedText = ` -List of things: -- But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - born and I will give you a complete account of the system -- and expound the actual teachings of the great explorer of the truth, the master-builder of human - happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure - `; - testFormatText(text, formattedText); -}); - -test("Hyphen list with lots of overflow", () => { - const text = ` -List of things: -- But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. -No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. -- Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. -To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? -- But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?" - `; - const formattedText = ` -List of things: -- But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - born and I will give you a complete account of the system, and expound the actual teachings of the - great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or - avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue - pleasure rationally encounter consequences that are extremely painful. -- Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is - pain, but because occasionally circumstances occur in which toil and pain can procure him some - great pleasure. To take a trivial example, which of us ever undertakes laborious physical - exercise, except to obtain some advantage from it? -- But who has any right to find fault with a man who chooses to enjoy a pleasure that has no - annoying consequences, or one who avoids a pain that produces no resultant pleasure?" - `; - testFormatText(text, formattedText); -}); - -test("Number period list with single overflow", () => { - const text = ` -List of things: -1. But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will -give you a complete account of the system -2. and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one -rejects, dislikes, or avoids pleasure itself, because it is pleasure - `; - const formattedText = ` -List of things: -1. But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - born and I will give you a complete account of the system -2. and expound the actual teachings of the great explorer of the truth, the master-builder of human - happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure - `; - testFormatText(text, formattedText); -}); - -test("Number period list with lots of overflow", () => { - const text = ` -List of things: -1. But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. -No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. -2. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. -To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? -3. But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?" - `; - const formattedText = ` -List of things: -1. But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - born and I will give you a complete account of the system, and expound the actual teachings of - the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, - or avoids pleasure itself, because it is pleasure, but because those who do not know how to - pursue pleasure rationally encounter consequences that are extremely painful. -2. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is - pain, but because occasionally circumstances occur in which toil and pain can procure him some - great pleasure. To take a trivial example, which of us ever undertakes laborious physical - exercise, except to obtain some advantage from it? -3. But who has any right to find fault with a man who chooses to enjoy a pleasure that has no - annoying consequences, or one who avoids a pain that produces no resultant pleasure?" - `; - testFormatText(text, formattedText); -}); - -test("Number parenthesis list with single overflow", () => { - const text = ` -List of things: -1) But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will -give you a complete account of the system -2) and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one -rejects, dislikes, or avoids pleasure itself, because it is pleasure - `; - const formattedText = ` -List of things: -1) But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - born and I will give you a complete account of the system -2) and expound the actual teachings of the great explorer of the truth, the master-builder of human - happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure - `; - testFormatText(text, formattedText); -}); - -test("Number parenthesis list with lots of overflow", () => { - const text = ` -List of things: -1) But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. -No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. -2) Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. -To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? -3) But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?" - `; - const formattedText = ` -List of things: -1) But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - born and I will give you a complete account of the system, and expound the actual teachings of - the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, - or avoids pleasure itself, because it is pleasure, but because those who do not know how to - pursue pleasure rationally encounter consequences that are extremely painful. -2) Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is - pain, but because occasionally circumstances occur in which toil and pain can procure him some - great pleasure. To take a trivial example, which of us ever undertakes laborious physical - exercise, except to obtain some advantage from it? -3) But who has any right to find fault with a man who chooses to enjoy a pleasure that has no - annoying consequences, or one who avoids a pain that produces no resultant pleasure?" - `; - testFormatText(text, formattedText); -}); - -test("Hyphen list with newlines between everything", () => { - const text = ` -List of things: - -- But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. -No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. - -- Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. -To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? - -- But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?" - `; - const formattedText = ` -List of things: - -- But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - born and I will give you a complete account of the system, and expound the actual teachings of the - great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or - avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue - pleasure rationally encounter consequences that are extremely painful. - -- Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is - pain, but because occasionally circumstances occur in which toil and pain can procure him some - great pleasure. To take a trivial example, which of us ever undertakes laborious physical - exercise, except to obtain some advantage from it? - -- But who has any right to find fault with a man who chooses to enjoy a pleasure that has no - annoying consequences, or one who avoids a pain that produces no resultant pleasure?" - `; - testFormatText(text, formattedText); -}); - -test("Hyphen list with sub-bullets", () => { - const text = ` -List of things: -- But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. -No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. - - Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. -To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? -- But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?" - `; - const formattedText = ` -List of things: -- But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - born and I will give you a complete account of the system, and expound the actual teachings of the - great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or - avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue - pleasure rationally encounter consequences that are extremely painful. - - Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it - is pain, but because occasionally circumstances occur in which toil and pain can procure him - some great pleasure. To take a trivial example, which of us ever undertakes laborious physical - exercise, except to obtain some advantage from it? -- But who has any right to find fault with a man who chooses to enjoy a pleasure that has no - annoying consequences, or one who avoids a pain that produces no resultant pleasure?" - `; - testFormatText(text, formattedText); -}); - -test("Hyphen list with a list item that looks like a number parenthesis list", () => { - const text = ` -Pattern can be any of the following: - -- '*a': reads from the socket until the connection is closed. No end-of-line translation is - performed. -- '*l': reads a line of text from the socket. The line is marked/denoted by an LF character (ASCII - 10), optionally preceded by a CR character (ASCII 13). The CR and LF characters are not included in the returned line. In fact, all CR characters are ignored by the pattern. -- number: causes the method to read a specified number of bytes from the socket. - `; - const formattedText = ` -Pattern can be any of the following: - -- '*a': reads from the socket until the connection is closed. No end-of-line translation is - performed. -- '*l': reads a line of text from the socket. The line is marked/denoted by an LF character (ASCII - 10), optionally preceded by a CR character (ASCII 13). The CR and LF characters are not included - in the returned line. In fact, all CR characters are ignored by the pattern. -- number: causes the method to read a specified number of bytes from the socket. - `; - testFormatText(text, formattedText); -}); - -test("Text block that looks like a number period list", () => { - const text = ` -This function will crash the program if you provide an invalid argument, such as 1000000000000000 or -43. Thus, you should basically never call this function, since it is very unstable and could lead to -undefined behavior. - `; - testFormatText(text); -}); diff --git a/packages/eslint-plugin-isaacscript/tests/format.test.ts b/packages/eslint-plugin-isaacscript/tests/format.test.ts deleted file mode 100644 index 17452a7d7..000000000 --- a/packages/eslint-plugin-isaacscript/tests/format.test.ts +++ /dev/null @@ -1,457 +0,0 @@ -import { testFormatText } from "./format.js"; - -test("Exactly 100 characters", () => { - const text = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was bo - `; - testFormatText(text); -}); - -test("Exactly 101 characters", () => { - const text = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was bor - `; - const formattedText = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was -bor - `; - testFormatText(text, formattedText); -}); - -test("Exactly 100 characters with an extra line", () => { - const text = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was bo -and I will give you a complete account of the system - `; - testFormatText(text); -}); - -test("1 line to 2", () => { - const text = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system - `; - const formattedText = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was -born and I will give you a complete account of the system - `; - testFormatText(text, formattedText); -}); - -test("1 line to 3", () => { - const text = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system and expound the actual teachings of the great explorer of the truth - `; - const formattedText = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was -born and I will give you a complete account of the system and expound the actual teachings of the -great explorer of the truth - `; - testFormatText(text, formattedText); -}); - -test("2 lines to 1", () => { - const text = ` -But I must explain to you -how all this mistaken idea of denouncing pleasure - `; - const formattedText = ` -But I must explain to you how all this mistaken idea of denouncing pleasure - `; - testFormatText(text, formattedText); -}); - -test("2 lines to 3", () => { - const text = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will -give you a complete account of the system and expound the actual teachings of the great explorer of the truth - `; - const formattedText = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was -born and I will give you a complete account of the system and expound the actual teachings of the -great explorer of the truth - `; - testFormatText(text, formattedText); -}); - -test("3 lines to 2", () => { - const text = ` -But I must explain to you how all this mistaken idea of denouncing pleasure -and praising pain was born and I will give you a complete account of the system and -expound the actual teachings of the - `; - const formattedText = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was -born and I will give you a complete account of the system and expound the actual teachings of the - `; - testFormatText(text, formattedText); -}); - -test("4 lines to 5", () => { - const text = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will -give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder -of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how -to pursue pleasure rationally encounter consequences that are extremely painful. - `; - const formattedText = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was -born and I will give you a complete account of the system, and expound the actual teachings of the -great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or -avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue -pleasure rationally encounter consequences that are extremely painful. - `; - testFormatText(text, formattedText); -}); - -test("Multiple sections", () => { - const text = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born - -and I will give you a complete account of the system, and expound the actual teachings of the great explorer -of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself - - -because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter -consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to -obtain pain of itself, because it is pain, but because occasionally circumstances occur - `; - const formattedText = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was -born - -and I will give you a complete account of the system, and expound the actual teachings of the great -explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids -pleasure itself - -because it is pleasure, but because those who do not know how to pursue pleasure rationally -encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or -desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur - `; - testFormatText(text, formattedText); -}); - -test("Leading newline", () => { - const text = - "\nBut I must explain to you how all this mistaken idea of denouncing"; - const formattedText = - "But I must explain to you how all this mistaken idea of denouncing"; - testFormatText(text, formattedText, false); -}); - -test("2 leading newlines", () => { - const text = - "\n\nBut I must explain to you how all this mistaken idea of denouncing"; - const formattedText = - "But I must explain to you how all this mistaken idea of denouncing"; - testFormatText(text, formattedText, false); -}); - -test("Line that goes past ruler", () => { - const text = ` -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - `; - testFormatText(text); -}); - -test("Line that goes past ruler with overflow", () => { - const text = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA I will give you a complete account of the system - `; - const formattedText = ` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was -born and -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -I will give you a complete account of the system - `; - testFormatText(text, formattedText); -}); - -test("2 spaces between words", () => { - const text = ` -dog cat - `; - const formattedText = ` -dog cat - `; - testFormatText(text, formattedText); -}); - -test("URL does not get merged with 2 lines", () => { - const text = ` -Go to this website: -https://stackoverflow.com/ - `; - testFormatText(text); -}); - -test("URL does not get merged with 3 lines", () => { - const text = ` -Go to this website: -https://stackoverflow.com/ -And you will find the information that you seek. - `; - testFormatText(text); -}); - -test("e.g. does not get merged", () => { - const text = ` -The contents of JSDoc tag header, if any. -e.g. "@param foo This is foo." would be "@param foo". - `; - testFormatText(text); -}); - -test("e.g. in parenthesis does not get merged", () => { - const text = ` -The contents of JSDoc tag header, if any. -(e.g. "@param foo This is foo." would be "@param foo".) - `; - testFormatText(text); -}); - -test("i.e. does not get merged", () => { - const text = ` -The contents of JSDoc tag header, if any. -i.e. "@param foo This is foo." would be "@param foo". - `; - testFormatText(text); -}); - -test("i.e. in parenthesis does not get merged", () => { - const text = ` -The contents of JSDoc tag header, if any. -(i.e. "@param foo This is foo." would be "@param foo".) - `; - testFormatText(text); -}); - -test("Code blocks with newline separator", () => { - const text = ` -This is my example: - -\`\`\` -const foo = 123; -const bar = 456; -function fooFunction() { - barFunction(); -} - - - -const baz = 789; -\`\`\` - -It is a good example. - `; - testFormatText(text); -}); - -test("Code blocks with long text", () => { - const text = ` -This is my example: - -\`\`\` -But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system and expound the actual teachings of the great explorer of the truth -\`\`\` - `; - testFormatText(text); -}); - -test("Code blocks without newline separator", () => { - const text = ` -This is my example: -\`\`\` -const foo = 123; -\`\`\` -It is a good example. - `; - const formattedText = ` -This is my example: - -\`\`\` -const foo = 123; -\`\`\` - -It is a good example. - `; - testFormatText(text, formattedText); -}); - -test("JSDoc tags normal", () => { - const text = ` -Here is my function. - -@param bar But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and -I will give you a complete account of the system, and expound the actual teachings of the great -@returns explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure -explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself - `; - const formattedText = ` -Here is my function. - -@param bar But I must explain to you how all this mistaken idea of denouncing pleasure and praising - pain was born and I will give you a complete account of the system, and expound the - actual teachings of the great -@returns explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or - avoids pleasure explorer of the truth, the master-builder of human happiness. No one - rejects, dislikes, or avoids pleasure itself - `; - testFormatText(text, formattedText); -}); - -test("JSDoc tags with long variable names", () => { - const text = ` -Here is my function. - -@param thisIsAReallyLongVariableNameThatGoesToHalfTheScreen But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and -I will give you a complete account of the system, and expound the actual teachings of the great -@returns explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure -explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself - `; - const formattedText = ` -Here is my function. - -@param thisIsAReallyLongVariableNameThatGoesToHalfTheScreen But I must explain to you how all this - mistaken idea of denouncing pleasure and praising pain was born and - I will give you a complete account of the system, and expound the - actual teachings of the great -@returns explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or - avoids pleasure explorer of the truth, the master-builder of human happiness. No one - rejects, dislikes, or avoids pleasure itself - `; - testFormatText(text, formattedText); -}); - -test("Title with hyphen separator", () => { - const text = ` ----------------- -Getter functions ----------------- - `; - testFormatText(text); -}); - -test("eslint-disable without trailing text", () => { - const text = ` -Trim the quotes surrounding the sentence. -eslint-disable-next-line no-constant-condition - `; - testFormatText(text); -}); - -test("eslint-disable with trailing text", () => { - const text = ` -Trim the quotes surrounding the sentence. -eslint-disable-next-line no-constant-condition -This is another line. - `; - testFormatText(text); -}); - -test("eslint-disable with long line", () => { - const text = ` -eslint-disable-next-line @typescript-eslint/no-var-requires,import-x/no-dynamic-require,global-require,no-plusplus - `; - testFormatText(text); -}); - -test("Enum block label without trailing text", () => { - const text = ` -ModCallback.POST_PLAYER_RENDER (32) -PlayerVariant.PLAYER (0) -BabySubType.SUB_TYPE (1) - `; - testFormatText(text); -}); - -test("Enum block label with trailing text", () => { - const text = ` -ModCallback.POST_PLAYER_RENDER (32) -PlayerVariant.PLAYER (0) -This is a description. - `; - testFormatText(text); -}); - -test("Line with sole integer", () => { - const text = ` -1 -This is the first value. - `; - testFormatText(text); -}); - -test("Line with sole float", () => { - const text = ` -1.0 -This is the first value. - `; - testFormatText(text); -}); - -test("Line with sole bit flag", () => { - const text = ` -1 << 1 -This is the first value. - `; - testFormatText(text); -}); - -test("Line with number list", () => { - const text = ` -14, 33 -This is the first and second values. - `; - testFormatText(text); -}); - -test("TODO after a line", () => { - const text = ` -The boost is the amount of damage granted by Dim Candle. -TODO: DELETE - `; - testFormatText(text); -}); - -test("TODO before a line", () => { - const text = ` -TODO: DELETE -The boost is the amount of damage granted by Dim Candle. - `; - testFormatText(text); -}); - -test("Comment with a parenthetical sentence before a param JSDoc tag", () => { - const text = ` -Foo. - -(This is a parenthetical sentence.) -@param foo A description of foo. - `; - const formattedText = ` -Foo. - -(This is a parenthetical sentence.) - -@param foo A description of foo. - `; - testFormatText(text, formattedText); -}); - -test("Tab characters removed", () => { - const text = ` -Some text. - -Some tab characters here. - -This is some other normal text. - `; - const formattedText = ` -Some text. - -Some tab characters here. - -This is some other normal text. - `; - testFormatText(text, formattedText); -}); diff --git a/packages/eslint-plugin-isaacscript/tests/format.ts b/packages/eslint-plugin-isaacscript/tests/format.ts deleted file mode 100644 index 7633bac21..000000000 --- a/packages/eslint-plugin-isaacscript/tests/format.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { formatText } from "../src/format.js"; - -const FORMAT_TEST_MAX_LENGTH = 100; - -export function testFormatText( - text: string, - expectedFormattedText?: string, - trim = true, -): void { - if (expectedFormattedText === undefined) { - expectedFormattedText = text; - } - - if (trim) { - text = text.trim(); - expectedFormattedText = expectedFormattedText.trim(); - } - - const formattedText = formatText(text, FORMAT_TEST_MAX_LENGTH); - expect(formattedText).toBe(expectedFormattedText); -} diff --git a/packages/eslint-plugin-isaacscript/tests/rules/complete-sentences-jsdoc.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/complete-sentences-jsdoc.test.ts deleted file mode 100644 index 844913c26..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/complete-sentences-jsdoc.test.ts +++ /dev/null @@ -1,606 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { CompleteSentenceMessageIds } from "../../src/completeSentence.js"; -import type { Options } from "../../src/rules/complete-sentences-jsdoc.js"; -import { completeSentencesJSDoc } from "../../src/rules/complete-sentences-jsdoc.js"; -import { ruleTester } from "../utils.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -valid.push({ - name: "Single-line comment with complete sentence", - code: ` -/** This is a complete sentence. */ - `, -}); - -invalid.push({ - name: "Single-line comment without a capital", - code: ` -/** sometimes I forget to capitalize my sentences. */ - `, - errors: [{ messageId: "missingCapital" }], -}); - -invalid.push({ - name: "Single-line comment without a period", - code: ` -/** Sometimes I forget to put a period on my comments */ - `, - errors: [{ messageId: "missingPeriod" }], -}); - -valid.push({ - name: "Multi-line comment with complete sentence", - code: ` -/** - * Sometimes I forget to put a period on my comments. - */ - `, -}); - -invalid.push({ - name: "Multi-line comment without a period", - code: ` -/** -* Sometimes I forget to put a period on my comments -*/ - `, - errors: [{ messageId: "missingPeriod" }], -}); - -invalid.push({ - name: "Multi-line comment without a capital", - code: ` -/** - * sometimes I forget to capitalize my sentences. - */ - `, - errors: [{ messageId: "missingCapital" }], -}); - -valid.push({ - name: "Multi-line comment with complete sentences and two blocks", - code: ` -/** -* This is a complete sentence. -* -* This is another block that stretches -* between two lines. -*/ - `, -}); - -invalid.push({ - name: "Multi-line comment with incomplete sentences and two blocks", - code: ` -/** -* Sometimes I forget to put a period on my comments -* -* This is another block that stretches -* between two lines -*/ - `, - errors: [{ messageId: "missingPeriod" }, { messageId: "missingPeriod" }], -}); - -valid.push({ - name: "Single-line blank comments", - code: ` -/**/ -/***/ -/****/ -/*****/ - -/* */ -/* */ -/* */ - -/* **/ -/* **/ -/* **/ - -/** */ -/** */ -/** */ - -/** **/ -/** **/ -/** **/ - `, -}); - -valid.push({ - name: "Multi-line blank comments", - code: ` -/** - */ - -/** - * - */ - - /** - * - * - */ - - /** - * - * - * - */ - `, -}); - -valid.push({ - name: "Single-line comment with a URL (simple)", - code: ` -/** Taken from ESLint: https://github.com/eslint/eslint/blob/main/lib/rules/fake-rule.js */ - `, -}); - -valid.push({ - name: "Multi-line comment with a URL (combined)", - code: ` -/** - * Taken from ESLint: https://github.com/eslint/eslint/blob/main/lib/rules/fake-rule.js - */ - `, -}); - -valid.push({ - name: "Multi-line comment with a URL (separated)", - code: ` -/** - * Taken from ESLint: - * https://github.com/eslint/eslint/blob/main/lib/rules/fake-rule.js - */ - `, -}); - -valid.push({ - name: "Multi-line comment with a URL and trailing text", - code: ` -/** - * The TypeScript config extends it: - * https://github.com/iamturns/eslint-config-airbnb-typescript/blob/master/lib/shared.js - * (This includes the "parser" declaration of "@typescript-eslint/parser".) - */ - `, -}); - -valid.push({ - name: "Multi-line comment with a code block", - code: ` -/** - * An object containing one or more contiguous comments. For example: - * - * \`\`\`ts - * // A comment. - * // Another comment. - * \`\`\` - */ - `, -}); - -invalid.push({ - name: "Multi-line comment with a code block and trailing incomplete sentence", - code: ` -/** - * An object containing one or more contiguous comments. For example: - * - * \`\`\`ts - * // A comment. - * // Another comment. - * \`\`\` - * this is an incomplete sentence. - */ - `, - errors: [{ messageId: "missingCapital" }], -}); - -valid.push({ - name: "Multi-line comment with a colon and bullet points", - code: ` -/** - * The amount of spaces before a sub bullet. For example, the following bullet points would have a - * \`subBulletIndentLength\` of "" and " " respectively: - * - * - First bullet point. - * - Sub bullet point. - */ - `, -}); - -valid.push({ - name: "Multi-line comment with a colon and bullet points of non-complete items", - code: ` -/** - * This is my list of things: - * - * - first thing - * - sub-first thing - * - second thing - */ - `, -}); - -valid.push({ - name: "Single-line comment with complete sentence in quotes", - code: ` -/** "foo" refers to "baz". */ - `, -}); - -invalid.push({ - name: "Single-line comment with incomplete sentence in quotes", - code: ` -/** "foo" refers to "baz" */ - `, - errors: [{ messageId: "missingPeriod" }], -}); - -valid.push({ - name: "Multi-line comment with a complete sentence in quotes", - code: ` -/** - * "But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain - * was born and I will." - */ - `, -}); - -invalid.push({ - name: "Multi-line comment with a incomplete sentence in quotes", - code: ` -/** - * "But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain - * was born and I will" - */ - `, - errors: [{ messageId: "missingPeriod" }], -}); - -valid.push({ - name: "Function comment", - code: ` -/** - * This is the foo function. - * - * @param bar This is a bar. - * @returns This is a return value. - */ -function foo(bar: number) {} - `, -}); - -invalid.push({ - name: "Function comment with missing period in param tag", - code: ` -/** - * This is the foo function. - * - * @param bar This is a bar - * @returns This is a return value. - */ -function foo(bar: number) {} - `, - errors: [{ messageId: "missingPeriod" }], -}); - -invalid.push({ - name: "Function comment with missing period in returns tag", - code: ` -/** - * This is the foo function. - * - * @param bar This is a bar. - * @returns This is a return value - */ -function foo(bar: number) {} - `, - errors: [{ messageId: "missingPeriod" }], -}); - -invalid.push({ - name: "Function comment with missing capital in param tag", - code: ` -/** - * This is the foo function. - * - * @param bar this is a bar. - * @returns This is a return value. - */ -function foo(bar: number) {} - `, - errors: [{ messageId: "missingCapital" }], -}); - -invalid.push({ - name: "Function comment with missing capital in returns tag", - code: ` -/** - * This is the foo function. - * - * @param bar This is a bar. - * @returns this is a return value. - */ -function foo(bar: number) {} - `, - errors: [{ messageId: "missingCapital" }], -}); - -valid.push({ - name: "Comment with lone JSDoc tag", - code: ` -/** @noSelf */ - `, -}); - -invalid.push({ - name: "Comment with non-lone JSDoc tag", - code: ` -/** @noSelf Incomplete sentence here oh my */ - `, - errors: [{ messageId: "missingPeriod" }], -}); - -valid.push({ - name: "Comment with colon ending with code", - code: ` -/** For example: \`foo()\` */ - `, -}); - -invalid.push({ - name: "Comment without colon ending with code", - code: ` -/** The following is an example of foo \`foo()\` */ - `, - errors: [{ messageId: "missingPeriod" }], -}); - -valid.push({ - name: "Comment using e.g. and no period", - code: ` -/** - * The static methods in this class can only be called by a global variable. - * - * e.g. \`Foo.Bar()\` - */ - `, -}); - -valid.push({ - name: "Comment using a question", - code: ` -/** What is the meaning of life? */ - `, -}); - -valid.push({ - name: "Comment using an exclamation point", - code: ` -/** I love linting! */ - `, -}); - -valid.push({ - name: "Comment using a numeric literal", - code: ` -/** - * This is a foo. - * - * 1 << 1 - */ - `, -}); - -valid.push({ - name: "Comment using a trailing number expression", - code: ` -/** - * For EntityType.TEAR (2) - * - * This is an object instead of a TypeScript enum because we need to specify that it contains bit - * flags. Furthermore, enums cannot be instantiated with \`BitSet128\` objects. - * - * This enum was renamed from "TearFlags" to be consistent with the other flag enums. - */ - `, -}); - -valid.push({ - name: "Comment using an in-line URL", - code: ` -{ - { - { - { - /** - * We have to use \`leftTSNode.name\` instead of \`leftTSNode\` to avoid run-time errors - * because the \`typeChecker.getTypeAtLocation\` method expects a \`ts.BindingName\` instead - * of a \`ts.VariableDeclaration\`: https://github.com/microsoft/TypeScript/issues/48878 - */ - } - } - } -} - `, -}); - -valid.push({ - name: "Comment with spillover number in parenthesis", - code: ` -/** - * For EntityType.CONSTANT_STONE_SHOOTER (202), ConstantStoneShooterVariant.CONSTANT_STONE_SHOOTER - * (0) - * - * This is the same as the \`Direction\` enum. - */ - `, -}); - -valid.push({ - name: "Comment with date", - code: ` -/** January 1st */ - `, -}); - -valid.push({ - name: "Comment with JSDoc type on single line", - code: ` -/** @type {import("@docusaurus/types").DocusaurusConfig} */ - `, -}); - -valid.push({ - name: "Comment with JSDoc type on multi line", - code: ` -/** - * @type {import("@docusaurus/types").DocusaurusConfig} - */ - `, -}); - -valid.push({ - name: "Comment with JSDoc link with URL without trailing text", - code: ` -/** - * This starts a debug session with ZeroBrane Studio. For more information, see the - * [documentation](https://wofsauge.github.io/IsaacDocs/rep/tutorials/ZeroBraneStudio.html). - */ - `, -}); - -valid.push({ - name: "Comment with JSDoc link with URL and trailing text", - code: ` -/** - * Also see the [documentation for the socket - * library](https://web.tecgraf.puc-rio.br/luasocket/old/luasocket-2.0-beta/tcp.html). - * - * @noSelf - */ - `, -}); - -valid.push({ - name: "Comment with JSDoc example on one line", - code: ` -/** - * Inference helper for inputs. - * - * @example type HelloInput = RouterInputs['example']['hello']; - */ - `, -}); - -valid.push({ - name: "Comment with JSDoc example on multiple lines", - code: ` -/** - * Inference helper for inputs. - * - * @example - * no capital letters here. - * just some example text. - */ - `, -}); - -valid.push({ - name: "Comment with JSDoc markdown table", - code: ` -/** - * | API | Description | - * | ---------------------------------------------------- | ---------------------------------------------------------------------------- | - * | {@link getNames getNames()} | Provides a list of all peripherals available. | - * | {@link isPresent isPresent(name)} | Determines if a peripheral is present with the given name. | - * | {@link getType getType(peripheral)} | Get the types of a named or wrapped peripheral. | - * | {@link hasType hasType(peripheral, peripheral_type)} | Check if a peripheral is of a particular type. | - * | {@link getMethods getMethods(name)} | Get all available methods for the peripheral with the given name. | - * | {@link getName getName(peripheral)} | Get the name of a peripheral wrapped with \`peripheral.wrap\`. | - * | {@link call call(name, method, ...)} | Call a method on the peripheral with the given name. | - * | {@link wrap wrap(name)} | Get a table containing all functions available on a peripheral. | - * | {@link find find(ty [, filter])} | Find all peripherals of a specific type, and return the wrapped peripherals. | - */ - `, -}); - -valid.push({ - name: "Comment with JSDoc link tag", - code: ` -/** Get the name of a peripheral wrapped with {@link peripheral.wrap}. */ - `, -}); - -valid.push({ - name: "Comment with capitalized JSDoc link tag", - code: ` -/** - * {@link NamepathOrURL} it doesn't allow this. - * - * [Link text]{@link namepathOrURL} hey, it actually starts with a capital letter. - * - * {@link namepathOrURL|Link text} what do you mean it doesn't start with a capital letter? - * - * {@link namepathOrURL Link text (after the first space)} this does indeed start with a capital letter. - */ - `, -}); - -valid.push({ - name: "Comment with JSDoc see tag", - code: ` -/** - * @see peripheral This event is fired whenever a - * new peripheral is attached. - */ - `, -}); - -valid.push({ - name: "Comment with JSDoc Markdown header at the beginning", - code: ` -/** - * # This is a header - * - * This is another comment. - */ - `, -}); - -valid.push({ - name: "Comment with JSDoc Markdown header in the middle", - code: ` -/** - * This is a comment. - * - * # This is a header - * - * This is another comment. - */ - `, -}); - -valid.push({ - name: "Comment with JSDoc something that looks like a Markdown header", - code: ` -/** - * Grey. Written as \`7\` in paint files and {@link term.blit}, has a default terminal color of - * #4C4C4C. - * - * @see {@link colors.gray} - */ `, -}); - -ruleTester.run("complete-sentences-jsdoc", completeSentencesJSDoc, { - valid, - invalid, -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/complete-sentences-line-comments.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/complete-sentences-line-comments.test.ts deleted file mode 100644 index 1ffac3589..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/complete-sentences-line-comments.test.ts +++ /dev/null @@ -1,300 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { CompleteSentenceMessageIds } from "../../src/completeSentence.js"; -import type { Options } from "../../src/rules/complete-sentences-line-comments.js"; -import { completeSentencesLineComments } from "../../src/rules/complete-sentences-line-comments.js"; -import { ruleTester } from "../utils.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -invalid.push({ - name: "Single-line comment without complete sentence", - code: ` -// this is not a complete sentence. - `, - errors: [{ messageId: "missingCapital" }], -}); - -valid.push({ - name: "Comment with complete sentence", - code: ` -// This is a complete -// sentence. - `, -}); - -invalid.push({ - name: "Comment without a capital", - code: ` -// sometimes I forget to capitalize -// my sentences. - `, - errors: [{ messageId: "missingCapital" }], -}); - -invalid.push({ - name: "Comment without a period", - code: ` -// Sometimes I forget to put a period on -// my comments - `, - errors: [{ messageId: "missingPeriod" }], -}); - -valid.push({ - name: "Blank comments", - code: ` -// - -// -// - -// -// -// - `, -}); - -valid.push({ - name: "Comment with a URL and without trailing text", - code: ` -// Taken from ESLint: -// https://github.com/eslint/eslint/blob/main/lib/rules/fake-rule.js - `, -}); - -valid.push({ - name: "Comment with a URL and with trailing text", - code: ` -// The TypeScript config extends it: -// https://github.com/iamturns/eslint-config-airbnb-typescript/blob/master/lib/shared.js -// (This includes the "parser" declaration of "@typescript-eslint/parser".) - `, -}); - -valid.push({ - name: "Comment with a colon and bullet points of non-complete items", - code: ` -// This is my list of things: -// -// - first thing -// - sub-first thing -// - second thing - `, -}); - -valid.push({ - name: "Comment with complete sentence in quotes", - code: ` -// "foo" refers to -// the "baz". - `, -}); - -invalid.push({ - name: "Comment with incomplete sentence in quotes", - code: ` -// "foo" refers to -// the "baz" - `, - errors: [{ messageId: "missingPeriod" }], -}); - -valid.push({ - name: "Multi-line comment with a complete sentence in quotes", - code: ` -// "But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain -// was born and I will." - `, -}); - -invalid.push({ - name: "Multi-line comment with a incomplete sentence in quotes", - code: ` -// "But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain -// was born and I will" - `, - errors: [{ messageId: "missingPeriod" }], -}); - -valid.push({ - name: "Comment with colon ending with code", - code: ` -// This is a line. -// For example: \`foo()\` - `, -}); - -invalid.push({ - name: "Comment without colon ending with code", - code: ` -// This is a line. -// For example \`foo()\` - `, - errors: [{ messageId: "missingPeriod" }], -}); - -valid.push({ - name: "Comment with colon ending without a period", - code: ` -// THIS CODE WAS AUTOMATICALLY GENERATED. -// DO NOT EDIT THIS FILE BY HAND. -// YOU CAN REGENERATE IT USING: -// npm run generate - `, -}); - -valid.push({ - name: "Comment using e.g. and no period", - code: ` -// The static methods in this class can only be called by a global variable. -// e.g. \`Foo.Bar()\` - `, -}); - -valid.push({ - name: "Comment using a question", - code: ` -// This is a line. -// What is the meaning of life? - `, -}); - -valid.push({ - name: "Comment using a numeric literal", - code: ` -// This is a foo. -// -// 1 << 1 - `, -}); - -valid.push({ - name: "Comment using a trailing number expression", - code: ` -// For EntityType.TEAR (2) -// -// This is an object instead of a TypeScript enum because we need to specify that it contains bit -// flags. Furthermore, enums cannot be instantiated with \`BitSet128\` objects. -// -// This enum was renamed from "TearFlags" to be consistent with the other flag enums. - `, -}); - -valid.push({ - name: "Comment using an in-line URL", - code: ` -{ - { - { - { - // We have to use \`leftTSNode.name\` instead of \`leftTSNode\` to avoid run-time errors - // because the \`typeChecker.getTypeAtLocation\` method expects a \`ts.BindingName\` instead - // of a \`ts.VariableDeclaration\`: https://github.com/microsoft/TypeScript/issues/48878 - } - } - } -} - `, -}); - -valid.push({ - name: "Comment using separators", - code: ` -// ------------ -// SHARED TESTS -// ------------ - `, -}); - -valid.push({ - name: "Comment with ts-ignore", - code: ` -function foo() { - // @ts-ignore -} - `, -}); - -valid.push({ - name: "Comment with spillover number in parenthesis", - code: ` -// For EntityType.CONSTANT_STONE_SHOOTER (202), ConstantStoneShooterVariant.CONSTANT_STONE_SHOOTER -// (0) - `, -}); - -valid.push({ - name: "Enum block comment type 1", - code: ` -// CollectibleType.SAD_ONION - `, -}); - -valid.push({ - name: "Enum block comment type 2", - code: ` -// CollectibleType.SAD_ONION (1) - `, -}); - -valid.push({ - name: "Enum block comment type 3", - code: ` -// CacheFlag.FIRE_DELAY (1 << 1) - `, -}); - -invalid.push({ - name: "Text that looks like an enum block comment", - code: ` -// This variable uses CollectibleType.SAD_ONION - `, - errors: [{ messageId: "missingPeriod" }], -}); - -valid.push({ - name: "Commenting out code using const", - code: ` -// const foo = 123; - `, -}); - -valid.push({ - name: "Commenting out code using export", - code: ` -// export const CLIENT_LOBBY_CHANNEL_ID = "123"; - `, -}); - -valid.push({ - name: "Commenting out code using console.log", - code: ` -// console.log("foo"); - `, -}); - -valid.push({ - name: "Commented out array elements", - code: ` -const array = [ - "try", - // "typeof", - // "var", - // "void", - // "volatile", -]; - `, -}); - -ruleTester.run( - "complete-sentences-line-comments", - completeSentencesLineComments, - { - valid, - invalid, - }, -); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/consistent-enum-values.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/consistent-enum-values.test.ts deleted file mode 100644 index d26d139bf..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/consistent-enum-values.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { consistentEnumValues } from "../../src/rules/consistent-enum-values.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("consistent-enum-values", consistentEnumValues, { - valid: [ - { - code: ` -enum Foo { - Value1, -} - `, - }, - { - code: ` -enum Foo { - Value1 = 0, -} - `, - }, - { - code: ` -enum Foo { - Value1 = "Value1", -} - `, - }, - ], - - invalid: [ - { - code: ` -enum Foo { - Value1 = "VALUE1", -} - `, - errors: [{ messageId: "inconsistentValue" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/consistent-named-tuples.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/consistent-named-tuples.test.ts deleted file mode 100644 index 10354e96b..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/consistent-named-tuples.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { consistentNamedTuples } from "../../src/rules/consistent-named-tuples.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("consistent-named-tuples", consistentNamedTuples, { - valid: [ - { - code: ` -type MyTuple = [string, number]; - `, - }, - { - code: ` -type MyTuple = [arg1: string, arg2: number]; - `, - }, - ], - - invalid: [ - { - code: ` -type MyTuple = [arg1: string, number]; - `, - errors: [{ messageId: "notNamed" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/eqeqeq-fix.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/eqeqeq-fix.test.ts deleted file mode 100644 index 41a84de61..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/eqeqeq-fix.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { eqeqeqFix } from "../../src/rules/eqeqeq-fix.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("eqeqeq-fix", eqeqeqFix, { - valid: [ - { - code: ` -if (foo === bar) { -} - `, - }, - { - code: ` -if (foo !== bar) { -} - `, - }, - ], - - invalid: [ - { - code: ` -if (foo == bar) { -} - `, - errors: [{ messageId: "unexpected" }], - output: ` -if (foo === bar) { -} - `, - }, - { - code: ` -if (foo != bar) { -} - `, - errors: [{ messageId: "unexpected" }], - output: ` -if (foo !== bar) { -} - `, - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/format-jsdoc-comments.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/format-jsdoc-comments.test.ts deleted file mode 100644 index cbe1527be..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/format-jsdoc-comments.test.ts +++ /dev/null @@ -1,721 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { - MessageIds, - Options, -} from "../../src/rules/format-jsdoc-comments.js"; -import { formatJSDocComments } from "../../src/rules/format-jsdoc-comments.js"; -import { ruleTester } from "../utils.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -valid.push({ - name: 'Using a single-line "//" comment that is too long', - code: ` -// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will - `, -}); - -valid.push({ - name: "Using a non-JSDoc comment that is too long", - code: ` -/* But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will */ - `, -}); - -valid.push({ - name: "Using a single-line comment with exactly 100 characters without any indent", - code: ` -/** But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain */ - `, -}); - -invalid.push({ - name: "Using a single-line comment with exactly 101 characters without any indent", - code: ` -/** But I must explain to you how all this mistaken idea of denouncing pleasure and praising pains */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pains - */ - `, -}); - -invalid.push({ - name: "Using a single-line comment with no preceding or trailing whitespace", - code: "/** But I must explain to you how all this mistaken idea of denouncing pleasure and praising pains */", - errors: [{ messageId: "incorrectlyFormatted" }], - output: `/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pains - */`, -}); - -valid.push({ - name: "Using a multi-line comment with exactly 100 characters without any indent", - code: ` -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - */ - `, -}); - -valid.push({ - name: "Using a multi-line comment with exactly 100 characters and potential spillover", - code: ` -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - * born and I will give you a complete account of the system - */ - `, -}); - -invalid.push({ - name: "Using a multi-line comment with exactly 101 characters", - code: ` -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain work - * born and I will give you a complete account of the system - */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain - * work born and I will give you a complete account of the system - */ - `, -}); - -invalid.push({ - name: "Using a multi-line comment that is too long", - code: ` -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and - * I will give you a complete account of the system - */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - * born and I will give you a complete account of the system - */ - `, -}); - -invalid.push({ - name: "Using a multi-line comment with many long lines", - code: ` -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will - * give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder - * of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how - * to pursue pleasure rationally encounter consequences that are extremely painful. - */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - * born and I will give you a complete account of the system, and expound the actual teachings of - * the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, - * or avoids pleasure itself, because it is pleasure, but because those who do not know how to - * pursue pleasure rationally encounter consequences that are extremely painful. - */ - `, -}); - -valid.push({ - name: "Using a single-line comment with exactly 100 characters inside a function", - code: ` -function foo() { - /** But I must explain to you how all this mistaken idea of denouncing pleasure and praising to */ -} - `, -}); - -invalid.push({ - name: "Using a single-line comment with exactly 101 characters inside a function", - code: ` -function foo() { - /** But I must explain to you how all this mistaken idea of denouncing pleasure and praising two */ -} - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -function foo() { - /** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising two - */ -} - `, -}); - -valid.push({ - name: "Using a multi-line comment with exactly 100 characters inside a function", - code: ` -function foo() { - /** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain a - * born and I will give you a complete account of the system - */ -} - `, -}); - -invalid.push({ - name: "Using a multi-line comment with exactly 101 characters inside a function", - code: ` -function foo() { - /** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain as - * born and I will give you a complete account of the system - */ -} - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -function foo() { - /** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain - * as born and I will give you a complete account of the system - */ -} - `, -}); - -invalid.push({ - name: "Using a multi-line comment that is too long inside a function", - code: ` -function foo() { - /** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and - * I will give you a complete account of the system - */ -} - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -function foo() { - /** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain - * was born and I will give you a complete account of the system - */ -} - `, -}); - -invalid.push({ - name: "Using a multi-line comment with many long lines inside a function", - code: ` -function foo() { - /** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will - * give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder - * of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how - * to pursue pleasure rationally encounter consequences that are extremely painful. - */ -} - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -function foo() { - /** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain - * was born and I will give you a complete account of the system, and expound the actual teachings - * of the great explorer of the truth, the master-builder of human happiness. No one rejects, - * dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know - * how to pursue pleasure rationally encounter consequences that are extremely painful. - */ -} - `, -}); - -invalid.push({ - name: "Using a multi-line comment that has many blocks and block separation", - code: ` -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born - * - * and I will give you a complete account of the system, and expound the actual teachings of the great - * explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure - * - * - * itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally - * encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or - * desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur - */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - * born - * - * and I will give you a complete account of the system, and expound the actual teachings of the - * great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or - * avoids pleasure - * - * itself, because it is pleasure, but because those who do not know how to pursue pleasure - * rationally encounter consequences that are extremely painful. Nor again is there anyone who loves - * or pursues or desires to obtain pain of itself, because it is pain, but because occasionally - * circumstances occur - */ - `, -}); - -invalid.push({ - name: "Using a multi-line comment that has many blocks and block separation inside a function", - code: ` -function foo() { - /** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born - * - * and I will give you a complete account of the system, and expound the actual teachings of the great - * explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure - * - * - * itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally - * encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or - * desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur - */ -} - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -function foo() { - /** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain - * was born - * - * and I will give you a complete account of the system, and expound the actual teachings of the - * great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, - * or avoids pleasure - * - * itself, because it is pleasure, but because those who do not know how to pursue pleasure - * rationally encounter consequences that are extremely painful. Nor again is there anyone who - * loves or pursues or desires to obtain pain of itself, because it is pain, but because - * occasionally circumstances occur - */ -} - `, -}); - -valid.push({ - name: "Using a multi-line comment that looks like a numbered bullet point", - code: ` -function foo() { - /** - * This method will crash the game if you provide it an invalid collectible type, such as -1 or - * 43. (Using 0 will not cause a crash.) Thus, it is safer to use the \`RemoveCostume\` method - * instead. - */ -} - `, -}); - -invalid.push({ - name: "Using a single-line comment with an unbreakable line", - code: ` -/** AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** - * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - */ - `, -}); - -valid.push({ - name: "Using a multi-line comment with an unbreakable line", - code: ` -/** - * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - */ - `, -}); - -invalid.push({ - name: "Using a single-line comment with an unbreakable line and other overflowing text", - code: ` -/** But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA I will give you a complete account of the system */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - * born and - * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - * I will give you a complete account of the system - */ - `, -}); - -invalid.push({ - name: "Using a multi-line comment with JSDoc block tags", - code: ` -/** - * Here is my function. - * - * @param bar But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and - * I will give you a complete account of the system, and expound the actual teachings of the great - * @returns explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure - * explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself - */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** - * Here is my function. - * - * @param bar But I must explain to you how all this mistaken idea of denouncing pleasure and - * praising pain was born and I will give you a complete account of the system, and - * expound the actual teachings of the great - * @returns explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, - * or avoids pleasure explorer of the truth, the master-builder of human happiness. No one - * rejects, dislikes, or avoids pleasure itself - */ - `, -}); - -valid.push({ - name: "Using a multi-line comment with code blocks and no trailing line", - code: ` -/** - * For example: - * - * \`\`\`ts - * function foo() { - * const abc = 123; - * } - * \`\`\` - */ - `, -}); - -invalid.push({ - name: "Using a multi-line comment with code blocks and a trailing line", - code: ` -/** - * For example: - * - * \`\`\`ts - * function foo() { - * const abc = 123; - * } - * \`\`\` - * (this is a trailing message) - */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** - * For example: - * - * \`\`\`ts - * function foo() { - * const abc = 123; - * } - * \`\`\` - * - * (this is a trailing message) - */ - `, -}); - -valid.push({ - name: "Using a multi-line comment with code blocks that contain blank lines", - code: ` -/** - * Returns an array of grouped comments. For example, the following code would return an array of - * three comment blocks: - * - * \`\`\`ts - * // This is the first block. - * - * // This is the second block. - * // We are still in the second block, because there has not been a newline separator yet. - * - * - * - * // This is the third block. - * \`\`\` - */ - `, -}); - -valid.push({ - name: "Using a single-line comment with a JSDoc tag with text", - code: ` -/** @param foo This is foo. */ - `, -}); - -valid.push({ - name: "Using a single-line comment with a short JSDoc tag without text", - code: ` -/** @foo */ - `, -}); - -invalid.push({ - name: "Using a single-line comment with a single duplicate asterisk", - code: ` -/** * Foo */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** Foo */ - `, -}); - -invalid.push({ - name: "Using a single-line comment with two duplicate asterisks", - code: ` -/** * * Foo */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** Foo */ - `, -}); - -invalid.push({ - name: "Using a multi-line comment with a single duplicate asterisk", - code: ` -/** - * * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - */ - `, -}); - -invalid.push({ - name: "Using a multi-line comment with two duplicate asterisks", - code: ` -/** - * * * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** - * But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - */ - `, -}); - -valid.push({ - name: "Using a comment with an enum header", - code: ` -/** - * ModCallback.PRE_NPC_COLLISION (30) - * EntityType.SUCKER (61) - * - * The algorithm for detecting a discharge is checking if the current charge is less than the charge - * on the previous frame. Thus, when a Bulb zaps a player and drains their charge, this will be a - * false position, so Bulbs have to be handled. - */ - `, -}); - -invalid.push({ - name: "Using a comment with no line before JSDoc tag", - code: ` -/** - * This is the description for \`foo\`. - * @param arg1 Whether to bar. - */ -function foo(arg1: boolean) {} - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** - * This is the description for \`foo\`. - * - * @param arg1 Whether to bar. - */ -function foo(arg1: boolean) {} - `, -}); - -valid.push({ - name: "Using a comment with only JSDoc param tags", - code: ` - /** - * @param nullItemID - * @param addCostume - * @param count Default is 1. - */ - `, -}); - -valid.push({ - name: "Comment with JSDoc example on one line", - code: ` -/** - * Inference helper for inputs. - * - * @example type HelloInput = RouterInputs['example']['hello']; - */ - `, -}); - -valid.push({ - name: "Comment with JSDoc example on multiple lines and header", - code: ` -/** - * Inference helper for inputs. - * - * @example - * type Foo = 123; - * type Bar = 456; - */ - `, -}); - -valid.push({ - name: "Comment with JSDoc example on multiple lines and no header", - code: ` -/** - * @example - * // Open the modem on the top of this computer. - * peripheral.call("top", "open", 1); - */ - `, -}); - -valid.push({ - name: "Comment with JSDoc example on multiple lines and another tag afterwards", - code: ` -/** - * Inference helper for inputs. - * - * @example - * type Foo = 123; - * type Bar = 456; - * - * @param Baz This is baz. - */ - `, -}); - -valid.push({ - name: "Comment with multiple JSDoc example tags", - code: ` -/** - * Determines if a peripheral is present with the given name. - * - * @example - * peripheral.isPresent("top"); - * @example - * peripheral.isPresent("monitor_0"); - * @param name The side or network name that you want to check. - * @returns If a peripheral is present with the given name. - */ -declare function isPresent(name: string): boolean; - `, -}); - -valid.push({ - name: "Comment with JSDoc markdown table", - code: ` -/** - * | API | Description | - * | ---------------------------------------------------- | ---------------------------------------------------------------------------- | - * | {@link getNames getNames()} | Provides a list of all peripherals available. | - * | {@link isPresent isPresent(name)} | Determines if a peripheral is present with the given name. | - * | {@link getType getType(peripheral)} | Get the types of a named or wrapped peripheral. | - * | {@link hasType hasType(peripheral, peripheral_type)} | Check if a peripheral is of a particular type. | - * | {@link getMethods getMethods(name)} | Get all available methods for the peripheral with the given name. | - * | {@link getName getName(peripheral)} | Get the name of a peripheral wrapped with \`peripheral.wrap\`. | - * | {@link call call(name, method, ...)} | Call a method on the peripheral with the given name. | - * | {@link wrap wrap(name)} | Get a table containing all functions available on a peripheral. | - * | {@link find find(ty [, filter])} | Find all peripherals of a specific type, and return the wrapped peripherals. | - */ - `, -}); - -invalid.push({ - name: "Comment with multiple JSDoc link tag that spills over on a new line", - code: ` -/** - * Asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd {@link colors}. - */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** - * Asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd - * {@link colors}. - */ - `, -}); - -valid.push({ - name: "Comment with example JSDoc and code block inside", - code: ` -function foo() { - function bar() { - /** - * Get detailed information about the items in the given slot. - * - * @since 1.64.0 - * @example - * // Print the current slot, assuming it contains 13 dirt. - * print(text_utils.serialize(turtle.getItemDetail())); - * // \`\`\`lua { - * // name = "minecraft:dirt", - * // count = 13, - * // \`\`\` - * @param slot The slot to get information about. Defaults to the {@link select selected slot}. - * @param detailed Whether to include "detailed" information. When \`true\` the method will - * contain much more information about the item at the cost of taking longer to - * run. - * @returns Information about the given slot, or \`undefined\` if it is empty. - * @throws If the slot is out of range. - * @see {@link InventoryPeripheral.getItemDetail} Describes the information returned by a - * detailed query. - */ - } -} - `, -}); - -invalid.push({ - name: "Comment with 1 leading asterisk", - code: ` -/** *foo */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** foo */ - `, -}); - -invalid.push({ - name: "Comment with 2 leading asterisks", - code: ` -/** **foo */ - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -/** foo */ - `, -}); - -ruleTester.run("format-jsdoc-comments", formatJSDocComments, { - valid, - invalid, -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/format-line-comments.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/format-line-comments.test.ts deleted file mode 100644 index 59b8aa797..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/format-line-comments.test.ts +++ /dev/null @@ -1,619 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { - MessageIds, - Options, -} from "../../src/rules/format-line-comments.js"; -import { formatLineComments } from "../../src/rules/format-line-comments.js"; -import { ruleTester } from "../utils.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -valid.push({ - name: "Using a single-line JSDoc comment that is too long", - code: ` -/** But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will */ - `, -}); - -valid.push({ - name: "Using a single-line comment with exactly 100 characters", - code: ` -// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - `, -}); - -invalid.push({ - name: "Using a single-line comment with exactly 101 characters", - code: ` -// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain felt - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain -// felt - `, -}); - -invalid.push({ - name: "Using a single-line comment with no preceding or trailing whitespace", - code: "// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will", - errors: [{ messageId: "incorrectlyFormatted" }], - output: `// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was -// born and I will`, -}); - -valid.push({ - name: "Using a multi-line comment with exactly 100 characters and potential spillover", - code: ` -// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was -// born and I will give you a complete account of the system - `, -}); - -invalid.push({ - name: "Using a multi-line comment that is too long", - code: ` -// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and -// I will give you a complete account of the system - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was -// born and I will give you a complete account of the system - `, -}); - -invalid.push({ - name: "Using a multi-line comment with with many long lines", - code: ` -// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will -// give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder -// of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how -// to pursue pleasure rationally encounter consequences that are extremely painful. - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was -// born and I will give you a complete account of the system, and expound the actual teachings of -// the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, -// or avoids pleasure itself, because it is pleasure, but because those who do not know how to -// pursue pleasure rationally encounter consequences that are extremely painful. - `, -}); - -valid.push({ - name: "Using a multi-line comment with with exactly 100 characters inside a function", - code: ` -function foo() { - // But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain a -} - `, -}); - -invalid.push({ - name: "Using a multi-line comment with with exactly 101 characters inside a function", - code: ` -function foo() { - // But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain as -} - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -function foo() { - // But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain - // as -} - `, -}); - -invalid.push({ - name: "Using a multi-line comment with that is too long inside a function", - code: ` -function foo() { - // But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was - // born and I will give you a complete account of the system -} - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -function foo() { - // But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain - // was born and I will give you a complete account of the system -} - `, -}); - -invalid.push({ - name: "Using a multi-line comment with many long lines inside a function", - code: ` -function foo() { - // But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will - // give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder - // of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how - // to pursue pleasure rationally encounter consequences that are extremely painful. -} - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -function foo() { - // But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain - // was born and I will give you a complete account of the system, and expound the actual teachings - // of the great explorer of the truth, the master-builder of human happiness. No one rejects, - // dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know - // how to pursue pleasure rationally encounter consequences that are extremely painful. -} - `, -}); - -// The extra newline in the expected output cannot be removed because this rule operates on -// individual comment blocks, and it has no notion of the whitespace in between comment blocks. -// Prettier will automatically remove extra trailing newlines between comments like this, so we do -// not have to make a rule to handle that in this plugin. -invalid.push({ - name: "Using a multi-line comment that has many code blocks and block separation", - code: ` -// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born - -// and I will give you a complete account of the system, and expound the actual teachings of the great -// explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure - - -// itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally -// encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or -// desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur - `, - errors: [ - { messageId: "incorrectlyFormatted" }, - { messageId: "incorrectlyFormatted" }, - { messageId: "incorrectlyFormatted" }, - ], - output: ` -// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was -// born - -// and I will give you a complete account of the system, and expound the actual teachings of the -// great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or -// avoids pleasure - - -// itself, because it is pleasure, but because those who do not know how to pursue pleasure -// rationally encounter consequences that are extremely painful. Nor again is there anyone who loves -// or pursues or desires to obtain pain of itself, because it is pain, but because occasionally -// circumstances occur - `, -}); - -invalid.push({ - name: "Using a multi-line comment that has many code blocks and block separation inside a function", - code: ` -function foo() { - // But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born - - // and I will give you a complete account of the system, and expound the actual teachings of the great - // explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure - - - // itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally - // encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or - // desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur -} - `, - errors: [ - { messageId: "incorrectlyFormatted" }, - { messageId: "incorrectlyFormatted" }, - { messageId: "incorrectlyFormatted" }, - ], - output: ` -function foo() { - // But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain - // was born - - // and I will give you a complete account of the system, and expound the actual teachings of the - // great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, - // or avoids pleasure - - - // itself, because it is pleasure, but because those who do not know how to pursue pleasure - // rationally encounter consequences that are extremely painful. Nor again is there anyone who - // loves or pursues or desires to obtain pain of itself, because it is pain, but because - // occasionally circumstances occur -} - `, -}); - -invalid.push({ - name: "Using a multi-line comment with bullet points with a newline before the bullets", - code: ` -// Here is my list of things: -// -// - But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and -// - I will give you a complete account of the system, and expound the actual teachings of the great explorer of the -// truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure -// - itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -// Here is my list of things: -// -// - But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain -// was born and -// - I will give you a complete account of the system, and expound the actual teachings of the great -// explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or -// avoids pleasure -// - itself, because it is pleasure, but because those who do not know how to pursue pleasure -// rationally encounter - `, -}); - -invalid.push({ - name: "Using a multi-line comment with bullet points with no newline before the bullets", - code: ` -// Here is my list of things: -// - But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and -// - I will give you a complete account of the system, and expound the actual teachings of the great explorer of the -// truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure -// - itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -// Here is my list of things: -// - But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain -// was born and -// - I will give you a complete account of the system, and expound the actual teachings of the great -// explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or -// avoids pleasure -// - itself, because it is pleasure, but because those who do not know how to pursue pleasure -// rationally encounter - `, -}); - -invalid.push({ - name: "Using a multi-line comment with sub-bullet points", - code: ` -// Here is my list of things: -// -// - But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and -// - I will give you a complete account of the system, and expound the actual teachings of the great explorer of the -// truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure -// - itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter -// - consequences that are extremely painful. - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -// Here is my list of things: -// -// - But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain -// was born and -// - I will give you a complete account of the system, and expound the actual teachings of the -// great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, -// or avoids pleasure -// - itself, because it is pleasure, but because those who do not know how to pursue pleasure -// rationally encounter -// - consequences that are extremely painful. - `, -}); - -invalid.push({ - name: "Using a multi-line comment with bullet points with newlines in-between", - code: ` -// Here is my list of things: -// -// - But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and -// -// - I will give you a complete account of the system, and expound the actual teachings of the great explorer of the -// truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure -// -// - itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter - `, - errors: [ - { messageId: "incorrectlyFormatted" }, - { messageId: "incorrectlyFormatted" }, - { messageId: "incorrectlyFormatted" }, - ], - output: ` -// Here is my list of things: -// -// - But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain -// was born and -// -// - I will give you a complete account of the system, and expound the actual teachings of the great -// explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or -// avoids pleasure -// -// - itself, because it is pleasure, but because those who do not know how to pursue pleasure -// rationally encounter - `, -}); - -valid.push({ - name: "Using a multi-line comment with different kinds of bullet points", - code: ` -function foo() { - // Reads data from a client object, according to the specified read pattern. Patterns follow the - // Lua file I/O format, and the difference in performance between all patterns is negligible. - // - // Pattern can be any of the following: - // - // - '*a': reads from the socket until the connection is closed. No end-of-line translation is - // performed. - // - '*l': reads a line of text from the socket. The line is terminated by a LF character (ASCII - // 10), optionally preceded by a CR character (ASCII 13). The CR and LF characters are not - // included in the returned line. In fact, all CR characters are ignored by the pattern. This is - // the default pattern. - // - number: causes the method to read a specified number of bytes from the socket. - // - // Prefix is an optional string to be concatenated to the beginning of any received data before - // return. - // - // If successful, the method returns the received pattern. In case of error, the method returns - // undefined followed by an error message which can be the string "closed" in case the connection - // was closed before the transmission was completed or the string "timeout" in case there was a - // timeout during the operation. Also, after the error message, the function returns the partial - // result of the transmission. -} - `, -}); - -valid.push({ - name: "Multi-line comment with bullet points with colons and e.g.", - code: ` -// Allow ending with a quote or backtick if this is an example of something indicated with a colon -// or an "e.g" or an "i.e.", like: -// - Use the following code: \`foo()\` -// - e.g. \`Foo.Bar()\` - `, -}); - -valid.push({ - name: "Using a multi-line comment that looks like a numbered bullet point", - code: ` -function foo() { - // This method will crash the game if you provide it an invalid collectible type, such as -1 or - // 43. (Using 0 will not cause a crash.) Thus, it is safer to use the \`RemoveCostume\` method - // instead. -} - `, -}); - -invalid.push({ - name: "Using a multi-line comment with very long bullet points", - code: ` -function foo() { - // This is my list: - // - // - But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I - // will give you a complete account of the system, and expound the actual teachings of the great explorer of the - // truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it - // is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences - // - that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, - // because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great - // pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some - // advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no - // annoying consequences, or one who avoids a pain that produces no resultant pleasure? -} - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -function foo() { - // This is my list: - // - // - But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain - // was born and I will give you a complete account of the system, and expound the actual - // teachings of the great explorer of the truth, the master-builder of human happiness. No one - // rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who - // do not know how to pursue pleasure rationally encounter consequences - // - that are extremely painful. Nor again is there anyone who loves or pursues or desires to - // obtain pain of itself, because it is pain, but because occasionally circumstances occur in - // which toil and pain can procure him some great pleasure. To take a trivial example, which of - // us ever undertakes laborious physical exercise, except to obtain some advantage from it? But - // who has any right to find fault with a man who chooses to enjoy a pleasure that has no - // annoying consequences, or one who avoids a pain that produces no resultant pleasure? -} - `, -}); - -valid.push({ - name: "Using a single-line comment with an unbreakable line", - code: ` -// AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - `, -}); - -invalid.push({ - name: "Using a single-line comment with an unbreakable line and other overflowing text", - code: ` -// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA I will give you a complete account of the system - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -// But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was -// born and -// AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -// I will give you a complete account of the system - `, -}); - -valid.push({ - name: "Using a multi-line comment with a URL", - code: ` -// Documentation: https://github.com/jrdrg/eslint-plugin-something -// Not defined in the parent configs. - `, -}); - -valid.push({ - name: "Using a multi-line comment with a URL and a blank line", - code: ` -// It is not possible to get single-line comments in the AST: -// https://stackoverflow.com/questions/47429792/is-it-possible-to-get-comments-as-nodes-in-the-ast-using-the-typescript-compiler -// -// Thus, we need to write the rule in such a way that it operates on the entire source code instead -// of individual AST nodes. - `, -}); - -valid.push({ - name: "Using a multi-line comment with a URL and an empty line", - code: ` -// It is not possible to get single-line comments in the AST: -// https://stackoverflow.com/questions/47429792/is-it-possible-to-get-comments-as-nodes-in-the-ast-using-the-typescript-compiler - -// Thus, we need to write the rule in such a way that it operates on the entire source code instead -// of individual AST nodes. - `, -}); - -valid.push({ - name: "Using an URL in the subsequent line", - code: ` -// Allow proper formatting of JSONC files: -// https://github.com/prettier/prettier/issues/5708 -// (this is an extra line) - `, -}); - -valid.push({ - name: "Using triple slash directives", - code: ` -/// -/// - `, -}); - -valid.push({ - name: "Using triple slash directives with a leading comment", - code: ` -// This is my directive. -/// - `, -}); - -valid.push({ - name: "Using triple slash directives with a trailing comment", - code: ` -/// -// This is my directive. - `, -}); - -valid.push({ - name: "Using triple slash directives with a mix of comments", - code: ` -// This is my directive. -/// -// This is my directive. -/// -// This is my directive. - `, -}); - -valid.push({ - name: "Using a block comment specified with hyphens", - code: ` -// ---------------- -// Getter functions -// ---------------- - `, -}); - -valid.push({ - name: "Using a callback trace list", - code: ` -// ModCallback.POST_PLAYER_RENDER (32) -// PlayerVariant.PLAYER (0) -// BabySubType.SUB_TYPE (1) - `, -}); - -valid.push({ - name: "Using a simple trailing number", - code: ` -// 1 -// Magdalene can increase her maximum heart containers with Birthright. - `, -}); - -valid.push({ - name: "Using a complicated trailing number", - code: ` -// 14, 33 -// Keeper and Tainted Keeper can increase their coin containers with Mother's Kiss and Greed's -// Gullet. - `, -}); - -valid.push({ - name: "Using a number at the end of the line", - code: ` -{ - { - // If the room contained Mom's Hands, then a screen shake will be queued. Override it with a 0 - // frame shake. - } -} - `, -}); - -valid.push({ - name: "Using two or more enum headers", - code: ` -// ModCallbackCustom.POST_GRID_ENTITY_UPDATE -// GridEntityType.PRESSURE_PLATE (20) -// GridEntityType.PRESSURE_PLATE - `, -}); - -invalid.push({ - name: "Double spaces between sentences", - code: ` -// This is the first sentence. This is the second sentence. - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -// This is the first sentence. This is the second sentence. - `, -}); - -invalid.push({ - name: "Double spaces between words", - code: ` -// This is the first sentence. - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -// This is the first sentence. - `, -}); - -invalid.push({ - name: "No space after double slash", - code: ` -//This is a sentence. - `, - errors: [{ messageId: "incorrectlyFormatted" }], - output: ` -// This is a sentence. - `, -}); - -valid.push({ - name: "Commented out array elements", - code: ` -const array = [ - "try", - // "typeof", - // "var", - // "void", - // "volatile", -]; - `, -}); - -ruleTester.run("format-line-comments", formatLineComments, { - valid, - invalid, -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/jsdoc-code-block-language.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/jsdoc-code-block-language.test.ts deleted file mode 100644 index ff070c6ba..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/jsdoc-code-block-language.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { jsdocCodeBlockLanguage } from "../../src/rules/jsdoc-code-block-language.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("jsdoc-code-block-language", jsdocCodeBlockLanguage, { - valid: [ - { - code: ` -/** - * Use \`foo\` like this: - * - * \`\`\`ts - * foo(); - * \`\`\` - */ - `, - }, - { - code: ` -/** - * The "socket.lua" module exists at: - * - * \`\`\`text - * C:\\Program Files (x86)\\ - * \`\`\` - * - * It is intended to be consumed by mods via: - * - * \`\`\`lua - * local socket = require("socket") - * \`\`\` - * - * In order to import socket, the "--luadebug" launch flag must be enabled. - * - * The documentation is located at: - * https://web.tecgraf.puc-rio.br/luasocket/old/luasocket-2.0-beta/tcp.html - */ - `, - }, - ], - - invalid: [ - { - code: ` -/** - * Use \`foo\` like this: - * - * \`\`\` - * foo(); - * \`\`\` - */ - `, - errors: [{ messageId: "noLanguage" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/newline-between-switch-case.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/newline-between-switch-case.test.ts deleted file mode 100644 index 4f9659b25..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/newline-between-switch-case.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { - MessageIds, - Options, -} from "../../src/rules/newline-between-switch-case.js"; -import { newlineBetweenSwitchCase } from "../../src/rules/newline-between-switch-case.js"; -import { ruleTester } from "../utils.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -valid.push({ - name: "is empty switch", - code: ` -switch (foo) {} - `, -}); - -valid.push({ - name: "is switch with one case", - code: ` -switch (foo) { - case 1: {} -} - `, -}); - -valid.push({ - name: "is switch with two cases", - code: ` -switch (foo) { - case 1: - case 2: {} -} - `, -}); - -valid.push({ - name: "is newline between case 3 and 4", - code: ` -switch (foo) { - case 1: - case 2: - case 3: { - doSomething(); - break; - } - - case 4: { - doSomething(); - break; - } -} - `, -}); - -invalid.push({ - name: "is not newline between case 3 and 4", - code: ` -switch (foo) { - case 1: - case 2: - case 3: { - doSomething(); - break; - } - case 4: { - doSomething(); - break; - } -} - `, - errors: [{ messageId: "noNewline" }], - output: ` -switch (foo) { - case 1: - case 2: - case 3: { - doSomething(); - break; - } - - case 4: { - doSomething(); - break; - } -} - `, -}); - -ruleTester.run("newline-between-switch-case", newlineBetweenSwitchCase, { - valid, - invalid, -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-confusing-set-methods.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-confusing-set-methods.test.ts deleted file mode 100644 index a4614aa5e..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-confusing-set-methods.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { noConfusingSetMethods } from "../../src/rules/no-confusing-set-methods.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-confusing-set-methods", noConfusingSetMethods, { - valid: [ - { - code: ` -declare const mySet: Set; -for (const key of mySet) {} - `, - }, - { - code: ` -declare const MY_SET: ReadonlySet; -for (const key of MY_SET) {} - `, - }, - ], - - invalid: [ - { - code: ` -declare const mySet: Set; -for (const key of mySet.keys()) {} - `, - errors: [{ messageId: "noKeys" }], - }, - { - code: ` -declare const mySet: Set; -for (const [key, value] of mySet.entries()) {} - `, - errors: [{ messageId: "noEntries" }], - }, - { - code: ` -declare const MY_SET: ReadonlySet; -for (const key of MY_SET.keys()) {} - `, - errors: [{ messageId: "noKeys" }], - }, - { - code: ` -declare const MY_SET: ReadonlySet; -for (const [key, value] of MY_SET.entries()) {} - `, - errors: [{ messageId: "noEntries" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-empty-jsdoc.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-empty-jsdoc.test.ts deleted file mode 100644 index b651c43b0..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-empty-jsdoc.test.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { noEmptyJSDoc } from "../../src/rules/no-empty-jsdoc.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-empty-jsdoc", noEmptyJSDoc, { - valid: [ - { - code: ` -/** A */ - `, - }, - { - code: ` -/** - * A - */ - `, - }, - ], - - invalid: [ - { - code: ` -/***/ - `, - errors: [{ messageId: "isEmpty" }], - output: ` - - `, - }, - { - code: ` -/** */ - `, - errors: [{ messageId: "isEmpty" }], - output: ` - - `, - }, - { - code: ` -/** */ - `, - errors: [{ messageId: "isEmpty" }], - output: ` - - `, - }, - { - code: ` -/** */ - `, - errors: [{ messageId: "isEmpty" }], - output: ` - - `, - }, - { - code: ` -/** - * - */ - `, - errors: [{ messageId: "isEmpty" }], - output: ` - - `, - }, - { - code: ` -/** - * - * - */ - `, - errors: [{ messageId: "isEmpty" }], - output: ` - - `, - }, - { - code: ` -/** - * - * - * - */ - `, - errors: [{ messageId: "isEmpty" }], - output: ` - - `, - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-empty-line-comments.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-empty-line-comments.test.ts deleted file mode 100644 index 3740bc4eb..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-empty-line-comments.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { noEmptyLineComments } from "../../src/rules/no-empty-line-comments.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-empty-line-comments", noEmptyLineComments, { - valid: [ - { - code: ` -// A - `, - }, - { - code: ` -const foo = 123; // A - `, - }, - ], - - invalid: [ - { - code: ` -// - `, - errors: [{ messageId: "isEmpty" }], - output: ` - - `, - }, - { - code: ` -// -// - `, - errors: [{ messageId: "isEmpty" }, { messageId: "isEmpty" }], - output: ` - - - `, - }, - { - code: ` -const foo = 123;// - `, - errors: [{ messageId: "isEmpty" }], - output: ` -const foo = 123; - `, - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-explicit-array-loops.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-explicit-array-loops.test.ts deleted file mode 100644 index 229071ca9..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-explicit-array-loops.test.ts +++ /dev/null @@ -1,158 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { - MessageIds, - Options, -} from "../../src/rules/no-explicit-array-loops.js"; -import { noExplicitArrayLoops } from "../../src/rules/no-explicit-array-loops.js"; -import { ruleTester } from "../utils.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -valid.push({ - name: "Implicit iteration over array", - code: ` -const myArray = [1, 2, 3]; -for (const element of myArray) {} - `, -}); - -valid.push({ - name: "Implicit iteration over read-only array", - code: ` -const MY_ARRAY = [1, 2, 3] as const; -for (const element of MY_ARRAY) {} - `, -}); - -valid.push({ - name: "Implicit iteration over map", - code: ` -const myMap = new Map(); -for (const [key, value] of myMap) {} - `, -}); - -valid.push({ - name: "Implicit iteration over read-only map", - code: ` -const MY_MAP: ReadonlyMap = new Map(); -for (const [key, value] of MY_MAP) {} - `, -}); - -valid.push({ - name: "Implicit iteration over set", - code: ` -const mySet = new Set(); -for (const value of mySet) {} - `, -}); - -valid.push({ - name: "Implicit iteration over read-only set", - code: ` -const MY_SET = new ReadonlySet(); -for (const value of MY_SET) {} - `, -}); - -valid.push({ - name: "Explicit iteration over map", - code: ` -const myMap = new Map(); -for (const element of myMap.entries()) {} - `, -}); - -valid.push({ - name: "Explicit iteration over read-only map", - code: ` -const MY_MAP: ReadonlyMap = new Map(); -for (const [key, value] of MY_MAP.entries()) {} - `, -}); - -valid.push({ - name: "Explicit iteration over set", - code: ` -const mySet = new Set(); -for (const value of mySet.values()) {} - `, -}); - -valid.push({ - name: "Explicit iteration over read-only set", - code: ` -const MY_SET: ReadonlySet = new Set(); -for (const value of MY_SET.values()) {} - `, -}); - -invalid.push({ - name: "Explicit iteration over array", - code: ` -const myArray = [1, 2, 3]; -for (const element of myArray.values()) {} - `, - errors: [{ messageId: "noExplicitArray" }], - output: ` -const myArray = [1, 2, 3]; -for (const element of myArray) {} - `, -}); - -invalid.push({ - name: "Explicit iteration over read-only array", - code: ` -const MY_ARRAY: readonly number[] = [1, 2, 3]; -for (const element of MY_ARRAY.values()) {} - `, - errors: [{ messageId: "noExplicitArray" }], - output: ` -const MY_ARRAY: readonly number[] = [1, 2, 3]; -for (const element of MY_ARRAY) {} - `, -}); - -invalid.push({ - name: "Explicit iteration over array as const", - code: ` -const MY_ARRAY = [1, 2, 3] as const; -for (const element of MY_ARRAY.values()) {} - `, - errors: [{ messageId: "noExplicitArray" }], - output: ` -const MY_ARRAY = [1, 2, 3] as const; -for (const element of MY_ARRAY) {} - `, -}); - -valid.push({ - name: "Iterating over a method with an argument", - code: ` -const data = "1a2a3"; -for (const line of data.split("a")) {} - `, -}); - -invalid.push({ - name: "Using Object.values", - code: ` -const myArray = [1, 2, 3]; -for (const element of Object.values(myArray)) {} - `, - errors: [{ messageId: "noExplicitArray" }], - output: ` -const myArray = [1, 2, 3]; -for (const element of myArray) {} - `, -}); - -ruleTester.run("no-explicit-array-loops", noExplicitArrayLoops, { - valid, - invalid, -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-explicit-map-set-loops.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-explicit-map-set-loops.test.ts deleted file mode 100644 index b7c3fe3e1..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-explicit-map-set-loops.test.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { noExplicitMapSetLoops } from "../../src/rules/no-explicit-map-set-loops.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-explicit-map-set-loops", noExplicitMapSetLoops, { - valid: [ - { - code: ` -const myArray = [1, 2, 3]; -for (const element of myArray) {} - `, - }, - { - code: ` -const MY_ARRAY = [1, 2, 3] as const; -for (const element of MY_ARRAY) {} - `, - }, - { - code: ` -const myMap = new Map(); -for (const [key, value] of myMap) {} - `, - }, - { - code: ` -const mySet = new Set(); -for (const value of mySet) {} - `, - }, - { - code: ` -const MY_MAP: ReadonlyMap = new Map(); -for (const [key, value] of myMap) {} - `, - }, - { - code: ` -const MY_SET: ReadonlySet = new Set(); -for (const value of mySet) {} - `, - }, - ], - - invalid: [ - { - code: ` -const myMap = new Map(); -for (const [key, value] of myMap.entries()) {} - `, - errors: [{ messageId: "noExplicitMap" }], - output: ` -const myMap = new Map(); -for (const [key, value] of myMap) {} - `, - }, - { - code: ` -const mySet = new Set(); -for (const value of mySet.values()) {} - `, - errors: [{ messageId: "noExplicitSet" }], - output: ` -const mySet = new Set(); -for (const value of mySet) {} - `, - }, - { - code: ` -const MY_MAP: ReadonlyMap = new Map(); -for (const [key, value] of MY_MAP.entries()) {} - `, - errors: [{ messageId: "noExplicitMap" }], - output: ` -const MY_MAP: ReadonlyMap = new Map(); -for (const [key, value] of MY_MAP) {} - `, - }, - { - code: ` -const MY_SET: ReadonlySet = new Set(); -for (const value of MY_SET.values()) {} - `, - errors: [{ messageId: "noExplicitSet" }], - output: ` -const MY_SET: ReadonlySet = new Set(); -for (const value of MY_SET) {} - `, - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-for-in.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-for-in.test.ts deleted file mode 100644 index eb6daf0d9..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-for-in.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { noForIn } from "../../src/rules/no-for-in.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-for-in", noForIn, { - valid: [ - { - code: ` -const array = [1, 2, 3]; -for (const element of array) {} - `, - }, - { - code: ` -const object = { foo: "bar" }; -for (const key of Object.keys(object)) {} - `, - }, - ], - - invalid: [ - { - code: ` -const array = [1, 2, 3]; -for (const element in array) {} - `, - errors: [{ messageId: "noForIn" }], - }, - { - code: ` -const object = { foo: "bar" }; -for (const key in object) {} - `, - errors: [{ messageId: "noForIn" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-let-any.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-let-any.test.ts deleted file mode 100644 index 9433d6c60..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-let-any.test.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { noLetAny } from "../../src/rules/no-let-any.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-let-any", noLetAny, { - valid: [ - { - code: ` -let foo: string[]; - `, - }, - { - code: ` -let foo: unknown; - `, - }, - { - code: ` -const myArray = [0, 1]; -let [, secondElement] = myArray; - `, - }, - ], - - invalid: [ - { - code: ` -let foo; - `, - errors: [{ messageId: "noType" }], - }, - { - code: ` -let foo: any; - `, - errors: [{ messageId: "noType" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-mutable-return.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-mutable-return.test.ts deleted file mode 100644 index a52d94108..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-mutable-return.test.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { noMutableReturn } from "../../src/rules/no-mutable-return.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-mutable-array-return", noMutableReturn, { - valid: [ - { - code: ` -function getArray(): readonly number[] { - return []; -} - `, - }, - { - code: ` -function getArray(): readonly number[] | readonly string[] { - return []; -} - `, - }, - { - code: ` -function getArray(): ReadonlyArray { - return []; -} - `, - }, - { - code: ` -function getMap(): ReadonlyMap { - return new Map(); -} - `, - }, - { - code: ` -function getSet(): ReadonlySet { - return new Set(); -} - `, - }, - ], - - invalid: [ - { - code: ` -function getArray(): number[] { - return []; -} - `, - errors: [{ messageId: "mutableArray" }], - }, - { - code: ` -function getArray(): string[] { - return []; -} - `, - errors: [{ messageId: "mutableArray" }], - }, - { - code: ` -function getArray(): boolean[] { - return []; -} - `, - errors: [{ messageId: "mutableArray" }], - }, - { - code: ` -function getArray(): readonly number[] | string[] { - return []; -} - `, - errors: [{ messageId: "mutableArray" }], - }, - { - code: ` -function getArray(): number[] | readonly string[] { - return []; -} - `, - errors: [{ messageId: "mutableArray" }], - }, - { - code: ` -function getArray(): Array { - return []; -} - `, - errors: [{ messageId: "mutableArray" }], - }, - { - code: ` -function getMap(): Map { - return new Map(); -} - `, - errors: [{ messageId: "mutableMap" }], - }, - { - code: ` -function getSet(): Set { - return new Set(); -} - `, - errors: [{ messageId: "mutableSet" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-number-enums.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-number-enums.test.ts deleted file mode 100644 index bd03564c5..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-number-enums.test.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { noNumberEnums } from "../../src/rules/no-number-enums.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-number-enums", noNumberEnums, { - valid: [ - { - code: ` -enum Foo { - Value1 = "Value1", -} - `, - }, - ], - - invalid: [ - { - code: ` -enum Foo { - Value1 = 1, -} - `, - errors: [{ messageId: "noNumberEnums" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-object-any.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-object-any.test.ts deleted file mode 100644 index 050ee4719..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-object-any.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { noObjectAny } from "../../src/rules/no-object-any.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-object-any", noObjectAny, { - valid: [ - { - code: ` -const myMap = new Map(); - `, - }, - { - code: ` -const myMap: Map = new Map(); - `, - }, - { - code: ` -const myMap: ReadonlyMap = new Map(); - `, - }, - { - code: ` -const mySet = new Set(); - `, - }, - { - code: ` -const mySet: Set = new Set(); - `, - }, - { - code: ` -const mySet: ReadonlySet = new Set(); - `, - }, - { - code: ` -const myArray: string[] = []; - `, - }, - { - code: ` -const myArray = [0, 1]; -let [, secondElement] = myArray; - `, - }, - ], - - invalid: [ - { - code: ` -const myMap = new Map(); - `, - errors: [{ messageId: "noType" }, { messageId: "noType" }], - }, - { - code: ` -const myArray = []; - `, - errors: [{ messageId: "noType" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-object-methods-with-map-set.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-object-methods-with-map-set.test.ts deleted file mode 100644 index 6335b3876..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-object-methods-with-map-set.test.ts +++ /dev/null @@ -1,190 +0,0 @@ -import { noObjectMethodsWithMapSet } from "../../src/rules/no-object-methods-with-map-set.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-object-methods-with-map-set", noObjectMethodsWithMapSet, { - valid: [ - { - code: ` -declare const myMap: Map; -for (const [key, value] of myMap.entries()) { -} - `, - }, - { - code: ` -declare const myMap: Map; -for (const key of myMap.keys()) { -} - `, - }, - { - code: ` -declare const myMap: Map; -for (const value of myMap.values()) { -} - `, - }, - { - code: ` -declare const mySet: Set; -for (const entry of mySet.entries()) { -} - `, - }, - { - code: ` -declare const mySet: Set; -for (const key of mySet.keys()) { -} - `, - }, - { - code: ` -declare const mySet: Set; -for (const value of mySet.values()) { -} - `, - }, - { - code: ` -declare const MY_MAP: ReadonlyMap; -for (const [key, value] of MY_MAP.entries()) { -} - `, - }, - { - code: ` -declare const MY_MAP: ReadonlyMap; -for (const key of MY_MAP.keys()) { -} - `, - }, - { - code: ` -declare const MY_MAP: ReadonlyMap; -for (const value of MY_MAP.values()) { -} - `, - }, - { - code: ` -declare const MY_SET: ReadonlySet; -for (const entry of MY_SET.entries()) { -} - `, - }, - { - code: ` -declare const MY_SET: ReadonlySet; -for (const key of MY_SET.keys()) { -} - `, - }, - { - code: ` -declare const MY_SET: ReadonlySet; -for (const value of MY_SET.values()) { -} - `, - }, - ], - - invalid: [ - { - code: ` -declare const myMap: Map; -for (const [key, value] of Object.entries(myMap)) { -} - `, - errors: [{ messageId: "noObjectEntriesMap" }], - }, - { - code: ` -declare const myMap: Map; -for (const key of Object.keys(myMap)) { -} - `, - errors: [{ messageId: "noObjectKeysMap" }], - }, - { - code: ` -declare const myMap: Map; -for (const value of Object.values(myMap)) { -} - `, - errors: [{ messageId: "noObjectValuesMap" }], - }, - { - code: ` -declare const mySet: Set; -for (const entry of Object.entries(mySet)) { -} - `, - errors: [{ messageId: "noObjectEntriesSet" }], - }, - { - code: ` -declare const mySet: Set; -for (const key of Object.keys(mySet)) { -} - `, - errors: [{ messageId: "noObjectKeysSet" }], - }, - { - code: ` -declare const mySet: Set; -for (const value of Object.values(mySet)) { -} - `, - errors: [{ messageId: "noObjectValuesSet" }], - }, - { - code: ` -declare const MY_MAP: ReadonlyMap; -for (const [key, value] of Object.entries(MY_MAP)) { -} - `, - errors: [{ messageId: "noObjectEntriesMap" }], - }, - { - code: ` -declare const MY_MAP: ReadonlyMap; -for (const key of Object.keys(MY_MAP)) { -} - `, - errors: [{ messageId: "noObjectKeysMap" }], - }, - { - code: ` -declare const MY_MAP: ReadonlyMap; -for (const value of Object.values(MY_MAP)) { -} - `, - errors: [{ messageId: "noObjectValuesMap" }], - }, - { - code: ` -declare const MY_SET: ReadonlySet; -for (const entry of Object.entries(MY_SET)) { -} - `, - errors: [{ messageId: "noObjectEntriesSet" }], - }, - { - code: ` -declare const MY_SET: ReadonlySet; -for (const key of Object.keys(MY_SET)) { -} - `, - errors: [{ messageId: "noObjectKeysSet" }], - }, - { - code: ` -declare const MY_SET: ReadonlySet; -for (const value of Object.values(MY_SET)) { -} - `, - errors: [{ messageId: "noObjectValuesSet" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-string-length-0.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-string-length-0.test.ts deleted file mode 100644 index 1666ed09a..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-string-length-0.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { noStringLength0 } from "../../src/rules/no-string-length-0.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-string-length-0", noStringLength0, { - valid: [ - { - code: ` -declare const foo: string; -if (foo === "") { -} - `, - }, - { - code: ` -declare const foo: string[]; -if (foo.length === 0) { -} - `, - }, - { - code: ` -declare const foo: number[]; -if (foo.length === 0) { -} - `, - }, - { - code: ` -declare const foo: string | string[]; -if (foo.length === 0) { -} - `, - }, - ], - - invalid: [ - { - code: ` -declare const foo: string; -if (foo.length === 0) { -} - `, - errors: [{ messageId: "noStringLength0" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-template-curly-in-string-fix.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-template-curly-in-string-fix.test.ts deleted file mode 100644 index 60dadd1c1..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-template-curly-in-string-fix.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { noTemplateCurlyInStringFix } from "../../src/rules/no-template-curly-in-string-fix.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-template-curly-in-string-fix", noTemplateCurlyInStringFix, { - valid: [ - { - code: ` -const fooString = \`foo: \${foo}\`; - `, - }, - ], - - invalid: [ - { - code: ` -const fooString = "foo: \${foo}"; - `, - errors: [{ messageId: "unexpectedTemplateExpression" }], - output: ` -const fooString = \`foo: \${foo}\`; - `, - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-undefined-return-type.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-undefined-return-type.test.ts deleted file mode 100644 index 56fee5a0e..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-undefined-return-type.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { noUndefinedReturnType } from "../../src/rules/no-undefined-return-type.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-undefined-return-type", noUndefinedReturnType, { - valid: [ - { - code: ` -function foo(): void { - return; -} - `, - }, - { - code: ` -function foo() { - return; -} - `, - }, - ], - - invalid: [ - { - code: ` -function foo(): undefined { - return; -} - `, - errors: [{ messageId: "undefinedReturnType" }], - }, - { - code: ` -function foo() { - return undefined; -} - `, - errors: [{ messageId: "undefinedReturnType" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-unnecessary-assignment.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-unnecessary-assignment.test.ts deleted file mode 100644 index 63d8aca05..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-unnecessary-assignment.test.ts +++ /dev/null @@ -1,694 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { - MessageIds, - Options, -} from "../../src/rules/no-unnecessary-assignment.js"; -import { noUnnecessaryAssignment } from "../../src/rules/no-unnecessary-assignment.js"; -import { ruleTester } from "../utils.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -valid.push({ - name: "normal boolean assignment expression with literal", - code: ` -declare let foo: boolean; -foo = true; - `, -}); - -invalid.push({ - name: "useless boolean assignment expression with literal", - code: ` -declare let foo: true; -foo = true; - `, - errors: [{ messageId: "unnecessary" }], -}); - -valid.push({ - name: "normal boolean assignment expression with variable", - code: ` -declare let foo: boolean; -declare let bar: boolean; -foo = bar; - `, -}); - -invalid.push({ - name: "useless boolean assignment expression with variable", - code: ` -declare let foo: true; -declare let bar: true; -foo = bar; - `, - errors: [{ messageId: "unnecessary" }], -}); - -valid.push({ - name: "normal number assignment expression with literal", - code: ` -declare let foo: number; -foo = 123; - `, -}); - -invalid.push({ - name: "invalid number assignment expression with literal", - code: ` -declare let foo: 123; -foo = 123; - `, - errors: [{ messageId: "unnecessary" }], -}); - -valid.push({ - name: "normal number assignment expression with variable", - code: ` -declare let foo: number; -declare let bar: 123; -foo = bar; - `, -}); - -invalid.push({ - name: "invalid number assignment expression with variable", - code: ` -declare let foo: 123; -declare let bar: 123; -foo = bar; - `, - errors: [{ messageId: "unnecessary" }], -}); - -valid.push({ - name: "normal string assignment expression with literal", - code: ` -declare let foo: string; -foo = "foo"; - `, -}); - -invalid.push({ - name: "invalid string assignment expression with literal", - code: ` -declare let foo: "foo"; -foo = "foo"; - `, - errors: [{ messageId: "unnecessary" }], -}); - -valid.push({ - name: "normal string assignment expression with variable", - code: ` -declare let foo: string; -declare let bar: "foo"; -foo = bar; - `, -}); - -invalid.push({ - name: "invalid string assignment expression with variable", - code: ` -declare let foo: "foo"; -declare let bar: "foo"; -foo = bar; - `, - errors: [{ messageId: "unnecessary" }], -}); - -valid.push({ - name: "normal assignment with string enum member literal", - code: ` -enum Foo { - Value1 = "Value1", - Value2 = "Value2", -} -declare let foo: Foo.Value1; -foo = Foo.Value2; - `, -}); - -invalid.push({ - name: "invalid assignment with string enum member literal", - code: ` -enum Foo { - Value1 = "Value1", - Value2 = "Value2", -} -declare let foo: Foo.Value1; -foo = Foo.Value1; - `, - errors: [{ messageId: "unnecessary" }], -}); - -valid.push({ - name: "normal assignment with string enum member variable", - code: ` -enum Foo { - Value1 = "Value1", - Value2 = "Value2", -} -declare let foo: Foo.Value1; -declare let bar: Foo.Value2; -foo = bar; - `, -}); - -invalid.push({ - name: "invalid assignment with string enum member variable", - code: ` -enum Foo { - Value1 = "Value1", - Value2 = "Value2", -} -declare let foo: Foo.Value1; -declare let bar: Foo.Value1; -foo = bar; - `, - errors: [{ messageId: "unnecessary" }], -}); - -valid.push({ - name: "normal assignment with number enum member literal", - code: ` -enum Foo { - Value1, - Value2, -} -declare let foo: Foo.Value1; -foo = Foo.Value2; - `, -}); - -invalid.push({ - name: "invalid assignment with number enum member literal", - code: ` -enum Foo { - Value1, - Value2, -} -declare let foo: Foo.Value1; -foo = Foo.Value1; - `, - errors: [{ messageId: "unnecessary" }], -}); - -valid.push({ - name: "normal assignment with number enum member variable", - code: ` -enum Foo { - Value1, - Value2, -} -declare let foo: Foo.Value1; -declare let bar: Foo.Value2; -foo = bar; - `, -}); - -invalid.push({ - name: "invalid assignment with number enum member variable", - code: ` -enum Foo { - Value1, - Value2, -} -declare let foo: Foo.Value1; -declare let bar: Foo.Value1; -foo = bar; - `, - errors: [{ messageId: "unnecessary" }], -}); - -valid.push({ - name: "normal assignment with string enum variable", - code: ` -enum Foo { - Value1 = "Value1", - Value2 = "Value2", -} -declare let foo: Foo; -declare let bar: Foo; -foo = bar; - `, -}); - -valid.push({ - name: "normal assignment with number enum variable", - code: ` -enum Foo { - Value1, - Value2, -} -declare let foo: Foo; -declare let bar: Foo; -foo = bar; - `, -}); - -valid.push({ - name: "assignment with generic type", - code: ` -declare let foo: Set; -declare let bar: Set; -foo = bar; - `, -}); - -valid.push({ - name: "adding 1 with equal and literal", - code: ` -declare let foo: number; -foo = foo + 1; - `, -}); - -invalid.push({ - name: "adding 0 with equal and literal", - code: ` -declare let foo: number; -foo = foo + 0; - `, - errors: [{ messageId: "unnecessaryZero" }], -}); - -valid.push({ - name: "adding 1 with = and variable", - code: ` -declare let foo: number; -declare let bar: 1; -foo = foo + bar; - `, -}); - -valid.push({ - name: "adding 0 with equal and variable", - code: ` -declare let foo: number; -declare let bar: 0; -foo = foo + bar; - `, -}); - -valid.push({ - name: "adding 1 with plus-equal and literal", - code: ` -declare let foo: number; -foo += 1; - `, -}); - -invalid.push({ - name: "adding 0 with plus-equal and literal", - code: ` -declare let foo: number; -foo += 0; - `, - errors: [{ messageId: "unnecessaryZero" }], -}); - -valid.push({ - name: "adding 1 with plus-equal and variable", - code: ` -declare let foo: number; -declare let bar: 1; -foo += bar; - `, -}); - -valid.push({ - name: "adding 0 with plus-equal and variable", - code: ` -declare let foo: number; -declare let bar: 0; -foo += bar; - `, -}); - -valid.push({ - name: "adding a with equal and literal", - code: ` -declare let foo: string; -foo = foo + "a"; - `, -}); - -invalid.push({ - name: "adding empty string with equal and literal", - code: ` -declare let foo: string; -foo = foo + ""; - `, - errors: [{ messageId: "unnecessaryEmptyString" }], -}); - -valid.push({ - name: "adding a with equal and variable", - code: ` -declare let foo: string; -declare let bar: "a" -foo = foo + bar; - `, -}); - -valid.push({ - name: "adding empty string with equal and variable", - code: ` -declare let foo: string; -declare let bar: "" -foo = foo + bar; - `, -}); - -valid.push({ - name: "adding a with plus-equal and literal", - code: ` -declare let foo: string; -foo += "a"; - `, -}); - -invalid.push({ - name: "adding empty string with plus-equal and literal", - code: ` -declare let foo: string; -foo += ""; - `, - errors: [{ messageId: "unnecessaryEmptyString" }], -}); - -valid.push({ - name: "adding a with plus-equal and variable", - code: ` -declare let foo: string; -declare let bar: "a"; -foo += bar; - `, -}); - -valid.push({ - name: "adding empty string with plus-equal and variable", - code: ` -declare let foo: string; -declare let bar: ""; -foo += bar; - `, -}); - -valid.push({ - name: "normal boolean short-circuit with pipe-pipe and literal", - code: ` -declare const foo: boolean; -const bar = foo || true; - `, -}); - -invalid.push({ - name: "invalid boolean short-circuit with pipe-pipe and literal", - code: ` -declare const foo: boolean; -const bar = foo || false; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -valid.push({ - name: "normal boolean short-circuit with pipe-pipe and variable", - code: ` -declare const foo: boolean; -declare const bar: true; -const baz = foo || bar; - `, -}); - -invalid.push({ - name: "invalid boolean short-circuit with pipe-pipe and variable", - code: ` -declare const foo: boolean; -declare const bar: false; -const baz = foo || bar; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -valid.push({ - name: "normal boolean short-circuit with ampersand-ampersand and literal", - code: ` -declare const foo: boolean; -const bar = foo && false; - `, -}); - -invalid.push({ - name: "invalid boolean short-circuit with ampersand-ampersand and literal", - code: ` -declare const foo: boolean; -const bar = foo && true; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -valid.push({ - name: "normal boolean short-circuit with ampersand-ampersand and variable", - code: ` -declare const foo: boolean; -declare const bar: false; -const baz = foo && bar; - `, -}); - -invalid.push({ - name: "invalid boolean short-circuit with ampersand-ampersand and variable", - code: ` -declare const foo: boolean; -declare const bar: true; -const baz = foo && bar; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -valid.push({ - name: "normal number short-circuit with pipe-pipe and literal", - code: ` -declare const foo: number; -const bar = foo || 1; - `, -}); - -invalid.push({ - name: "invalid number short-circuit with pipe-pipe and literal", - code: ` -declare const foo: number; -const bar = foo || 0; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -valid.push({ - name: "normal number short-circuit with pipe-pipe and variable", - code: ` -declare const foo: number; -declare const bar: 1; -const baz = foo || bar; - `, -}); - -invalid.push({ - name: "invalid number short-circuit with pipe-pipe and variable", - code: ` -declare const foo: number; -declare const bar: 0; -const baz = foo || bar; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -valid.push({ - name: "normal string short-circuit with pipe-pipe and literal", - code: ` -declare const foo: string; -const bar = foo || "a"; - `, -}); - -invalid.push({ - name: "invalid string short-circuit with pipe-pipe and literal", - code: ` -declare const foo: string; -const bar = foo || ""; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -valid.push({ - name: "normal string short-circuit with pipe-pipe and variable", - code: ` -declare const foo: string; -declare const bar: "a"; -const baz = foo || bar; - `, -}); - -invalid.push({ - name: "invalid string short-circuit with pipe-pipe and variable", - code: ` -declare const foo: string; -declare const bar: ""; -const baz = foo || bar; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -valid.push({ - name: "normal boolean union short-circuit with pipe-pipe and literal true", - code: ` -declare const foo: boolean | null; -const bar = foo || true; - `, -}); - -valid.push({ - name: "normal boolean union short-circuit with pipe-pipe and literal false", - code: ` -declare const foo: boolean | null; -const bar = foo || false; - `, -}); - -valid.push({ - name: "normal short-circuit with question-mark-question-mark and literal null", - code: ` -declare const foo: string | null | undefined; -const bar = foo ?? null; - `, -}); - -invalid.push({ - name: "invalid short-circuit with question-mark-question-mark and literal null (1)", - code: ` -declare const foo: null; -const bar = foo ?? null; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -invalid.push({ - name: "invalid short-circuit with question-mark-question-mark and literal null (2)", - code: ` -declare const foo: string | null; -const bar = foo ?? null; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -valid.push({ - name: "normal short-circuit with question-mark-question-mark and variable null", - code: ` -declare const foo: string | null | undefined; -declare const bar: null; -const baz = foo ?? bar; - `, -}); - -invalid.push({ - name: "invalid short-circuit with question-mark-question-mark and variable null (1)", - code: ` -declare const foo: null; -declare const bar: null; -const baz = foo ?? bar; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -invalid.push({ - name: "invalid short-circuit with question-mark-question-mark and variable null (2)", - code: ` -declare const foo: string | null; -declare const bar: null; -const baz = foo ?? bar; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -valid.push({ - name: "normal short-circuit with question-mark-question-mark and literal undefined", - code: ` -declare const foo: string | null | undefined; -const bar = foo ?? undefined; - `, -}); - -invalid.push({ - name: "invalid short-circuit with question-mark-question-mark and literal undefined (1)", - code: ` -declare const foo: string | undefined; -const bar = foo ?? undefined; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -invalid.push({ - name: "invalid short-circuit with question-mark-question-mark and literal undefined (2)", - code: ` -declare const foo: undefined; -const bar = foo ?? undefined; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -valid.push({ - name: "normal short-circuit with question-mark-question-mark and variable undefined", - code: ` -declare const foo: string | null | undefined; -declare const bar: undefined; -const baz = foo ?? bar; - `, -}); - -invalid.push({ - name: "invalid short-circuit with question-mark-question-mark and variable undefined (1)", - code: ` -declare const foo: string | undefined; -declare const bar: undefined; -const baz = foo ?? bar; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -invalid.push({ - name: "invalid short-circuit with question-mark-question-mark and variable undefined (2)", - code: ` -declare const foo: undefined; -declare const bar: undefined; -const baz = foo ?? bar; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -valid.push({ - name: "normal logical expression assignment with existing variable", - code: ` -declare const foo: boolean; -declare let bar: boolean; -bar = foo || true; - `, -}); - -invalid.push({ - name: "invalid logical expression assignment with existing variable", - code: ` -declare const foo: boolean; -declare let bar: boolean; -bar = foo || false; - `, - errors: [{ messageId: "unnecessaryShortCircuit" }], -}); - -ruleTester.run("no-unnecessary-assignment", noUnnecessaryAssignment, { - valid, - invalid, -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-unsafe-plusplus.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-unsafe-plusplus.test.ts deleted file mode 100644 index a31f605f0..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-unsafe-plusplus.test.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { noUnsafePlusplus } from "../../src/rules/no-unsafe-plusplus.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-unsafe-plusplus", noUnsafePlusplus, { - valid: [ - { - code: ` -foo++; -foo--; - `, - }, - { - code: ` -void foo++; -void foo--; - `, - }, - { - code: ` -foo++, foo++, 0; -foo--, foo--, 0; - `, - }, - { - code: ` -for (; ; foo++) {} -for (; ; foo--) {} - `, - }, - ], - - invalid: [ - { - code: ` -foo++, foo++, foo++; -foo--, foo--, foo--; - `, - errors: [{ messageId: "plusPlus" }, { messageId: "minusMinus" }], - }, - { - code: ` -for (foo++; ; ) {} -for (foo--; ; ) {} - `, - errors: [{ messageId: "plusPlus" }, { messageId: "minusMinus" }], - }, - { - code: ` -for (; foo++; ) {} -for (; foo--; ) {} - `, - errors: [{ messageId: "plusPlus" }, { messageId: "minusMinus" }], - }, - { - code: ` -foo++ + foo++; -foo-- - foo--; - `, - errors: [ - { messageId: "plusPlus" }, - { messageId: "plusPlus" }, - { messageId: "minusMinus" }, - { messageId: "minusMinus" }, - ], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-useless-return.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-useless-return.test.ts deleted file mode 100644 index cdcd71678..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-useless-return.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { noUselessReturn } from "../../src/rules/no-useless-return.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-useless-return", noUselessReturn, { - valid: [ - { - code: ` -function foo() { -} - `, - }, - ], - - invalid: [ - { - code: ` -function foo() { - return; -} - `, - errors: [{ messageId: "unnecessaryReturn" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/no-void-return-type.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/no-void-return-type.test.ts deleted file mode 100644 index cd78c6f06..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/no-void-return-type.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { noVoidReturnType } from "../../src/rules/no-void-return-type.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("no-void-return-type", noVoidReturnType, { - valid: [ - { - code: ` -function foo() {} - `, - }, - ], - - invalid: [ - { - code: ` -function foo(): void {} - `, - errors: [{ messageId: "voidReturnType" }], - output: ` -function foo() {} - `, - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/prefer-const.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/prefer-const.test.ts deleted file mode 100644 index 50d26cfc3..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/prefer-const.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { preferConst } from "../../src/rules/prefer-const.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("prefer-const", preferConst, { - valid: [ - { - code: ` -const a = 1; - `, - }, - ], - - invalid: [ - { - code: ` -let a = 1; - `, - errors: [{ messageId: "useConst" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/prefer-plusplus.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/prefer-plusplus.test.ts deleted file mode 100644 index 2943a7ec4..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/prefer-plusplus.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { MessageIds, Options } from "../../src/rules/prefer-plusplus.js"; -import { preferPlusplus } from "../../src/rules/prefer-plusplus.js"; -import { ruleTester } from "../utils.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -valid.push({ - name: "Normal plus plus", - code: ` -i++; - `, -}); - -valid.push({ - name: "Normal minus minus", - code: ` -i--; - `, -}); - -valid.push({ - name: "Normal plus equals 2", - code: ` -i += 2; - `, -}); - -valid.push({ - name: "Normal minus equals 2", - code: ` -i -= 2; - `, -}); - -invalid.push({ - name: "Normal plus equals 1", - code: ` -i += 1; - `, - errors: [{ messageId: "plusPlus" }], - output: ` -i++; - `, -}); - -invalid.push({ - name: "Normal minus equals 1", - code: ` -i -= 1; - `, - errors: [{ messageId: "minusMinus" }], - output: ` -i--; - `, -}); - -ruleTester.run("prefer-plusplus", preferPlusplus, { - valid, - invalid, -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/prefer-postfix-plusplus.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/prefer-postfix-plusplus.test.ts deleted file mode 100644 index f6123e8d7..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/prefer-postfix-plusplus.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { preferPostfixPlusplus } from "../../src/rules/prefer-postfix-plusplus.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("prefer-postfix-plusplus", preferPostfixPlusplus, { - valid: [ - { - code: ` -foo++; - `, - }, - { - code: ` -foo--; - `, - }, - ], - - invalid: [ - { - code: ` -++foo; - `, - errors: [{ messageId: "plusPlus" }], - }, - { - code: ` ---foo; - `, - errors: [{ messageId: "minusMinus" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/prefer-readonly-parameter-types.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/prefer-readonly-parameter-types.test.ts deleted file mode 100644 index 8c552193b..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/prefer-readonly-parameter-types.test.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { preferReadonlyParameterTypes } from "../../src/rules/prefer-readonly-parameter-types.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run( - "prefer-readonly-parameter-types", - preferReadonlyParameterTypes, - { - valid: [ - { - code: ` -function foo(array: readonly string[]) {} - `, - }, - { - code: ` -function foo(map: ReadonlyMap) {} - `, - }, - { - code: ` -function foo(set: ReadonlySet) {} - `, - }, - { - code: ` -function foo(record: Readonly>) {} - `, - }, - { - code: ` -interface Foo { - arg1: boolean; -} -function foo(arg: Foo | string[]) {} - `, - }, - ], - - invalid: [ - { - code: ` -function foo(array: string[]) {} - `, - errors: [{ messageId: "shouldBeReadonly" }], - }, - { - code: ` -function foo(map: Map) {} - `, - errors: [{ messageId: "shouldBeReadonly" }], - }, - { - code: ` -function foo(map: Set) {} - `, - errors: [{ messageId: "shouldBeReadonly" }], - }, - { - code: ` -function foo(record: Record) {} - `, - errors: [{ messageId: "shouldBeReadonly" }], - }, - ], - }, -); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/require-break.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/require-break.test.ts deleted file mode 100644 index 371fe2c03..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/require-break.test.ts +++ /dev/null @@ -1,85 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { MessageIds, Options } from "../../src/rules/require-break.js"; -import { requireBreak } from "../../src/rules/require-break.js"; -import { ruleTester } from "../utils.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -valid.push({ - name: "two cases with break", - code: ` -switch (foo) { - case 0: { - break; - } - - case 1: { - break; - } -} - `, -}); - -valid.push({ - name: "three cases with break", - code: ` -switch (foo) { - case 0: { - break; - } - - case 1: { - break; - } - - default: { - break; - } -} - `, -}); - -invalid.push({ - name: "second case missing break", - code: ` -switch (foo) { - case 0: { - break; - } - - case 1: { - doSomething(); - } -} - `, - errors: [{ messageId: "noBreak" }], -}); - -invalid.push({ - name: "third case missing break", - code: ` -switch (foo) { - case 0: { - break; - } - - case 1: { - break; - } - - default: { - doSomething(); - } -} - `, - errors: [{ messageId: "noBreak" }], -}); - -ruleTester.run("require-break", requireBreak, { - valid, - invalid, -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/require-capital-const-assertions.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/require-capital-const-assertions.test.ts deleted file mode 100644 index be1e4e036..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/require-capital-const-assertions.test.ts +++ /dev/null @@ -1,187 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { - MessageIds, - Options, -} from "../../src/rules/require-capital-const-assertions.js"; -import { requireCapitalConstAssertions } from "../../src/rules/require-capital-const-assertions.js"; -import { ruleTester } from "../utils.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -valid.push({ - name: "Object acting as a number enum with const assertion", - code: ` -const Foo = { - Value1: 1, - Value2: 2, - Value3: 3, -} as const; - `, -}); - -invalid.push({ - name: "Object acting as a number enum without const assertion", - code: ` -const Foo = { - Value1: 1, - Value2: 2, - Value3: 3, -}; - `, - errors: [{ messageId: "noConstAssertion" }], - output: ` -const Foo = { - Value1: 1, - Value2: 2, - Value3: 3, -} as const; - `, -}); - -valid.push({ - name: "Object acting as a static map with const assertion", - code: ` -const FOO = { - [MyEnum.Value1]: "something1", - [MyEnum.Value2]: "something2", - [MyEnum.Value3]: "something3", -} as const; - `, -}); - -valid.push({ - name: "Object acting as a static map with const assertion and satisfies", - code: ` -const FOO = { - [MyEnum.Value1]: "something1", - [MyEnum.Value2]: "something2", - [MyEnum.Value3]: "something3", -} as const satisfies Record; - `, -}); - -invalid.push({ - name: "Object acting as a static map without const assertion", - code: ` -const FOO = { - [MyEnum.Value1]: "something1", - [MyEnum.Value2]: "something2", - [MyEnum.Value3]: "something3", -}; - `, - errors: [{ messageId: "noConstAssertion" }], - output: ` -const FOO = { - [MyEnum.Value1]: "something1", - [MyEnum.Value2]: "something2", - [MyEnum.Value3]: "something3", -} as const; - `, -}); - -invalid.push({ - name: "Object acting as a static map without const assertion and satisfies", - code: ` -const FOO = { - [MyEnum.Value1]: "something1", - [MyEnum.Value2]: "something2", - [MyEnum.Value3]: "something3", -} satisfies Record; - `, - errors: [{ messageId: "noConstAssertion" }], -}); - -valid.push({ - name: "Empty object assignment with const assertion", - code: ` -const Foo = {} as const; - `, -}); - -invalid.push({ - name: "Empty object assignment without const assertion", - code: ` -const Foo = {}; - `, - errors: [{ messageId: "noConstAssertion" }], - output: ` -const Foo = {} as const; - `, -}); - -valid.push({ - name: "Lowercase object", - code: ` -const myObject = {}; - `, -}); - -invalid.push({ - name: "Array constant declaration without const assertion", - code: ` -const MY_CONSTANT = [1, 2, 3]; - `, - errors: [{ messageId: "noConstAssertion" }], - output: ` -const MY_CONSTANT = [1, 2, 3] as const; - `, -}); - -valid.push({ - name: "Empty array constant declaration with const assertion", - code: ` -const MY_CONSTANT = [] as const; - `, -}); - -invalid.push({ - name: "Empty array constant declaration without const assertion", - code: ` -const MY_CONSTANT = []; - `, - errors: [{ messageId: "noConstAssertion" }], - output: ` -const MY_CONSTANT = [] as const; - `, -}); - -valid.push({ - name: "Lowercase array", - code: ` -const myArray = []; - `, -}); - -valid.push({ - name: "Number constant declaration", - code: ` -const MY_CONSTANT = 123; - `, -}); - -valid.push({ - name: "String constant declaration", - code: ` -const MY_CONSTANT = "foo"; - `, -}); - -valid.push({ - name: "Array constant declaration with const assertion", - code: ` -const MY_CONSTANT = [1, 2, 3] as const; - `, -}); - -ruleTester.run( - "require-capital-const-assertions", - requireCapitalConstAssertions, - { - valid, - invalid, - }, -); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/require-capital-read-only.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/require-capital-read-only.test.ts deleted file mode 100644 index 0c1167aa3..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/require-capital-read-only.test.ts +++ /dev/null @@ -1,102 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { - MessageIds, - Options, -} from "../../src/rules/require-capital-read-only.js"; -import { requireCapitalReadOnly } from "../../src/rules/require-capital-read-only.js"; -import { ruleTester } from "../utils.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -valid.push({ - name: "Read-only map", - code: ` -const MY_MAP: ReadonlyMap = new Map([ - [1, 2], - [3, 4], - [5, 6], -]); - `, -}); - -valid.push({ - name: "Read-only set", - code: ` -const MY_SET: ReadonlySet = new Set([1, 2, 3]); - `, -}); - -valid.push({ - name: "Read-only array", - code: ` -const MY_ARRAY: readonly number[] = [1, 2, 3]; - `, -}); - -valid.push({ - name: "Read-only object", - code: ` -interface Foo { - foo: number; - bar: number; -} - -const MY_OBJECT: Readonly = { - foo: 123, - bar: 456, -}; - `, -}); - -invalid.push({ - name: "Writable map", - code: ` -const MY_MAP = new Map([ - [1, 2], - [3, 4], - [5, 6], -]); - `, - errors: [{ messageId: "readOnlyMap" }], -}); - -invalid.push({ - name: "Writable set", - code: ` -const MY_SET = new Set([1, 2, 3]); - `, - errors: [{ messageId: "readOnlySet" }], -}); - -invalid.push({ - name: "Writable array", - code: ` -const MY_ARRAY = [1, 2, 3]; - `, - errors: [{ messageId: "readOnlyArray" }], -}); - -invalid.push({ - name: "Writable object", - code: ` -interface Foo { - foo: number; - bar: number; -} - -const MY_OBJECT = { - foo: 123, - bar: 456, -}; - `, - errors: [{ messageId: "readOnlyObject" }], -}); - -ruleTester.run("require-capital-read-only", requireCapitalReadOnly, { - valid, - invalid, -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/require-unannotated-const-assertions.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/require-unannotated-const-assertions.test.ts deleted file mode 100644 index 40ac7330e..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/require-unannotated-const-assertions.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { requireUnannotatedConstAssertions } from "../../src/rules/require-unannotated-const-assertions.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run( - "require-unannotated-const-assertions", - requireUnannotatedConstAssertions, - { - valid: [ - { - code: ` -const array = [1, 2, 3] as const; - `, - }, - { - code: ` -const array: number[] = [1, 2, 3]; - `, - }, - ], - - invalid: [ - { - code: ` -const array: number[] = [1, 2, 3] as const; - `, - errors: [{ messageId: "annotatedConstAssertion" }], - }, - ], - }, -); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/require-variadic-function-argument.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/require-variadic-function-argument.test.ts deleted file mode 100644 index 941fcb34e..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/require-variadic-function-argument.test.ts +++ /dev/null @@ -1,213 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { - MessageIds, - Options, -} from "../../src/rules/require-variadic-function-argument.js"; -import { requireVariadicFunctionArgument } from "../../src/rules/require-variadic-function-argument.js"; -import { ruleTester } from "../utils.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -valid.push({ - name: "Normal array.push", - code: ` -const array = [1, 2, 3]; -array.push(4); - `, -}); - -invalid.push({ - name: "Empty array.push", - code: ` -const array = [1, 2, 3]; -array.push(); - `, - errors: [{ messageId: "noArgument" }], -}); - -valid.push({ - name: "Normal variadic function call", - code: ` -function foo(...things: string[]) {} -foo("thing"); - `, -}); - -invalid.push({ - name: "Empty variadic function call with mandatory argument", - code: ` -function foo(mandatoryArg: string, ...things: string[]) {} -foo("mandatory"); - `, - errors: [{ messageId: "noArgument" }], -}); - -valid.push({ - name: "Normal variadic function call with mandatory argument", - code: ` -function foo(mandatoryArg: string, ...things: string[]) {} -foo("mandatory", "thing"); - `, -}); - -invalid.push({ - name: "Empty variadic function call", - code: ` -function foo(...things: string[]) {} -foo(); - `, - errors: [{ messageId: "noArgument" }], -}); - -valid.push({ - name: "Using console.log to print a newline", - code: ` -console.log(); - `, -}); - -valid.push({ - name: "Using console.log normally", - code: ` -console.log("foo"); - `, -}); - -valid.push({ - name: "Using console.error to print a newline", - code: ` -console.error(); - `, -}); - -valid.push({ - name: "Using console.error normally", - code: ` -console.error("foo"); - `, -}); - -valid.push({ - name: "Using setTimeout normally", - code: ` -setTimeout(() => { - console.error("foo"); -}, 1000); - `, -}); - -valid.push({ - name: "Using window.setTimeout normally", - code: ` -window.setTimeout(() => { - console.error("foo"); -}, 1000); - `, -}); - -valid.push({ - name: "Using setTimeout with arguments", - code: ` -setTimeout((arg) => { - console.error("foo"); -}, 1000, "foo"); - `, -}); - -valid.push({ - name: "Using window.setTimeout with arguments", - code: ` -window.setTimeout((arg) => { - console.error("foo"); -}, 1000, "foo"); - `, -}); - -valid.push({ - name: "Using setInterval normally", - code: ` -setInterval(() => { - console.error("foo"); -}, 1000); - `, -}); - -valid.push({ - name: "Using window.setInterval normally", - code: ` -setInterval(() => { - console.error("foo"); -}, 1000); - `, -}); - -valid.push({ - name: "Using setInterval with arguments", - code: ` -setInterval((arg) => { - console.error("foo"); -}, 1000, "foo"); - `, -}); - -valid.push({ - name: "Using window.setInterval with arguments", - code: ` -setInterval((arg) => { - console.error("foo"); -}, 1000, "foo"); - `, -}); - -invalid.push({ - name: "Empty variadic function call with JSDoc comment without tag", - code: ` -/** - * Helper function to get all of the cars in the database. By default, it will return every car. - * - * You can optionally specify one or more car types to return only the cars that match the specified - * car types. - */ -function foo(...things: string[]) {} -foo(); - `, - errors: [{ messageId: "noArgument" }], -}); - -valid.push({ - name: "Empty variadic function call with JSDoc comment with tag", - code: ` -/** - * Helper function to get all of the cars in the database. By default, it will return every car. - * - * You can optionally specify one or more car types to return only the cars that match the specified - * car types. - * - * @allowEmptyVariadic - */ -function foo(...things: string[]) {} -foo(); - `, -}); - -valid.push({ - name: "Empty variadic function call with bare tag", - code: ` -/** @allowEmptyVariadic */ -function foo(...things: string[]) {} -foo(); - `, -}); - -ruleTester.run( - "require-variadic-function-argument", - requireVariadicFunctionArgument, - { - valid, - invalid, - }, -); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/strict-array-methods.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/strict-array-methods.test.ts deleted file mode 100644 index 4dafe88be..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/strict-array-methods.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { strictArrayMethods } from "../../src/rules/strict-array-methods.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("strict-array-methods", strictArrayMethods, { - valid: [ - { - code: ` -const numbers: number[] = []; -const filteredNumbers = numbers.filter((element) => { - return element !== 0; -}); - `, - }, - { - code: ` -const numbers: number[] = []; -function filterFunc(element: number) { - return element !== 0; -} -const filteredNumbers = numbers.filter(filterFunc); - `, - }, - { - code: ` -const numbers: number[] = []; -function filterFunc(element: number): boolean { - return element !== 0; -} -const filteredNumbers = numbers.filter(filterFunc); - `, - }, - ], - - invalid: [ - { - code: ` -const numbers: number[] = []; -const filteredNumbers = numbers.filter((element) => { - return element; -}); - `, - errors: [{ messageId: "conditionError" }], - }, - { - code: ` -const numbers: number[] = []; -function filterFunc(element: number) { - return element; -} -const filteredNumbers = numbers.filter(filterFunc); - `, - errors: [{ messageId: "conditionError" }], - }, - { - code: ` -const numbers: number[] = []; -function filterFunc(element: number): number { - return element; -} -const filteredNumbers = numbers.filter(filterFunc); - `, - errors: [{ messageId: "conditionError" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/strict-enums-assignment.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/strict-enums-assignment.test.ts deleted file mode 100644 index 50e6a8af6..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/strict-enums-assignment.test.ts +++ /dev/null @@ -1,244 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { MessageIds, Options } from "../../src/rules/strict-enums.js"; -import { strictEnums } from "../../src/rules/strict-enums.js"; -import { ruleTester } from "../utils.js"; -import { fruit2EnumDefinition, fruitEnumDefinition } from "./strict-enums.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -valid.push({ - name: "Declaring an enum with an empty initializer", - code: `${fruitEnumDefinition} - let fruit: Fruit; - if (true) { - fruit = Fruit.Apple; - } else { - fruit = Fruit.Banana; - } - `, -}); - -/** - * In development, this would trigger run-time errors due to the `typeChecker.getTypeAtLocation` - * method being buggy and not having a proper function signature. - */ -valid.push({ - name: 'Declaring an "empty" variable with array destructuring', - code: ` - const myArray = [1]; - const [firstElement] = myArray; - `, -}); - -valid.push({ - name: "Assigning a number enum literal to a number enum (with type-inference)", - code: `${fruitEnumDefinition} -const fruit = Fruit.Apple; - `, -}); - -valid.push({ - name: "Assigning a number enum literal to a number enum (without type-inference)", - code: `${fruitEnumDefinition} -const fruit: Fruit = Fruit.Apple; - `, -}); - -valid.push({ - name: "Assigning a number enum value to a variable of the same type with const", - code: `${fruitEnumDefinition} -const apple = Fruit.Apple; -const fruit: Fruit = apple; - `, -}); - -invalid.push({ - name: "Assigning a number literal to a number enum with const", - code: `${fruitEnumDefinition} -const fruit: Fruit = 0; - `, - errors: [{ messageId: "mismatchedAssignment" }], -}); - -valid.push({ - name: "Assigning a number enum value to a variable of the same type with let", - code: `${fruitEnumDefinition} -let fruit = Fruit.Apple; -fruit = Fruit.Banana; - `, -}); - -invalid.push({ - name: "Assigning a number literal to a number enum with let", - code: `${fruitEnumDefinition} -let fruit = Fruit.Apple; -fruit = 1; - `, - errors: [{ messageId: "mismatchedAssignment" }], -}); - -invalid.push({ - name: "Assigning an enum parent to a number enum", - code: `${fruitEnumDefinition} -const fruit: Fruit = Fruit; - `, - errors: [{ messageId: "mismatchedAssignment" }], -}); - -invalid.push({ - name: "Assigning a mismatched enum value to a number enum", - code: `${fruitEnumDefinition + fruit2EnumDefinition} -const fruit: Fruit = Fruit2.Apple2; - `, - errors: [{ messageId: "mismatchedAssignment" }], -}); - -valid.push({ - name: 'Assigning a number enum literal to a variable with a union type of "number enum | null" with const', - code: `${fruitEnumDefinition} -const fruit: Fruit | null = Fruit.Apple; - `, -}); - -valid.push({ - name: 'Assigning a null value to a variable with a union type of "number enum | null" with const', - code: `${fruitEnumDefinition} -const fruit: Fruit | null = null; - `, -}); - -invalid.push({ - name: 'Assigning a number literal to a variable with a union type of "number enum | null" with const', - code: `${fruitEnumDefinition} -const fruit: Fruit | null = 0; - `, - errors: [{ messageId: "mismatchedAssignment" }], -}); - -valid.push({ - name: 'Assigning a number enum literal to a variable with a union type of "number enum | null" with let', - code: `${fruitEnumDefinition} -let fruit: Fruit | null = null; -fruit = Fruit.Apple; - `, -}); - -valid.push({ - name: 'Assigning a null value to a variable with a union type of "number enum | null" with let', - code: `${fruitEnumDefinition} -let fruit: Fruit | null = Fruit.Apple; -fruit = null; - `, -}); - -invalid.push({ - name: 'Assigning a number literal to a variable with a union type of "number enum | null" with let', - code: `${fruitEnumDefinition} -let fruit: Fruit | null = null; -fruit = 0; - `, - errors: [{ messageId: "mismatchedAssignment" }], -}); - -invalid.push({ - name: 'Assigning a enum literal to a variable with a union type of "number enum | number"', - code: `${fruitEnumDefinition} -declare const fruit: Fruit | number; -const fruitCopy: Fruit = fruit; - `, - errors: [{ messageId: "mismatchedAssignment" }], -}); - -valid.push({ - name: "Assigning variables with a composition type that includes individual enum values", - code: ` -enum Foo { - A = 1, - B = 2, - C = 3, - D = 4, -} - -declare const foo: Foo; -declare const fooSubset: Foo.A | Foo.B | Foo.C; -const x: Foo = fooSubset; -const y: Foo.A | Foo.B | Foo.C = fooSubset; -const z: Foo.A | Foo.B | Foo.C | Foo.D = foo; - `, -}); - -// Intersection types are always allowed; see the docs. -valid.push({ - name: "Assigning a variable with a intersection enum type", - code: `${fruitEnumDefinition + fruit2EnumDefinition} -const foo: Fruit & Fruit2 = Fruit.Apple; - `, -}); - -valid.push({ - name: "Assigning to a variable with a composition of binary flags", - code: ` -enum Flag { - Value1 = 1 << 0, - Value2 = 1 << 1, -} -const flags = Flag.Value1 | Flag.Value2; - `, -}); - -valid.push({ - name: "Assigning a number enum array to a variable with a number enum array", - code: `${fruitEnumDefinition} -declare let fruits: Fruit[]; -fruits = [Fruit.Apple, Fruit.Banana]; - `, -}); - -valid.push({ - name: "Assigning a number enum array to a variable with a number array", - code: `${fruitEnumDefinition} -declare let numbers: number[]; -numbers = [Fruit.Apple, Fruit.Banana]; - `, -}); - -invalid.push({ - name: "Assigning a number array to a variable with a number enum array", - code: `${fruitEnumDefinition} -declare let fruits: Fruit[]; -fruits = [0, 1]; - `, - errors: [{ messageId: "mismatchedAssignment" }], -}); - -valid.push({ - name: "Assigning an empty array to a variable with a number enum array", - code: `${fruitEnumDefinition} -const fruitArray: Fruit[] = []; - `, -}); - -invalid.push({ - name: "Assigning a mismatched number enum array", - code: `${fruitEnumDefinition + fruit2EnumDefinition} -declare let fruits: Fruit[]; -fruits = [Fruit2.Apple2, Fruit2.Banana2]; - `, - errors: [{ messageId: "mismatchedAssignment" }], -}); - -valid.push({ - name: "Assigning a new variable with a composition of bit flags", - code: `${fruitEnumDefinition} -const fruitFlags = Fruit.Apple | Fruit.Banana; - `, -}); - -ruleTester.run("strict-enums-assignment", strictEnums, { - valid, - invalid, -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/strict-enums-functions.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/strict-enums-functions.test.ts deleted file mode 100644 index 9fcc228e4..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/strict-enums-functions.test.ts +++ /dev/null @@ -1,873 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { MessageIds, Options } from "../../src/rules/strict-enums.js"; -import { strictEnums } from "../../src/rules/strict-enums.js"; -import { ruleTester } from "../utils.js"; -import { - fruitEnumDefinition, - vegetableEnumDefinition, -} from "./strict-enums.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -/** A function that takes a number enum. */ -const fruitFunctionDefinition = `${fruitEnumDefinition} -function useFruit(fruit: Fruit) {} -`; - -valid.push({ - name: "Using a number enum literal on a non-existent function", - code: ` -useFruit(0); - `, -}); - -valid.push({ - name: "Using a number enum literal on a function that takes a number enum", - code: `${fruitFunctionDefinition} -useFruit(Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number enum value on a function that takes a number enum", - code: `${fruitFunctionDefinition} -declare const fruit: Fruit.Apple; -useFruit(fruit); - `, -}); - -invalid.push({ - name: "Using a number literal on a function that takes a number enum", - code: `${fruitFunctionDefinition} -useFruit(0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a matching number enum literal on a function that takes an enum literal", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple) {} -useFruit(Fruit.Apple); - `, -}); - -/** - * The TypeScript compiler will correctly handle this case, so the lint rule does not need to care. - */ -valid.push({ - name: "Using a non-matching number enum literal on a function that takes an enum literal", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple) {} -useFruit(Fruit.Banana); - `, -}); - -valid.push({ - name: "Using a matching number enum value on a function that takes an enum literal", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple) {} -declare const fruit: Fruit.Apple; -useFruit(fruit); - `, -}); - -/** - * The TypeScript compiler will correctly handle this case, so the lint rule does not need to care. - */ -valid.push({ - name: "Using a non-matching number enum value on a function that takes an enum literal", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple) {} -declare const fruit: Fruit.Banana; -useFruit(fruit); - `, -}); - -invalid.push({ - name: "Using a number literal on a function that takes an enum literal", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple) {} -useFruit(0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a number enum literal on a function that takes a number enum with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit = Fruit.Apple) {} -useFruit(Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number enum value on a function that takes a number enum with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit = Fruit.Apple) {} -const fruit = Fruit.Apple; -useFruit(fruit); - `, -}); - -invalid.push({ - name: "Using a number literal on a function that takes a number enum with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit = Fruit.Apple) {} -useFruit(0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a number enum literal on a function that takes a number enum literal with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple = Fruit.Apple) {} -useFruit(Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number enum value on a function that takes a number enum literal with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple = Fruit.Apple) {} -const fruit = Fruit.Apple; -useFruit(fruit); - `, -}); - -invalid.push({ - name: "Using a number literal on a function that takes a number enum literal with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple = Fruit.Apple) {} -useFruit(0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a number enum literal on a function that takes a number enum | null", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit | null) {} -useFruit(Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number enum value on a function that takes a number enum | null", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit | null) {} -const fruit = Fruit.Apple; -useFruit(fruit); - `, -}); - -valid.push({ - name: "Using a null literal on a function that takes a number enum | null", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit | null) {} -useFruit(null); - `, -}); - -valid.push({ - name: "Using a null value on a function that takes a number enum | null", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit | null) {} -const fruit = null; -useFruit(fruit); - `, -}); - -invalid.push({ - name: "Using a number literal on a function that takes a number enum | null", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit | null) {} -useFruit(0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a number enum literal on a function that takes a number enum | null with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit | null = Fruit.Apple) {} -useFruit(Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number enum value on a function that takes a number enum | null with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit | null = Fruit.Apple) {} -const fruit = Fruit.Apple; -useFruit(fruit); - `, -}); - -valid.push({ - name: "Using a null literal on a function that takes a number enum | null with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit | null = Fruit.Apple) {} -useFruit(null); - `, -}); - -valid.push({ - name: "Using a null value on a function that takes a number enum | null with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit | null = Fruit.Apple) {} -const fruit = null; -useFruit(fruit); - `, -}); - -invalid.push({ - name: "Using a number literal on a function that takes a number enum | null with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit | null = Fruit.Apple) {} -useFruit(0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a number enum literal on a function that takes a number enum literal | null", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | null) {} -useFruit(Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number enum value on a function that takes a number enum literal | null", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | null) {} -const fruit = Fruit.Apple; -useFruit(fruit); - `, -}); - -valid.push({ - name: "Using a null literal on a function that takes a number enum literal | null", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | null) {} -useFruit(null); - `, -}); - -valid.push({ - name: "Using a null value on a function that takes a number enum literal | null", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | null) {} -const fruit = null; -useFruit(fruit); - `, -}); - -invalid.push({ - name: "Using a number literal on a function that takes a number enum literal | null", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | null) {} -useFruit(0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a number enum literal on a function that takes a number enum literal | null with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | null = Fruit.Apple) {} -useFruit(Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number enum value on a function that takes a number enum literal | null with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | null = Fruit.Apple) {} -const fruit = Fruit.Apple; -useFruit(fruit); - `, -}); - -valid.push({ - name: "Using a null literal on a function that takes a number enum literal | null with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | null = Fruit.Apple) {} -useFruit(null); - `, -}); - -valid.push({ - name: "Using a null value on a function that takes a number enum literal | null with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | null = Fruit.Apple) {} -const fruit = null; -useFruit(fruit); - `, -}); - -invalid.push({ - name: "Using a number literal on a function that takes a number enum literal | null with a default argument", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | null = Fruit.Apple) {} -useFruit(0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a number enum literal on a function that takes a number enum literal | number enum literal | null", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | Fruit.Banana | null) {} -useFruit(Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number enum value on a function that takes a number enum literal | number enum literal | null", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | Fruit.Banana | null) {} -const fruit = Fruit.Apple; -useFruit(fruit); - `, -}); - -valid.push({ - name: "Using a null literal on a function that takes a number enum literal | number enum literal | null", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | Fruit.Banana | null) {} -useFruit(null); - `, -}); - -valid.push({ - name: "Using a null value on a function that takes a number enum literal | number enum literal | null", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | Fruit.Banana | null) {} -const fruit = null; -useFruit(fruit); - `, -}); - -invalid.push({ - name: "Using a number literal on a function that takes a number enum literal | number enum literal | null", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | Fruit.Banana | null) {} -useFruit(0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using an enum from a composition type on a function that takes a number enum", - code: `${fruitEnumDefinition} -interface BaseNode { - type: Fruit; -} - -interface AppleNode extends BaseNode { - type: Fruit.Apple; - apple: number; -} - -interface BananaNode extends BaseNode { - type: Fruit.Apple; - banana: Number; -} - -type Node = AppleNode | BananaNode; - -const fruitNodesSet = new Set([ - Fruit.Apple, - Fruit.Banana, -]); - -const appleNode: AppleNode = { - type: Fruit.Apple, - apple: 1, -}; - -fruitNodesSet.has(appleNode.type); - `, -}); - -valid.push({ - name: "Using an enum number literal in a Set method", - code: `${fruitEnumDefinition} -const fruitSet = new Set([ - Fruit.Apple, - Fruit.Banana, -]); - -fruitSet.has(Fruit.Apple); - `, -}); - -invalid.push({ - name: "Using a number literal in a Set method", - code: `${fruitEnumDefinition} -const fruitSet = new Set([ - Fruit.Apple, - Fruit.Banana, -]); - -fruitSet.has(0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a partial union type on a function that takes a number enum", - code: `${fruitFunctionDefinition} -declare const fruitUnion: Fruit.Apple | Fruit.Banana; -useFruit(fruitUnion); -`, -}); - -valid.push({ - name: "Using a partial union type on a function that takes a partial union", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | Fruit.Banana) {} -declare const fruitUnion: Fruit.Apple | Fruit.Banana; -useFruit(fruitUnion); -`, -}); - -invalid.push({ - name: "Using a number literal on a function that takes a partial union", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | Fruit.Banana) {} -useFruit(0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a full enum union on a function that takes a number enum", - code: `${fruitFunctionDefinition} -declare const fruitUnion: Fruit.Apple | Fruit.Banana | Fruit.Pear; -useFruit(fruitUnion); -`, -}); - -valid.push({ - name: "Using a full enum union on a function that takes a full enum union", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | Fruit.Banana | Fruit.Pear) {} -declare const fruitUnion: Fruit.Apple | Fruit.Banana | Fruit.Pear; -useFruit(fruitUnion); -`, -}); - -invalid.push({ - name: "Using a number literal on a function that takes a full enum union", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit.Apple | Fruit.Banana | Fruit.Pear) {} -useFruit(0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a partial enum union on a function that takes a number enum (from a type narrowing switch statement)", - code: `${fruitFunctionDefinition} -declare const fruit: Fruit; -switch (fruit) { - case Fruit.Apple: - case Fruit.Banana: { - useFruit(fruit); - } -} -`, -}); - -valid.push({ - name: "Using a number enum on a function that takes an extension type", - code: `${fruitEnumDefinition} -function useFruit(fruitType: FruitType) {} -useFruit(Fruit.Apple); -`, -}); - -valid.push({ - name: "Using a number literal on a function that takes an extension type", - code: `${fruitEnumDefinition} -function useFruit(fruitType: FruitType) {} -useFruit(0); -`, -}); - -valid.push({ - name: "Using a number enum on a function that takes an enum extension type", - code: `${fruitEnumDefinition} -function useFruit(fruitType: FruitType) {} -useFruit(Fruit.Apple); -`, -}); - -invalid.push({ - name: "Using a number literal on a function that takes an enum extension type", - code: `${fruitEnumDefinition} -function useFruit(fruitType: FruitType) {} -useFruit(0); -`, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a number enum on a function that takes an enum extension type", - code: `${fruitEnumDefinition} -class FruitClass { - constructor(type: FruitType) {} - useFruit(type: FruitType) {} -} -const fruitClass = new FruitClass(Fruit.Apple); -fruitClass.useFruit(Fruit.Apple); -`, -}); - -invalid.push({ - name: "Using a number literal on a function that takes an enum extension type", - code: `${fruitEnumDefinition} -class FruitClass { - constructor(type: FruitType) {} - useFruit(type: FruitType) {} -} -const fruitClass = new FruitClass(0); -fruitClass.useFruit(0); - `, - errors: [ - { messageId: "mismatchedFunctionArgument" }, - { messageId: "mismatchedFunctionArgument" }, - ], -}); - -valid.push({ - name: "Using a number array on a function that takes a number array", - code: `${fruitEnumDefinition} -function useNumbers(numberArray: number[]) {} -useNumbers([0, 1]); - `, -}); - -valid.push({ - name: "Using a number enum array on a function that takes a number enum array", - code: `${fruitEnumDefinition} -function useFruit(fruitArray: Fruit[]) {} -useFruit([Fruit.Apple, Fruit.Banana]); - `, -}); - -invalid.push({ - name: "Using a number array on a function that takes a number enum array", - code: `${fruitEnumDefinition} -function useFruit(fruitArray: Fruit[]) {} -useFruit([0, 1]); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -invalid.push({ - name: "Using a mixed array on a function that takes a number enum array", - code: `${fruitEnumDefinition} -function useFruit(fruitArray: Fruit[]) {} -useFruit([Fruit.Apple, 1]); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a number literal on a function that takes a number", - code: ` -function useNumber(num: number) {} -useNumber(0); - `, -}); - -valid.push({ - name: "Using a number enum literal on a function that takes a number", - code: `${fruitEnumDefinition} -function useNumber(num: number) {} -useNumber(Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a string literal on a function that takes a string", - code: `${vegetableEnumDefinition} -function useString(str: string) {} -useString('lettuce'); - `, -}); - -valid.push({ - name: "Using a string enum literal on a function that takes a string", - code: `${vegetableEnumDefinition} -function useString(str: string) {} -useString(Vegetable.Lettuce); - `, -}); - -valid.push({ - name: "Using a number literal on a function that takes any", - code: ` -function useAnything(something: any) {} -useAnything(0); - `, -}); - -valid.push({ - name: "Using a number enum literal on a function that takes any", - code: `${fruitEnumDefinition} -function useAnything(something: any) {} -useAnything(Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number literal on a function that takes unknown", - code: ` -function useUnknown(something: unknown) {} -useUnknown(0); - `, -}); - -valid.push({ - name: "Using a number enum literal on a function that takes unknown", - code: `${fruitEnumDefinition} -function useUnknown(something: unknown) {} -useUnknown(Fruit.Apple); - `, -}); - -invalid.push({ - name: "Using a number literal on a function that takes enum | enum array", - code: `${fruitEnumDefinition} -function useFruit(fruitOrFruitArray: Fruit | Fruit[]) {} -useFruit(0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a number enum literal on a function that takes enum | enum array", - code: `${fruitEnumDefinition} -function useFruit(fruitOrFruitArray: Fruit | Fruit[]) {} -useFruit(Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number enum array on a function that takes enum | enum array", - code: `${fruitEnumDefinition} -function useFruit(fruitOrFruitArray: Fruit | Fruit[]) {} -useFruit([Fruit.Apple, Fruit.Banana]); - `, -}); - -valid.push({ - name: "Using a enum | enum array union on a function that takes enum | enum array", - code: `${fruitEnumDefinition} -function useFruit(fruitOrFruitArray: Fruit | Fruit[]) {} -declare const fruit: Fruit | Fruit[]; -useFruit(fruit); - `, -}); - -invalid.push({ - name: "Using a number array on a function that takes enum | enum array", - code: `${fruitEnumDefinition} -function useFruit(fruitOrFruitArray: Fruit | Fruit[]) {} -useFruit([0, 1]); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a number on a function that takes number | enum array", - code: `${fruitEnumDefinition} -function useFruit(fruitOrFruitArray: number | Fruit[]) {} -useFruit(0); - `, -}); - -valid.push({ - name: "Using an enum array on a function that takes number | enum array", - code: `${fruitEnumDefinition} -function useFruit(fruitOrFruitArray: number | Fruit[]) {} -useFruit([Fruit.Apple, Fruit.Banana]); - `, -}); - -invalid.push({ - name: "Using a number array on a function that takes number | enum array", - code: `${fruitEnumDefinition} -function useFruit(fruitOrFruitArray: number | Fruit[]) {} -useFruit([0, 1]); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -invalid.push({ - name: "Using a number literal on a variadic function", - code: `${fruitEnumDefinition} -function useFruit(...fruits: Fruit[]) {} -useFruit(0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a number enum literal on a variadic function", - code: `${fruitEnumDefinition} -function useFruit(...fruits: Fruit[]) {} -useFruit(Fruit.Apple); -useFruit(Fruit.Apple, Fruit.Banana); - `, -}); - -invalid.push({ - name: "Using a number enum literal and a number literal on a variadic function", - code: `${fruitEnumDefinition} -function useFruit(...fruits: Fruit[]) {} -useFruit(Fruit.Apple, 0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a number enum literal on a generic function with a default generic type that is unspecified as any", - code: `${fruitEnumDefinition} -function toEqual(expected: E): void {} -toEqual(Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number enum literal on a generic function with a default generic type that is unspecified as a number enum", - code: `${fruitEnumDefinition} -function toEqual(expected: E): void {} -toEqual(Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number enum literal on a generic function with a default generic type that is specified as any", - code: `${fruitEnumDefinition} -function toEqual(expected: E): void {} -toEqual(Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number enum literal on a generic function with a default generic type that is specified as a number enum", - code: `${fruitEnumDefinition} -function toEqual(expected: E): void {} -toEqual(Fruit.Apple); - `, -}); - -invalid.push({ - name: "Using a number literal on a generic function with a default generic type that is specified as a number enum", - code: `${fruitEnumDefinition} -function toEqual(expected: E): void {} -toEqual(0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using a number enum literal on a generic function with a default generic type that is unspecified as any + extra arg", - code: `${fruitEnumDefinition} -function toEqual(arg1: number, expected: E): void {} -toEqual(0, Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number enum literal on a generic function with a default generic type that is unspecified as a number enum + extra arg", - code: `${fruitEnumDefinition} -function toEqual(arg1: number, expected: E): void {} -toEqual(0, Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number enum literal on a generic function with a default generic type that is specified as any + extra arg", - code: `${fruitEnumDefinition} -function toEqual(arg1: number, expected: E): void {} -toEqual(0, Fruit.Apple); - `, -}); - -valid.push({ - name: "Using a number enum literal on a generic function with a default generic type that is specified as a number enum + extra arg", - code: `${fruitEnumDefinition} -function toEqual(arg1: number, expected: E): void {} -toEqual(0, Fruit.Apple); - `, -}); - -invalid.push({ - name: "Using a number literal on a generic function with a default generic type that is specified as a number enum + extra arg", - code: `${fruitEnumDefinition} -function toEqual(arg1: number, expected: E): void {} -toEqual(0, 0); - `, - errors: [{ messageId: "mismatchedFunctionArgument" }], -}); - -valid.push({ - name: "Using JSON.stringify", - code: ` -JSON.stringify( - {}, - (_, value: unknown) => value ?? undefined, - 2, -); - `, -}); - -valid.push({ - name: "Using flatten", - code: ` -function flatten(arr: T[][]): T[] { - return arr.reduce((acc, a) => acc.concat(a), []); -} - `, -}); - -valid.push({ - name: "Using a number literal in a function that takes a number literal", - code: `${fruitEnumDefinition} -function useFruit(fruit: Fruit | -1) {} -useFruit(-1); - `, -}); - -valid.push({ - name: "Using a function with this void and 2 arguments", - code: `${fruitEnumDefinition} -function foo(this: void, arg1: Fruit, arg2: number) {} -foo(Fruit.Apple, 123); - `, -}); - -valid.push({ - name: "Using a function with this void and 3 arguments", - code: `${fruitEnumDefinition} -function foo(this: void, arg1: Fruit, arg2: number, arg3: number) {} -foo(Fruit.Apple, 123, 456); - `, -}); - -ruleTester.run("strict-enums-functions", strictEnums, { - valid, - invalid, -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/strict-enums-incrementing.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/strict-enums-incrementing.test.ts deleted file mode 100644 index cc7b75353..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/strict-enums-incrementing.test.ts +++ /dev/null @@ -1,118 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { MessageIds, Options } from "../../src/rules/strict-enums.js"; -import { strictEnums } from "../../src/rules/strict-enums.js"; -import { ruleTester } from "../utils.js"; -import { fruitEnumDefinition } from "./strict-enums.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -valid.push({ - name: "Incrementing a number (postfix)", - code: `${fruitEnumDefinition} -let fruit = 0; -fruit++; - `, -}); - -invalid.push({ - name: "Incrementing a number enum value (postfix)", - code: `${fruitEnumDefinition} -let fruit = Fruit.Apple; -fruit++; - `, - errors: [{ messageId: "incorrectIncrement" }], -}); - -valid.push({ - name: "Decrementing a number (postfix)", - code: `${fruitEnumDefinition} -let fruit = 1; -fruit--; - `, -}); - -invalid.push({ - name: "Decrementing a number enum value (postfix)", - code: `${fruitEnumDefinition} -let fruit = Fruit.Banana; -fruit--; - `, - errors: [{ messageId: "incorrectIncrement" }], -}); - -valid.push({ - name: "Incrementing a number (prefix)", - code: `${fruitEnumDefinition} -let fruit = 0; -++fruit; - `, -}); - -invalid.push({ - name: "Incrementing a number enum value (prefix)", - code: `${fruitEnumDefinition} -let fruit = Fruit.Apple; -++fruit; - `, - errors: [{ messageId: "incorrectIncrement" }], -}); - -valid.push({ - name: "Decrementing a number (prefix)", - code: `${fruitEnumDefinition} -let fruit = 1; ---fruit - `, -}); - -invalid.push({ - name: "Decrementing a number enum value (prefix)", - code: `${fruitEnumDefinition} -let fruit = Fruit.Banana; ---fruit; - `, - errors: [{ messageId: "incorrectIncrement" }], -}); - -valid.push({ - name: "Incrementing a number (assignment operator)", - code: `${fruitEnumDefinition} -let fruit = 0; -fruit += 1; - `, -}); - -invalid.push({ - name: "Incrementing a number enum value (assignment operator)", - code: `${fruitEnumDefinition} -let fruit = Fruit.Apple; -fruit += 1; - `, - errors: [{ messageId: "mismatchedAssignment" }], -}); - -valid.push({ - name: "Decrementing a number (assignment operator)", - code: `${fruitEnumDefinition} -let fruit = 1; -fruit -= 1; - `, -}); - -invalid.push({ - name: "Decrementing a number enum value (assignment operator)", - code: `${fruitEnumDefinition} -let fruit = Fruit.Banana; -fruit -= 1; - `, - errors: [{ messageId: "mismatchedAssignment" }], -}); - -ruleTester.run("strict-enums-incrementing", strictEnums, { - valid, - invalid, -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/strict-enums.ts b/packages/eslint-plugin-isaacscript/tests/rules/strict-enums.ts deleted file mode 100644 index e34be3934..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/strict-enums.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** A number enum. */ -export const fruitEnumDefinition = ` -enum Fruit { - Apple, - Banana, - Pear, -} -`; - -/** A different number enum. */ -export const fruit2EnumDefinition = ` -enum Fruit2 { - Apple2, - Banana2, - Pear2, -} -`; - -/** - * A string enum. - * - * String enums are almost exclusively used for comparison tests, since the TypeScript compiler does - * a good job of ensuring safety for string enum variable assignment and usage in functions. - */ -export const vegetableEnumDefinition = ` - enum Vegetable { - Lettuce = 'lettuce', - Carrot = 'carrot', - Celery = 'celery', - } - `; diff --git a/packages/eslint-plugin-isaacscript/tests/rules/strict-undefined-functions.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/strict-undefined-functions.test.ts deleted file mode 100644 index 2062b7765..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/strict-undefined-functions.test.ts +++ /dev/null @@ -1,107 +0,0 @@ -import type { - InvalidTestCase, - ValidTestCase, -} from "@typescript-eslint/rule-tester"; -import type { - MessageIds, - Options, -} from "../../src/rules/strict-undefined-functions.js"; -import { strictUndefinedFunctions } from "../../src/rules/strict-undefined-functions.js"; -import { ruleTester } from "../utils.js"; - -const valid: Array> = []; -const invalid: Array> = []; - -valid.push({ - name: "void function returns void", - code: ` -function foo(): void { - return; -} - `, -}); - -valid.push({ - name: "only number function returns 0", - code: ` -function foo(): number { - return 0; -} - `, -}); - -valid.push({ - name: "only undefined function returns undefined", - code: ` -function foo(): undefined { - return undefined; -} - `, -}); - -invalid.push({ - name: "only undefined function returns void", - code: ` -function foo(): undefined { - return; -} - `, - errors: [{ messageId: "mismatchedReturnType" }], -}); - -valid.push({ - name: "number or undefined function returns undefined", - code: ` -function foo(): number | undefined { - return undefined; -} - `, -}); - -invalid.push({ - name: "number or undefined function returns void", - code: ` -function foo(): number | undefined { - return; -} - `, - errors: [{ messageId: "mismatchedReturnType" }], -}); - -valid.push({ - name: "unannotated arrow function returns undefined", - code: ` -const foo = () => undefined; - `, -}); - -valid.push({ - name: "undefined arrow function returns undefined", - code: ` -const foo = (): undefined => undefined; - `, -}); - -invalid.push({ - name: "undefined arrow function returns void", - code: ` -const foo = (): undefined => { - return; -}; - `, - errors: [{ messageId: "mismatchedReturnType" }], -}); - -valid.push({ - name: "declare interface arrow function", - code: ` -declare interface Foo { - Get: (id: number) => number | undefined; -} - `, -}); - -ruleTester.run("strict-undefined-functions", strictUndefinedFunctions, { - valid, - invalid, -}); diff --git a/packages/eslint-plugin-isaacscript/tests/rules/strict-void-functions.test.ts b/packages/eslint-plugin-isaacscript/tests/rules/strict-void-functions.test.ts deleted file mode 100644 index 85ed91b94..000000000 --- a/packages/eslint-plugin-isaacscript/tests/rules/strict-void-functions.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { strictVoidFunctions } from "../../src/rules/strict-void-functions.js"; -import { ruleTester } from "../utils.js"; - -ruleTester.run("strict-void-functions", strictVoidFunctions, { - valid: [ - { - code: ` -function foo(): void { - return; -} - `, - }, - { - code: ` -function foo(): undefined { - return undefined; -} - `, - }, - ], - - invalid: [ - { - code: ` -function foo(): void { - return undefined; -} - `, - errors: [{ messageId: "mismatchedReturnType" }], - }, - ], -}); diff --git a/packages/eslint-plugin-isaacscript/tests/tsconfig.json b/packages/eslint-plugin-isaacscript/tests/tsconfig.json index dec18ff8e..232f2c27e 100644 --- a/packages/eslint-plugin-isaacscript/tests/tsconfig.json +++ b/packages/eslint-plugin-isaacscript/tests/tsconfig.json @@ -1,10 +1,12 @@ { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../../isaacscript-tsconfig/tsconfig.base.json", - "../../isaacscript-tsconfig/tsconfig.node.json", - "../../../tsconfig.monorepo.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], "include": ["./**/*.ts"], diff --git a/packages/eslint-plugin-isaacscript/tests/utils.ts b/packages/eslint-plugin-isaacscript/tests/utils.ts index 997ef5999..9e7ed7b0b 100644 --- a/packages/eslint-plugin-isaacscript/tests/utils.ts +++ b/packages/eslint-plugin-isaacscript/tests/utils.ts @@ -1,11 +1,14 @@ -import { RuleTester } from "@typescript-eslint/rule-tester"; // eslint-disable-line import-x/no-extraneous-dependencies +import { RuleTester } from "@typescript-eslint/rule-tester"; import path from "node:path"; /** @see https://typescript-eslint.io/packages/rule-tester */ export const ruleTester = new RuleTester({ languageOptions: { parserOptions: { - // TODO: Try changing this to "projectServices" as explained in the TSESLint documentation. + // In the future, this should be converted to "projectServices" as explained in the TSESLint + // documentation. + // https://discord.com/channels/1026804805894672454/1274783430785241220/1274783430785241220 + // https://github.com/typescript-eslint/typescript-eslint/issues/9906 project: true, /** @@ -13,7 +16,6 @@ export const ruleTester = new RuleTester({ * * SyntaxError: Cannot use 'import.meta' outside a module */ - // eslint-disable-next-line unicorn/prefer-module tsconfigRootDir: path.join(__dirname, "fixtures"), }, }, diff --git a/packages/eslint-plugin-isaacscript/tsconfig.json b/packages/eslint-plugin-isaacscript/tsconfig.json index ecefe8736..2a914a853 100644 --- a/packages/eslint-plugin-isaacscript/tsconfig.json +++ b/packages/eslint-plugin-isaacscript/tsconfig.json @@ -1,16 +1,24 @@ { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../isaacscript-tsconfig/tsconfig.base.json", - "../isaacscript-tsconfig/tsconfig.node.json", - "../../tsconfig.monorepo.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], // https://www.typescriptlang.org/docs/handbook/compiler-options.html "compilerOptions": { // Needed since this is a library. + "sourceMap": true, "declaration": true, "declarationMap": true, + + // Needed since we import from the "package.json" file. + // TODO: Remove this when the monorepo version of TypeScript is: >= 5.9.2 + // (It automatically gets applied for some reason on newer TypeScript versions.) + "resolveJsonModule": true, }, } diff --git a/packages/isaac-lua-polyfill/README.md b/packages/isaac-lua-polyfill/README.md index e420537f1..32696cbeb 100644 --- a/packages/isaac-lua-polyfill/README.md +++ b/packages/isaac-lua-polyfill/README.md @@ -1,4 +1,4 @@ -# isaac-lua-polyfill +# `isaac-lua-polyfill` [![npm version](https://img.shields.io/npm/v/isaac-lua-polyfill.svg)](https://www.npmjs.com/package/isaac-lua-polyfill) diff --git a/packages/isaac-lua-polyfill/eslint.config.mjs b/packages/isaac-lua-polyfill/eslint.config.mjs index 7bc5fb25e..2c70fbca4 100644 --- a/packages/isaac-lua-polyfill/eslint.config.mjs +++ b/packages/isaac-lua-polyfill/eslint.config.mjs @@ -1,6 +1,7 @@ -import tseslint from "typescript-eslint"; -import { base } from "../eslint-config-isaacscript/base.js"; -import { mod } from "../eslint-config-isaacscript/mod.js"; -import { monorepo } from "../eslint-config-isaacscript/monorepo.js"; +// @ts-check -export default tseslint.config(...base, ...mod, ...monorepo); +import { completeConfigBase } from "eslint-config-complete"; +import { defineConfig } from "eslint/config"; +import { isaacScriptModConfigBase } from "../eslint-config-isaacscript/src/mod.js"; + +export default defineConfig(...completeConfigBase, ...isaacScriptModConfigBase); diff --git a/packages/isaac-lua-polyfill/package.json b/packages/isaac-lua-polyfill/package.json index b85e4d035..1b89166c7 100644 --- a/packages/isaac-lua-polyfill/package.json +++ b/packages/isaac-lua-polyfill/package.json @@ -21,17 +21,18 @@ "type": "module", "main": "./dist/index.js", "files": [ - "dist", - "LICENSE", - "package.json", - "README.md" + "dist" ], "scripts": { "build": "tsx ./scripts/build.ts", "lint": "tsx ./scripts/lint.ts" }, "dependencies": { - "isaac-typescript-definitions": "^42.2.0", - "isaacscript-common-ts": "^16.1.0" + "complete-common": "2.21.0", + "isaac-typescript-definitions": "43.0.6" + }, + "devDependencies": { + "complete-node": "16.4.0", + "typescript-eslint": "8.57.1" } } diff --git a/packages/isaac-lua-polyfill/scripts/build.ts b/packages/isaac-lua-polyfill/scripts/build.ts index eeaecee2f..dba8956d9 100644 --- a/packages/isaac-lua-polyfill/scripts/build.ts +++ b/packages/isaac-lua-polyfill/scripts/build.ts @@ -1,20 +1,5 @@ -import { - $s, - buildScript, - fixMonorepoPackageDistDirectory, -} from "isaacscript-common-node"; -import { assertDefined } from "isaacscript-common-ts"; +import { $, buildScript } from "complete-node"; -await buildScript(({ packageRoot, outDir }) => { - assertDefined( - outDir, - 'Failed to get the "outDir" from the "tsconfig.json" file.', - ); - - compile(packageRoot, outDir); +await buildScript(import.meta.dirname, async () => { + await $`tsc`; }); - -function compile(packageRoot: string, outDir: string) { - $s`tsc`; - fixMonorepoPackageDistDirectory(packageRoot, outDir); -} diff --git a/packages/isaac-lua-polyfill/scripts/lint.ts b/packages/isaac-lua-polyfill/scripts/lint.ts index 290fcfe0d..d828f8792 100644 --- a/packages/isaac-lua-polyfill/scripts/lint.ts +++ b/packages/isaac-lua-polyfill/scripts/lint.ts @@ -1,10 +1,7 @@ -import { $, lintScript } from "isaacscript-common-node"; +import { lintCommands } from "complete-node"; -await lintScript(async () => { - const promises = [ - $`tsc --noEmit`, - $`tsc --noEmit --project ./scripts/tsconfig.json`, - $`eslint --max-warnings 0 .`, - ]; - await Promise.all(promises); -}); +await lintCommands(import.meta.dirname, [ + "tsc --noEmit", + "tsc --noEmit --project ./scripts/tsconfig.json", + "eslint --max-warnings 0 .", +]); diff --git a/packages/isaac-lua-polyfill/scripts/tsconfig.json b/packages/isaac-lua-polyfill/scripts/tsconfig.json index 5afad029c..81e995789 100644 --- a/packages/isaac-lua-polyfill/scripts/tsconfig.json +++ b/packages/isaac-lua-polyfill/scripts/tsconfig.json @@ -1,10 +1,12 @@ { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../../isaacscript-tsconfig/tsconfig.base.json", - "../../isaacscript-tsconfig/tsconfig.node.json", - "../../../tsconfig.monorepo.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], "include": ["*.ts"], diff --git a/packages/isaac-lua-polyfill/src/index.ts b/packages/isaac-lua-polyfill/src/index.ts index 32987cfea..47712f0bf 100644 --- a/packages/isaac-lua-polyfill/src/index.ts +++ b/packages/isaac-lua-polyfill/src/index.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-empty-function */ -import type { ReadonlyRecord } from "isaacscript-common-ts"; -import { parseIntSafe } from "isaacscript-common-ts"; +import type { ReadonlyRecord } from "complete-common"; +import { parseIntSafe } from "complete-common"; // -------------------- // Lua global functions @@ -96,7 +96,7 @@ function Random(): int { return 1; } -globalThis.Random = Random; // eslint-disable-line deprecation/deprecation +globalThis.Random = Random; // eslint-disable-line @typescript-eslint/no-deprecated function RNG(): RNG { return { diff --git a/packages/isaac-lua-polyfill/tsconfig.json b/packages/isaac-lua-polyfill/tsconfig.json index be432c710..ef9ffea8c 100644 --- a/packages/isaac-lua-polyfill/tsconfig.json +++ b/packages/isaac-lua-polyfill/tsconfig.json @@ -1,10 +1,12 @@ { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../isaacscript-tsconfig/tsconfig.base.json", - "../isaacscript-tsconfig/tsconfig.node.json", - "../../tsconfig.monorepo.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], // https://www.typescriptlang.org/docs/handbook/compiler-options.html diff --git a/packages/isaac-typescript-definitions-repentogon/README.md b/packages/isaac-typescript-definitions-repentogon/README.md index b186d9bda..98431bb8e 100644 --- a/packages/isaac-typescript-definitions-repentogon/README.md +++ b/packages/isaac-typescript-definitions-repentogon/README.md @@ -1,8 +1,8 @@ -# isaac-typescript-definitions-repentogon +# `isaac-typescript-definitions-repentogon` [![npm version](https://img.shields.io/npm/v/isaac-typescript-definitions-repentogon.svg)](https://www.npmjs.com/package/isaac-typescript-definitions-repentogon) -These are TypeScript definitions for [REPENTOGON](https://repentogon.com/index.html), an exe-hack for the modding API of [_The Binding of Isaac: Repentance_](https://store.steampowered.com/app/1426300/The_Binding_of_Isaac_Repentance/). +These are TypeScript definitions for [REPENTOGON](https://repentogon.com/), an exe-hack for the modding API of [_The Binding of Isaac: Repentance_](https://store.steampowered.com/app/1426300/The_Binding_of_Isaac_Repentance/). They are not included by default in [IsaacScript](https://isaacscript.github.io/) mods. diff --git a/packages/isaac-typescript-definitions-repentogon/eslint.config.mjs b/packages/isaac-typescript-definitions-repentogon/eslint.config.mjs index bbcfd37d5..496f88c63 100644 --- a/packages/isaac-typescript-definitions-repentogon/eslint.config.mjs +++ b/packages/isaac-typescript-definitions-repentogon/eslint.config.mjs @@ -1,17 +1,17 @@ -import tseslint from "typescript-eslint"; -import { base } from "../eslint-config-isaacscript/base.js"; -import { mod } from "../eslint-config-isaacscript/mod.js"; -import { monorepo } from "../eslint-config-isaacscript/monorepo.js"; -// @ts-expect-error There are no TypeScript definitions for this plugin. +// @ts-check + +import { completeConfigBase } from "eslint-config-complete"; import ESLintPluginSortExports from "eslint-plugin-sort-exports"; +import { defineConfig } from "eslint/config"; +import { isaacScriptModConfigBase } from "../eslint-config-isaacscript/src/mod.js"; -export default tseslint.config( - ...base, - ...mod, - ...monorepo, +export default defineConfig( + ...completeConfigBase, + ...isaacScriptModConfigBase, { plugins: { + // @ts-expect-error https://github.com/jrdrg/eslint-plugin-sort-exports/issues/44 "sort-exports": ESLintPluginSortExports, }, @@ -37,6 +37,9 @@ export default tseslint.config( sortDir: "asc", }, ], + + // TODO: https://github.com/eslint/eslint/issues/20272 + "@typescript-eslint/unified-signatures": "off", }, }, diff --git a/packages/isaac-typescript-definitions-repentogon/package.json b/packages/isaac-typescript-definitions-repentogon/package.json index 5853e7bba..1233ea24a 100644 --- a/packages/isaac-typescript-definitions-repentogon/package.json +++ b/packages/isaac-typescript-definitions-repentogon/package.json @@ -1,6 +1,6 @@ { "name": "isaac-typescript-definitions-repentogon", - "version": "1.11.0", + "version": "3.0.0", "description": "TypeScript definitions for REPENTOGON, an exe-hack which expands the modding API for Repentance.", "keywords": [ "isaac", @@ -23,16 +23,19 @@ "types": "./dist/index.d.ts", "files": [ "dist", - "src", - "LICENSE", - "package.json", - "README.md" + "src" ], "scripts": { "build": "tsx --tsconfig ./scripts/tsconfig.json ./scripts/build.mts", "lint": "tsx --tsconfig ./scripts/tsconfig.json ./scripts/lint.mts" }, "dependencies": { - "isaac-typescript-definitions": "^42.2.0" + "isaac-typescript-definitions": "43.0.6" + }, + "devDependencies": { + "complete-node": "16.4.0", + "eslint-plugin-sort-exports": "0.9.1", + "typescript-eslint": "8.57.1", + "typescript-to-lua": "1.34.0" } } diff --git a/packages/isaac-typescript-definitions-repentogon/scripts/build.mts b/packages/isaac-typescript-definitions-repentogon/scripts/build.mts index e1f0e2041..9b74b73ea 100644 --- a/packages/isaac-typescript-definitions-repentogon/scripts/build.mts +++ b/packages/isaac-typescript-definitions-repentogon/scripts/build.mts @@ -1,32 +1,33 @@ -import { $, buildScript, cp, prependFile } from "isaacscript-common-node"; -import { assertDefined } from "isaacscript-common-ts"; +import { + $, + buildScript, + copyFileOrDirectory, + prependFile, +} from "complete-node"; import path from "node:path"; -await buildScript(async ({ packageRoot, outDir }) => { - assertDefined( - outDir, - 'Failed to get the "outDir" from the "tsconfig.json" file.', - ); - - const promises = [ +await buildScript(import.meta.dirname, async (packageRoot) => { + await Promise.all([ $`tstl`, // We need to create JavaScript files in addition to Lua files because we want this package to // be usable in Jest tests. We disable declarations because running `tstl` will create // declarations and we don't want the two processes to stomp on each other. $`tsc --declaration false --declarationMap false`, - ]; - - await Promise.all(promises); + ]); // If we let the triple slash reference in the "./dist/index.ts" file point to the // "./src/types/index.d.ts", things will not work properly because the compiled enums are // different from the TypeScript source enums. Specifically, the `strict-enums` lint rule will // start to complain about e.g. `RoomType` not matching `RoomType`. Thus, we need to copy all of // the types into the "dist" directory so that they resolve properly. + const outDir = "dist"; const indexDTSPath = path.join(outDir, "index.d.ts"); - prependFile(indexDTSPath, '/// \n\n'); + await prependFile( + indexDTSPath, + '/// \n\n', + ); const srcPath = path.join(packageRoot, "src", "types"); const dstPath = path.join(outDir, "types"); - cp(srcPath, dstPath); + await copyFileOrDirectory(srcPath, dstPath); }); diff --git a/packages/isaac-typescript-definitions-repentogon/scripts/lint.mts b/packages/isaac-typescript-definitions-repentogon/scripts/lint.mts index 290fcfe0d..d828f8792 100644 --- a/packages/isaac-typescript-definitions-repentogon/scripts/lint.mts +++ b/packages/isaac-typescript-definitions-repentogon/scripts/lint.mts @@ -1,10 +1,7 @@ -import { $, lintScript } from "isaacscript-common-node"; +import { lintCommands } from "complete-node"; -await lintScript(async () => { - const promises = [ - $`tsc --noEmit`, - $`tsc --noEmit --project ./scripts/tsconfig.json`, - $`eslint --max-warnings 0 .`, - ]; - await Promise.all(promises); -}); +await lintCommands(import.meta.dirname, [ + "tsc --noEmit", + "tsc --noEmit --project ./scripts/tsconfig.json", + "eslint --max-warnings 0 .", +]); diff --git a/packages/isaac-typescript-definitions-repentogon/scripts/tsconfig.json b/packages/isaac-typescript-definitions-repentogon/scripts/tsconfig.json index 0327cd449..0055fe1b2 100644 --- a/packages/isaac-typescript-definitions-repentogon/scripts/tsconfig.json +++ b/packages/isaac-typescript-definitions-repentogon/scripts/tsconfig.json @@ -1,10 +1,12 @@ { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../../isaacscript-tsconfig/tsconfig.base.json", - "../../isaacscript-tsconfig/tsconfig.node.json", - "../../../tsconfig.monorepo.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], "include": ["*.mts"], diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/Achievement.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/Achievement.ts index 66a2e29d7..eba921481 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/Achievement.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/Achievement.ts @@ -3,7 +3,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum Achievement { /** Reserved for vanilla characters that you normally can't select in the menu. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/AltRockType.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/AltRockType.ts new file mode 100644 index 000000000..5febfa5f8 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/AltRockType.ts @@ -0,0 +1,23 @@ +/** + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +export enum AltRockType { + URN = 1, + MUSHROOM = 2, + SKULL = 3, + POLYP = 4, + /** + * Destroying buckets in Downpour give different outcomes than in Dross. + * + * See: https://bindingofisaacrebirth.fandom.com/wiki/Rocks#Buckets + */ + BUCKET_DOWNPOUR = 5, + /** + * Destroying buckets in Dross give different outcomes than in Downpour. + * + * See: https://bindingofisaacrebirth.fandom.com/wiki/Rocks#Buckets + */ + BUCKET_DROSS = 6, +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/AutocompleteType.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/AutocompleteType.ts index 8c32b2357..51e69fae9 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/AutocompleteType.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/AutocompleteType.ts @@ -3,7 +3,7 @@ * * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum AutocompleteType { NONE = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/BagOfCraftingPickup.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/BagOfCraftingPickup.ts index 79f9305df..c2d6910c7 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/BagOfCraftingPickup.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/BagOfCraftingPickup.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum BagOfCraftingPickup { NONE = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/BlendEquation.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/BlendEquation.ts new file mode 100644 index 000000000..8cee9dcc0 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/BlendEquation.ts @@ -0,0 +1,12 @@ +/** + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +export enum BlendEquation { + ADD = 0, + SUBTRACT = 1, + REVERSE_SUBTRACT = 2, + MIN = 3, + MAX = 4, +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/BlendFactor.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/BlendFactor.ts index a93a8dc7d..b0e9604f2 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/BlendFactor.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/BlendFactor.ts @@ -1,3 +1,8 @@ +/** + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ export enum BlendFactor { ZERO = 0, ONE = 1, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/BlendType.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/BlendType.ts index ee83b022a..89ccd1924 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/BlendType.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/BlendType.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum BlendType { /** Ignores any kind of source/destination modifiers. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/BombCostumeLayer.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/BombCostumeLayer.ts index 6ae39ca9e..722e40e46 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/BombCostumeLayer.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/BombCostumeLayer.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum BombCostumeLayer { BACK = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/CambionPregnancyLevel.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/CambionPregnancyLevel.ts new file mode 100644 index 000000000..4829cf00e --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/CambionPregnancyLevel.ts @@ -0,0 +1,10 @@ +/** + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +export enum CambionPregnancyLevel { + LEVEL_0 = 0, + LEVEL_1 = 1, + LEVEL_2 = 2, +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/CharacterMenuStatus.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/CharacterMenuStatus.ts index 06049705d..43acc5310 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/CharacterMenuStatus.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/CharacterMenuStatus.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum CharacterMenuStatus { DEFAULT = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/CharacterMenuType.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/CharacterMenuType.ts index d1ee6e820..7a454191e 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/CharacterMenuType.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/CharacterMenuType.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum CharacterMenuType { NORMAL = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/CoinJamAnimation.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/CoinJamAnimation.ts new file mode 100644 index 000000000..3712ccb1c --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/CoinJamAnimation.ts @@ -0,0 +1,11 @@ +/** + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +export enum CoinJamAnimation { + COIN_JAM_1 = "CoinJam", + COIN_JAM_2 = "CoinJam2", + COIN_JAM_3 = "CoinJam3", + COIN_JAM_4 = "CoinJam4", +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/CompletionMarkDifficulty.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/CompletionMarkDifficulty.ts index b1f7c1bf3..62017bcc7 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/CompletionMarkDifficulty.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/CompletionMarkDifficulty.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum CompletionMarkDifficulty { NONE = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/CompletionMarkType.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/CompletionMarkType.ts index dcb38a50e..864afa730 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/CompletionMarkType.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/CompletionMarkType.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum CompletionMarkType { MOMS_HEART = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/DailyChallengeMenuState.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/DailyChallengeMenuState.ts index 9bb89abbb..186eb49d3 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/DailyChallengeMenuState.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/DailyChallengeMenuState.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum DailyChallengeMenuState { NOT_LOADED = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/DeathAnimationName.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/DeathAnimationName.ts index 6b2845219..50737869e 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/DeathAnimationName.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/DeathAnimationName.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum DeathAnimationName { DEATH = "Death", diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/DialogButton.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/DialogButton.ts index 7aa3f59f4..944b469ce 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/DialogButton.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/DialogButton.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum DialogButton { OK = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/DialogIcon.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/DialogIcon.ts index 672517533..2fdec60c1 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/DialogIcon.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/DialogIcon.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum DialogIcon { ERROR = 16, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/DialogReturn.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/DialogReturn.ts index c7b763bf7..ce984e088 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/DialogReturn.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/DialogReturn.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum DialogReturn { PL = 1, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/DwmWindowsAttribute.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/DwmWindowsAttribute.ts index 29ab1aa6c..2f7951a41 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/DwmWindowsAttribute.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/DwmWindowsAttribute.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum DwmWindowAttribute { NC_RENDERING_ENABLED = 1, @@ -17,8 +17,10 @@ export enum DwmWindowAttribute { HAS_ICONIC_BITMAP = 10, DISALLOW_PEEK = 11, EXCLUDED_FROM_PEEK = 12, - CLOAK = 13, - CLOAKED = 14, + + // REPENTOGON blocks the CLOAK and CLOAKED attributes from being used. Therefore, they have been + // omitted from this enum. + FREEZE_REPRESENTATION = 15, PASSIVE_UPDATE_MODE = 16, USE_HOST_BACKDROP_BRUSH = 17, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/Ending.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/Ending.ts index c46ac79aa..2b61da336 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/Ending.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/Ending.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum Ending { DIE = 1, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/EvaluateStatStage.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/EvaluateStatStage.ts new file mode 100644 index 000000000..d97aa7250 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/EvaluateStatStage.ts @@ -0,0 +1,11 @@ +/** + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +export enum EvaluateStatStage { + TEARS_UP = 0, + FLAT_TEARS = 1, + DAMAGE_UP = 2, + FLAT_DAMAGE = 3, +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/FollowerPriority.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/FollowerPriority.ts index c5592108b..765838378 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/FollowerPriority.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/FollowerPriority.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum FollowerPriority { DEFAULT = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/GameMode.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/GameMode.ts new file mode 100644 index 000000000..548571cf7 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/GameMode.ts @@ -0,0 +1,9 @@ +/** + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +export enum GameMode { + NORMAL = 0, + GREED = 1, +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/GenericPromptSelection.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/GenericPromptSelection.ts index a0b9594f7..048c43532 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/GenericPromptSelection.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/GenericPromptSelection.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum GenericPromptSelection { NO = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/GenericPromptSubmittedSelection.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/GenericPromptSubmittedSelection.ts index 18504624b..6232de15d 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/GenericPromptSubmittedSelection.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/GenericPromptSubmittedSelection.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum GenericPromptSubmittedSelection { NONE = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/HealthType.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/HealthType.ts index 7491a6eec..223ac3a6e 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/HealthType.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/HealthType.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum HealthType { RED = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/HeartFlashType.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/HeartFlashType.ts index 0f70b20f7..71e1e9e61 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/HeartFlashType.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/HeartFlashType.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum HeartFlashType { NONE = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/MainMenuType.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/MainMenuType.ts index 333457516..e8b67ff57 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/MainMenuType.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/MainMenuType.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum MainMenuType { TITLE = 1, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/ModCallbackRepentogon.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/ModCallbackRepentogon.ts index 2beefbc1d..d47b771ce 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/ModCallbackRepentogon.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/ModCallbackRepentogon.ts @@ -1,14 +1,14 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum ModCallbackRepentogon { /** * A modified version of `ModCallback.POST_USE_PILL`. This callback provides a `PillColor` * parameter. * - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PillEffect` provided. * @@ -27,7 +27,14 @@ export enum ModCallbackRepentogon { * A modified version of `ModCallback.ENTITY_TAKE_DMG`. This callback now allows an interface to * be returned to further modify how the entity takes damage. * - * When registering this callback with the `Mod.AddCallback` method: + * Return false to cancel the damage from being applied. Alternatively, return an object with any + * of the following optional fields to modify how the damage is applied: + * - `DamageAmount`: The amount of damage to apply. + * - `DamageFlags`: The damage flags to apply. + * - `DamageCountdown`: The damage countdown to apply. Only works if the `DamageFlag.COUNTDOWN` + * flag is present. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `EntityType` provided. * @@ -54,7 +61,13 @@ export enum ModCallbackRepentogon { * A modified version of `ModCallback.PRE_FAMILIAR_COLLISION`. This callback now allows an * interface to be returned to further modify the collision behavior. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision and prevent collision effects from being ran. Return + * `false` to allow the collision but prevent collision effects from being ran. Alternatively, + * return an object with any of the following optional fields to modify the collision behavior: + * - `Collide`: Whether the familiar should collide with the collider. + * - `SkipCollisionEffects`: Whether to skip running collision effects. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `FamiliarVariant` provided. * @@ -72,7 +85,13 @@ export enum ModCallbackRepentogon { * A modified version of `ModCallback.PRE_NPC_COLLISION`. This callback now allows an interface to * be returned to further modify the collision behavior. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision and prevent collision effects from being ran. Return + * `false` to allow the collision but prevent collision effects from being ran. Alternatively, + * return an object with any of the following optional fields to modify the collision behavior: + * - `Collide`: Whether the familiar should collide with the collider. + * - `SkipCollisionEffects`: Whether to skip running collision effects. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `EntityType` provided. * @@ -90,7 +109,13 @@ export enum ModCallbackRepentogon { * A modified version of `ModCallback.PRE_PLAYER_COLLISION`. This callback now allows an interface * to be returned to further modify the collision behavior. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision and prevent collision effects from being ran. Return + * `false` to allow the collision but prevent collision effects from being ran. Alternatively, + * return an object with any of the following optional fields to modify the collision behavior: + * - `Collide`: Whether the familiar should collide with the collider. + * - `SkipCollisionEffects`: Whether to skip running collision effects. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerVariant` provided. * @@ -104,11 +129,50 @@ export enum ModCallbackRepentogon { */ PRE_PLAYER_COLLISION = 33, + /** + * A modified version of `ModCallback.POST_PICKUP_SELECTION`. This callback now provides the + * requested Variant and requested SubType. + * + * Internally, the game always attempts to randomize the spawned pickup's Variant and SubType, + * even when re-entering an already visited room, however there are checks in place to make sure + * that randomization only occurs if either of these values are initially set to 0. Therefore, you + * should always check to see if `requestedVariant` is equal to `PickupVariant.NULL` or + * `requestedSubType` is equal to `0`. + * + * When `requestedVariant` is equal to `PickupVariant.NULL`, the game will randomize both the + * Variant and SubType of the pickup. In this case, the value of `requestedSubType` is used as a + * variant blacklist. + * + * Return an array to modify the pickup selected. If the third element is set to true, the + * callback will replace the chosen Variant and SubType and continue running, allowing for other + * mods to modify the selection as well. + * + * You cannot filter this callback. + * + * ```ts + * function postPickupSelection( + * pickup: EntityPickup, + * variant: PickupVariant, + * subType: int | NullPickupSubType, + * requestedVariant: PickupVariant, + * requestedSubType: int, + * rng: RNG, + * ): [pickupVariant: PickupVariant, subType: int, continueSelection?: boolean] | undefined {} + * ``` + */ + POST_PICKUP_SELECTION = 37, + /** * A modified version of `ModCallback.PRE_PICKUP_COLLISION`. This callback now allows an interface * to be returned to further modify the collision behavior. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision and prevent collision effects from being ran. Return + * `false` to allow the collision but prevent collision effects from being ran. Alternatively, + * return an object with any of the following optional fields to modify the collision behavior: + * - `Collide`: Whether the familiar should collide with the collider. + * - `SkipCollisionEffects`: Whether to skip running collision effects. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PickupVariant` provided. * @@ -126,7 +190,13 @@ export enum ModCallbackRepentogon { * A modified version of `ModCallback.PRE_TEAR_COLLISION`. This callback now allows an interface * to be returned to further modify the collision behavior. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision and prevent collision effects from being ran. Return + * `false` to allow the collision but prevent collision effects from being ran. Alternatively, + * return an object with any of the following optional fields to modify the collision behavior: + * - `Collide`: Whether the familiar should collide with the collider. + * - `SkipCollisionEffects`: Whether to skip running collision effects. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `TearVariant` provided. * @@ -144,7 +214,13 @@ export enum ModCallbackRepentogon { * A modified version of `ModCallback.PRE_PROJECTILE_COLLISION`. This callback now allows an * interface to be returned to further modify the collision behavior. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision and prevent collision effects from being ran. Return + * `false` to allow the collision but prevent collision effects from being ran. Alternatively, + * return an object with any of the following optional fields to modify the collision behavior: + * - `Collide`: Whether the familiar should collide with the collider. + * - `SkipCollisionEffects`: Whether to skip running collision effects. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `ProjectileVariant` provided. * @@ -162,7 +238,13 @@ export enum ModCallbackRepentogon { * A modified version of `ModCallback.PRE_KNIFE_COLLISION`. This callback now allows an interface * to be returned to further modify the collision behavior. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision and prevent collision effects from being ran. Return + * `false` to allow the collision but prevent collision effects from being ran. Alternatively, + * return an object with any of the following optional fields to modify the collision behavior: + * - `Collide`: Whether the familiar should collide with the collider. + * - `SkipCollisionEffects`: Whether to skip running collision effects. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `KnifeVariant` provided. * @@ -180,7 +262,13 @@ export enum ModCallbackRepentogon { * A modified version of `ModCallback.PRE_BOMB_COLLISION`. This callback now allows an interface * to be returned to further modify the collision behavior. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision and prevent collision effects from being ran. Return + * `false` to allow the collision but prevent collision effects from being ran. Alternatively, + * return an object with any of the following optional fields to modify the collision behavior: + * - `Collide`: Whether the familiar should collide with the collider. + * - `SkipCollisionEffects`: Whether to skip running collision effects. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `BombVariant` provided. * @@ -195,7 +283,33 @@ export enum ModCallbackRepentogon { PRE_BOMB_COLLISION = 60, /** - * When registering this callback with the `Mod.AddCallback` method: + * A modified version of `ModCallback.POST_ENTITY_KILL`. This callback now provides an `EntityRef` + * of whoever killed the entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogonRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `EntityType` provided. + * + * ```ts + * function postEntityKill(entity: Entity, source: EntityRef): void {} + * ``` + */ + POST_ENTITY_KILL = 68, + + /** + * Fires before a collectible is added to the player's inventory. + * + * Return `CollectibleType` to override the collectible added. Alternatively, return `false` to + * prevent the collectible from being added. Alternatively, return an array with the following + * elements to override the collectible added: + * - `collectibleType`: Overrides the collectible that will be added. + * - `charge`: Overrides the charge of the collectible that will be added. + * - `firstTime`: Overrides whether the collectible is being added for the first time. + * - `slot`: Overrides the active slot the collectible will be added to. + * - `varData`: Overrides the `VarData` of the collectible that will be added. + * - `player`: Overrides the player the collectible will be added to. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `CollectibleType` provided. * @@ -209,14 +323,14 @@ export enum ModCallbackRepentogon { * player: EntityPlayer, * ): * | boolean - * | { - * Type?: CollectibleType; - * Charge?: int; - * FirstTime?: boolean; - * Slot?: ActiveSlot; - * VarData?: int; - * Player?: EntityPlayer; - * } + * | [ + * collectibleType?: CollectibleType; + * charge?: int; + * firstTime?: boolean; + * slot?: ActiveSlot; + * varData?: int; + * player?: EntityPlayer; + * ] * | CollectibleType * | undefined {} * ``` @@ -224,10 +338,12 @@ export enum ModCallbackRepentogon { PRE_ADD_COLLECTIBLE = 1004, /** + * Fires after a collectible has been added to the player's inventory. + * * Use this over Isaacscript-Common's `ModCallbackCustom.POST_PLAYER_COLLECTIBLE_ADDED` callback * as this is a lot more optimized. * - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `CollectibleType` provided. * @@ -245,7 +361,9 @@ export enum ModCallbackRepentogon { POST_ADD_COLLECTIBLE = 1005, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after an entity takes damage. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `EntityType` provided. * @@ -261,7 +379,13 @@ export enum ModCallbackRepentogon { POST_ENTITY_TAKE_DMG = 1006, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before `ModCallback.ENTITY_TAKE_DMG` regardless if the player is considered invincible or + * has items such as Holy Mantle. This callback can be used to give player invincibility that + * takes precedence over other damage negation effects, such as Holy Mantle. + * + * Return false to prevent the damage from being applied. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerVariant` provided. * @@ -278,7 +402,13 @@ export enum ModCallbackRepentogon { PRE_PLAYER_TAKE_DMG = 1008, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before hearts are added to the player. `optionalArg` is reserved for certain + * `Add(...)Hearts` functions, such as the `ignoreKeeper` argument for + * `EntityPlayer.AddMaxHearts`. + * + * Return an integer to override the amount of hearts added. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `AddHealthTypeFlag` provided. * @@ -294,7 +424,11 @@ export enum ModCallbackRepentogon { PRE_PLAYER_ADD_HEARTS = 1009, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after hearts are added to the player. `optionalArg` is reserved for certain + * `Add(...)Hearts` functions, such as the `ignoreKeeper` argument for + * `EntityPlayer.AddMaxHearts`. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `AddHealthTypeFlag` provided. * @@ -310,7 +444,10 @@ export enum ModCallbackRepentogon { POST_PLAYER_ADD_HEARTS = 1010, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a rock is destroyed. `source` can be undefined if `GridEntity.Destroy` is called + * instead of `GridEntity.DestroyWithSource`. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -318,14 +455,19 @@ export enum ModCallbackRepentogon { * function postGridRockDestroy( * rock: GridEntityRock, * gridEntityType: GridEntityType, - * immediate: boolean + * immediate: boolean, + * source: EntityRef | undefined * ): void {} * ``` */ POST_GRID_ROCK_DESTROY = 1011, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a `GridEntity` attempts to inflict damage on an entity. + * + * Return false to prevent the damage from being applied. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -333,17 +475,20 @@ export enum ModCallbackRepentogon { * function preGridHurtDamage( * gridEntity: GridEntity, * entity: Entity, - * damageAmount: number, + * playerDamageAmount: number, * damageFlags: BitFlags, - * unknownFloat: float, - * unknownBoolean: boolean + * damageAmount: float, + * ignoreGridCollisionClass: boolean * ): boolean | undefined {} * ``` */ PRE_GRID_HURT_DAMAGE = 1012, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a `GridEntity` has attempted to inflict damage on an entity. This does not + * guarantee that the entity actually took damage, such as if the player is currently invincible. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -351,15 +496,68 @@ export enum ModCallbackRepentogon { * function postGridHurtDamage( * gridEntity: GridEntity, * entity: Entity, - * damageAmount: number, + * playerDamageAmount: number, * damageFlags: BitFlags, - * unknownFloat: number, - * unknownBoolean: boolean + * damageAmount: number, + * ignoreGridCollisionClass: boolean * ): void {} * ``` */ POST_GRID_HURT_DAMAGE = 1013, + /** + * Fires before a trinket is added to the player. + * + * Return false to prevent the trinket from being added. Alternatively, return `TrinketType` to + * override the trinket added. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `TrinketType` provided. + * + * ```ts + * function preAddTrinket( + * player: EntityPlayer, + * trinket: TrinketType, + * firstTime: boolean + * ): TrinketType | boolean | undefined {} + * ``` + */ + PRE_ADD_TRINKET = 1014, + + /** + * Fires before a pickup is added to the player's Bag of Crafting. + * + * Return false to prevent the pickup from being added. Alternatively, return an array of + * `BagOfCraftingPickup` to override the pickup(s) added. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `PickupVariant` provided. + * + * ```ts + * function preAddToBagOfCrafting( + * player: EntityPlayer, + * pickup: EntityPickup, + * bagOfCraftingPickups: readonly BagOfCraftingPickup[] + * ): BagOfCraftingPickup[] | boolean | undefined {} + * ``` + */ + PRE_ADD_TO_BAG_OF_CRAFTING = 1015, + + /** + * Fires after a pickup is added to the player's Bag of Crafting. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `PickupVariant` provided. + * + * ```ts + * function postAddToBagOfCrafting(player: EntityPlayer, pickup: EntityPickup): void {} + * ``` + */ + POST_ADD_TO_BAG_OF_CRAFTING = 1016, + /** * You cannot filter this callback. * @@ -388,6 +586,8 @@ export enum ModCallbackRepentogon { PRE_HUD_RENDER = 1022, /** + * Fires each time the main menu renders on the screen. + * * You cannot filter this callback. * * ```ts @@ -406,25 +606,67 @@ export enum ModCallbackRepentogon { POST_HUD_RENDER = 1024, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when a split tear is fired. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `SplitTearType` or string provided. + * + * ```ts + * function postFireSplitTear( + * tear: EntityTear, + * source: Entity, + * splitType: SplitTearType | string + * ): void {} + * ``` + */ + POST_FIRE_SPLIT_TEAR = 1025, + + /** + * Fires before a sound effect is played. + * + * Return a `SoundEffect` to override the sound being played. Alternatively, return false to + * prevent the sound from being played. Alternatively, return an array with the following elements + * to modify the sound being played: + * - `sound`: Overrides the sound effect being played. + * - `volume`: Overrides the volume of the sound effect being played. + * - `frameDelay`: Overrides the frame delay of the sound effect being played. + * - `loop`: Overrides whether the sound effect should loop. + * - `pitch`: Overrides the pitch of the sound effect being played. + * - `pan`: Overrides the pan of the sound effect being played. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `SoundEffect` provided. * * ```ts - * function preSFXPlay( + * function preSFXPlay( * sound: SoundEffect, * volume: number, * frameDelay: int, * loop: boolean, * pitch: number, - * pan: number - * ): SoundEffect | [SoundEffect, number, int, boolean, number, number] | boolean | undefined {} + * pan: number, + * ): + * | SoundEffect + * | [ + * sound?: SoundEffect, + * volume?: number, + * frameDelay?: int, + * loop?: boolean, + * pitch?: number, + * pan?: number, + * ] + * | boolean + * | undefined {} * ``` */ PRE_SFX_PLAY = 1030, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a sound effect is played. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `SoundEffect` provided. * @@ -442,7 +684,9 @@ export enum ModCallbackRepentogon { POST_SFX_PLAY = 1031, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a projectile is destroyed. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `ProjectileVariant` provided. * @@ -453,7 +697,9 @@ export enum ModCallbackRepentogon { POST_PROJECTILE_DEATH = 1032, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a tear is destroyed. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `TearVariant` provided. * @@ -464,7 +710,16 @@ export enum ModCallbackRepentogon { POST_TEAR_DEATH = 1033, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before music is played. This callback is fired for both `MusicManager.Play` and + * `MusicManager.Crossfade`. To distinguish the source, use the `isFade` parameter. + * + * Return `Music` to override the music being played. Alternatively, return `false` to prevent the + * music from being played. Alternatively, return an array with the following elements to modify + * the music being played: + * - `music`: Overrides the music being played. + * - `volumeOrFadeRate`: Overrides the volume or fade rate of the music being played. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `Music` provided. * @@ -473,24 +728,36 @@ export enum ModCallbackRepentogon { * music: Music, * volumeOrFadeRate: float, * isFade: boolean - * ): Music | { ID?: Music, Volume?: float, FadeRate?: float } | boolean | undefined {} + * ): Music | [music?: Music, volumeOrFadeRate?: number] | boolean | undefined {} * ``` */ PRE_MUSIC_PLAY = 1034, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the combat layer of the playing music is toggled. This only fires for + * `MusicManager.EnableLayer` and not when the combat layer is automatically enabled in rooms with + * a lot of enemies. + * + * Return `true` to enable the combat layer. Alternatively, return `false` to disable the combat + * layer. Alternatively, return an integer to override the ID of the layer. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `Music` provided. + * matches the integer provided. * * ```ts - * function preMusicLayerToggle(music: Music, enabled: boolean): boolean | Music | undefined {} + * function preMusicLayerToggle(layerID: int, enabled: boolean): boolean | int | undefined {} * ``` */ PRE_MUSIC_LAYER_TOGGLE = 1035, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the player's head is rendered. + * + * Return false to prevent the head from being rendered. Alternatively, return a `Vector` to + * modify the render position of the head. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerType` provided. * @@ -504,7 +771,12 @@ export enum ModCallbackRepentogon { PRE_RENDER_PLAYER_HEAD = 1038, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the player's body is rendered. + * + * Return false to prevent the body from being rendered. Alternatively, return a `Vector` to + * modify the render position of the body. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerType` provided. * @@ -518,6 +790,10 @@ export enum ModCallbackRepentogon { PRE_RENDER_PLAYER_BODY = 1039, /** + * Fires before an entity is thrown by a player. + * + * Return a `Vector` to override the velocity of the thrown entity. + * * You cannot filter this callback. * * ```ts @@ -531,6 +807,8 @@ export enum ModCallbackRepentogon { PRE_ENTITY_THROW = 1040, /** + * Fires after an entity is thrown by a player. + * * You cannot filter this callback. * * ```ts @@ -544,7 +822,7 @@ export enum ModCallbackRepentogon { POST_ENTITY_THROW = 1041, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerType` provided. * @@ -555,7 +833,8 @@ export enum ModCallbackRepentogon { POST_PLAYER_INIT_LEVEL_STATS = 1042, /** - * You cannot filter this callback. + * Fires before the current room is unloaded from being exited. `newLevel` is set to `true` when + * entering a new level or exiting the run. * * ```ts * function preRoomExit(player: EntityPlayer, newLevel: boolean): void {} @@ -564,48 +843,98 @@ export enum ModCallbackRepentogon { PRE_ROOM_EXIT = 1043, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after all entities and grid entities in the room have been rendered, but before effects + * like overlays, shockwaves, and the mirror world shaders are applied. Rendering done in this + * callback is also preserved in room transition animations. + * + * You cannot filter this callback. + * + * ```ts + * function postRoomRenderEntities(): void {} + * ``` + */ + POST_ROOM_RENDER_ENTITIES = 1044, + + /** + * Fires before the completion mark is set. Return `false` to prevent it from being set. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerType` provided. * * ```ts - * function preCompletionMarkGet( + * function preCompletionMarkSet( * completion: CompletionType, * playerType: PlayerType * ): boolean | undefined {} + * ``` */ - PRE_COMPLETION_MARK_GET = 1047, + PRE_COMPLETION_MARK_SET = 1047, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after the completion mark is set. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerType` provided. * * ```ts - * function postCompletionMarkGet(completion: CompletionType, playerType: PlayerType): void {} + * function postCompletionMarkSet(completion: CompletionType, playerType: PlayerType): void {} + * ``` */ - POST_COMPLETION_MARK_GET = 1048, + POST_COMPLETION_MARK_SET = 1048, /** + * Fires before a completion event is recorded, such as when defeating an end boss or unlocking a + * tainted character. + * + * Return `CompletionType` to override the completion event. Alternatively, return `false` to + * prevent the completion event from being recorded. Cancelling it will also prevent all marks and + * completion event related stuff to trigger for all players. + * * You cannot filter this callback. * * ```ts - * function preCompletionEvent(completion: CompletionType): boolean | undefined {} + * function preCompletionEvent(completion: CompletionType): boolean | CompletionType | undefined {} * ``` */ PRE_COMPLETION_EVENT = 1049, /** + * Fires before the game checks for vanilla revive effects like 1UP before determining whether to + * show the game over screen. + * + * Return `false` or call `EntityPlayer.Revive` to cancel the death, reviving the player in-place + * with half a heart. + * + * Returning `false` or calling `EntityPlayer.Revive` may remove the current run's ability to + * save. This occurs because the game immediately deletes the run save during the death animation + * if there's no pending revives. In order to prevent this, only attempt to revive the player if + * they have an item or effect with REPENTOGON's "revive" custom tag, which allows the item/effect + * to count as an extra life on the HUD. + * * You cannot filter this callback. * * ```ts * function preTriggerPlayerDeath(player: EntityPlayer): boolean | undefined {} * ``` + * + * @see https://repentogon.com/xml/items.html */ PRE_TRIGGER_PLAYER_DEATH = 1050, /** - * You cannot filter this callback. + * Fires after the game checks for vanilla revive effects like 1UP before determining whether to + * show the game over screen. + * + * Return `false` or call `EntityPlayer.Revive` to cancel the death, reviving the player in-place + * with half a heart. + * + * Returning `false` or calling `EntityPlayer.Revive` may remove the current run's ability to + * save. This occurs because the game immediately deletes the run save during the death animation + * if there's no pending revives. In order to prevent this, only attempt to revive the player if + * they have an item or effect with REPENTOGON's "revive" custom tag, which allows the item/effect + * to count as an extra life on the HUD. * * ```ts * function triggerPlayerDeathPostCheckRevives(player: EntityPlayer): boolean | undefined {} @@ -614,6 +943,20 @@ export enum ModCallbackRepentogon { TRIGGER_PLAYER_DEATH_POST_CHECK_REVIVES = 1051, /** + * Fires before a completion event is recorded, such as when defeating an end boss or unlocking a + * tainted character. + * + * You cannot filter this callback. + * + * ```ts + * function postCompletionEvent(completion: CompletionType): void {} + * ``` + */ + POST_COMPLETION_EVENT = 1052, + + /** + * Fires before a level is initialized. + * * You cannot filter this callback. * * ```ts @@ -637,7 +980,9 @@ export enum ModCallbackRepentogon { PRE_CHANGE_ROOM = 1061, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a player purchased a pickup from a shop. This also fires for Devil Deals taken. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PickupVariant` provided. * @@ -648,18 +993,28 @@ export enum ModCallbackRepentogon { POST_PICKUP_SHOP_PURCHASE = 1062, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when `EntityFamiliar.GetFollowerPriority` is called. + * + * Return `FollowerPriority` or an integer to override the priority of the familiar. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `FamiliarVariant` provided. * * ```ts - * function getFollowerPriority(familiar: EntityFamiliar): FollowerPriority | undefined {} + * function getFollowerPriority(familiar: EntityFamiliar): FollowerPriority | | int | undefined {} * ``` */ GET_FOLLOWER_PRIORITY = 1063, /** - * You cannot filter this callback. + * Fires before a card is used. + * + * Return `true` to prevent the card from being used. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `CardType` provided. * * ```ts * function preUseCard( @@ -672,7 +1027,13 @@ export enum ModCallbackRepentogon { PRE_USE_CARD = 1064, /** - * You cannot filter this callback. + * Fires before a pill is used. + * + * Return `true` to prevent the pill from being used. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `PillEffect` provided. * * ```ts * function preUsePill( @@ -686,7 +1047,11 @@ export enum ModCallbackRepentogon { PRE_USE_PILL = 1065, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the price of a shop item is set. + * + * Return an integer or `PickupPrice` to override the price of the shop item. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PickupVariant` provided. * @@ -696,23 +1061,36 @@ export enum ModCallbackRepentogon { * pickupSubType: int, * shopItemID: int, * price: int - * ): int | undefined {} + * ): int | PickupPrice | undefined {} * ``` */ GET_SHOP_ITEM_PRICE = 1066, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when `EntityPlayer.GetHealthType` is called. + * + * This callback is usually not efficient. For setting the player's default health type, prefer to + * set their `healthtype` in `players.xml`. For items, use the `healthtype` custom cache in + * `items.xml`. + * + * Return `HealthType` to override the player's health type. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerType` provided. * * ```ts * function getPlayerHealthType(player: EntityPlayer): HealthType | undefined {} * ``` + * + * @see https://repentogon.com/xml/players.html + * @see https://repentogon.com/xml/items.html */ GET_PLAYER_HEALTH_TYPE = 1067, /** + * Fires before room clear effects are triggered. + * * You cannot filter this callback. * * ```ts @@ -722,6 +1100,29 @@ export enum ModCallbackRepentogon { PRE_ROOM_TRIGGER_CLEAR = 1068, /** + * Fires before room clear effects are triggered for a specific player. + * + * Return `false` to cancel the effects. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `PlayerVariant` provided. + * + * ```ts + * function postPlayerTriggerRoomClear(player: EntityPlayer): boolean | undefined {} + * ``` + */ + PRE_PLAYER_TRIGGER_ROOM_CLEAR = 1069, + + /** + * Fires before a shop is restocked from effects such as the Restock collectible or restock + * machines. + * + * This callback is called for both `Room.ShopRestockFull` and `Room.ShopRestockPartial`. Use the + * `partial` parameter to distinguish between the two. + * + * Return `false` to cancel the restock. + * * You cannot filter this callback. * * ```ts @@ -731,6 +1132,12 @@ export enum ModCallbackRepentogon { PRE_RESTOCK_SHOP = 1070, /** + * Fires after a shop is restocked from effects such as the Restock collectible or restock + * machines. + * + * This callback is called for both `Room.ShopRestockFull` and `Room.ShopRestockPartial`. Use the + * `partial` parameter to distinguish between the two. + * * You cannot filter this callback. * * ```ts @@ -740,7 +1147,11 @@ export enum ModCallbackRepentogon { POST_RESTOCK_SHOP = 1071, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when `EntityPlayer.GetActiveMaxCharge` is called. + * + * Return an integer to override the maximum charge of the active item. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `CollectibleType` provided. * @@ -748,14 +1159,22 @@ export enum ModCallbackRepentogon { * function getActiveMaxCharge( * collectible: CollectibleType, * player: EntityPlayer, - * varData: int + * varData: int, + * currentMaxCharges: int * ): int | undefined {} * ``` */ GET_ACTIVE_MAX_CHARGE = 1072, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when `EntityPlayer.GetActiveMinUsableCharge` is called. + * + * The minimum usable charge are the minimum charges required to use an active item. If the item + * has the minimum amount of charge, it'll also show the white outline. + * + * Return an integer to override the minimum usable charge of the active item. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `CollectibleType` provided. * @@ -763,13 +1182,21 @@ export enum ModCallbackRepentogon { * function getActiveMinUsableCharge( * slot: ActiveSlot, * player: EntityPlayer, + * currentMinUsableCharge: int, * ): int | undefined {} * ``` */ GET_ACTIVE_MIN_USABLE_CHARGE = 1073, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when `EntityPlayer.GetHeartLimit` is called. + * + * Return an integer to override the heart limit of the player. + * + * While you can set the limit to any arbitrary amount, the game can only render up to 4 lines of + * hearts in the HUD. However, hearts not being rendered in the HUD will still function normally. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerType` provided. * @@ -784,18 +1211,25 @@ export enum ModCallbackRepentogon { GET_PLAYER_HEART_LIMIT = 1074, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when the Giantbook animation updates. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GiantbookType` provided. * * ```ts - * function postItemOverlayUpdate(): void {} + * function postItemOverlayUpdate(giantbookID: GiantbookType, skipAnimation: boolean): void {} * ``` */ POST_ITEM_OVERLAY_UPDATE = 1075, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the 1076 plays. + * + * Return `GiantbookType` to override the Giantbook being shown. Alternatively, return `true` to + * prevent the animation from playing. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GiantbookType` provided. * @@ -810,7 +1244,7 @@ export enum ModCallbackRepentogon { PRE_ITEM_OVERLAY_SHOW = 1076, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerType` provided. * @@ -821,34 +1255,51 @@ export enum ModCallbackRepentogon { POST_PLAYER_NEW_ROOM_TEMP_EFFECTS = 1077, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerType` provided. * * ```ts - * function postPlayerNewLevel(player: EntityPlayer): void {} + * function postPlayerNewLevel( + * player: EntityPlayer, + * fromPlayerUpdate: boolean, + * postLevelInitFinished: boolean + * ): void {} * ``` */ POST_PLAYER_NEW_LEVEL = 1078, /** - * You cannot filter this callback. + * Fires after an active item is rendered on the player's HUD. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `CollectibleType` provided. * * ```ts * function postPlayerHUDRenderActiveItem( * player: EntityPlayer, * slot: ActiveSlot, - * offset: Vector, + * position: Vector, * alpha: float, * scale: float, - * chargeBarOffset: Vector + * chargeBarPosition: Vector * ): void {} * ``` */ POST_PLAYER_HUD_RENDER_ACTIVE_ITEM = 1079, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a familiar is rendered. + * + * Return a `Vector` to modify the render offset. Alternatively, return `false` to prevent the + * familiar from being rendered. + * + * Preventing a familiar from being rendered doesn't prevent the familiar's shadow from being + * rendered. To prevent this, call `Entity.SetShadowSize(0)` in + * `ModCallback.POST_FAMILIAR_UPDATE`. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `FamiliarVariant` provided. * @@ -862,7 +1313,15 @@ export enum ModCallbackRepentogon { PRE_FAMILIAR_RENDER = 1080, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a NPC is rendered. + * + * Return a `Vector` to modify the render offset. Alternatively, return `false` to prevent the NPC + * from being rendered. + * + * Preventing a NPC from being rendered doesn't prevent the NPC's shadow from being rendered. To + * prevent this, call `Entity.SetShadowSize(0)` in `ModCallback.POST_NPC_UPDATE`. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `EntityType` provided. * @@ -873,7 +1332,16 @@ export enum ModCallbackRepentogon { PRE_NPC_RENDER = 1081, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a player is rendered. + * + * Return a `Vector` to modify the render offset. Alternatively, return `false` to prevent the + * player from being rendered. + * + * Preventing a player from being rendered doesn't prevent the player's shadow from being + * rendered. To prevent this, call `Entity.SetShadowSize(0)` in + * `ModCallbackCustom.POST_PLAYER_UPDATE_REORDERED`. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerVariant` provided. * @@ -884,7 +1352,15 @@ export enum ModCallbackRepentogon { PRE_PLAYER_RENDER = 1082, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a pickup is rendered. + * + * Return a `Vector` to modify the render offset. Alternatively, return `false` to prevent the + * pickup from being rendered. + * + * Preventing a pickup from being rendered doesn't prevent the pickup's shadow from being + * rendered. To prevent this, call `Entity.SetShadowSize(0)` in `ModCallback.POST_PICKUP_UPDATE`. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PickupVariant` provided. * @@ -895,7 +1371,15 @@ export enum ModCallbackRepentogon { PRE_PICKUP_RENDER = 1083, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a tear is rendered. + * + * Return a `Vector` to modify the render offset. Alternatively, return `false` to prevent the + * tear from being rendered. + * + * Preventing a tear from being rendered doesn't prevent the tear's shadow from being rendered. To + * prevent this, call `Entity.SetShadowSize(0)` in `ModCallback.POST_TEAR_UPDATE`. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `TearVariant` provided. * @@ -906,9 +1390,18 @@ export enum ModCallbackRepentogon { PRE_TEAR_RENDER = 1084, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a projectile is rendered. + * + * Return a `Vector` to modify the render offset. Alternatively, return `false` to prevent the + * projectile from being rendered. + * + * Preventing a projectile from being rendered doesn't prevent the projectile's shadow from being + * rendered. To prevent this, call `Entity.SetShadowSize(0)` in + * `ModCallback.POST_PROJECTILE_UPDATE`. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `KnifeVariant` provided. + * matches the `ProjectileVariant` provided. * * ```ts * function preProjectileRender( @@ -920,7 +1413,15 @@ export enum ModCallbackRepentogon { PRE_PROJECTILE_RENDER = 1085, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a knife is rendered. + * + * Return a `Vector` to modify the render offset. Alternatively, return `false` to prevent the + * knife from being rendered. + * + * Preventing a knife from being rendered doesn't prevent the knife's shadow from being rendered. + * To prevent this, call `Entity.SetShadowSize(0)` in `ModCallback.POST_KNIFE_UPDATE`. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `KnifeVariant` provided. * @@ -931,7 +1432,15 @@ export enum ModCallbackRepentogon { PRE_KNIFE_RENDER = 1086, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before an effect is rendered. + * + * Return a `Vector` to modify the render offset. Alternatively, return `false` to prevent the + * effect from being rendered. + * + * Preventing a effect from being rendered doesn't prevent the effect's shadow from being + * rendered. To prevent this, call `Entity.SetShadowSize(0)` in `ModCallback.POST_EFFECT_UPDATE`. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `EffectVariant` provided. * @@ -942,7 +1451,15 @@ export enum ModCallbackRepentogon { PRE_EFFECT_RENDER = 1087, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a bomb is rendered. + * + * Return a `Vector` to modify the render offset. Alternatively, return `false` to prevent the + * bomb from being rendered. + * + * Preventing a bomb from being rendered doesn't prevent the bomb's shadow from being rendered. To + * prevent this, call `Entity.SetShadowSize(0)` in `ModCallback.POST_BOMB_UPDATE`. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `BombVariant` provided. * @@ -953,7 +1470,15 @@ export enum ModCallbackRepentogon { PRE_BOMB_RENDER = 1088, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before an `EntitySlot` is rendered. + * + * Return a `Vector` to modify the render offset. Alternatively, return `false` to prevent the + * slot from being rendered. + * + * Preventing a slot from being rendered doesn't prevent the slot's shadow from being rendered. To + * prevent this, call `Entity.SetShadowSize(0)` in `ModCallback.POST_SLOT_UPDATE`. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `SlotVariant` provided. * @@ -964,7 +1489,9 @@ export enum ModCallbackRepentogon { PRE_SLOT_RENDER = 1089, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after an `EntitySlot` is rendered. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `SlotVariant` provided. * @@ -975,6 +1502,8 @@ export enum ModCallbackRepentogon { POST_SLOT_RENDER = 1090, /** + * Fires after the player's hearts are rendered on the HUD. + * * You cannot filter this callback. * * ```ts @@ -982,7 +1511,7 @@ export enum ModCallbackRepentogon { * offset: Vector, * heartsSprite: Sprite, * position: Vector, - * unknown: float, + * spriteScale: float, * player: EntityPlayer * ): void {} * ``` @@ -1004,7 +1533,12 @@ export enum ModCallbackRepentogon { PRE_PLAYER_APPLY_INNATE_COLLECTIBLE_NUMBER = 1092, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a jingle plays. + * + * Return `Music` to override the jingle being played. Alternatively, return `false` to prevent + * the jingle from playing. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `Music` provided. * @@ -1015,18 +1549,26 @@ export enum ModCallbackRepentogon { PRE_MUSIC_PLAY_JINGLE = 1094, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a collectible has been removed from a player. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `CollectibleType` provided. * * ```ts - * function postCollectibleRemoved(player: EntityPlayer, collectible: CollectibleType): void {} + * function postCollectibleRemoved( + * player: EntityPlayer, + * collectible: CollectibleType, + * removeFromPlayerForm: boolean, wisp: boolean + * ): void {} * ``` */ POST_COLLECTIBLE_REMOVED = 1095, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a trinket has been added to a player. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `TrinketType` provided. * @@ -1041,7 +1583,9 @@ export enum ModCallbackRepentogon { POST_TRINKET_ADDED = 1096, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a trinket has been removed from a player. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `TrinketType` provided. * @@ -1052,7 +1596,9 @@ export enum ModCallbackRepentogon { POST_TRINKET_REMOVED = 1097, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after the a weapon's attack is triggered. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `WeaponType` provided. * @@ -1068,6 +1614,8 @@ export enum ModCallbackRepentogon { POST_TRIGGER_WEAPON_FIRED = 1098, /** + * Fires after the level's layout has been generated. + * * You cannot filter this callback. * * ```ts @@ -1077,7 +1625,21 @@ export enum ModCallbackRepentogon { POST_LEVEL_LAYOUT_GENERATED = 1099, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a grid entity is spawned outside of room initialization. + * + * The `desc` argument is undefined in most cases. The exceptions to this are poops spawned by the + * Mole enemy, grid entities spawned with `Room.TurnGold`, and grid entities spawned via the + * modding API. + * + * Return `false` to prevent the grid entity from spawning. Alternatively, return a + * `GridEntityDesc` to override the grid entity. Alternatively, return an array with the following + * elements to modify it: + * - `Type`: The `GridEntityType` to override. + * - `Variant`: The variant to override. + * - `Vardata`: The vardata to override. + * - `SpawnSeed`: The spawn seed to override. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -1092,14 +1654,16 @@ export enum ModCallbackRepentogon { * ): * | GridEntityDesc * | boolean - * | { Type?: GridEntityType; Variant?: int; Vardata?: int; SpawnSeed?: Seed } + * | [ type?: GridEntityType, variant?: int, vardata?: int, spawnSeed?: Seed ] * | undefined {} * ``` */ PRE_GRID_ENTITY_SPAWN = 1100, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a grid entity has spawned in the room. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -1110,30 +1674,51 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_SPAWN = 1101, /** + * Fires each frame the nightmare scene renders. + * * You cannot filter this callback. * * ```ts - * function postNightmareSceneShow(unknown: boolean): void {} + * function postNightmareSceneRender(): void {} * ``` */ - POST_NIGHTMARE_SCENE_SHOW = 1103, + POST_NIGHTMARE_SCENE_RENDER = 1102, /** + * Fires when the Nightmare Screen first appears on the screen. + * * You cannot filter this callback. * * ```ts - * function preLevelSelect( - * level: LevelStage, - * stageType: StageType - * ): [LevelStage?, StageType?] | undefined {} + * function postNightmareSceneShow(isDogmaNightmare: boolean): void {} * ``` */ - PRE_LEVEL_SELECT = 1104, + POST_NIGHTMARE_SCENE_SHOW = 1103, /** - * When registering this callback with the `Mod.AddCallback` method: - * - You can provide an optional third argument that will make the callback only fire if it - * matches the `WeaponType` provided. + * Fires before the game selects which stage to load, usually when entering a trapdoor. + * + * Return an array with the following elements to override the selected stage: + * - `levelStage`: The `LevelStage` to override. + * - `stageType`: The `StageType` to override. + * + * You cannot filter this callback. + * + * ```ts + * function preLevelSelect( + * levelStage: LevelStage, + * stageType: StageType + * ): [levelStage?: LevelStage, stageType?: StageType] | undefined {} + * ``` + */ + PRE_LEVEL_SELECT = 1104, + + /** + * Fires each frame the weapon updates. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `WeaponType` provided. * * ```ts * function postWeaponFire( @@ -1146,24 +1731,30 @@ export enum ModCallbackRepentogon { POST_WEAPON_FIRE = 1105, /** + * Fires before the walls of the backdrop are rendered. + * * You cannot filter this callback. * * ```ts - * function preBackdropRenderWalls(): void {} + * function preBackdropRenderWalls(wallColor: Color): void {} * ``` */ PRE_BACKDROP_RENDER_WALLS = 1106, /** + * Fires before the floor of the backdrop is rendered. + * * You cannot filter this callback. * * ```ts - * function preBackdropRenderFloor(): void {} + * function preBackdropRenderFloor(floorColor: Color): void {} * ``` */ PRE_BACKDROP_RENDER_FLOOR = 1107, /** + * Fires before the water is rendered. + * * You cannot filter this callback. * * ```ts @@ -1182,6 +1773,13 @@ export enum ModCallbackRepentogon { POST_BACKDROP_PRE_RENDER_WALLS = 1109, /** + * Fires when the game first calculates the chance to spawn a Planetarium by checking if the + * current floor is valid. By default, the game prevents Planetariums from spawning after Chapter + * 3 (or Chapter 4 with Telescope Lens). + * + * Return false to bypass the stage penalty and allow the Planetarium chance to be calculated as + * normal. + * * You cannot filter this callback. * * ```ts @@ -1191,6 +1789,12 @@ export enum ModCallbackRepentogon { PRE_PLANETARIUM_APPLY_STAGE_PENALTY = 1110, /** + * Fires after `ModCallbackRepentogon.PRE_PLANETARIUM_APPLY_STAGE_PENALTY` and when the chance + * penalty is applied. The penalty locks the planetarium chance to 1% (or 10% with Telescope Lens) + * if a Planetarium has been entered before. + * + * Return false to bypass the planetarium chance penalty. + * * You cannot filter this callback. * * ```ts @@ -1200,15 +1804,34 @@ export enum ModCallbackRepentogon { PRE_PLANETARIUM_APPLY_PLANETARIUM_PENALTY = 1111, /** + * Fires after `ModCallbackRepentogon.PRE_PLANETARIUM_APPLY_PLANETARIUM_PENALTY` and when the game + * applies the Treasure Room visit penalty. By default, the game applies a penalty depending on + * how many Treasure Rooms have been visited. If the amount of treasure rooms entered is greater + * than or equal to the current stage number, the chance will be locked at 1% (or 10% with + * Telescope Lens). + * + * Return an integer to override how many Treasure Rooms has been visited. Alternatively, return + * false to bypass the Treasure Room visit penalty. + * * You cannot filter this callback. * * ```ts - * function prePlanetariumApplyTreasureRoomPenalty(): boolean | undefined {} + * function prePlanetariumApplyTreasureRoomPenalty( + * treasureRoomsVisited: int, + * ): boolean | int | undefined {} * ``` */ PRE_PLANETARIUM_APPLY_TREASURE_ROOM_PENALTY = 1112, /** + * Fires after `ModCallbackRepentogon.PRE_PLANETARIUM_APPLY_TREASURE_ROOM_PENALTY` and when the + * game modifies the Planetarium chance from items such as Crystal Ball and Magic 8 Ball. + * + * This callback only applies a flat chance after all penalties have been applied. To modify the + * base chance, use `ModCallbackRepentogon.PRE_PLANETARIUM_APPLY_TELESCOPE_LENS`. + * + * Return a float to modify the chance. + * * You cannot filter this callback. * * ```ts @@ -1218,6 +1841,11 @@ export enum ModCallbackRepentogon { PRE_PLANETARIUM_APPLY_ITEMS = 1113, /** + * Fires after `ModCallbackRepentogon.PRE_PLANETARIUM_APPLY_ITEMS` and when the game calculates + * the additional 9% chance from having Telescope Lens. + * + * Return a float to modify the chance. + * * You cannot filter this callback. * * ```ts @@ -1227,7 +1855,10 @@ export enum ModCallbackRepentogon { PRE_PLANETARIUM_APPLY_TELESCOPE_LENS = 1114, /** - * You cannot filter this callback. + * Fires after `ModCallbackRepentogon.PRE_PLANETARIUM_APPLY_TELESCOPE_LENS` and when the final + * planetarium chance is calculated. + * + * Return a float to modify the final chance. * * ```ts * function prePlanetariumCalculateFinal(chance: float): float | undefined {} @@ -1236,28 +1867,40 @@ export enum ModCallbackRepentogon { PRE_PLANETARIUM_CALCULATE_FINAL = 1115, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a spritesheet is loaded. + * + * Return an array with the following elements to override the replacement: + * - `layerId`: The layer ID to override. + * - `fileName`: The `.png` file to override. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the string provided. * * ```ts - * function preReplaceSpritesheet(layerId: int, fileName: string): [int, string] | undefined {} + * function preReplaceSpritesheet(layerID: int, fileName: string): [layerId?: int, pngFileName?: string] | undefined {} * ``` */ PRE_REPLACE_SPRITESHEET = 1116, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a spritesheet has been loaded. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the string provided. * * ```ts - * function preReplaceSpritesheet(layerId: int, fileName: string): void {} + * function preReplaceSpritesheet(layerID: int, fileName: string): void {} * ``` */ POST_REPLACE_SPRITESHEET = 1117, /** + * Fires before the hearts UI is rendered on the player's HUD. + * + * Return `true` to prevent the hearts from rendering. + * * You cannot filter this callback. * * ```ts @@ -1265,7 +1908,7 @@ export enum ModCallbackRepentogon { * offset: Vector, * heartsSprite: Sprite, * position: Vector, - * unknown: float, + * spriteScale: float, * player: EntityPlayer * ): boolean | undefined {} * ``` @@ -1273,25 +1916,51 @@ export enum ModCallbackRepentogon { PRE_PLAYER_HUD_RENDER_HEARTS = 1118, /** - * You cannot filter this callback. + * Fires before an active item is rendered on the player's HUD. Return true to prevent the item + * from rendering. + * + * Return `true` to prevent the active item from rendering. Alternatively, return an object with + * the following fields to modify how the item renders: + * - `HideItem`: Determines whether the item should be hidden from the active slot or not. + * - `HideOutline`: Determines whether the item outline should be hidden or not. + * - `HideChargeBar`: Determines whether the chargebar should be hidden or not. + * - `CropOffset`: Determines the rectangular area of the active item that will be rendered in the + * active slot. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `CollectibleType` provided. * * ```ts * function prePlayerHudRenderActiveItem( * player: EntityPlayer, * slot: ActiveSlot, - * offset: Vector, + * position: Vector, * alpha: float, * scale: number, - * chargeBarOffset: Vector - * ): boolean | undefined {} + * chargeBarPosition: Vector, + * ): + * | { + * HideItem?: boolean; + * HideOutline?: boolean; + * HideChargeBar?: boolean; + * CropOffset?: Vector; + * } + * | boolean + * | undefined {} * ``` */ PRE_PLAYER_HUD_RENDER_ACTIVE_ITEM = 1119, /** - * This callback will only fire for commands using `AutocompleteType.CUSTOM`. + * Fires whenever a command with its autocomplete type set to `AutocompleteType.CUSTOM` is being + * autocompleted in the console. * - * When registering this callback with the `Mod.AddCallback` method: + * Return an array to determine what is listed in the autocomplete suggestions. Each element can + * be a string, which only shows the name of the suggestion, or an array of two strings, where the + * first element is the name of the suggestion and the second element is the description. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the string provided. * @@ -1299,13 +1968,15 @@ export enum ModCallbackRepentogon { * function consoleAutocomplete( * command: string, * params: string - * ): Array| undefined {} + * ): Array| undefined {} * ``` */ CONSOLE_AUTOCOMPLETE = 1120, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fries after an `EntitySlot` spawns. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `SlotVariant` provided. * @@ -1316,7 +1987,9 @@ export enum ModCallbackRepentogon { POST_SLOT_INIT = 1121, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after an `EntitySlot` updates. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `SlotVariant` provided. * @@ -1327,7 +2000,11 @@ export enum ModCallbackRepentogon { POST_SLOT_UPDATE = 1122, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before an `EntitySlot` spawns random pickups when blown up. + * + * Return `false` to prevent the drops from being created. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `SlotVariant` provided. * @@ -1338,7 +2015,9 @@ export enum ModCallbackRepentogon { PRE_SLOT_CREATE_EXPLOSION_DROPS = 1123, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after an `EntitySlot` spawns random pickups when blown up. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `SlotVariant` provided. * @@ -1349,7 +2028,12 @@ export enum ModCallbackRepentogon { POST_SLOT_CREATE_EXPLOSION_DROPS = 1124, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before an `EntitySlot` sets its prize collectible. This is used by Shell Game, Hell Game, + * and Crane Game. + * + * Return a `CollectibleType` to override the prize collectible. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `SlotVariant` provided. * @@ -1363,7 +2047,10 @@ export enum ModCallbackRepentogon { PRE_SLOT_SET_PRIZE_COLLECTIBLE = 1125, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after an `EntitySlot` sets its prize collectible. This is used by Shell Game, Hell Game, + * and Crane Game. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `SlotVariant` provided. * @@ -1374,7 +2061,7 @@ export enum ModCallbackRepentogon { POST_SLOT_SET_PRIZE_COLLECTIBLE = 1126, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerType` provided. * @@ -1384,6 +2071,29 @@ export enum ModCallbackRepentogon { */ PRE_PLAYER_LEVEL_INIT_STATS = 1127, + /** + * Fires after a player's `HealthType` changes, but before their existing health is corrected to + * fit the new health type. After the callback runs, if the player's new health type doesn't + * support Red Heart containers, they will automatically be converted to an appropriate type. + * + * You may modify the player's health differently within this callback, such as removing the heart + * containers entirely. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `PlayerType` provided. + * + * ```ts + * function postPlayerHealthTypeChange( + * player: EntityPlayer, + * newHealthType: HealthType, + * previousHealthType: HealthType, + * defaultHealthType: HealthType + * ): void {} + * ``` + */ + POST_PLAYER_HEALTH_TYPE_CHANGE = 1128, + /** * You cannot filter this callback. * @@ -1394,6 +2104,11 @@ export enum ModCallbackRepentogon { POST_FORCE_ADD_PILL_EFFECT = 1129, /** + * Fires when the game starts to tally up vanilla items for calculating the chance of Devil and + * Angel Deals. This is called before the stage penalty is applied. + * + * Return a float to modify the chance in this step of the calculation. + * * You cannot filter this callback. * * ```ts @@ -1403,6 +2118,11 @@ export enum ModCallbackRepentogon { PRE_DEVIL_APPLY_ITEMS = 1130, /** + * Fires after `ModCallbackRepentogon.PRE_DEVIL_APPLY_ITEMS` is called and when the game + * calculates the stage penalty if a Devil or Angel Deal has appeared on a previous floor. + * + * Return false to prevent the stage penalty from being applied. + * * You cannot filter this callback. * * ```ts @@ -1412,6 +2132,12 @@ export enum ModCallbackRepentogon { PRE_DEVIL_APPLY_STAGE_PENALTY = 1131, /** + * Fires after `ModCallbackRepentogon.PRE_DEVIL_APPLY_STAGE_PENALTY`is called and when the game + * calculates the chance from items which bypasses the stage penalty such as Goat Head and + * Eucharist. + * + * Return a float to modify the chance in this step of the calculation. + * * You cannot filter this callback. * * ```ts @@ -1421,6 +2147,11 @@ export enum ModCallbackRepentogon { PRE_DEVIL_APPLY_SPECIAL_ITEMS = 1132, /** + * Fires after `ModCallbackRepentogon.PRE_DEVIL_APPLY_SPECIAL_ITEMS`. This is the final step of + * calculating the Devil and Angel Deal chance. + * + * Return a float to modify the final chance. + * * You cannot filter this callback. * * ```ts @@ -1430,7 +2161,9 @@ export enum ModCallbackRepentogon { PRE_DEVIL_CALCULATE_FINAL = 1133, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when a Giantbook begins to play its animation. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GiantbookType` provided. * @@ -1445,6 +2178,8 @@ export enum ModCallbackRepentogon { POST_ITEM_OVERLAY_SHOW = 1134, /** + * Fires before the game begins to render its contents. + * * You cannot filter this callback. * * ```ts @@ -1454,6 +2189,11 @@ export enum ModCallbackRepentogon { PRE_RENDER = 1135, /** + * Fires before a room is placed in the level layout. + * + * Return a `RoomConfigRoom` to override the room being placed. The new `RoomShape` must be the + * same, and the new available door slots must be compatible with the original room doors. + * * You cannot filter this callback. * * ```ts @@ -1467,15 +2207,110 @@ export enum ModCallbackRepentogon { PRE_LEVEL_PLACE_ROOM = 1137, /** + * Fires after room clear effects have been triggered for a specific player. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `PlayerVariant` provided. + * + * ```ts + * function postPlayerTriggerRoomClear(player: EntityPlayer): void {} + * ``` + */ + POST_PLAYER_TRIGGER_ROOM_CLEAR = 1138, + + /** + * Fires each frame after the Giantbook renders on the screen. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `GiantbookType` provided. + * + * ```ts + * function postItemOverlayRender(giantbook: GiantbookType): void {} + * ``` + */ + POST_ITEM_OVERLAY_RENDER = 1139, + + /** + * Fires after an active item has been discharged. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `CollectibleType` provided. + * + * ```ts + * function postDischargeActiveItem( + * collectible: CollectibleType, + * collectibleRemoved: boolean, + * player: EntityPlayer, + * slot: ActiveSlot + * ): void {} + * ``` + */ + POST_DISCHARGE_ACTIVE_ITEM = 1140, + + /** + * Fires before a backdrop changes. + * + * Return a `BackdropType` to override the backdrop being set. + * * You cannot filter this callback. * * ```ts - * function preBackdropChange(backdrop: BackdropType): BackdropType {} + * function preBackdropChange(backdrop: BackdropType): BackdropType | undefined {} * ``` */ PRE_BACKDROP_CHANGE = 1141, /** + * Fires after a backdrop has changed. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `BackdropType` provided. + * + * ```ts + * function postBackdropChange(backdrop: BackdropType): void {} + * ``` + */ + POST_BACKDROP_CHANGE = 1142, + + /** + * Fires after room clear effects has been triggered. + * + * You cannot filter this callback. + * + * ```ts + * function postRoomTriggerClear(playSound: boolean): void {} + * ``` + */ + POST_ROOM_TRIGGER_CLEAR = 1143, + + /** + * Fires after a player drops a trinket onto the ground from their inventory. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `TrinketType` provided. + * + * ```ts + * function postPlayerDropTrinket( + * trinketType: TrinketType, + * dropPos: Vector, + * player: EntityPlayer, + * isGoldenTrinket: boolean, + * replacedTrinket: boolean + * ): void {} + */ + POST_PLAYER_DROP_TRINKET = 1144, + + /** + * Fires before the lighting alpha is set. + * + * Return a number to modify the lighting alpha. It is recommended to return a value between 0 and + * 1. + * * You cannot filter this callback. * * ```ts @@ -1485,7 +2320,12 @@ export enum ModCallbackRepentogon { PRE_GET_LIGHTING_ALPHA = 1150, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a grid entity's lighting is rendered. + * + * Return a `Vector` to override the render offset. Alternatively, return `false` to prevent the + * lighting from rendering. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -1499,7 +2339,12 @@ export enum ModCallbackRepentogon { PRE_RENDER_GRID_LIGHTING = 1151, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before an entity's lighting is rendered. + * + * Return a `Vector` to override the render offset. Alternatively, return `false` to prevent the + * lighting from rendering. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `EntityType` provided. * @@ -1513,7 +2358,11 @@ export enum ModCallbackRepentogon { PRE_RENDER_ENTITY_LIGHTING = 1152, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the player is updated. + * + * Return `true` to prevent the player from updating, ignoring its internal AI. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerVariant` provided. * @@ -1524,7 +2373,11 @@ export enum ModCallbackRepentogon { PRE_PLAYER_UPDATE = 1160, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the tear is updated. + * + * Return `true` to prevent the tear from updating, ignoring its internal AI. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `TearVariant` provided. * @@ -1535,7 +2388,11 @@ export enum ModCallbackRepentogon { PRE_TEAR_UPDATE = 1161, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the familiar is updated. + * + * Return `true` to prevent the familiar from updating, ignoring its internal AI. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `FamiliarVariant` provided. * @@ -1546,7 +2403,11 @@ export enum ModCallbackRepentogon { PRE_FAMILIAR_UPDATE = 1162, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the bomb is updated. + * + * Return `true` to prevent the bomb from updating, ignoring its internal AI. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `BombVariant` provided. * @@ -1557,29 +2418,41 @@ export enum ModCallbackRepentogon { PRE_BOMB_UPDATE = 1163, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the pickup is updated. + * + * Return `true` to prevent the pickup from updating, ignoring its internal AI. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `KnifeVariant` provided. + * matches the `PickupVariant` provided. * * ```ts - * function preKnifeUpdate(knife: EntityKnife): boolean | undefined {} + * function prePickupUpdate(pickup: EntityPickup): boolean | undefined {} * ``` */ - PRE_KNIFE_UPDATE = 1164, + PRE_PICKUP_UPDATE = 1164, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the knife is updated. + * + * Return `true` to prevent the knife from updating, ignoring its internal AI. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `PickupVariant` provided. + * matches the `KnifeVariant` provided. * * ```ts - * function prePickupUpdate(pickup: EntityPickup): boolean | undefined {} + * function preKnifeUpdate(knife: EntityKnife): boolean | undefined {} * ``` */ - PRE_PICKUP_UPDATE = 1165, + PRE_KNIFE_UPDATE = 1165, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the projectile is updated. + * + * Return `true` to prevent the projectile from updating, ignoring its internal AI. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `ProjectileVariant` provided. * @@ -1590,7 +2463,11 @@ export enum ModCallbackRepentogon { PRE_PROJECTILE_UPDATE = 1166, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the laser is updated. + * + * Return `true` to prevent the laser from updating, ignoring its internal AI. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `LaserVariant` provided. * @@ -1601,7 +2478,11 @@ export enum ModCallbackRepentogon { PRE_LASER_UPDATE = 1167, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the effect is updated. + * + * Return `true` to prevent the effect from updating, ignoring its internal AI. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `EffectVariant` provided. * @@ -1612,7 +2493,11 @@ export enum ModCallbackRepentogon { PRE_EFFECT_UPDATE = 1168, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the `EntitySlot` is updated. + * + * Return `true` to prevent the `EntitySlot` from updating, ignoring its internal AI. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `SlotVariant` provided. * @@ -1623,12 +2508,19 @@ export enum ModCallbackRepentogon { PRE_SLOT_UPDATE = 1169, /** + * Fires before a player collides with a grid entity. + * + * `gridEntity` can be undefined as it's possible for a grid collision to happen if the tile's + * `GridPath` value is >= 1000. + * * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as * this callback offers significantly better performance than the former. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `GridEntityType` provided. + * matches the `PlayerVariant` provided. * * ```ts * function prePlayerGridCollision( @@ -1641,12 +2533,19 @@ export enum ModCallbackRepentogon { PRE_PLAYER_GRID_COLLISION = 1171, /** + * Fires after the player collides with a grid entity. + * + * `gridEntity` can be undefined as it's possible for a grid collision to happen if the tile's + * `GridPath` value is >= 1000. + * * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as * this callback offers significantly better performance than the former. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `GridEntityType` provided. + * matches the `PlayerVariant` provided. * * ```ts * function postPlayerGridCollision( @@ -1659,10 +2558,24 @@ export enum ModCallbackRepentogon { POST_PLAYER_GRID_COLLISION = 1172, /** + * Fires before the tear collides with a grid entity. + * + * `gridEntity` can be undefined as it's possible for a grid collision to happen if the tile's + * `GridPath` value is >= 1000. + * + * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as + * this callback offers significantly better performance than the former. + * + * Return `true` to ignore the collision. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `TearVariant` provided. + * * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as * this callback offers significantly better performance than the former. * - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -1677,12 +2590,26 @@ export enum ModCallbackRepentogon { PRE_TEAR_GRID_COLLISION = 1173, /** + * Fires after the tear collides with a grid entity. + * + * `gridEntity` can be undefined as it's possible for a grid collision to happen if the tile's + * `GridPath` value is >= 1000. + * * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as * this callback offers significantly better performance than the former. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `GridEntityType` provided. + * matches the `TearVariant` provided. + * + * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as + * this callback offers significantly better performance than the former. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `TearVariant` provided. * * ```ts * function postTearGridCollision( @@ -1695,12 +2622,19 @@ export enum ModCallbackRepentogon { POST_TEAR_GRID_COLLISION = 1174, /** + * Fires before the familiar collides with a grid entity. + * + * `gridEntity` can be undefined as it's possible for a grid collision to happen if the tile's + * `GridPath` value is >= 1000. + * * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as * this callback offers significantly better performance than the former. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `GridEntityType` provided. + * matches the `FamiliarVariant` provided. * * ```ts * function preFamiliarGridCollision( @@ -1713,12 +2647,19 @@ export enum ModCallbackRepentogon { PRE_FAMILIAR_GRID_COLLISION = 1175, /** + * Fires after the familiar collides with a grid entity. + * + * `gridEntity` can be undefined as it's possible for a grid collision to happen if the tile's + * `GridPath` value is >= 1000. + * * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as * this callback offers significantly better performance than the former. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `GridEntityType` provided. + * matches the `FamiliarVariant` provided. * * ```ts * function postFamiliarGridCollision( @@ -1731,12 +2672,19 @@ export enum ModCallbackRepentogon { POST_FAMILIAR_GRID_COLLISION = 1176, /** + * Fires before the bomb collides with a grid entity. + * + * `gridEntity` can be undefined as it's possible for a grid collision to happen if the tile's + * `GridPath` value is >= 1000. + * * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as * this callback offers significantly better performance than the former. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `GridEntityType` provided. + * matches the `BombVariant` provided. * * ```ts * function preBombGridCollision( @@ -1749,12 +2697,19 @@ export enum ModCallbackRepentogon { PRE_BOMB_GRID_COLLISION = 1177, /** + * Fires before the bomb collides with a grid entity. + * + * `gridEntity` can be undefined as it's possible for a grid collision to happen if the tile's + * `GridPath` value is >= 1000. + * * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as * this callback offers significantly better performance than the former. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `GridEntityType` provided. + * matches the `BombVariant` provided. * * ```ts * function postBombGridCollision( @@ -1767,12 +2722,19 @@ export enum ModCallbackRepentogon { POST_BOMB_GRID_COLLISION = 1178, /** + * Fires before the pickup collides with a grid entity. + * + * `gridEntity` can be undefined as it's possible for a grid collision to happen if the tile's + * `GridPath` value is >= 1000. + * * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as * this callback offers significantly better performance than the former. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `GridEntityType` provided. + * matches the `PickupVariant` provided. * * ```ts * function prePickupGridCollision( @@ -1785,12 +2747,19 @@ export enum ModCallbackRepentogon { PRE_PICKUP_GRID_COLLISION = 1179, /** + * Fires after the pickup collides with a grid entity. + * + * `gridEntity` can be undefined as it's possible for a grid collision to happen if the tile's + * `GridPath` value is >= 1000. + * * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as * this callback offers significantly better performance than the former. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `GridEntityType` provided. + * matches the `PickupVariant` provided. * * ```ts * function postPickupGridCollision( @@ -1803,12 +2772,19 @@ export enum ModCallbackRepentogon { POST_PICKUP_GRID_COLLISION = 1180, /** + * Fires before the projectile collides with a grid entity. + * + * `gridEntity` can be undefined as it's possible for a grid collision to happen if the tile's + * `GridPath` value is >= 1000. + * * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as * this callback offers significantly better performance than the former. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `GridEntityType` provided. + * matches the `ProjectileVariant` provided. * * ```ts * function preProjectileGridCollision( @@ -1821,12 +2797,19 @@ export enum ModCallbackRepentogon { PRE_PROJECTILE_GRID_COLLISION = 1181, /** + * Fires after the projectile collides with a grid entity. + * + * `gridEntity` can be undefined as it's possible for a grid collision to happen if the tile's + * `GridPath` value is >= 1000. + * * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as * this callback offers significantly better performance than the former. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `GridEntityType` provided. + * matches the `ProjectileVariant` provided. * * ```ts * function postProjectileGridCollision( @@ -1839,12 +2822,19 @@ export enum ModCallbackRepentogon { POST_PROJECTILE_GRID_COLLISION = 1182, /** + * Fires before the NPC collides with a grid entity. + * + * `gridEntity` can be undefined as it's possible for a grid collision to happen if the tile's + * `GridPath` value is >= 1000. + * * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as * this callback offers significantly better performance than the former. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `GridEntityType` provided. + * matches the `EntityType` provided. * * ```ts * function preNPCGridCollision( @@ -1857,12 +2847,19 @@ export enum ModCallbackRepentogon { PRE_NPC_GRID_COLLISION = 1183, /** + * Fires after the NPC collides with a grid entity. + * + * `gridEntity` can be undefined as it's possible for a grid collision to happen if the tile's + * `GridPath` value is >= 1000. + * * Use this over Isaacscript Common's `ModCallbackCustom.POST_GRID_ENTITY_COLLISION` callback as * this callback offers significantly better performance than the former. * - * When registering this callback with the `Mod.AddCallback` method: + * Return `true` to ignore the collision. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it - * matches the `GridEntityType` provided. + * matches the `EntityType` provided. * * ```ts * function postNPCGridCollision( @@ -1875,6 +2872,10 @@ export enum ModCallbackRepentogon { POST_NPC_GRID_COLLISION = 1184, /** + * Fires before the player's active item is morphed from the 'M trinket. Return false to prevent + * the item from being rerolled. Return a `CollectibleType` to override what the item rerolls + * into. + * * You cannot filter this callback. * * ```ts @@ -1887,7 +2888,10 @@ export enum ModCallbackRepentogon { PRE_M_MORPH_ACTIVE = 1190, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before an NPC is split from the Meat Cleaver item effect. Return true to prevent the NPC + * from splitting. NPCs will still take damage from the Meat Cleaver even if you return true. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `EntityType` provided. * @@ -1898,7 +2902,18 @@ export enum ModCallbackRepentogon { PRE_NPC_SPLIT = 1191, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when a grid entity spawns during room initialization. This does not fire for grid + * entities spawned after room initialization or floor decorations. If you wish to modify those, + * use `ModCAllbackRepentogon.PRE_GRID_ENTITY_SPAWN` instead. + * + * Return `false` to prevent the grid entity from spawning. Alternatively, return an array with + * the following fields to modify the grid entity being spawned: + * - `gridType`: The type of grid entity to spawn. + * - `variant`: The variant of the grid entity to spawn. + * - `varData`: The `VarData` of the grid entity to spawn. + * - `spawnSpeed`: The grid entity's spawn seed. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -1908,13 +2923,21 @@ export enum ModCallbackRepentogon { * variant: int, * varData: int, * gridIndex: int, - * spawnSeed: Seed - * ): boolean | [ GridEntityType, int, int, Seed ] | undefined {} + * spawnSeed: Seed, + * ): + * | boolean + * | [gridType?: GridEntityType, variant?: int, varData?: int, spawnSeed?: Seed] + * | undefined {} * ``` */ PRE_ROOM_GRID_ENTITY_SPAWN = 1192, /** + * Fires before a new room is loaded. + * + * While a `room` object is provided, the callback fires before the new room is fully initialized. + * Therefore, many functions may not work as intended and are considered to be unstable. + * * You cannot filter this callback. * * ```ts @@ -1924,6 +2947,10 @@ export enum ModCallbackRepentogon { PRE_NEW_ROOM = 1200, /** + * Fires before the Mega Satan ending cutscene plays, forcibly ending the game. + * + * Return `true` to prevent the ending from occurring, guaranteeing a portal to the Void. + * * You cannot filter this callback. * * ```ts @@ -1933,7 +2960,8 @@ export enum ModCallbackRepentogon { PRE_MEGA_SATAN_ENDING = 1201, /** - * You cannot filter this callback. + * Fires after all mods have their Lua scripts loaded. This is ideal for implementing mod + * compatibility without abusing load order in `metadata.xml`. * * ```ts * function postModsLoaded(): void {} @@ -1942,6 +2970,15 @@ export enum ModCallbackRepentogon { POST_MODS_LOADED = 1210, /** + * Fires before a NPC morphs. + * + * Return `false` to prevent the NPC from morphing. Alternatively, return an array with the + * following elements to override the morph: + * - `entityType`: The new `EntityType` for the NPC. + * - `variant`: The new variant for the NPC. + * - `subType`: The new sub type for the NPC. + * - `championColor`: Optional. The new `ChampionColor` for the NPC. + * * You cannot filter this callback. * * ```ts @@ -1950,13 +2987,32 @@ export enum ModCallbackRepentogon { * entityType: EntityType, * variant: int, * subType: int, - * championColor: ChampionColor - * ): boolean | [ EntityType, int, int, ChampionColor? ] | undefined {} + * championColor: ChampionColor, + * ): + * | boolean + * | [ + * entityType?: EntityType, + * variant?: int, + * subType?: int, + * championColor?: ChampionColor, + * ] + * | undefined {} * ``` */ PRE_NPC_MORPH = 1212, /** + * Fires before a pickup morphs. + * + * Return `false` to prevent the pickup from morphing. Alternatively, return an array with the + * following elements to override the morph: + * - `entityType`: The new `EntityType` for the entity. + * - `variant`: The new variant for the pickup. + * - `subType`: The new sub type for the pickup. + * - `keepPrice`: Optional. Whether to keep the pickup's price. + * - `keepSeed`: Optional. Whether to keep the pickup's `InitSeed`. + * - `ignoreModifiers`: Optional. Whether to ignore the pickup's modifiers when morphing. + * * You cannot filter this callback. * * ```ts @@ -1967,13 +3023,25 @@ export enum ModCallbackRepentogon { * subType: int, * keepPrice: boolean, * keepSeed: boolean, - * ignoreModifiers: boolean - * ): boolean | [ EntityType, int, int, boolean?, boolean?, boolean? ] | undefined {} + * ignoreModifiers: boolean, + * ): + * | boolean + * | [ + * entityType: EntityType, + * variant: int, + * subType: int, + * keepPrice?: boolean, + * keepSeed?: boolean, + * ignoreModifiers?: boolean, + * ] + * | undefined {} * ``` */ PRE_PICKUP_MORPH = 1213, /** + * Fires after a NPC morphs. + * * You cannot filter this callback. * * ```ts @@ -1988,6 +3056,8 @@ export enum ModCallbackRepentogon { POST_NPC_MORPH = 1214, /** + * Fires after a pickup morphs. + * * You cannot filter this callback. * * ```ts @@ -2005,6 +3075,10 @@ export enum ModCallbackRepentogon { POST_PICKUP_MORPH = 1215, /** + * Fires before the completion marks render on the screen. + * + * Return `false` to prevent the completion marks from rendering. + * * You cannot filter this callback. * * ```ts @@ -2019,7 +3093,7 @@ export enum ModCallbackRepentogon { PRE_COMPLETION_MARKS_RENDER = 1216, /** - * You cannot filter this callback. + * Fires after the completion marks render on the screen. * * ```ts * function postCompletionMarksRender( @@ -2033,6 +3107,11 @@ export enum ModCallbackRepentogon { POST_COMPLETION_MARKS_RENDER = 1217, /** + * Fires before the pause screen renders on the screen. + * + * Return `false` to prevent the pause screen from rendering. Doing so will also prevent the + * screen from darkening. + * * You cannot filter this callback. * * ```ts @@ -2042,6 +3121,8 @@ export enum ModCallbackRepentogon { PRE_PAUSE_SCREEN_RENDER = 1218, /** + * Fires after the pause screen renders on the screen. + * * You cannot filter this callback. * * ```ts @@ -2051,7 +3132,10 @@ export enum ModCallbackRepentogon { POST_PAUSE_SCREEN_RENDER = 1219, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when the player is about to place a bomb. Return false to prevent the bomb from being + * placed. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerVariant` provided. * @@ -2062,7 +3146,9 @@ export enum ModCallbackRepentogon { PRE_PLAYER_USE_BOMB = 1220, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after the player places a bomb. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerVariant` provided. * @@ -2073,7 +3159,11 @@ export enum ModCallbackRepentogon { POST_PLAYER_USE_BOMB = 1221, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires whenever a NPC selects its target, such as when `EntityNPC.GetPlayerTarget` is called. + * + * Return an `Entity` to override the target selected. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `EntityType` provided. * @@ -2084,7 +3174,9 @@ export enum ModCallbackRepentogon { PRE_NPC_PICK_TARGET = 1222, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when a Dark Red Champion NPC regenerates from a pile of goo. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `EntityType` provided. * @@ -2095,7 +3187,10 @@ export enum ModCallbackRepentogon { POST_NPC_DARK_RED_CHAMPION_REGEN = 1223, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when a custom cache flag is being evaluated. Return a number to set the value of the + * custom cache flag. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the string provided. * @@ -2110,7 +3205,10 @@ export enum ModCallbackRepentogon { EVALUATE_CUSTOM_CACHE = 1224, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when a familiar's multiplier is being evaluated. Return a number to override the + * familiar's multiplier. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `FamiliarVariant` provided. * @@ -2125,7 +3223,28 @@ export enum ModCallbackRepentogon { EVALUATE_FAMILIAR_MULTIPLIER = 1225, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when the player's stats are being calculated. This should not be confused with + * `ModCallback.EVALUATE_CACHE`, which fires when a `CacheFlag` is being evaluated. + * + * Unless you want to perform complicated conditions/calculations, it's strongly recommended that + * you use REPENTOGON's XML item stats features over this callback. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `EvaluateStatStage` provided. + * + * ```ts + * function evaluateStat(player: EntityPlayer, stat: EvaluateStatStage, value: number): void {} + * ``` + * + * @see https://repentogon.com/xml/items.html + */ + EVALUATE_STAT = 1226, + + /** + * Fires after a player collides with an entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerVariant` provided. * @@ -2140,7 +3259,9 @@ export enum ModCallbackRepentogon { POST_PLAYER_COLLISION = 1231, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a tear collides with an entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `TearVariant` provided. * @@ -2151,7 +3272,9 @@ export enum ModCallbackRepentogon { POST_TEAR_COLLISION = 1233, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a familiar collides with an entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `FamiliarVariant` provided. * @@ -2166,7 +3289,9 @@ export enum ModCallbackRepentogon { POST_FAMILIAR_COLLISION = 1235, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a bomb collides with an entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `BombVariant` provided. * @@ -2177,7 +3302,9 @@ export enum ModCallbackRepentogon { POST_BOMB_COLLISION = 1237, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a pickup collides with an entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PickupVariant` provided. * @@ -2188,7 +3315,15 @@ export enum ModCallbackRepentogon { POST_PICKUP_COLLISION = 1239, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before an `EntitySlot` collides with an entity. + * + * Return `true` to ignore the collision and prevent collision effects from being ran. Return + * `false` to allow the collision but prevent collision effects from being ran. Alternatively, + * return an object with any of the following optional fields to modify the collision behavior: + * - `Collide`: Whether the familiar should collide with the collider. + * - `SkipCollisionEffects`: Whether to skip running collision effects. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `SlotVariant` provided. * @@ -2203,7 +3338,9 @@ export enum ModCallbackRepentogon { PRE_SLOT_COLLISION = 1240, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after an `EntitySlot` collides with an entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `SlotVariant` provided. * @@ -2218,7 +3355,9 @@ export enum ModCallbackRepentogon { POST_SLOT_COLLISION = 1241, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a knife collides with an entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `KnifeVariant` provided. * @@ -2229,7 +3368,9 @@ export enum ModCallbackRepentogon { POST_KNIFE_COLLISION = 1243, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a projectile collides with an entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `ProjectileVariant` provided. * @@ -2244,7 +3385,9 @@ export enum ModCallbackRepentogon { POST_PROJECTILE_COLLISION = 1245, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a NPC collides with an entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `EntityType` provided. * @@ -2255,7 +3398,14 @@ export enum ModCallbackRepentogon { POST_NPC_COLLISION = 1247, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a laser collides with an entity. + * + * Return `true` to ignore the collision. + * + * Fires when an `EntityLaser` is about to collide with an entity. Return true to prevent the + * collision from happening. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `LaserVariant` provided. * @@ -2266,7 +3416,9 @@ export enum ModCallbackRepentogon { PRE_LASER_COLLISION = 1248, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a laser collides with an entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `LaserVariant` provided. * @@ -2277,7 +3429,12 @@ export enum ModCallbackRepentogon { POST_LASER_COLLISION = 1249, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after `EntityPickup.GetCoinValue` is called to determine the value of a coin pickup. + * + * Return an integer to override the coin's value, modifying the amount of coins it gives on + * pickup. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `CoinSubType` provided. * @@ -2288,18 +3445,26 @@ export enum ModCallbackRepentogon { GET_COIN_VALUE = 1250, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerType` provided. * * ```ts - * function prePlayerGetMultiShotParams(player: EntityPlayer): MultiShotParams | undefined {} + * function prePlayerGetMultiShotParams( + * player: EntityPlayer, + * multiShotParams: MultiShotParams, + * weaponType: WeaponType + * ): MultiShotParams | undefined {} * ``` + * + * @deprecated Use `ModCallbackRepentogon.EVALUATE_MULTI_SHOT_PARAMS` instead. */ PRE_PLAYER_GET_MULTI_SHOT_PARAMS = 1251, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when a familiar fires a tear. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `FamiliarVariant` provided. * @@ -2310,6 +3475,8 @@ export enum ModCallbackRepentogon { POST_FAMILIAR_FIRE_PROJECTILE = 1252, /** + * Fires when a player fires a Dr. Fetus bomb. + * * You cannot filter this callback. * * ```ts @@ -2319,6 +3486,9 @@ export enum ModCallbackRepentogon { POST_FIRE_BOMB = 1253, /** + * Fires when the player fires the Bone Club. This is only called when the club is initially + * spawned, not when it's swung or thrown. + * * You cannot filter this callback. * * ```ts @@ -2328,6 +3498,8 @@ export enum ModCallbackRepentogon { POST_FIRE_BONE_CLUB = 1254, /** + * Fires when a player fires a Brimstone laser. + * * You cannot filter this callback. * * ```ts @@ -2337,6 +3509,8 @@ export enum ModCallbackRepentogon { POST_FIRE_BRIMSTONE = 1255, /** + * Fires when a player fires a Brimstone ball. + * * You cannot filter this callback. * * ```ts @@ -2346,6 +3520,8 @@ export enum ModCallbackRepentogon { POST_FIRE_BRIMSTONE_BALL = 1256, /** + * Fires when the player fires a knife from Mom's Knife. + * * You cannot filter this callback. * * ```ts @@ -2355,6 +3531,8 @@ export enum ModCallbackRepentogon { POST_FIRE_KNIFE = 1257, /** + * Fires when the player swings the Spirit Sword. + * * You cannot filter this callback. * * ```ts @@ -2364,6 +3542,8 @@ export enum ModCallbackRepentogon { POST_FIRE_SWORD = 1258, /** + * Fires when the player fires a Tech laser. + * * You cannot filter this callback. * * ```ts @@ -2373,6 +3553,8 @@ export enum ModCallbackRepentogon { POST_FIRE_TECH_LASER = 1259, /** + * Fires when the player fires a Tech X laser. + * * You cannot filter this callback. * * ```ts @@ -2382,7 +3564,9 @@ export enum ModCallbackRepentogon { POST_FIRE_TECH_X_LASER = 1260, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when the familiar fires a Brimstone laser. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `FamiliarVariant` provided. * @@ -2393,7 +3577,9 @@ export enum ModCallbackRepentogon { POST_FAMILIAR_FIRE_BRIMSTONE = 1261, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires when the familiar fires a Tech laser. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `FamiliarVariant` provided. * @@ -2404,6 +3590,10 @@ export enum ModCallbackRepentogon { POST_FAMILIAR_FIRE_TECH_LASER = 1262, /** + * Fires when `Room.IsPersistentRoomEntity` is called. + * + * Return `true` to allow the entity to respawn. + * * You cannot filter this callback. * * ```ts @@ -2416,11 +3606,16 @@ export enum ModCallbackRepentogon { GET_IS_PERSISTENT_ROOM_ENTITY = 1263, /** - * You cannot filter this callback. + * Fires before a trinket is rendered on the player's HUD. Return true to prevent the trinket from + * rendering. You can return an object with various fields to override how the trinket renders on + * the HUD. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `TrinketSlot` provided. * * ```ts * function prePlayerHUDRenderTrinket( - * slot: TrinketSlot, * position: Vector, * scale: number, * player: EntityPlayer, @@ -2431,7 +3626,10 @@ export enum ModCallbackRepentogon { PRE_PLAYER_HUD_RENDER_TRINKET = 1264, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a pickup is consumed from effects such as Void and Black Rune. Return false to + * prevent the pickup from being consumed. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PickupVariant` provided. * @@ -2442,7 +3640,10 @@ export enum ModCallbackRepentogon { PRE_PICKUP_VOIDED = 1265, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a pickup is consumed from The Abyss. Return false to prevent the pickup from being + * consumed. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PickupVariant` provided. * @@ -2453,7 +3654,10 @@ export enum ModCallbackRepentogon { PRE_PICKUP_VOIDED_ABYSS = 1266, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a pickup is consumed from Compost. Return false to prevent the pickup from being + * consumed. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PickupVariant` provided. * @@ -2461,142 +3665,485 @@ export enum ModCallbackRepentogon { * function prePickupComposted(pickup: EntityPickup): boolean | undefined {} * ``` */ - PRE_PICKUP_COMPOSTED = 1267, + PRE_PICKUP_COMPOSTED = 1267, + + /** + * Fires after a `TemporaryEffect` of an `ItemConfigItem` is removed from a player. + * + * You cannot filter this callback. + * + * ```ts + * function postPlayerTriggerEffectRemoved( + * player: EntityPlayer, + * itemConfigItem: ItemConfigItem + * count: int + * ): void {} + * ``` + */ + POST_PLAYER_TRIGGER_EFFECT_REMOVED = 1268, + + /** + * Fires after a `TemporaryEffect` of an `ItemConfigItem` is removed from the room. + * + * You cannot filter this callback. + * + * ```ts + * function postRoomTriggerEffectRemoved(itemConfig: ItemConfigItem): void {} + * ``` + */ + POST_ROOM_TRIGGER_EFFECT_REMOVED = 1269, + + /** + * Fires after the boss intro is initialized. + * + * You cannot filter this callback. + * + * ```ts + * function postBossIntroShow(boss1: BossID, boss2: BossID): void {} + * ``` + */ + POST_BOSS_INTRO_SHOW = 1270, + + /** + * Fires each frame the room transition animation updates. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `RoomTransitionAnim` provided. + * + * ```ts + * function postRoomTransitionUpdate(): void {} + * ``` + */ + POST_ROOM_TRANSITION_UPDATE = 1271, + + /** + * Fires each frame the room transition animation renders. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `RoomTransitionAnim` provided. + * + * ```ts + * function postRoomTransitionRender(): void {} + * ``` + */ + POST_ROOM_TRANSITION_RENDER = 1272, + + /** + * Fires after a `TemporaryEffect` is added to a player. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `ItemConfigItem` provided. + * + * ```ts + * function postPlayerAddEffect( + * player: EntityPlayer, + * itemConfigItem: ItemConfigItem, + * addCostume: boolean, + * count: int + * ): void {} + * ``` + */ + POST_PLAYER_ADD_EFFECT = 1273, + + /** + * Fires after a `TemporaryEffect` is added to the room. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `ItemConfigItem` provided. + * + * ```ts + * function postRoomAddEffect(itemConfig: ItemConfigItem): void {} + * ``` + */ + POST_ROOM_ADD_EFFECT = 1274, + + /** + * Fires after `Game.BombDamage` is called. This is used by the game to damage entities within a + * radius for explosions and similar effects. + * + * The optional third argument is used for the source entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `EntityType` provided. + * + * ```ts + * function postBombDamage( + * position: Vector, + * damage: number, + * radius: number, + * lineCheck: boolean, + * source: Entity | undefined, + * tearFlags: BitFlags, + * damageFlags: BitFlags, + * damageSource: boolean + * ): void {} + * ``` + */ + POST_BOMB_DAMAGE = 1275, + + /** + * Fires after `Game.BombTearflagEffects` is called. This is used by the game when `TearFlag` + * based effects are triggered from an explosion. + * + * The optional third argument is used for the source entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `EntityType` provided. + * + * ```ts + * function postBombTearflagEffects( + * position: Vector, + * radius: number, + * tearFlags: BitFlags, + * source: Entity | undefined, + * radiusMulti: number + * ): void {} + * ``` + */ + POST_BOMB_TEAR_FLAG_EFFECTS = 1276, + + /** + * Fires before the effects of Tear Flags are applied to an enemy upon being hit or damaged. + * + * Return `false` to prevent the effects from being applied. Alternatively, return an object with + * the following fields to override how the effects are applied: + * - `Position`: The relevant position for the effects. Only used for specific `TearFlag` effects. + * - `TearFlags`: The Tear Flags to apply. + * - `Damage`: The damage of the Tear Flag effects. + * + * The optional `EntityType` third argument is used for the source entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `EntityType` provided. + * + * ```ts + * function preApplyTearFlagEffects( + * npc: EntityNPC, + * position: Vector, + * tearFlags: BitFlags, + * source: Entity | undefined, + * damage: number, + * ): + * | boolean + * | undefined + * | { Position?: Vector; TearFlags?: BitFlags; Damage?: number } {} + * ``` + */ + PRE_APPLY_TEAR_FLAG_EFFECTS = 1277, + + /** + * Fires after the effects of Tear Flags are applied to an enemy upon being hit or damaged. + * + * The optional `EntityType` third argument is used for the source entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `EntityType` provided. + * + * ```ts + * function postApplyTearFlagEffects( + * npc: EntityNPC, + * position: Vector, + * tearFlags: BitFlags, + * source: Entity | undefined, + * damage: number, + * ): void {} + * ``` + */ + POST_APPLY_TEAR_FLAG_EFFECTS = 1278, + + /** + * Fires before a boss is selected for the floor. + * + * Return a `BossID` to override the selected boss. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `BossID` provided. + * + * ```ts + * function preBossSelect( + * bossID: BossID, + * bossPool: BossPool, + * levelStage: LevelStage, + * stageType: StageType + * ): BossID | undefined {} + * ``` + */ + PRE_BOSS_SELECT = 1280, + + /** + * Fires before a costume is added to the player. + * + * Return `true` to prevent the costume from being added. Alternatively, return an + * `ItemConfigItem` to replace the costume. + * + * You cannot filter this callback. + * + * ```ts + * function prePlayerAddCostume( + * itemConfig: ItemConfigItem, + * player: EntityPlayer, + * itemStateOnly: boolean + * ): boolean | ItemConfigItem | undefined {} + * ``` + */ + PRE_PLAYER_ADD_COSTUME = 1281, + + /** + * Fires before the game tries to remove a costume from the player. + * + * Return `true` to prevent the costume from being removed. + * + * You cannot filter this callback. + * + * ```ts + * function prePlayerAddCostume( + * itemConfig: ItemConfigItem, + * player: EntityPlayer + * ): boolean | undefined {} + * ``` + */ + PRE_PLAYER_REMOVE_COSTUME = 1282, + + /** + * Fires after a costume is added to the player. + * + * You cannot filter this callback. + * + * ```ts + * function postPlayerAddCostume( + * itemConfig: ItemConfigItem, + * player: EntityPlayer, + * itemStateOnly: boolean + * ): void {} + * ``` + */ + POST_PLAYER_ADD_COSTUME = 1283, + + /** + * Fires after a costume is removed from the player. + * + * You cannot filter this callback. + * + * ```ts + * function postPlayerAddCostume( + * itemConfig: ItemConfigItem, + * player: EntityPlayer + * ): void {} + * ``` + */ + POST_PLAYER_REMOVE_COSTUME = 1284, + + /** + * Fires before the effects of sleeping on a bed are granted after the cutscene, such as healing. + * Return true to prevent the effects from activating. + * + * This callback does not prevent the sleep cutscene from happening. To prevent this, use + * `ModCallbackRepentogon.PRE_BED_SLEEP`. + * + * You cannot filter this callback. + * + * ```ts + * function preTriggerBedSleepEffect(player: EntityPlayer): boolean | undefined {} + * ``` + */ + PRE_TRIGGER_BED_SLEEP_EFFECT = 1285, + + /** + * Fires after the effects of sleeping on a bed are granted after the cutscene, such as healing. + * + * You cannot filter this callback. + * + * ```ts + * function postTriggerBedSleepEffect(player: EntityPlayer): boolean | undefined {} + * ``` + */ + POST_TRIGGER_BED_SLEEP_EFFECT = 1286, + + /** + * Fires before the player's pocket items are swapped. Return true to prevent them from swapping. + * + * You cannot filter this callback. + * + * ```ts + * function prePlayerPocketItemSwap(player: EntityPlayer): boolean | undefined {} + * ``` + */ + PRE_PLAYER_POCKET_ITEMS_SWAP = 1287, + + /** + * Fires before the player sleeps on a bed after colliding with it. Return true to prevent the + * player from sleeping on the bed. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `BedSubType` provided. + * + * ```ts + * function preBedSleep(player: EntityPlayer, bed: EntityPickup): boolean | undefined {} + * ``` + */ + PRE_BED_SLEEP = 1288, /** - * You cannot filter this callback. + * Fires before the `MultiShotParams` for a player are updated. + * + * Return `MultiShotParams` to modify the parameters of the player's shooting behavior. The + * modified `MultiShotParams` is passed along the remaining callbacks. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `PlayerType` provided. * * ```ts - * function postPlayerTriggerEffectRemoved( + * function evaluateMultiShotParams( * player: EntityPlayer, - * itemConfigItem: ItemConfigItem - * ): void {} + * multiShotParams: MultiShotParams, + * weaponType: WeaponType + * ): MultiShotParams | undefined {} * ``` */ - POST_PLAYER_TRIGGER_EFFECT_REMOVED = 1268, + EVALUATE_MULTI_SHOT_PARAMS = 1289, /** + * Fires when the game tries to get a random available room index on the floor. + * + * Return an integer to override the target room index. + * * You cannot filter this callback. * * ```ts - * function postRoomTriggerEffectRemoved(player: EntityPlayer: void {} + * function preGetRandomRoomIndex( + * roomIndex: int, + * iAmErrorRoom: boolean, + * seed: Seed + * ): int | undefined {} * ``` */ - POST_ROOM_TRIGGER_EFFECT_REMOVED = 1269, + PRE_GET_RANDOM_ROOM_INDEX = 1290, /** + * Fires after the Glowing Hourglass state is saved. + * * You cannot filter this callback. * * ```ts - * function postBossIntroShow(boss1: BossID, boss2: BossID): void {} + * function postGlowingHourglassSave(slot: int): void {} * ``` */ - POST_BOSS_INTRO_SHOW = 1270, + POST_GLOWING_HOURGLASS_SAVE = 1300, /** + * Fires after the Glowing Hourglass state is loaded. + * * You cannot filter this callback. * * ```ts - * function postRoomTransitionUpdate(): void {} + * function postGlowingHourglassSave(slot: int): void {} * ``` */ - POST_ROOM_TRANSITION_UPDATE = 1271, + POST_GLOWING_HOURGLASS_LOAD = 1301, /** + * Fires before the Glowing Hourglass state is saved. + * * You cannot filter this callback. * * ```ts - * function postRoomTransitionRender(): void {} + * function preGlowingHourglassSave(slot: int): void {} * ``` */ - POST_ROOM_TRANSITION_RENDER = 1272, + PRE_GLOWING_HOURGLASS_SAVE = 1302, /** + * Fires before the Glowing Hourglass state is loaded. + * * You cannot filter this callback. * * ```ts - * function postGlowingHourglassSave(slot: int): void {} + * function preGlowingHourglassLoad(slot: int): void {} * ``` */ - POST_GLOWING_HOURGLASS_SAVE = 1300, + PRE_GLOWING_HOURGLASS_LOAD = 1303, /** + * Fires after the room saves all entities and grid entities. + * * You cannot filter this callback. * * ```ts - * function postGlowingHourglassSave(slot: int): void {} + * function postRoomSaveState(room: Room, roomDescriptor: RoomDescriptor): void {} * ``` */ - POST_GLOWING_HOURGLASS_LOAD = 1301, + POST_ROOM_SAVE_STATE = 1304, /** - * When registering this callback with the `Mod.AddCallback` method: - * - You can provide an optional third argument that will make the callback only fire if it - * matches the `BossID` provided. + * Fires before the room respawns all saved entities. * - * ```ts - * function preBossSelect( - * bossID: BossID, - * bossPool: BossPool, - * levelStage: LevelStage, - * stageType: StageType - * ): BossID | undefined {} - * ``` - */ - PRE_BOSS_SELECT = 1280, - - /** * You cannot filter this callback. * * ```ts - * function prePlayerAddCostume( - * itemConfig: ItemConfigItem, - * player: EntityPlayer, - * itemStateOnly: boolean - * ): boolean | ItemConfigItem | undefined {} + * function preRoomRestoreState(room: Room, roomDescriptor: RoomDescriptor): void {} * ``` */ - PRE_PLAYER_ADD_COSTUME = 1281, + PRE_ROOM_RESTORE_STATE = 1305, /** + * Fires after two rooms have been swapped due to the Curse of the Maze. + * * You cannot filter this callback. * * ```ts - * function prePlayerAddCostume( - * itemConfig: ItemConfigItem, - * player: EntityPlayer - * ): boolean | undefined {} + * function postSwapRooms(roomDesc1: RoomDescriptor, roomDesc2: RoomDescriptor): void {} * ``` */ - PRE_PLAYER_REMOVE_COSTUME = 1282, + POST_SWAP_ROOMS = 1306, /** + * Fires when a room previously encountered on a floor has been saved. The saved room is restored + * later to be used for the Ascent route. + * * You cannot filter this callback. * * ```ts - * function postPlayerAddCostume( - * itemConfig: ItemConfigItem, - * player: EntityPlayer, - * itemStateOnly: boolean + * function postBackwardsRoomSave( + * stage: LevelStage, + * roomDesc: RoomDescriptor, + * id: string * ): void {} * ``` */ - POST_PLAYER_ADD_COSTUME = 1283, + POST_BACKWARDS_ROOM_SAVE = 1307, /** + * Fires when a room previously encountered on a floor is loaded back into the game during the + * Ascent route. + * * You cannot filter this callback. * * ```ts - * function postPlayerAddCostume( - * itemConfig: ItemConfigItem, - * player: EntityPlayer + * function postBackwardsRoomRestore( + * stage: LevelStage, + * roomDesc: RoomDescriptor, + * id: string * ): void {} * ``` */ - POST_PLAYER_REMOVE_COSTUME = 1284, + POST_BACKWARDS_ROOM_RESTORE = 1308, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the character menu is rendered on the screen while a custom character is selected. + * This callback does not trigger for vanilla characters. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerType` provided. * @@ -2611,7 +4158,9 @@ export enum ModCallbackRepentogon { PRE_RENDER_CUSTOM_CHARACTER_MENU = 1333, /** - * You cannot filter this callback. + * Fires before the `LootList` of a pickup is selected. + * + * Return a `LootList` to override the loot list used for the pickup. * * ```ts * function prePickupGetLootList( @@ -2623,19 +4172,26 @@ export enum ModCallbackRepentogon { PRE_PICKUP_GET_LOOT_LIST = 1334, /** + * Fires before the ghost pickup effect from Guppy's Eye updates. Return false to prevent the + * ghost pickups from displaying. + * + * Return `false` to prevent the ghost pickups from being displayed. + * * You cannot filter this callback. * * ```ts - * function prePickupGetLootList( - * pickup: EntityPickup, - * shouldAdvance: boolean - * ) => boolean | undefined {} + * function prePickupUpdateGhostPickups(pickup: EntityPickup) => boolean | undefined {} * ``` */ PRE_PICKUP_UPDATE_GHOST_PICKUPS = 1335, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a card is added to the player's inventory. + * + * Return `false` to prevent the card from being added. Alternatively, return a `CardType` to + * override the card being added. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `CardType` provided. * @@ -2650,7 +4206,9 @@ export enum ModCallbackRepentogon { PRE_PLAYER_ADD_CARD = 1350, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a card is added to the player's inventory. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `CardType` provided. * @@ -2665,7 +4223,12 @@ export enum ModCallbackRepentogon { POST_PLAYER_ADD_CARD = 1351, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a pill is added to the player's inventory. + * + * Return `false` to prevent the pill from being added. Alternatively, return a `PillColor` to + * override the pill being added. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PillColor` provided. * @@ -2680,7 +4243,9 @@ export enum ModCallbackRepentogon { PRE_PLAYER_ADD_PILL = 1352, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a pill is added to the player's inventory. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PillColor` provided. * @@ -2695,7 +4260,9 @@ export enum ModCallbackRepentogon { POST_PLAYER_ADD_PILL = 1353, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a card is removed from the player's inventory. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `CardType` provided. * @@ -2710,7 +4277,9 @@ export enum ModCallbackRepentogon { POST_PLAYER_REMOVE_CARD = 1354, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a pill is removed from the player's inventory. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PillColor` provided. * @@ -2725,7 +4294,11 @@ export enum ModCallbackRepentogon { POST_PLAYER_REMOVE_PILL = 1355, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the player picks up a card off the ground. + * + * Return `false` to prevent the card from being picked up. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `CardType` provided. * @@ -2739,7 +4312,9 @@ export enum ModCallbackRepentogon { PRE_PLAYER_COLLECT_CARD = 1356, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after the player picks up a card off the ground. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `CardType` provided. * @@ -2750,7 +4325,11 @@ export enum ModCallbackRepentogon { POST_PLAYER_COLLECT_CARD = 1357, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the player picks up a pill off the ground. + * + * Return `false` to prevent the pill from being picked up. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PillColor` provided. * @@ -2764,7 +4343,9 @@ export enum ModCallbackRepentogon { PRE_PLAYER_COLLECT_PILL = 1358, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after the player picks up a pill off the ground. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PillColor` provided. * @@ -2775,7 +4356,9 @@ export enum ModCallbackRepentogon { POST_PLAYER_COLLECT_PILL = 1359, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after the player drops a card from their inventory. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `CardType` provided. * @@ -2790,7 +4373,9 @@ export enum ModCallbackRepentogon { POST_PLAYER_DROP_CARD = 1360, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after the player drops a pill from their inventory. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PillColor` provided. * @@ -2805,7 +4390,7 @@ export enum ModCallbackRepentogon { POST_PLAYER_DROP_PILL = 1361, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2818,7 +4403,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_DECORATION_UPDATE = 1400, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2829,7 +4414,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_DECORATION_UPDATE = 1401, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2840,7 +4425,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_DOOR_UPDATE = 1402, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2854,7 +4439,7 @@ export enum ModCallbackRepentogon { * Fire grid entities are largely unused and in most cases you'll want to target the `EntityNPC` * fireplaces with `ModCallback.PRE_NPC_UPDATE`. * - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2868,7 +4453,7 @@ export enum ModCallbackRepentogon { * Fire grid entities are largely unused and in most cases you'll want to target the `EntityNPC` * fireplaces with `ModCallback.POST_NPC_UPDATE`. * - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2879,7 +4464,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_FIRE_UPDATE = 1405, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2890,7 +4475,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_GRAVITY_UPDATE = 1406, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2901,7 +4486,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_GRAVITY_UPDATE = 1407, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2912,7 +4497,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_LOCK_UPDATE = 1408, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2923,7 +4508,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_LOCK_UPDATE = 1409, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2934,7 +4519,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_PIT_UPDATE = 1410, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2948,7 +4533,7 @@ export enum ModCallbackRepentogon { * This does not include the `EntityNPC` poops used by Tainted Blue Baby. Use * `ModCallback.PRE_NPC_UPDATE` if you wish to target them. * - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2962,7 +4547,7 @@ export enum ModCallbackRepentogon { * This does not include the `EntityNPC` poops used by Tainted Blue Baby. Use * `ModCallback.POST_NPC_UPDATE` if you wish to target them. * - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2973,7 +4558,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_POOP_UPDATE = 1413, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2986,7 +4571,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_PRESSURE_PLATE_UPDATE = 1414, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -2997,7 +4582,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_PRESSURE_PLATE_UPDATE = 1415, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3008,7 +4593,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_ROCK_UPDATE = 1416, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3019,7 +4604,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_ROCK_UPDATE = 1417, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3030,7 +4615,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_SPIKES_UPDATE = 1418, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3041,7 +4626,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_SPIKES_UPDATE = 1419, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3052,7 +4637,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_STAIRCASE_UPDATE = 1420, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3063,7 +4648,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_STAIRCASE_UPDATE = 1421, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3074,7 +4659,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_STATUE_UPDATE = 1422, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3085,7 +4670,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_STATUE_UPDATE = 1423, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3098,7 +4683,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_TELEPORTER_UPDATE = 1424, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3109,7 +4694,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_TELEPORTER_UPDATE = 1425, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3120,7 +4705,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_TRAPDOOR_UPDATE = 1426, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3131,7 +4716,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_TRAPDOOR_UPDATE = 1427, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3142,7 +4727,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_WEB_UPDATE = 1428, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3153,7 +4738,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_WEB_UPDATE = 1429, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3164,7 +4749,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_TNT_UPDATE = 1430, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3175,7 +4760,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_TNT_UPDATE = 1431, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3189,7 +4774,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_SPIKES_RENDER = 1432, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3200,7 +4785,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_SPIKES_RENDER = 1433, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3214,7 +4799,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_WEB_RENDER = 1434, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3225,7 +4810,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_WEB_RENDER = 1435, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3239,7 +4824,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_TNT_RENDER = 1436, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3250,7 +4835,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_TNT_RENDER = 1437, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3264,7 +4849,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_TRAPDOOR_RENDER = 1438, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3275,7 +4860,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_TRAPDOOR_RENDER = 1439, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3289,7 +4874,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_STAIRCASE_RENDER = 1440, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3300,7 +4885,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_STAIRCASE_RENDER = 1441, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3314,7 +4899,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_DECORATION_RENDER = 1444, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3328,7 +4913,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_DECORATION_RENDER = 1445, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3342,7 +4927,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_DOOR_RENDER = 1446, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3356,7 +4941,7 @@ export enum ModCallbackRepentogon { * Fire grid entities are largely unused and in most cases you'll want to target the `EntityNPC` * fireplaces with `ModCallback.PRE_NPC_RENDER`. * - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3373,7 +4958,7 @@ export enum ModCallbackRepentogon { * Fire grid entities are largely unused and in most cases you'll want to target the `EntityNPC` * fireplaces with `ModCallback.POST_NPC_RENDER`. * - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3384,7 +4969,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_FIRE_RENDER = 1449, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3398,7 +4983,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_LOCK_RENDER = 1450, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3409,7 +4994,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_LOCK_RENDER = 1451, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3423,7 +5008,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_TELEPORTER_RENDER = 1452, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3437,7 +5022,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_TELEPORTER_RENDER = 1453, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3451,7 +5036,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_PIT_RENDER = 1454, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3465,7 +5050,7 @@ export enum ModCallbackRepentogon { * This does not include the `EntityNPC` poops used by Tainted Blue Baby. Use * `ModCallback.PRE_NPC_RENDER` if you wish to target them. * - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3482,7 +5067,7 @@ export enum ModCallbackRepentogon { * This does not include the `EntityNPC` poops used by Tainted Blue Baby. Use * `ModCallback.POST_NPC_RENDER` if you wish to target them. * - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3493,7 +5078,7 @@ export enum ModCallbackRepentogon { POOP_GRID_ENTITY_POOP_RENDER = 1457, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityRock` provided. * @@ -3507,7 +5092,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_ROCK_RENDER = 1458, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3518,7 +5103,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_ROCK_RENDER = 1459, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3532,7 +5117,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_PRESSURE_PLATE_RENDER = 1460, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3546,7 +5131,7 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_PRESSURE_PLATE_RENDER = 1461, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3560,7 +5145,7 @@ export enum ModCallbackRepentogon { PRE_GRID_ENTITY_WALL_RENDER = 1462, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `GridEntityType` provided. * @@ -3571,7 +5156,13 @@ export enum ModCallbackRepentogon { POST_GRID_ENTITY_WALL_RENDER = 1463, /** - * When registering this callback with the `Mod.AddCallback` method: + * Behaves like `ModCallback.INPUT_ACTION` except it only works on the main menu. + * + * Return a boolean to force whether to force an input if `hook` is `InputHook.IS_ACTION_PRESSED` + * or `InputHook.IS_ACTION_TRIGGERED`, or return a float to override the value if `hook` is + * `InputHook.GET_ACTION_VALUE`. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `InputHook` provided. * @@ -3586,15 +5177,60 @@ export enum ModCallbackRepentogon { MENU_INPUT_ACTION = 1464, /** + * Fires before a status effect is applied to an entity. + * + * Return `false` to prevent the status effect from being applied. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `StatusEffect` provided. + * + * ```ts + * function preStatusEffectApply( + * statusEffect: StatusEffect, + * entity: Entity, + * source: EntityRef, + * duration: int + * ): boolean | undefined {} + * ``` + */ + PRE_STATUS_EFFECT_APPLY = 1465, + + /** + * Fires after a status effect is applied to an entity. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `StatusEffect` provided. + * + * ```ts + * function preStatusEffectApply( + * statusEffect: StatusEffect, + * entity: Entity, + * source: EntityRef, + * duration: int + * ): void {} + * ``` + */ + POST_STATUS_EFFECT_APPLY = 1466, + + /** + * Fires when a save slot is loaded by the game. + * * This callback cannot be filtered. * * ```ts * function postSaveSlotLoad(saveSlot: int, isSlotSelected: boolean, rawSlot: int): void {} + * ``` */ POST_SAVE_SLOT_LOAD = 1470, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before a challenge is marked as completed. + * + * Return `false` to prevent the challenge from being marked as completed. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `Challenge` provided. * @@ -3605,7 +5241,9 @@ export enum ModCallbackRepentogon { PRE_CHALLENGE_DONE = 1471, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after a challenge is marked as completed. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `Challenge` provided. * @@ -3616,7 +5254,26 @@ export enum ModCallbackRepentogon { POST_CHALLENGE_DONE = 1472, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before `EntityFamiliar.CanCharm` is called. This is used ot determine whether the Siren + * can charm a familiar. + * + * Return `false` to prevent the familiar from being charmed. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `FamiliarVariant` provided. + * + * ```ts + * function preFamiliarCanCharm(familiar: EntityFamiliar): boolean | undefined {} + * ``` + */ + PRE_FAMILIAR_CAN_CHARM = 1473, + + /** + * Fires before the player gives birth to a familiar due to Cambion Conception. Return false to + * prevent the player from spawning the familiar. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `ConceptionFamiliarFlag` provided. * @@ -3630,7 +5287,10 @@ export enum ModCallbackRepentogon { PRE_PLAYER_GIVE_BIRTH_CAMBION = 1474, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires before the player gives birth to a familiar due to Immaculate Conception. Return false to + * prevent the player from spawning the familiar. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `ConceptionFamiliarFlag` provided. * @@ -3644,7 +5304,64 @@ export enum ModCallbackRepentogon { PRE_PLAYER_GIVE_BIRTH_IMMACULATE = 1475, /** - * When registering this callback with the `Mod.AddCallback` method: + * Fires after an achievement is unlocked. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `Achievement` provided. + * + * ```ts + * function postAchievementUnlock(achievement: Achievement): void {} + * ``` + */ + POST_ACHIEVEMENT_UNLOCK = 1476, + + /** + * Fires before the minimap is updated. + * + * You cannot filter this callback. + * + * ```ts + * function preMinimapUpdate(): void {} + * ``` + */ + PRE_MINIMAP_UPDATE = 1477, + + /** + * Fires after the minimap is updated. + * + * You cannot filter this callback. + * + * ```ts + * function postMinimapUpdate(): void {} + * ``` + */ + POST_MINIMAP_UPDATE = 1478, + + /** + * Fires before the minimap is rendered. + * + * You cannot filter this callback. + * + * ```ts + * function preMinimapRender(): void {} + * ``` + */ + PRE_MINIMAP_RENDER = 1479, + + /** + * Fires after the minimap is rendered. + * + * You cannot filter this callback. + * + * ```ts + * function postMinimapRender(): void {} + * ``` + */ + POST_MINIMAP_RENDER = 1480, + + /** + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerType` provided. * @@ -3655,7 +5372,7 @@ export enum ModCallbackRepentogon { PRE_PLAYER_REVIVE = 1481, /** - * When registering this callback with the `Mod.AddCallback` method: + * When registering this callback with the `Mod.AddCallbackRepentogon` method: * - You can provide an optional third argument that will make the callback only fire if it * matches the `PlayerType` provided. * @@ -3666,6 +5383,10 @@ export enum ModCallbackRepentogon { POST_PLAYER_REVIVE = 1482, /** + * Fires before a fortune is displayed on the screen. + * + * Return `false` to prevent the fortune from displaying. + * * You cannot filter this callback. * * ```ts @@ -3675,6 +5396,8 @@ export enum ModCallbackRepentogon { PRE_FORTUNE_DISPLAY = 1483, /** + * Fires before the item display text appears. Return false to prevent it from appearing. + * * You cannot filter this callback. * * ```ts @@ -3687,4 +5410,143 @@ export enum ModCallbackRepentogon { * ``` */ PRE_ITEM_TEXT_DISPLAY = 1484, + + /** + * Fires before a status effect target of an entity is set. + * + * Return an `Entity` to change targets. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `EntityType` provided. + * + * ```ts + * function getStatusEffectTarget(entity: Entity): Entity | undefined {} + * ``` + */ + GET_STATUS_EFFECT_TARGET = 1485, + + /** + * Fires before the entity's color is set with `Entity.SetColor`. This callback does not fire if + * the `Entity.Color` field is directly modified. + * + * Return `false` to prevent the color from being set. Alternatively, return a `Color` to override + * the color set. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `EntityType` provided. + * + * ```ts + * function preEntitySetColor( + * entity: Entity, + * color: Color, + * duration: int, + * priority: int, + * fadeOut: boolean, + * share: boolean + * ): Color | boolean | undefined {} + * ``` + */ + PRE_ENTITY_SET_COLOR = 1486, + + /** + * Fires after the entity's color is set with `Entity.SetColor`. This callback does not fire if + * the `Entity.Color` field is directly modified. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `EntityType` provided. + * + * ```ts + * function postEntitySetColor( + * entity: Entity, + * color: Color, + * duration: int, + * priority: int, + * fadeOut: boolean, + * share: boolean + * ): void {} + * ``` + */ + POST_ENTITY_SET_COLOR = 1487, + + /** + * Fires when a challenge/boss rush room wave starts. + * + * You cannot filter this callback. + * + * ```ts + * function postStartAmbushWave(bossAmbush: boolean): void {} + * ``` + */ + POST_START_AMBUSH_WAVE = 1488, + + /** + * Fires when a Greed Mode wave starts. + * + * You cannot filter this callback. + * + * ```ts + * function postStartGreedWave(): void {} + * ``` + */ + POST_START_GREED_WAVE = 1489, + + /** + * Fires before the player's `TearParams` object is calculated. + * + * Return a `TearParams` object to override the player's `TearParams` object. The modified + * `TearParams` is passed along the remaining callbacks. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `PlayerType` provided. + * + * ```ts + * function evaluateTearHitParams( + * player: EntityPlayer, + * tearParams: TearParams + * weaponType: WeaponType, + * damageScale: float, + * tearDisplacement: int, + * source: Entity + * ): TearParams | undefined {} + * ``` + */ + EVALUATE_TEAR_HIT_PARAMS = 1490, + + /** + * Fires before a chest is opened. + * + * Return `false` to prevent the chest from being opened. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `PickupVariant` provided. + * + * ```ts + * function preOpenChest( + * chest: EntityPickup + * player: EntityPlayer | undefined + * ): boolean | undefined {} + * ``` + */ + PRE_OPEN_CHEST = 1491, + + /** + * Fires after a chest is opened. + * + * When registering this callback with the `Mod.AddCallbackRepentogon` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `PickupVariant` provided. + * + * ```ts + * function postOpenChest( + * chest: EntityPickup + * player: EntityPlayer | undefined + * ): void {} + * ``` + */ + POST_OPEN_CHEST = 1492, } diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/NullPickupSubType.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/NullPickupSubType.ts new file mode 100644 index 000000000..08ed3ae20 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/NullPickupSubType.ts @@ -0,0 +1,12 @@ +/** + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +export enum NullPickupSubType { + ANY = 0, + NO_COLLECTIBLE_CHEST = 1, + NO_COLLECTIBLE = 2, + NO_COLLECTIBLE_CHEST_COIN = 3, + NO_COLLECTIBLE_TRINKET_CHEST = 4, +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/PauseMenuState.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/PauseMenuState.ts index fb173408d..cf431820f 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/PauseMenuState.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/PauseMenuState.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum PauseMenuState { CLOSED = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/PillCardSlot.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/PillCardSlot.ts index 0c6cd90f7..6024c1e1f 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/PillCardSlot.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/PillCardSlot.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum PillCardSlot { PRIMARY = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/PlayerFoot.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/PlayerFoot.ts new file mode 100644 index 000000000..3e0e11edd --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/PlayerFoot.ts @@ -0,0 +1,9 @@ +/** + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +export enum PlayerFoot { + RIGHT = -1, + LEFT = 0, +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/ProceduralEffectActionType.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/ProceduralEffectActionType.ts index af9dcf6c9..352a8bd19 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/ProceduralEffectActionType.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/ProceduralEffectActionType.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum ProceduralEffectActionType { USE_ACTIVE_ITEM = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/ProceduralEffectConditionType.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/ProceduralEffectConditionType.ts index 1b75288dd..885a26d74 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/ProceduralEffectConditionType.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/ProceduralEffectConditionType.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum ProceduralEffectConditionType { ACTIVE = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/PurityState.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/PurityState.ts index 78de7b2ed..c023ad1bb 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/PurityState.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/PurityState.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum PurityState { RED = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/SlotState.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/SlotState.ts new file mode 100644 index 000000000..9934a6e6f --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/SlotState.ts @@ -0,0 +1,17 @@ +/** + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +export enum SlotState { + IDLE = 1, + + /** Only used by Shell Game and Hell Game. */ + IDLE_REWARD = 2, + + BOMBED = 3, + PAYOUT = 4, + + /** Only used by Shell Game and Hell Game. */ + REWARD = 5, +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/SpecialQuest.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/SpecialQuest.ts index bbf741eeb..e65d6400a 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/SpecialQuest.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/SpecialQuest.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum SpecialQuest { DISABLED = -1, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/SplitTearType.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/SplitTearType.ts new file mode 100644 index 000000000..5e242bb05 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/SplitTearType.ts @@ -0,0 +1,18 @@ +/** + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +export enum SplitTearType { + GENERIC = 0, + QUAD = 1, + PARASITE = 2, + BONE = 3, + ABSORB = 4, + SPORE = 5, + STICKY = 6, + BURST = 7, + POP = 8, + MULTIDIMENSIONAL = 9, + ANGELIC_PRISM = 10, +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/StatusEffect.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/StatusEffect.ts new file mode 100644 index 000000000..a9a93a778 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/StatusEffect.ts @@ -0,0 +1,23 @@ +/** + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +export enum StatusEffect { + BAITED = 0, + BLEEDING = 1, + BRIMSTONE_MARK = 2, + BURN = 3, + CHARMED = 4, + CONFUSION = 5, + FEAR = 6, + FREEZE = 7, + ICE = 8, + KNOCKBACK = 9, + MAGNETIZED = 10, + MIDAS_FREEZE = 11, + POISON = 12, + SHRINK = 13, + SLOWING = 14, + WEAKNESS = 15, +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/StbRailVariant.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/StbRailVariant.ts index de982a746..a86a211cd 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/StbRailVariant.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/StbRailVariant.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum StbRailVariant { HORIZONTAL = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/SuplexState.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/SuplexState.ts new file mode 100644 index 000000000..280922e21 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/SuplexState.ts @@ -0,0 +1,12 @@ +/** + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +export enum SuplexState { + INACTIVE = 0, + DASH = 1, + HOLD = 2, + JUMP = 3, + FALL = 4, +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/TaintedMarksGroup.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/TaintedMarksGroup.ts index eba2f4738..d8b179fee 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/TaintedMarksGroup.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/TaintedMarksGroup.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum TaintedMarksGroup { BOTH = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/WeaponSlot.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/WeaponSlot.ts index 47fb1e349..cf7c35ad8 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/WeaponSlot.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/WeaponSlot.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum WeaponSlot { /** Used by weapons such as Notched Axe and Urn of Souls. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/WindowIcon.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/WindowIcon.ts index a8a7a6020..2c28ad391 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/WindowIcon.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/WindowIcon.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum WindowIcon { NORMAL = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/AddHealthTypeFlag.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/AddHealthTypeFlag.ts index 2b84b4c77..8f0d70a6b 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/AddHealthTypeFlag.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/AddHealthTypeFlag.ts @@ -4,10 +4,10 @@ * * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @enum * @notExported * @rename AddHealthTypeFlag + * @see https://repentogon.com/ */ const AddHealthTypeFlagInternal = { NONE: 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/AnimationRenderFlag.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/AnimationRenderFlag.ts index ac09c3cdb..22ab5dbe7 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/AnimationRenderFlag.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/AnimationRenderFlag.ts @@ -4,10 +4,10 @@ * * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @enum * @notExported * @rename AnimationRenderFlag + * @see https://repentogon.com/ */ const AnimationRenderFlagInternal = { /** Rapidly distorts the spritesheet position. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/ButtonActionFlag.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/ButtonActionFlag.ts index f1d1e3756..812ee61e0 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/ButtonActionFlag.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/ButtonActionFlag.ts @@ -4,10 +4,10 @@ * * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @enum * @notExported * @rename ButtonActionFlag + * @see https://repentogon.com/ */ const ButtonActionFlagInternal = { ACTION_LEFT: 1 << 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/ConceptionFamiliarFlag.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/ConceptionFamiliarFlag.ts index 70249a642..ca838cd6d 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/ConceptionFamiliarFlag.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/ConceptionFamiliarFlag.ts @@ -4,10 +4,10 @@ * * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @enum * @notExported * @rename ConceptionFamiliarFlag + * @see https://repentogon.com/ */ const ConceptionFamiliarFlagInternal = { LEECH: 1 << 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/DebugFlag.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/DebugFlag.ts index 608071cfa..e00cd1be9 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/DebugFlag.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/DebugFlag.ts @@ -4,10 +4,10 @@ * * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @enum * @notExported * @rename DebugFlag + * @see https://repentogon.com/ */ const DebugFlagInternal = { ENTITY_POSITIONS: 1 << 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/EntityTag.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/EntityTag.ts index 6921d3dbd..62a52a773 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/EntityTag.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/EntityTag.ts @@ -4,10 +4,10 @@ * * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @enum * @notExported * @rename EntityTag + * @see https://repentogon.com/ */ const EntityTagInternal = { FLY: 1 << 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/GetCollectibleFlag.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/GetCollectibleFlag.ts new file mode 100644 index 000000000..be920f3de --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/GetCollectibleFlag.ts @@ -0,0 +1,39 @@ +/** + * This is represented as an object instead of an enum due to limitations with TypeScript enums. (We + * want this type to be a child of the `BitFlag` type.) + * + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @enum + * @notExported + * @rename GetCollectibleFlag + * @see https://repentogon.com/ + */ +const GetCollectibleFlagInternal = { + /** Bans active collectibles. */ + BAN_ACTIVE: 1 << 0, + + /** + * Ignores attempts to morph the collectible into Magic Skin or Rosary. Does not prevent morphing + * the collectible into The Bible. + */ + IGNORE_MODIFIERS: 1 << 1, + + BAN_PASSIVE: 1 << 2, + + /** Bans passive collectibles. */ +} as const; + +type GetCollectibleFlagValue = BitFlag & { + readonly __getCollectibleFlagBrand: symbol; +}; +type GetCollectibleFlagType = { + readonly [K in keyof typeof GetCollectibleFlagInternal]: GetCollectibleFlagValue; +}; + +export const GetCollectibleFlag = + GetCollectibleFlagInternal as GetCollectibleFlagType; +export type GetCollectibleFlag = + GetCollectibleFlagType[keyof GetCollectibleFlagType]; + +export const GetCollectibleFlagZero = 0 as BitFlags; diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/GibFlag.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/GibFlag.ts index 5755aad1a..49d8f5dc9 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/GibFlag.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/GibFlag.ts @@ -4,10 +4,10 @@ * * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @enum * @notExported * @rename GibFlag + * @see https://repentogon.com/ */ const GibFlagInternal = { BLOOD: 1 << 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/ImGuiWindowFlags.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/ImGuiWindowFlags.ts new file mode 100644 index 000000000..85be12d8a --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/ImGuiWindowFlags.ts @@ -0,0 +1,92 @@ +/** + * This is represented as an object instead of an enum due to limitations with TypeScript enums. (We + * want this type to be a child of the `BitFlag` type.) + * + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @enum + * @notExported + * @rename ImGuiWindowFlag + * @see https://repentogon.com/ + */ +const ImGuiWindowFlagInternal = { + NONE: 0, + + /** Disables the title bar. */ + NO_TITLE_BAR: 1 << 0, + + NO_RESIZE: 1 << 1, + + /** Disables moving the window. */ + NO_MOVE: 1 << 2, + + /** Disable scrollbars. The window can still scroll with the mouse or programmatically. */ + NO_SCROLLBAR: 1 << 3, + + /** + * Disable user vertically scrolling with mouse wheel. On child window, mouse wheel will be + * forwarded to the parent unless `ImGuiWindowFlag.NO_SCROLLBAR` is also set. + */ + NO_SCROLL_WITH_MOUSE: 1 << 4, + + /** Disable user collapsing window by double-clicking on it. */ + NO_COLLAPSE: 1 << 5, + + /** Resize every window to its content every frame. */ + ALWAYS_AUTO_RESIZE: 1 << 6, + + /** Disable drawing background colors and outside borders. */ + NO_BACKGROUND: 1 << 7, + + /** Never load/save settings in an `.ini` file. */ + NO_SAVED_SETTINGS: 1 << 8, + + /** Disable catching mouse inputs. */ + NO_MOUSE_INPUTS: 1 << 9, + + /** Has a menu-bar. */ + MENU_BAR: 1 << 10, + + /** Allow horizontal scrollbar to appear (off by default). */ + HORIZONTAL_SCROLLBAR: 1 << 11, + + /** Disable taking focus when transitioning from hidden to visible state. */ + NO_FOCUS_ON_APPEARING: 1 << 12, + + /** + * Disable bringing window to front when taking focus (e.g. clicking on it or programmatically + * giving it focus). + */ + NO_BRING_TO_FRONT_ON_FOCUS: 1 << 13, + + /** Always show vertical scrollbar. */ + ALWAYS_VERTICAL_SCROLLBAR: 1 << 14, + + /** Always show horizontal scrollbar. */ + ALWAYS_HORIZONTAL_SCROLLBAR: 1 << 15, + + /** No gamepad/keyboard navigation within the window. */ + NO_NAV_INPUTS: 1 << 16, + + /** No focusing toward this window with gamepad/keyboard navigation (e.g. skipped by CTRL+TAB). */ + NO_NAV_FOCUS: 1 << 17, + + /** + * Display a dot next to the title. When used in a tab/docking context, tab is selected when + * clicking the X + closure is not assumed (will wait for user to stop submitting the tab). + * Otherwise closure is assumed. + */ + UNSAVED_DOCUMENT: 1 << 18, +} as const; + +type ImGuiWindowFlagValue = BitFlag & { + readonly __imGuiWindowFlagBrand: symbol; +}; +type ImGuiWindowFlagType = { + readonly [K in keyof typeof ImGuiWindowFlagInternal]: ImGuiWindowFlagValue; +}; + +export const ImGuiWindowFlag = ImGuiWindowFlagInternal as ImGuiWindowFlagType; +export type ImGuiWindowFlag = ImGuiWindowFlagType[keyof ImGuiWindowFlagType]; + +export const ImGuiWindowFlagZero = 0 as BitFlags; diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/WaterClipFlag.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/WaterClipFlag.ts new file mode 100644 index 000000000..2c8ce1950 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/WaterClipFlag.ts @@ -0,0 +1,47 @@ +/** + * This is represented as an object instead of an enum due to limitations with TypeScript enums. (We + * want this type to be a child of the `BitFlag` type.) + * + * This enum is for REPENTOGON, an exe-hack which expands the modding API. + * + * @enum + * @notExported + * @rename WaterClipFlag + * @see https://repentogon.com/ + */ +const WaterClipFlagInternal = { + /** When set for an Entity, also enables rendering below water. */ + DISABLE_RENDER_ABOVE_WATER: 1 << 1, + /** + * Allows the entity to be rendered below the water along with being rendered above the water. + * Only works for entities. + */ + ENABLE_RENDER_BELOW_WATER: 1 << 2, + + /** Prevents the entity from being rendered below the water. Takes priority over other flags. */ + DISABLE_RENDER_BELOW_WATER: 1 << 3, + + /** Prevents the entity from having its reflection be rendered. Only works for entities. */ + DISABLE_RENDER_REFLECTION: 1 << 5, + + /** Overrides other flags and only allows the entity to render above water with no reflection. */ + IGNORE_WATER_RENDERING: 1 << 6, + + /** + * Forces the entity to spawn water ripple effects regardless of if they're on the ground or not. + * Only works for entities. + */ + FORCE_WATER_RIPPLE_WHEN_MOVING: 1 << 7, +} as const; + +type WaterClipFlagValue = BitFlag & { + readonly __waterClipFlagBrand: symbol; +}; +type WaterClipFlagType = { + readonly [K in keyof typeof WaterClipFlagInternal]: WaterClipFlagValue; +}; + +export const WaterClipFlag = WaterClipFlagInternal as WaterClipFlagType; +export type WaterClipFlag = WaterClipFlagType[keyof WaterClipFlagType]; + +export const WaterClipFlagZero = 0 as BitFlags; diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/WeaponModifierFlag.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/WeaponModifierFlag.ts index 5396fefae..b65d1ff17 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/flags/WeaponModifierFlag.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/flags/WeaponModifierFlag.ts @@ -4,10 +4,10 @@ * * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @enum * @notExported * @rename WeaponModifierFlag + * @see https://repentogon.com/ */ const WeaponModifierFlagInternal = { CHOCOLATE_MILK: 1 << 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiCallback.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiCallback.ts index f92c0293f..472c48516 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiCallback.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiCallback.ts @@ -3,7 +3,7 @@ * * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum ImGuiCallback { CLICKED = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiColor.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiColor.ts index fd65c6242..30a8ce784 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiColor.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiColor.ts @@ -3,7 +3,7 @@ * * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum ImGuiColor { TEXT = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiData.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiData.ts index 9866de762..e3d9b4729 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiData.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiData.ts @@ -3,7 +3,7 @@ * * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum ImGuiData { /** Descriptive text of an element. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiElement.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiElement.ts index e0af403a5..5b9086ecf 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiElement.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiElement.ts @@ -3,7 +3,7 @@ * * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum ImGuiElement { WINDOW = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiNotificationType.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiNotificationType.ts index fdeb060a0..135ae3bfa 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiNotificationType.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/imgui/ImGuiNotificationType.ts @@ -3,7 +3,7 @@ * * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum ImGuiNotificationType { INFO = 0, diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/xml/BossColorXMLIndex.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/xml/BossColorXMLIndex.ts index b0fa6d877..c95167e44 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/xml/BossColorXMLIndex.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/xml/BossColorXMLIndex.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum BossColorXMLIndex { RED_1 = "1", diff --git a/packages/isaac-typescript-definitions-repentogon/src/enums/xml/XMLNode.ts b/packages/isaac-typescript-definitions-repentogon/src/enums/xml/XMLNode.ts index 95c444eb3..0d8a443c5 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/enums/xml/XMLNode.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/enums/xml/XMLNode.ts @@ -1,7 +1,7 @@ /** * This enum is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ export enum XMLNode { diff --git a/packages/isaac-typescript-definitions-repentogon/src/index.ts b/packages/isaac-typescript-definitions-repentogon/src/index.ts index bc107a54b..5fd5d0ac9 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/index.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/index.ts @@ -1,10 +1,14 @@ export * from "./enums/Achievement"; +export * from "./enums/AltRockType"; export * from "./enums/AutocompleteType"; export * from "./enums/BagOfCraftingPickup"; +export * from "./enums/BlendEquation"; export * from "./enums/BlendFactor"; export * from "./enums/BlendType"; export * from "./enums/BombCostumeLayer"; +export * from "./enums/CambionPregnancyLevel"; export * from "./enums/CharacterMenuType"; +export * from "./enums/CoinJamAnimation"; export * from "./enums/CompletionMarkDifficulty"; export * from "./enums/CompletionMarkType"; export * from "./enums/DailyChallengeMenuState"; @@ -14,6 +18,7 @@ export * from "./enums/DialogIcon"; export * from "./enums/DialogReturn"; export * from "./enums/DwmWindowsAttribute"; export * from "./enums/Ending"; +export * from "./enums/EvaluateStatStage"; export * from "./enums/EventCounter"; export * from "./enums/flags/AddHealthTypeFlag"; export * from "./enums/flags/AnimationRenderFlag"; @@ -21,9 +26,13 @@ export * from "./enums/flags/ButtonActionFlag"; export * from "./enums/flags/ConceptionFamiliarFlag"; export * from "./enums/flags/DebugFlag"; export * from "./enums/flags/EntityTag"; +export * from "./enums/flags/GetCollectibleFlag"; export * from "./enums/flags/GibFlag"; +export * from "./enums/flags/ImGuiWindowFlags"; +export * from "./enums/flags/WaterClipFlag"; export * from "./enums/flags/WeaponModifierFlag"; export * from "./enums/FollowerPriority"; +export * from "./enums/GameMode"; export * from "./enums/GenericPromptSelection"; export * from "./enums/GenericPromptSubmittedSelection"; export * from "./enums/GiantbookType"; @@ -37,14 +46,20 @@ export * from "./enums/imgui/ImGuiNotificationType"; export * from "./enums/MainMenuType"; export * from "./enums/MinimapState"; export * from "./enums/ModCallbackRepentogon"; +export * from "./enums/NullPickupSubType"; export * from "./enums/PauseMenuState"; export * from "./enums/PillCardSlot"; +export * from "./enums/PlayerFoot"; export * from "./enums/PocketItemType"; export * from "./enums/ProceduralEffectActionType"; export * from "./enums/ProceduralEffectConditionType"; export * from "./enums/PurityState"; +export * from "./enums/SlotState"; export * from "./enums/SpecialQuest"; +export * from "./enums/SplitTearType"; +export * from "./enums/StatusEffect"; export * from "./enums/StbRailVariant"; +export * from "./enums/SuplexState"; export * from "./enums/TaintedMarksGroup"; export * from "./enums/WeaponSlot"; export * from "./enums/WindowIcon"; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/ActiveItemDesc.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/ActiveItemDesc.d.ts index 09ca6cf4a..b6249d5bb 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/ActiveItemDesc.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/ActiveItemDesc.d.ts @@ -4,7 +4,7 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface ActiveItemDesc { BatteryCharge: int; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Ambush.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Ambush.d.ts index eebd8ae09..1709357c4 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Ambush.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Ambush.d.ts @@ -1,17 +1,27 @@ /** + * The `Ambush` class is used to manage Challenge Room and Boss Rush functionality. + * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace Ambush { /** Returns the current wave for the ongoing ambush. */ function GetCurrentWave(): int; + /** + * Returns the maximum amount of Boss Challenge Room waves. + * + * The maximum amount of Boss Challenge Room waves can be modified through the + * `Ambush.SetMaxBossChallengeWaves` method. + */ + function GetMaxBossChallengeWaves(): int; + /** * Returns the amount of waves that the boss rush has. * - * The maximum amount of boss rush waves can be modified through the `Ambush.SetMaxBossrushWaves` + * The maximum amount of Boss Rush waves can be modified through the `Ambush.SetMaxBossrushWaves` * method. */ function GetMaxBossrushWaves(): int; @@ -19,7 +29,7 @@ declare namespace Ambush { /** * Returns the maximum amount of challenge room waves. * - * The maximum amount of challenge room waves can be modified through the + * The maximum amount of Challenge Room waves can be modified through the * `Ambush.SetMaxChallengeWaves` method. */ function GetMaxChallengeWaves(): int; @@ -27,19 +37,41 @@ declare namespace Ambush { /** * Returns the `RoomConfig` of the next Challenge Room wave to spawn. * - * Calling this method outside of a Challenge Room will throw an error. + * Calling this method will error if the current room's type is not `RoomType.CHALLENGE`. */ - function GetNextWave(): RoomConfig; + function GetNextWave(): RoomConfig | undefined; - /** Returns an array containing the `RoomConfig` of the next Challenge Room waves. */ + /** + * Returns an array containing the `RoomConfig` of the next Challenge Room waves. + * + * Calling this method will error if the current room's type is not`RoomType.CHALLENGE`. + */ function GetNextWaves(): RoomConfig[]; - /** Sets the maximum amount of Boss Rush waves. This is currently capped at 25. */ + /** + * Sets the maximum amount of Boss Challenge Room waves. + * + * The maximum amount of Boss Challenge Room waves will persist until the game restarts. If this + * behavior is not desired, use Isaacscript Common's save manager to keep track of the original + * number of waves and reset it when appropriate. + */ + function SetMaxBossChallengeWaves(waves: int): void; + + /** + * Sets the maximum amount of Boss Rush waves. This is currently capped at 25 waves. + * + * The maximum amount of Boss Rush waves will persist until the game restarts. If this behavior is + * is not desired, use Isaacscript Common's save manager to keep track of the original number of + * waves and reset it when appropriate. + */ function SetMaxBossrushWaves(waves: int): void; /** - * Sets the maximum amount of Challenge Room waves. The new amount of waves will persist across - * runs until the game restarts. + * Sets the maximum amount of Challenge Room waves. + * + * The maximum amount of Challenge Room waves will persist until the game restarts. If this + * behavior is not desired, use Isaacscript Common's save manager to keep track of the original + * number of waves and reset it when appropriate. */ function SetMaxChallengeWaves(waves: int): void; @@ -48,9 +80,9 @@ declare namespace Ambush { /** * Spawns a Challenge Room wave associated with the current floor. * - * Calling this method will result in a crash if: - * - The current floor is Blue Womb. - * - The current difficulty is either Greed or Greedier. + * Calling this method crashes if there is no Challenge Rooms in the current floor's STB file. + * Under normal circumstances, the only floors to not have any Challenge rooms in their STB file + * is every Greed/Greedier Mode floor and Blue Womb. */ function SpawnWave(): void; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Backdrop.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Backdrop.d.ts new file mode 100644 index 000000000..f979c5208 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Backdrop.d.ts @@ -0,0 +1,38 @@ +/** + * The `Backdrop` class is used to modify the appearance of the room's backdrop and similar visual + * elements. You can get this class through the `Room.GetBackdrop` method. + * + * This class is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/index.html + */ +declare interface Backdrop { + /** + * Returns the sprite of the player controls that are displayed on the starting room's floor at + * the start of the run. + */ + GetControlsANM2: () => Sprite; + + /** + * Returns the sprite of the buttons tied to the player's controls that are displayed on the + * starting room's floor at the start of the run. + */ + GetControlsButtonsANM2: () => Sprite; + + /** + * Returns the sprite of the backdrop's details. + * + * The backdrop's details are not the same as the randomly spawning details on the ground as the + * latter is a GridEntity (`GridEntityType.DECORATION`). + */ + GetDetailANM2: () => Sprite; + + /** + * Returns the ANM2 of the fake backdrop used to render extremely small room. This can only be + * seen in the small closet room in Home. + */ + GetFloorANM2: () => Sprite; + + // `GetWallImage` and `GetFloorImage` are not implemented due to the Image buffer class not being + // implemented yet. +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Camera.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Camera.d.ts index 58d900dcb..b3a4ddcd0 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Camera.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Camera.d.ts @@ -1,18 +1,24 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface Camera extends IsaacAPIClass { + /** Returns whether the camera is clamped to the room's boundaries. */ + IsClampEnabled: () => boolean; + /** Returns whether the specified position is visible within the camera's current view. */ IsPosVisible: (position: Vector) => boolean; + /** Sets whether the camera is clamped to the room's boundaries. */ + SetClampEnabled: (enabled: boolean) => void; + /** * Sets the camera's current focus position, causing it to shift towards the specified position. * If you want the camera to change its position instantly, use `Camera.SnapToPosition` instead. * - * The camera will only move if the current room size is larger than 1x1. If the room size is 1x1 - * or smaller, this method will do nothing. + * By default, he camera will only move if the current room size is larger than 1x1. To allow the + * camera to move regardless of the room's shape, you must call `Camera.SetClampEnabled(false)`. * * This method must be called on every game update, otherwise the game will override the camera's * focus position. @@ -23,8 +29,8 @@ declare interface Camera extends IsaacAPIClass { * Changes the camera's position immediately. If you want the camera to smoothly change its * position, use `Camera.SetFocusPosition` instead. * - * The camera will only move if the current room size is larger than 1x1. If the room size is 1x1 - * or smaller, this method will do nothing. + * By default, he camera will only move if the current room size is larger than 1x1. To allow the + * camera to move regardless of the room's shape, you must call `Camera.SetClampEnabled(false)`. * * This method must be called on every game update, otherwise the game will override the camera's * focus position. @@ -32,4 +38,11 @@ declare interface Camera extends IsaacAPIClass { * This method does not work if `Options.CameraStyle` is not equal to `CameraStyle.ON`. */ SnapToPosition: (position: Vector) => void; + + /** + * Updates the camera. + * + * @param interpolated Optional. Default is false. + */ + Update: (interpolated?: boolean) => void; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Capsule.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Capsule.d.ts index 07d668619..4c748fff3 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Capsule.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Capsule.d.ts @@ -14,27 +14,103 @@ * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare function Capsule( this: void, position: Vector, - sizeMultiplier: Vector, - rotation: number, - size: number, + sizeMultiplierOrTargetPosition: Vector, + rotationOrSize: number, + size?: number, ): Capsule; /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface Capsule extends IsaacAPIClass { - Collide: (capsule: Capsule, point: Vector) => boolean; + /** + * Attempts to trigger a collision between two capsules at a specific position. Returns whether + * the capsules have collided or not. + */ + Collide: (capsule1: Capsule, capsule2: Capsule, point: Vector) => boolean; + + /** + * Returns a unit vector corresponding to the direction the capsule relative to its origin. This + * takes its rotation and size into account. + */ GetDirection: () => Vector; - GetF1: () => number; - GetF2: () => number; + + /** Returns the end point of the capsule. */ + GetEndPoint: () => Vector; + + /** Returns the capsule's position. */ GetPosition: () => Vector; - GetVec2: () => Vector; - GetVec3: () => Vector; + + /** Returns the size of the capsule. */ + GetSize: () => number; + + /** Returns the start point of the capsule. */ + GetStartPoint: () => Vector; + + /** Returns the size difference of the capsule. */ + GetSizeDifference: () => number; + + // DEPRECATED METHODS + + /** + * Returns the capsule's radius. + * + * The original name of this method is `GetF1` as the purpose of the function has remained unknown + * for some time. When compiling the mod, the compiler will rename this method from "GetRadius" to + * "GetF1" to prevent errors. REPENTOGON will give these methods proper names in a later update. + * + * @customName GetF1 + * @deprecated Use `Capsule.GetSize` instead as REPENTOGON added new methods that accurately + * reflect what the capsule does. + */ + GetRadius: () => number; + + /** + * Returns the distance between the two endpoints of the capsule. + * + * The original name of this method is `GetF2` as the purpose of the function has remained unknown + * for some time. When compiling the mod, the compiler will rename this method from + * "GetEndpointsDistance" to "GetF2" to prevent errors. REPENTOGON will give these methods proper + * names in a later update. + * + * @customName GetF2 + * @deprecated Use `Capsule.GetSizeDifference` instead as REPENTOGON added new methods that + * accurately reflect what the capsule does. + */ + GetEndpointsDistance: () => number; + + /** + * Returns the position of one of the two capsule's endpoints. + * + * The original name of this method is `GetVec2` as the purpose of the function has remained + * unknown for some time. When compiling the mod, the compiler will rename this method from + * "GetEndpoint1Position" to "GetVec2" to prevent errors. REPENTOGON will give these methods + * proper names in a later update. + * + * @customName GetVec2 + * @deprecated Use `Capsule.GetStartPoint` instead as REPENTOGON added new methods that accurately + * reflect what the capsule does. + */ + GetEndpoint1Position: () => Vector; + + /** + * Returns the position of one of the two capsule's endpoints. + * + * The original name of this method is `GetVec2` as the purpose of the function has remained + * unknown for some time. When compiling the mod, the compiler will rename this method from + * "GetEndpoint2Position" to "GetVec3" to prevent errors. REPENTOGON will give these methods + * proper names in a later update. + * + * @customName GetVec3 + * @deprecated Use `Capsule.GetEndPoint` instead as REPENTOGON added new methods that accurately + * reflect what the capsule does. + */ + GetEndpoint2Position: () => Vector; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/ChallengeParams.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/ChallengeParams.d.ts index 9d6d3f785..c801ec380 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/ChallengeParams.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/ChallengeParams.d.ts @@ -15,15 +15,13 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface ChallengeParams extends IsaacAPIClass { /** Returns true if the player does not start off blindfolded in the challenge. */ CanShoot: () => boolean; - /** - * Returns an array of all of the achievements that are granted upon completing the challenge. - */ + /** Returns an array of all of the achievements required for the challenge to be unlocked. */ GetAchievementList: () => Achievement[]; GetAddDamage: () => number; @@ -61,6 +59,7 @@ declare global { /** Returns the amount of red heart containers the player starts with in the challenge. */ GetMaxHearts: () => int; + /** Returns the minimum fire rate the player has in the challenge. */ GetMinFireRate: () => number; /** Returns the name of the challenge. */ @@ -84,15 +83,25 @@ declare global { /** Returns an array of trinkets that the player starts with in the challenge. */ GetTrinketList: () => TrinketType[]; - /** Returns true if the challenge goes through the alt path. */ + /** Returns whether the player must go through the Alt Path. */ IsAltPath: () => boolean; + /** Returns whether the player must go through ascent and defeat The Beast. */ + IsBeastPath: () => boolean; + + /** Returns whether the player's range is forced to be at its maximum value at 16.50. */ IsBigRangeEnabled: () => boolean; + + /** Returns whether the player's damage is forced to be at its maximum value at 100. */ IsMaxDamageEnabled: () => boolean; /** Returns true if the end-boss of the challenge is Mega Satan. */ IsMegaSatanRun: () => boolean; + + /** Returns whether the player has a minimum shot speed cap. */ IsMinShotSpeedEnabled: () => boolean; + + /** Returns whether the challenge takes the player through the Repentance path. */ IsSecretPath: () => boolean; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Color.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Color.d.ts index a024fbad8..c7bd9fcf0 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Color.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Color.d.ts @@ -12,6 +12,7 @@ * @param ac Optional. Default is 0. */ declare function Color( + this: void, r?: float, g?: float, b?: float, diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/ColorModifier.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/ColorModifier.d.ts index a75c766d1..f7df4b5cf 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/ColorModifier.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/ColorModifier.d.ts @@ -6,13 +6,12 @@ * @param b Optional. Default is 1. * @param a Optional. Default is 0. * @param brightness Optional. Default is 0. - * @param contrast Optional. Default is 1. - * - * This class is for REPENTOGON, an exe-hack which expands the modding API. - * - * @see https://repentogon.com/index.html + * @param contrast Optional. Default is 1. This class is for REPENTOGON, an exe-hack which expands + * the modding API. + * @see https://repentogon.com/ */ declare function ColorModifier( + this: void, r?: float, g?: float, b?: float, @@ -24,7 +23,7 @@ declare function ColorModifier( /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface ColorModifier extends IsaacAPIClass { A: float; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/ColorParams.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/ColorParams.d.ts index e622c676b..f9e71ddec 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/ColorParams.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/ColorParams.d.ts @@ -2,8 +2,7 @@ declare function ColorParams( this: void, color: Color, priority: int, - duration1: int, - duration2: int, + duration: int, fadeout: boolean, shared: boolean, ): ColorParams; @@ -11,7 +10,7 @@ declare function ColorParams( /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface ColorParams extends IsaacAPIClass { /** Returns the current color. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Console.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Console.d.ts index 903f0bd24..90b8254ba 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Console.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Console.d.ts @@ -2,10 +2,12 @@ import type { AutocompleteType } from "../../enums/AutocompleteType"; declare global { /** + * This class is used for handling the functionality of the debug console. + * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ namespace Console { /** Returns an array of the previously executed commands in the console. */ @@ -14,8 +16,8 @@ declare global { /** * Returns an array of all text output to the console, including user input and command outputs. * - * The order is reversed chronologically, with them most recent input first. The final entry is - * always "Repentance Console". + * The elements in the returned array are ordered last-to-first. The first element is always an + * empty string and the last element is always "Repentance+ Console". */ function GetHistory(): string[]; @@ -26,20 +28,33 @@ declare global { */ function PopHistory(amount?: number): void; - /** Logs an error message to the console, displayed in red text. */ + /** + * Logs an error message to the console, displayed in red text. + * + * This method is purely for looks; the method does not include the stack trace and the current + * callback does not stop running. If this is undesired, use the `error` global function + * instead. + */ function PrintError(error: string): void; - /** Logs a warning message to the console, displayed in yellow text. */ + /** + * Logs a warning message to the console, displayed in yellow text. + * + * This method is purely for looks; the method does not include the stack trace. + */ function PrintWarning(warning: string): void; /** - * Registers a command in the new console with autocomplete support. + * Registers a command to the console with autocomplete support. * - * @param name The command's unique name. + * @param name * @param desc A brief description shown in the output of the `help` command. * @param helpText Extended help information shown with `help (name)`. - * @param showOnMenu - * @param autocompleteType Determines the autocomplete behavior for this command. + * @param showOnMenu Whether the command will show up in the autofill while on the main menu. + * @param autocompleteType Determines the autocomplete behavior for this command. If it's set to + * `AutocompleteType.CUSTOM`, you will need to use the + * `ModCallbackRepentogon.CONSOLE_AUTOCOMPLETE` callback to handle which + * autocomplete entries show up. */ function RegisterCommand( name: string, @@ -53,6 +68,6 @@ declare global { * Registers a macro to execute a sequence of commands. Macros are accessible via the "macro" * command. */ - function RegisterMacro(name: string, commands: string[]): void; + function RegisterMacro(name: string, commands: readonly string[]): void; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/CostumeSpriteDesc.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/CostumeSpriteDesc.d.ts index 4bfe1a927..288f59e65 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/CostumeSpriteDesc.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/CostumeSpriteDesc.d.ts @@ -4,45 +4,49 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ interface CostumeSpriteDesc extends IsaacAPIClass { - /** Returns whether the costume can change the player's color. */ + /** Returns whether the costume overrides the character's body color. */ CanOverwriteColor: () => boolean; - /** Returns the base `SkinColor` of the costume's body. */ + /** Returns the costume body's `SkinColor`. */ GetBodyColor: () => SkinColor; - /** Returns the base `SkinColor` of the costume's head. */ + /** Returns the costume head's `SkinColor`. */ GetHeadColor: () => SkinColor; - /** Returns the `ItemConfigItem` of the collectible associated with this costume. */ + /** Returns the `ItemConfigItem` associated with the costume. */ GetItemConfig: () => ItemConfigItem; /** Returns the `PlayerType` of the player wearing the costume. */ GetPlayerType: () => PlayerType; - /** Returns the display priority of the costume. */ + /** Returns the costume's display priority. */ GetPriority: () => int; /** Returns the costume's sprite. */ GetSprite: () => Sprite; - /** Returns whether the costume is an overlay. */ + /** Returns whether the costume has an overlay effect. */ HasOverlay: () => boolean; - /** Returns whether the costume has an alternate version based on the player's skin color. */ + /** Returns whether the costume has alternative versions for other skin colors. */ HasSkinAlt: () => boolean; - /** Returns whether the costume grants flying. */ + /** + * Returns whether the costume displays the player as flying. This does not actually grant + * flying. + */ IsFlying: () => boolean; + /** Returns whether the costume's item animation is playing. */ IsItemAnimPlaying: () => boolean; /** - * Returns whether or not the costume is only applied when the collectible it is associated with - * is in a special state. + * Returns whether or not the costume is only visible when the player's item state matches is + * the same as the associated collectible. */ IsItemStateOnly: () => boolean; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/DailyChallenge.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/DailyChallenge.d.ts index 8ec8a31ff..3aa92a5cf 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/DailyChallenge.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/DailyChallenge.d.ts @@ -4,8 +4,8 @@ * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace DailyChallenge { /** Returns the `ChallengeParams` associated with the current daily challenge. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Debug.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Debug.d.ts index 6178387b2..dc1762b63 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Debug.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Debug.d.ts @@ -1,8 +1,8 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace Debug { /** Forcibly unloads a specified script from the Lua environment. */ @@ -13,7 +13,9 @@ declare namespace Debug { * * Passing an invalid address will throw an error. */ - function GetSignature(address: int): string; + function GetSignature( + address: int, + ): LuaMultiReturn<[status: int, signature: string | boolean]>; /** Returns an array of all scripts currently loaded in the Lua environment. */ function ListLoadedFiles(): string[]; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/EntityDesc.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/EntityDesc.d.ts new file mode 100644 index 000000000..df68f8f87 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/EntityDesc.d.ts @@ -0,0 +1,44 @@ +import type { ChampionColor, EntityType } from "isaac-typescript-definitions"; + +declare global { + /** + * Constructs an `EntityDesc` object. EntityDesc objects can only be constructed for NPCs, + * therefore passing an `EntityType` that does not correspond to a NPC will result in an error. + * + * @param this + * @param entityType Optional. Default is `EntityType.NULL`. + * @param variant Optional. Default is 0. + * @param subType Optional. Default is 0. + * @param championColor Optional. Default is -1. + * @param health Optional. Default is 0. + * @param maxHealth Optional. Default is 0. + * @param playerControlled Optional. Default is false. + */ + function EntityDesc( + this: void, + entityType?: EntityType, + variant?: int, + subType?: int, + championColor?: ChampionColor, + health?: number, + maxHealth?: number, + playerControlled?: boolean, + ): EntityDesc; + + interface EntityDesc extends IsaacAPIClass { + GetHealth: () => void; + GetChampionId: () => ChampionColor | -1; + GetMaxHealth: () => number; + GetSubtype: () => int; + GetType: () => EntityType; + GetVariant: () => int; + IsPlayerControlled: () => boolean; + SetChampionId: (championColor: ChampionColor | -1) => void; + SetHealth: (health: int) => void; + SetMaxHealth: (maxHealth: number) => void; + SetPlayerControlled: (controlled: boolean) => void; + SetSubtype: (subType: int) => void; + SetType: (entityType: EntityType) => void; + SetVariant: (variant: int) => void; + } +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/FXLayers.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/FXLayers.d.ts new file mode 100644 index 000000000..7c803313d --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/FXLayers.d.ts @@ -0,0 +1,8 @@ +/** + * This class is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +declare interface FXLayers { + AddPoopFx: (color: Color) => void; +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/FXParams.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/FXParams.d.ts index 2a1786e19..d63d706ef 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/FXParams.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/FXParams.d.ts @@ -1,7 +1,7 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface FXParams extends IsaacAPIClass { /** @@ -13,7 +13,7 @@ declare interface FXParams extends IsaacAPIClass { ColorModifier: ColorModifier; /** The base color. */ - KColor: KColor; + LightColor: KColor; /** Opacity of the room's shadow overlay. */ ShadowAlpha: number; @@ -24,8 +24,12 @@ declare interface FXParams extends IsaacAPIClass { /** Enables the reflective water shader. */ UseWaterV2: boolean; + /** The water's color. */ + WaterColor: KColor; + /** A multiplier applied to the water color. */ WaterColorMultiplier: KColor; + /** The water effects' color. */ WaterEffectColor: Color; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Game.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Game.d.ts index 64d72c6e5..ba32cdbe5 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Game.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Game.d.ts @@ -1,6 +1,8 @@ import type { EntityType, + LevelStage, StageTransitionType, + TearFlag, } from "isaac-typescript-definitions"; import type { CompletionMarkType } from "../../enums/CompletionMarkType"; import type { PauseMenuState } from "../../enums/PauseMenuState"; @@ -8,26 +10,103 @@ import type { DebugFlag } from "../../enums/flags/DebugFlag"; declare global { interface Game extends IsaacAPIClass { + /** + * Returns whether achievements cannot be unlocked in this run. + * + * Achievements can be blocked for a variety of reasons, such as: + * + * - The player playing on a challenge. + * - The player is doing a victory lap. + * - The player is playing on a seeded run. + */ AchievementUnlocksDisallowed: () => boolean; - AddDebugFlags: (flags: BitFlags) => void; + + /** Enables one or more debug flags. */ + AddDebugFlags: (flags: DebugFlag | BitFlags) => void; + + /** Increases the unique amount of shops visited in this run. */ AddShopVisits: (count: int) => void; - /** Removes all enemies that were erased by the Eraser item. */ + /** + * @param position + * @param baseDamage Optional. Default is 3.5. + * @param tearFlags Optional. Default is `TearFlag.NORMAL`. + * @param spawner Optional. Default is undefined. + */ + ChainLightning: ( + position: Vector, + baseDamage?: number, + tearFlags?: TearFlag | BitFlags, + spawner?: Entity, + ) => EntityEffect; + + /** + * Clears the list of enemies that were erased by the Eraser item, allowing them to appear + * again. + */ ClearErasedEnemies: () => void; + /** Devolves the provided enemy as if the D10 was used on them. */ DevolveEnemy: (enemy: Entity) => void; + + /** Returns the `ChallengeParams` object for the current run. */ GetChallengeParams: () => ChallengeParams; + + /** + * Returns a copy of the current color correction. This represents the vaw color values being + * used globally, which may be influenced by items such as Astral Projection. + * + * The returned `ColorModifier` do not necessarily reflect the specific color correction being + * applied in the current room. To get the current room's color correction, use + * `FXParams.ColorModifier`. + */ GetCurrentColorModifier: () => ColorModifier; + + /** Returns a bitmask of the currently enabled debug flags. */ GetDebugFlags: () => BitFlags; - GetDizzyAmount: () => int; + + /** Returns the current level of dizziness applied to the screen. */ + GetDizzyAmount: () => number; + + /** Returns the currently active `GenericPrompt` object. */ GetGenericPrompt: () => GenericPrompt; + + /** + * Repentogon's modified `Game.GetLastDevilRoomStage` method that properly returns a + * `LevelStage` value instead of an unusable userdata object. + * + * This method has been renamed to include "Ex" so it can not conflict with the vanilla type + * definitions. However, when the project compiles the method's name will change to what it's + * supposed to be. + * + * @customName GetLastDevilRoomStage + */ + GetLastDevilRoomStageEx: () => LevelStage; + + /** + * Returns the transitioning color modifier. This is formatted as the absolute rate of change, + * with all values are positive. + */ GetLerpColorModifier: () => ColorModifier; + + /** Returns the current state of the pause menu. */ GetPauseMenuState: () => PauseMenuState; + + /** Returns the number of unique planetariums visited during the current run. */ GetPlanetariumsVisited: () => int; - GetShopVisits: () => void; + + /** Returns the number of unique shops visited during the current run. */ + GetShopVisits: () => int; + + /** + * Returns the target color modifier if the game is currently transitioning between two color + * modifiers. Otherwise, returns the current color modifier. + */ GetTargetColorModifier: () => ColorModifier; /** + * Returns whether the entity has been erased by the Eraser item. + * * @param entity * @param entityType * @param variant Optional. Default is -1. @@ -37,38 +116,74 @@ declare global { | ((entity: Entity) => boolean) | ((entityType: EntityType, variant?: int, subType?: int) => boolean); + /** Returns whether the current wave is a boss wave in Greed Mode. */ IsGreedBoss: () => boolean; + + /** Returns whether the current wave is the optional "nightmare" wave in Greed Mode. */ IsGreedFinalBoss: () => boolean; + + /** Returns whether the current game mode is Hard Mode or Greedier. */ IsHardMode: () => boolean; + + /** Returns whether the pause menu is currently opened. */ IsPauseMenuOpen: () => boolean; + + /** Returns whether the run is a "re-run", meaning the player manually set the seed. */ IsRerun: () => boolean; + /** + * Returns whether the game is currently starting from a continued state or not. Once + * `ModCallback.POST_GAME_STARTED` has been called, this will always return false. + */ + IsStartingFromState: () => boolean; + + /** + * Records the provided completion type for all players in the current run, unlocking the + * relevant achievements and giving them the relevant completion mark. + */ RecordPlayerCompletion: (completionType: CompletionMarkType) => void; + /** Sets the bloom amount for a certain duration. */ + SetBloom: (duration: number, amount: number) => void; + /** + * Sets the game's current color modifier. + * * @param colorModifier - * @param lerp Optional. Default is true. - * @param rate Optional. Default is 0.015. + * @param lerp Optional. If true, the game will smoothly transition to the new color modifier. + * Default is true. + * @param rate Optional. The rate at which the colors transition. Default is 0.015. */ SetColorModifier: ( colorModifier: ColorModifier, lerp?: boolean, rate?: number, ) => void; - SetBloom: (time: number, strength: number) => void; + + /** + * Sets current dizziness amount, the effect normally used by Wavy Cap. + * + * @param targetIntensity + * @param currentIntensity Optional. If defined, the current intensity is set to this value + * before transitioning to the target intensity. Default is undefined. + */ SetDizzyAmount: ( targetIntensity: number, currentIntensity?: number, ) => void; + SetDonationModAngel: (amount: int) => void; SetDonationModGreed: (amount: int) => void; + ShowGenericLeaderboard: () => void; /** + * Spawns a bomb crater. The spawned bomb crater is returned. + * * @param position * @param radius Optional. Default is 1. */ - SpawnBombCrater: (position: Vector, radius?: number) => void; + SpawnBombCrater: (position: Vector, radius?: number) => Entity; /** * Repentogon's modified `Game.StartStageTransition` method. @@ -82,7 +197,7 @@ declare global { StartStageTransitionEx: ( sameStage: boolean, stageTransitionType: StageTransitionType, - player: EntityPlayer | undefined, + player?: EntityPlayer, ) => void; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/GenericPrompt.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/GenericPrompt.d.ts index dd7cbfddd..02795e5c9 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/GenericPrompt.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/GenericPrompt.d.ts @@ -4,45 +4,9 @@ import type { GenericPromptSubmittedSelection } from "../../enums/GenericPromptS /** * Constructs a new `GenericPrompt` class. * - * **Example** - * - * ```ts - * const mod = RegisterMod("Foo", 1); - * - * const prompt = GenericPrompt(); - * prompt.Initialize(); - * prompt.SetText("Some test text"); - * - * let wasPromptDisplayed = false; - * - * function postRender() { - * prompt.Render(); - * } - * - * mod.AddCallback(ModCallback.POST_RENDER, postRender); - * - * function postUpdate() { - * prompt.Update(true); // Process user inputs - * - * if (wasPromptDisplayed && !prompt.IsActive()) { - * // Prompt was closed by user. - * const submittedSelection = prompt.GetSubmittedSelection(); - * print(`User selected option: ${submittedSelection}`); - * wasPromptDisplayed = false; - * } - * - * if (Input.IsButtonTriggered(Keyboard.MINUS, 0)) { - * prompt.Show(); - * wasPromptDisplayed = true; - * } - * } - * - * mod.AddCallback(ModCallback.POST_UPDATE, postUpdate); - * ``` - * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare function GenericPrompt(this: void): GenericPrompt; @@ -50,36 +14,63 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface GenericPrompt { + /** Returns the selection the player is hovering over. */ GetCurrentSelection: () => GenericPromptSelection; + + /** Returns the sprite used by the prompt. */ GetSprite: () => Sprite; + + /** Returns the selection the player has submitted. */ GetSubmittedSelection: () => GenericPromptSubmittedSelection; - /** @param smallPrompt Optional. Default is false. */ + /** + * Initializes the generic prompt. This method should be called immediately after constructing + * the object. + * + * @param smallPrompt Optional. Default is false. + */ Initialize: (smallPrompt?: boolean) => void; + /** Returns whether the prompt is currently active. */ IsActive: () => boolean; + + /** + * Renders the prompt on the screen. This method should be called in `ModCallback.POST_RENDER`. + */ Render: () => void; + + /** Sets the prompt's image to the victory run image. */ SetImageToVictoryRun: () => void; /** + * Sets the paper's text. + * + * @param header1 Optional. Default is an empty string. + * @param header2 Optional. Default is an empty string. * @param line1 Optional. Default is an empty string. * @param line2 Optional. Default is an empty string. * @param line3 Optional. Default is an empty string. - * @param line4 Optional. Default is an empty string. - * @param line5 Optional. Default is an empty string. */ SetText: ( + header1?: string, + header2?: string, line1?: string, line2?: string, line3?: string, - line4?: string, - line5?: string, ) => void; + /** Displays the prompt on-screen. */ Show: () => void; + + /** + * Updates the animation of the prompt paper and its functionality. This method should be called + * in `ModCallback.POST_UPDATE`. + * + * @param processInput If true, the game will process the player's input for selecting yes/no. + */ Update: (processInput: boolean) => void; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/ImGui.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/ImGui.d.ts index 72aee17af..26f324f29 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/ImGui.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/ImGui.d.ts @@ -1,4 +1,5 @@ import type { Controller, Keyboard } from "isaac-typescript-definitions"; +import type { ImGuiWindowFlag } from "../../enums/flags/ImGuiWindowFlags"; import type { ImGuiCallback } from "../../enums/imgui/ImGuiCallback"; import type { ImGuiColor } from "../../enums/imgui/ImGuiColor"; import type { ImGuiElement } from "../../enums/imgui/ImGuiElement"; @@ -8,8 +9,8 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ namespace ImGui { /** @@ -42,7 +43,7 @@ declare global { function AddCallback( elementID: string, callbackType: ImGuiCallback, - callbackFunction: () => void, + callbackFunction: (clickCount: int) => void, ): void; /** @@ -506,6 +507,9 @@ declare global { /** Returns whether a window element with the given id is currently visible. */ function GetVisible(elementID: string): boolean; + function GetWindowChildFlags(windowID: string): BitFlags; + function GetWindowFlags(windowID: string): BitFlags; + /** Returns whether a window element with the given id is currently pinned. */ function GetWindowPinned(windowId: string): boolean; @@ -587,7 +591,7 @@ declare global { */ function SetColor( elementID: string, - colorType: ImGuiCallback, + colorType: ImGuiColor, r: float, g: float, b: float, @@ -600,6 +604,8 @@ declare global { */ function SetHelpmarker(elementID: string, text: string): void; + function SetSize(elementID: string, width: number, height: number): void; + /** * Sets the text color of an ImGui element. * @@ -626,6 +632,16 @@ declare global { /** Sets the visibility of an ImGui element. */ function SetVisible(elementID: string, visible: boolean): void; + function SetWindowChildFlags( + windowID: string, + flags: ImGuiWindowFlag | BitFlags, + ): void; + + function SetWindowFlags( + windowID: string, + flags: ImGuiWindowFlag | BitFlags, + ): void; + /** * Sets whether an ImGui window is pinned. Pinned windows remain open even when the main ImGui * interface is not visible. diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Input.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Input.d.ts index 26c49d91b..037624618 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Input.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Input.d.ts @@ -3,5 +3,6 @@ import type { ControllerIndex } from "isaac-typescript-definitions"; declare global { namespace Input { function GetDeviceNameByIdx(index: ControllerIndex): string | undefined; + function GetMouseWheel(): Vector; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Isaac.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Isaac.d.ts index 7e4690555..00f8208a8 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Isaac.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Isaac.d.ts @@ -1,14 +1,17 @@ import type { BackdropType, Challenge, + CollectibleType, Cutscene, EntityPartition, + EntityType, ItemPoolType, LanguageAbbreviation, Music, NullItemID, PlayerType, StageID, + TrinketType, WeaponType, } from "isaac-typescript-definitions"; import type { Achievement } from "../../enums/Achievement"; @@ -22,6 +25,7 @@ import type { GiantbookType } from "../../enums/GiantbookType"; import type { MainMenuType } from "../../enums/MainMenuType"; import type { TaintedMarksGroup } from "../../enums/TaintedMarksGroup"; import type { WindowIcon } from "../../enums/WindowIcon"; +import type { BossColorXMLIndex } from "../../enums/xml/BossColorXMLIndex"; declare global { /** @noSelf */ @@ -56,7 +60,7 @@ declare global { * @param ignoreNPCs Optional. If false, all NPCs in the room that aren't friendly and are * capable of keeping the doors closed are killed. Default is false. */ - function ClearBossHazards(ignoreNPCs?: EntityNPC): void; + function ClearBossHazards(ignoreNPCs?: boolean): void; /** Sets the specified challenge as completed. */ function ClearChallenge(challenge: Challenge): void; @@ -71,20 +75,21 @@ declare global { /** * Spawns a timer effect. * - * The timer is called every game update, meaning only frames in which the game is actively - * running and not paused are taken into consideration. + * The timer function is called every game update, meaning only frames in which the game is + * actively running and not paused are taken into consideration. If your use case requires a + * timer that takes paused time into account, stick with a custom timer running on a render + * callback. * - * If your use case requires a timer that takes paused time into account, stick with a custom - * timer running on a render callback. - * - * @param callback Ran after `interval` amount of frames has passed. - * @param interval The interval in frames for `callback` to be ran. - * @param persistent Whether the timer persists across rooms. + * @param timerFunction + * @param delay The delay in frames between each time `timerFunction` is ran. + * @param times Optional. Default is 1. + * @param persistent Optional. Whether the timer persists across rooms. Default is true. */ function CreateTimer( - callback: () => void, - interval: int, - persistent: boolean, + timerFunction: (effect: EntityEffect) => void, + delay: int, + times?: int, + persistent?: boolean, ): EntityEffect; /** @@ -102,26 +107,40 @@ declare global { * Draws a line between two positions. * * This method must be called in a render callback. + * + * @param startPos + * @param endPos + * @param startColor + * @param endColor + * @param thickness Optional. Default is 1. */ function DrawLine( startPos: Vector, endPos: Vector, startColor: KColor, endColor: KColor, - thickness: int, + thickness?: int, ): void; /** * Draws a quadrilateral from the four positions. * * This method must be called in a render callback. + * + * @param topLeftPos + * @param topRightPos + * @param bottomLeftPos + * @param bottomRightPos + * @param color + * @param thickness Optional. Default is 1. */ function DrawQuad( topLeftPos: Vector, topRightPos: Vector, bottomLeftPos: Vector, + bottomRightPos: Vector, color: KColor, - thickness: int, + thickness?: int, ): void; /** Completes all of the completion marks for the specified character. */ @@ -131,13 +150,24 @@ declare global { * Returns an array of entities inside the specified capsule. * * @param capsule - * @param partitions Optional. Default is `EntityPartitionZero`. + * @param partitions */ function FindInCapsule( capsule: Capsule, - partitions: BitFlags, + partitions: EntityPartition | BitFlags, ): Entity[]; + /** + * @param position + * @param targetPosition + * @param pitIndex Optional. Default is -1. + */ + function FindTargetPit( + position: Vector, + targetPosition: Vector, + pitIndex?: int, + ): int; + /** * This method is meant to be used when creating local enums that represent custom achievements. * (We have to retrieve the ID of the achievement at run-time, because it is dynamically @@ -151,7 +181,10 @@ declare global { * * Returns -1 if no achievement with the specified name was found. */ - function GetAchievementByName(name: string): Achievement; + function GetAchievementIdByName(name: string): Achievement; + + // GetAxisAlignedUnitVectorFromDir is not implemented in favor of Isaacscript Common's + // `directionToVector` function. /** * This method is meant to be used when creating local enums that represent custom backdrops. @@ -168,12 +201,18 @@ declare global { */ function GetBackdropIdByName(name: string): BackdropType; + function GetBossColorIdxByName(name: string): BossColorXMLIndex; + + /** Returns the sprite used to render the controller buttons. */ + function GetButtonsSprite(): Sprite; + /** * Returns the contents of the clipboard as long if it's in text form. Returns undefined if the * contents are not text or if it's empty. */ function GetClipboard(): string | undefined; + /** Returns the corrected position a collectible would spawn at. */ function GetCollectibleSpawnPosition(position: Vector): Vector; /** Returns a completion mark value for the specified character. */ @@ -208,7 +247,8 @@ declare global { */ function GetCutsceneIdByName(name: string): Cutscene; - function GetDwmWindowAttribute(): DwmWindowAttribute; + /** Returns the window's current Dwm attribute value. */ + function GetDwmWindowAttribute(attribute: DwmWindowAttribute): int; /** * This method is meant to be used when creating local enums that represent custom modded @@ -245,7 +285,7 @@ declare global { * Returns an array of all of the loaded script files. The key for each element is the file's * path and the value is what the file returns. */ - function GetLoadedModules(): Array>; + function GetLoadedModules(): LuaMap; /** * Returns the translation string associated with the specified key in the specified category. @@ -263,6 +303,9 @@ declare global { */ function GetModChallengeClearCount(challenge: Challenge): int; + /** Returns the current time in nanoseconds. */ + function GetNanoTime(): int; + /** * This method is meant to be used when creating local enums that represent custom null items. * (We have to retrieve the ID of the null item at run-time, because it is dynamically @@ -278,6 +321,9 @@ declare global { */ function GetNullItemIdByName(name: string): NullItemID; + /** + * Returns the game's `PersistentGameData` object, which is used to manage persistent game data. + */ function GetPersistentGameData(): PersistentGameData; /** @@ -293,9 +339,11 @@ declare global { * * Returns -1 if no item pool with the specified name was found. */ - function GetPoolByName(itemPool: string): ItemPoolType | -1; + function GetPoolIdByName(itemPool: string): ItemPoolType | -1; /** + * Returns the render position from the provided position in world coordinates. + * * @param position * @param scale Optional. Default is true. */ @@ -307,6 +355,7 @@ declare global { */ function GetString(category: string, key: LanguageAbbreviation): string; + /** Returns the appended text on the game's window title. */ function GetWindowTitle(): string; /** Returns whether the specified challenge is complete. */ @@ -315,6 +364,9 @@ declare global { /** Returns whether a run is ongoing and a cutscene is not playing. */ function IsInGame(): boolean; + /** Returns whether the game is shutting down. */ + function IsShuttingDown(): boolean; + /** Creates a new blank `LevelGeneratorEntry`. */ function LevelGeneratorEntry(): LevelGeneratorEntry; @@ -325,18 +377,62 @@ declare global { * Plays the specified cutscene. * * @param cutscene - * @param clearGameState Optional. Default is false. + * @param clearGameState Optional. If true, the run will end and the player is taken back to the + * main menu once the cutscene is finished. Default is false. */ function PlayCutscene(cutscene: Cutscene, clearGameState?: boolean): void; + /** + * @param collectible + * @param position + * @param scale Optional. Default is `VectorOne`. + * @param color Optional. Default is `ColorDefault`. + */ + function RenderCollectionItem( + collectible: CollectibleType, + position: Vector, + scale?: Vector, + color?: Color, + ): void; + + /** + * Forces the Birthright effect of the provided `PlayerType` to have no behavior at all. This + * method allows you to easily rework an existing birthright effect without the need of creating + * a fake collectible or wrestling with the birthright's existing behavior. + * + * This method will only work when called while mods are loading. After all mods have loaded, + * calling this method will result in an error. + */ + function ReworkBirthright(playerType: PlayerType): void; + + /** + * Forces the provided collectible to have no behavior at all. This method allows you to easily + * rework an existing collectible without the need of creating a fake collectible or wrestling + * with the item's existing behavior. + * + * This method will only work when called while mods are loading. After all mods have loaded, + * calling this method will result in an error. + */ + function ReworkCollectible(collectible: CollectibleType): void; + + /** + * Forces the provided trinket to have no behavior at all. This method allows you to easily + * rework an existing trinket without the need of creating a fake trinket or wrestling with the + * trinket's existing behavior. + * + * This method will only work when called while mods are loading. After all mods have loaded, + * calling this method will result in an error. + */ + function ReworkTrinket(trinket: TrinketType): void; + /** * Sets the contents of the clipboard to the specified string. Returns whether the contents were * set successfully. */ - function SetClipboard(contents: string): void; + function SetClipboard(contents: string): boolean; /** Sets the value of the specified completion mark for a character. */ - function SetCompletionMarks( + function SetCompletionMark( character: PlayerType, mark: CompletionMarkType, value: CompletionMarkDifficulty, @@ -367,10 +463,22 @@ declare global { * The new name does not persist on save/continue. You will need to manually account for that * using Isaacscript Common's Save Data Manager. */ - function SetCurrentFlorName(name: string): void; + function SetCurrentFloorName(name: string): void; - function SetDwmWindowAttribute(attribute: DwmWindowAttribute): void; + /** Sets the game's Dwm window attribute. */ + function SetDwmWindowAttribute( + attribute: DwmWindowAttribute, + value: int, + ): void; + /** + * Sets the game's taskbar icon. + * + * @param windowIcon You can choose to either pass `WindowIcon` to use one of the two vanilla + * game icons or pass a path to an .ico file to use as the game's taskbar + * icon. + * @param bypassResolutionLimit Optional. If true, the 16x16 resolution cap is bypassed. + */ function SetIcon( windowIcon: WindowIcon | string, bypassResolutionLimit: boolean, @@ -383,6 +491,12 @@ declare global { * Displays a Win32 message box. Returns a `DialogReturn` value which indicates the button * pressed. * + * It's a good idea to not heavily rely on this function as: + * + * - Players using a gamepad are unable to navigate the popup. They will have to use a mouse, + * keyboard, or touchscreen. + * - The window title will not show up in some environments such as the Steam Deck. + * * @param title * @param text * @param dialogIcon Optional. Default is `DialogIcon.ERROR`. @@ -395,6 +509,28 @@ declare global { dialogButtons?: DialogButton, ): DialogReturn; + /** + * Spawns a boss. This method will error if you attempt to spawn an entity that's not an + * EntityNPC. + * + * @param entityType + * @param variant + * @param subType + * @param position + * @param velocity + * @param spawner Optional. Default is undefined. + * @param seed Optional. Default is the current room's seed. + */ + function SpawnBoss( + entityType: EntityType, + variant: int, + subType: int, + position: Vector, + velocity: Vector, + spawner?: Entity, + seed?: Seed, + ): EntityNPC; + /** * @param playerType Optional. Default is `PlayerType.Isaac`. * @param challenge Optional. Default is undefined. diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/ItemOverlay.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/ItemOverlay.d.ts index ef594ae6b..8191cf7b4 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/ItemOverlay.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/ItemOverlay.d.ts @@ -3,8 +3,8 @@ import type { GiantbookType } from "../../enums/GiantbookType"; /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace ItemOverlay { /** @@ -14,6 +14,7 @@ declare namespace ItemOverlay { */ function GetDelay(): int; + /** Returns the sprite used to play the the Mega Mush transformation animation. */ function GetMegaMushPlayerSprite(): Sprite; /** Returns the `GiantbookType` of the last played giantbook animation. */ @@ -23,7 +24,7 @@ declare namespace ItemOverlay { * Returns the player that triggered the last played giantbook animation. Returns undefined if no * player triggered the animation. */ - function GetPlayer(): EntityPlayer; + function GetPlayer(): EntityPlayer | undefined; /** Returns the sprite used for the giantbook animations. */ function GetSprite(): Sprite; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/ItemPool.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/ItemPool.d.ts index 09544a2c3..2ea878c3f 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/ItemPool.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/ItemPool.d.ts @@ -6,6 +6,7 @@ import type { PillEffect, TrinketType, } from "isaac-typescript-definitions"; +import type { GetCollectibleFlag } from "../../enums/flags/GetCollectibleFlag"; declare global { interface ItemPool extends IsaacAPIClass { @@ -21,8 +22,8 @@ declare global { ignoreLocked: boolean, ) => boolean; - /** Returns the number of Bible collectibles added to the specified `ItemPoolType`. */ - GetBibleUpgrades: (itemPool: ItemPoolType) => int; + /** Returns the number of Bible collectibles added to provided `itemPool`. */ + GetBibleUpgrades: (itemPoolType: ItemPoolType) => int; /** * A more sophisticated version of `ItemPool.GetCard` that allows you to define individual @@ -57,9 +58,10 @@ declare global { ) => CollectibleType; /** Returns an array of collectibles registered in the specified `ItemPoolType`. */ - GetCollectiblesFromPool: (poolType: ItemPoolType) => Array<{ + GetCollectiblesFromPool: (itemPoolType: ItemPoolType) => Array<{ decreaseBy: float; initialWeight: float; + isUnlocked: boolean; itemID: CollectibleType; removeOn: float; weight: float; @@ -82,11 +84,32 @@ declare global { */ GetPillColor: (pillEffect: PillEffect) => PillColor; - /** Returns an array of collectibles removed from all pools. */ - GetRemovedCollectibles: () => CollectibleType[]; + /** + * Returns a random item pool that is present in the current game mode. The pool selection is + * weighted, meaning item pools with more collectibles have a higher chance of being selected. + * + * @param rng + * @param advancedSearch Optional. If true, the game will return any item pool in the game, + * including those not present in the current game mode. Furthermore, + * setting it to true will allow you to make use of the `filter` argument. + * Default is false. + * @param filter Optional. The list of filtered item pools. Default is an empty array. + * @param isWhitelist Optional. If true, the game will only select item pools from the filter. + * Otherwise, the game will not select item pools from the filter. Default is + * false. + */ + GetRandomPool: ( + rng: RNG, + advancedSearch?: boolean, + filter?: ItemPoolType[], + isWhitelist?: boolean, + ) => ItemPoolType; + + /** Returns a map of collectibles removed from all pools. */ + GetRemovedCollectibles: () => LuaMap; /** Returns an array of all collectibles blacklisted in the current room. */ - GetRoomBlacklistedCollectibles: () => CollectibleType[]; + GetRoomBlacklistedCollectibles: () => LuaMap; /** Returns whether the specified collectible is available in item pools. */ HasCollectible: (collectible: CollectibleType) => boolean; @@ -94,6 +117,52 @@ declare global { /** Returns whether the specified trinket is available in the trinket pool. */ HasTrinket: (trinket: TrinketType) => boolean; + /** + * Returns the raw result of `ItemPool.GetCollectible` without applying the filtering used in + * `ItemPool.GetCollectible`. Returns undefined if the provided `itemPool` has no collectibles + * remaining. + * + * **Differences with `ItemPool.GetCollectible`** + * + * - The game does not select glitched items, even if a player has TMTRAINER. + * - The game does not randomize the pool if a player has Chaos. + * - The game does not attempt to return a collectible from `ItemPoolType.TREASURE` or + * `CollectibleType.BREAKFAST` if it fails to pick a random collectible. + * - The game does not attempt to morph the collectible into `CollectibleType.BIBLE`, + * `CollectibleType.MAGIC_SKIN`, or `CollectibleType.ROSARY`. + * - The game does not trigger `ModCallbackRepentogon.PRE_GET_COLLECTIBLE` and + * `ModCallbackRepentogon.POST_GET_COLLECTIBLE`. + * + * @param itemPoolType + * @param decrease Optional. Default is false. + * @param rng Optional. Default is a new RNG object seeded with `Random()`. + * @param flags Optional. Default is `GetCollectibleFlagZero`. + */ + PickCollectible: ( + itemPoolType: ItemPoolType, + decrease?: boolean, + rng?: RNG, + flags?: GetCollectibleFlag | BitFlags, + ) => + | { + itemID: CollectibleType; + initialWeight: float; + weight: float; + decreaseBy: float; + removeOn: float; + isUnlocked: boolean; + } + | undefined; + + /** + * Makes the provided collectible available again in every item pool. Its `initialWeight` is + * also restored. + */ + ResetCollectible: (collectible: CollectibleType) => void; + + /** Sets the currently selected `ItemPoolType`. */ + SetLastPool: (itemPoolType: ItemPoolType) => void; + /** Resets the specified `PillColor` back to its unidentified state. */ UnidentifyPill: (pill: PillColor) => void; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/LRoomAreaDesc.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/LRoomAreaDesc.d.ts new file mode 100644 index 000000000..22c2afc43 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/LRoomAreaDesc.d.ts @@ -0,0 +1,18 @@ +/** + * This class is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +declare interface LRoomAreaDesc { + /** Returns the position of the upper half's bottom right corner. */ + GetHighBottomRight: () => Vector; + + /** Returns the position of the upper half's bottom right corner. */ + GetHighTopLeft: () => Vector; + + /** Returns the position of the bottom half's bottom right corner. */ + GetLowBottomRight: () => Vector; + + /** Returns the position of the lower half's top left corner. */ + GetLowTopLeft: () => Vector; +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/LRoomTileDesc.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/LRoomTileDesc.d.ts new file mode 100644 index 000000000..a5b06f459 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/LRoomTileDesc.d.ts @@ -0,0 +1,21 @@ +/** + * This class is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +declare interface LRoomTileDesc { + /** Returns the grid coordinates of the upper half's bottom right corner. */ + GetHighBottomRight: () => [int, int]; + + /** Returns the grid coordinates of the upper half's top left corner. */ + GetHighTopLeft: () => [int, int]; + + /** Returns the grid coordinates of the lower half's bottom right corner. */ + GetLowBottomRight: () => [int, int]; + + /** Returns the grid coordinates of the lower half's top left corner. */ + GetLowTopLeft: () => [int, int]; + + /** Returns the grid coordinates of a random tile. */ + GetRandomTile: (seed: Seed) => [int, int]; +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Level.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Level.d.ts index 0b055b75b..4136839ba 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Level.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Level.d.ts @@ -2,28 +2,116 @@ import type { Dimension, DoorSlot, LevelStage, + RoomShape, StageType, } from "isaac-typescript-definitions"; import type { SpecialQuest } from "../../enums/SpecialQuest"; declare global { interface Level extends IsaacAPIClass { + /** + * Returns whether the provided room config can be successfully placed at the provided grid + * index using `Level.TryPlaceRoom`. + * + * @param roomConfigToPlace + * @param gridIndex + * @param dimension Optional. Default is `Dimension.CURRENT`. + * @param allowMultipleDoors Optional. If true, the room can be placed if it has more than one + * door. Default is true. + * @param allowSpecialNeighbors Optional. If true, the game will allow the room to connect with + * special rooms. Default is false. + * @param allowNoNeighbors Optional. If true, the room can be placed anywhere on the map without + * having any neighbors. Default is false. + */ + CanPlaceRoom: ( + roomConfigToPlace: RoomConfig, + gridIndex: int, + dimension?: Dimension, + allowMultipleDoors?: boolean, + allowSpecialNeighbors?: boolean, + allowNoNeighbors?: boolean, + ) => boolean; + + /** + * Returns whether the provided room config can be successfully placed as a neighbor of an + * existing room at the provided door slot using `Level.TryPlaceRoomAtDoor`. + * + * @param roomConfigToPlace + * @param neighborRoomDescriptor + * @param doorSlot + * @param allowMultipleDoors Optional. If true, the room can be placed if it has more than one + * door. Default is true. + * @param allowSpecialNeighbors Optional. If true, the game will allow the room to connect with + * special rooms. Default is false. + */ + CanPlaceRoomAtDoor: ( + roomConfigToPlace: RoomConfig, + neighborRoomDescriptor: RoomDescriptor, + doorSlot: DoorSlot, + allowMultipleDoors?: boolean, + allowSpecialNeighbors?: boolean, + ) => boolean; + /** Returns whether the Red Door outline can spawn at the specified `DoorSlot`. */ CanSpawnDoorOutline: (roomIndex: int, doorSlot: DoorSlot) => boolean; + /** + * Returns an array of grid indices that are valid locations to place the provided room using + * `Level.TryPlaceRoom`. + * + * @param roomConfigToPlace + * @param dimension Optional. Default is `Dimension.CURRENT`. + * @param allowMultipleDoors Optional. If true, the room can be placed if it has more than one + * door. Default is true. + * @param allowSpecialNeighbors Optional. If true, the game will allow the room to connect with + * special rooms. Default is false. + */ + FindValidRoomPlacementLocations: ( + roomConfigToPlace: RoomConfig, + dimension?: Dimension, + allowMultipleDoors?: boolean, + allowSpecialNeighbors?: boolean, + ) => int[]; + /** Returns the current dimension the player is in. */ GetDimension: () => Dimension; + /** + * Returns the level's forced special quest. This can be set through + * `Level.SetForceSpecialQuest`. + */ + GetForceSpecialQuest: () => SpecialQuest; + + GetGenerationRNG: () => RNG; + + /** Returns the number of Greed Mode waves cleared without a player taking Red Heart damage. */ + GetGreedWavesClearedWithoutRedHeartDamage: () => int; + /** * Returns the pickups that will be transferred to the next floor by the Myosotis trinket * effect. */ GetMyosotisPickups: () => EntitiesSaveStateVector; - /** Returns whether the special quest is forced. */ - GetForceSpecialQuest: () => SpecialQuest; - - GetGreedWavesClearedWithoutRedHeartDamage: () => int; + /** + * Returns a map that maps `DoorSlot` to `RoomDescriptor` for all of the neighbors that a room + * of the provided room shape would have if placed at the provided grid index. + * + * This method does not give any information on if a room would actually fit there, or if the + * neighbors would allow the connection. + * + * If you want to get the neighbors of an existing room, use + * `RoomDescriptor.GetNeighboringRooms` instead. + * + * @param gridIndex + * @param roomShape + * @param dimension Optional. Default is `Dimension.CURRENT`. + */ + GetNeighboringRooms: ( + gridIndex: int, + roomShape: RoomShape, + dimension?: Dimension, + ) => LuaMap; /** Returns whether the floor has the mineshaft room used for the second Knife Piece puzzle. */ HasAbandonedMineshaft: () => boolean; @@ -41,11 +129,15 @@ declare global { * Returns whether the specified level and stage combination can be generated in any given run * and is not locked behind an achievement. */ - IsStageAvailable: (level: LevelStage, stage: StageType) => void; + IsStageAvailable: (level: LevelStage, stage: StageType) => boolean; /** * Attempts to place a room. * + * This method does not check if a room placement would be considered valid, nor does it create + * the doors necessary to connect the new room to its neighbors. If you wish to properly add new + * rooms to the floor after level generation, use `Level.TryPlaceRoom` instead. + * * Returns whether room placement was successful. */ PlaceRoom: ( @@ -54,10 +146,67 @@ declare global { seed: Seed, ) => boolean; - SetGreedWavesClearedWithoutRedHeartDamage: (waves: int) => void; + /** + * Sets the level's forced special quest on the floor. For this method to work properly, it + * should be called in `ModCallbackRepentogon.PRE_LEVEL_INIT`. + */ SetForceSpecialQuest: (quest: SpecialQuest) => void; + /** Sets how many Greed Mode waves were cleared without taking Red Heart damage. */ + SetGreedWavesClearedWithoutRedHeartDamage: (waves: int) => void; + /** Sets the display name of the level. */ SetName: (name: string) => void; + + /** + * Tries to place a room corresponding to the provided room config at the provided grid index. + * Returns a `RoomDescriptor` if room placement was successful. Returns undefined if room + * placement was unsuccessful. + * + * @param roomConfigToPlace + * @param gridIndex + * @param dimension Optional. Default is `Dimension.CURRENT`. + * @param seed Optional. Setting the seed to zero will have the game generate a seed based on + * the room's location, shape, and the level's seed. Default is 0. + * @param allowMultipleDoors Optional. If true, the room can be placed if it has more than one + * door. Default is true. + * @param allowSpecialNeighbors Optional. If true, the game will allow the room to connect with + * special rooms. Default is false. + * @param allowNoNeighbors Optional. If true, the room can be placed anywhere on the map without + * having any neighbors. Default is false. + */ + TryPlaceRoom: ( + roomConfigToPlace: RoomConfig, + gridIndex: int, + dimension?: Dimension, + seed?: Seed, + allowMultipleDoors?: boolean, + allowSpecialNeighbors?: boolean, + allowNoNeighbors?: boolean, + ) => RoomDescriptor | undefined; + + /** + * Tries to place a room corresponding to the provided room config at the provided door slot at + * in existing room. Returns a `RoomDescriptor` if room placement was successful. Returns + * undefined if room placement was unsuccessful. + * + * @param roomConfigToPlace + * @param neighborRoomDescriptor + * @param doorSlot + * @param seed Optional. Setting the seed to zero will have the game generate a seed based on + * the room's location, shape, and the level's seed. Default is 0. + * @param allowMultipleDoors Optional. If true, the room can be placed if it has more than one + * door. Default is true. + * @param allowSpecialNeighbors Optional. If true, the game will allow the room to connect with + * special rooms. Default is false. + */ + TryPlaceRoomAtDoor: ( + roomConfigToPlace: RoomConfig, + neighborRoomDescriptor: RoomDescriptor, + doorSlot: DoorSlot, + seed?: Seed, + allowMultipleDoors?: boolean, + allowSpecialNeighbors?: boolean, + ) => RoomDescriptor | undefined; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/LootList.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/LootList.d.ts index 3304adbc8..a848d89fe 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/LootList.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/LootList.d.ts @@ -4,12 +4,45 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface LootList extends IsaacAPIClass { + /** Returns an array of entries in the `LootList`. */ GetEntries: () => LootListEntry[]; /** + * Adds a new entry into the `LootList`. + * + * While usually reserved for chests and sacks that give pickups like hearts and bombs, every + * `EntityPickup` has a `LootList` that lets you add your entities to it. + * + * Calling this method does nothing if the `LootList` is readonly; it should only be called in + * `ModCallbackRepentogon.PRE_PICKUP_GET_LOOT_LIST`. + * + * **Example** + * + * This snippet replaces the contents of every chest in the game with Delirium, for better or + * for worse: + * + * ```ts + * const mod = RegisterMod("Delirium Unboxing", 1); + * + * function getLootList(pickup: EntityPickup) { + * if (pickup.Variant === PickupVariant.CHEST) { + * const newLootList = LootList(); + * newLootList.PushEntry(EntityType.DELIRIUM, 0, 0); + * return newLootList; + * } + * + * return undefined; + * } + * + * mod.AddCallbackRepentogon( + * ModCallbackRepentogon.PRE_PICKUP_GET_LOOT_LIST, + * getLootList, + * ); + * ``` + * * @param entityType * @param variant * @param subType diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/LootListEntry.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/LootListEntry.d.ts index 785af70fb..7be446a71 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/LootListEntry.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/LootListEntry.d.ts @@ -4,13 +4,22 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface LootListEntry extends IsaacAPIClass { + /** Returns the entry's RNG. Returns undefined if it has no RNG object. */ GetRNG: () => RNG | undefined; + + /** Returns the entry's seed. */ GetSeed: () => Seed; + + /** Returns the entry's sub-type. */ GetSubType: () => int; + + /** Returns the entry's `EntityType`. */ GetType: () => EntityType; + + /** Returns the entry's variant. */ GetVariant: () => int; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/MultiShotParams.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/MultiShotParams.d.ts index 822bfacef..0d9a9b3a0 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/MultiShotParams.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/MultiShotParams.d.ts @@ -4,7 +4,7 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface MultiShotParams { /** @@ -13,7 +13,7 @@ declare global { */ GetMultiEyeAngle: () => number; - /** the number of active eyes that shoots simultaneously (e.g. 2 for The Wiz). */ + /** Returns the number of active eyes that shoots simultaneously (e.g. 2 for The Wiz). */ GetNumEyesActive: () => int; /** @@ -25,8 +25,11 @@ declare global { /** Returns the number of tears fired in random directions, similar to the Eye Sore effect. */ GetNumRandomDirTears: () => int; + /** Returns the amount of tears the player can simultaneously fire. */ + GetNumTears: () => int; + /** Returns the spread angle of the specified `WeaponType`. */ - GetSpreadAngle: (weaponType: WeaponType) => void; + GetSpreadAngle: (weaponType: WeaponType) => number; /** Returns whether the cross-eyed effect is active, similar to The Wiz. */ IsCrossEyed: () => boolean; @@ -58,6 +61,9 @@ declare global { /** Sets the number of lanes tears are spread into per eye. */ SetNumLanesPerEye: (lanes: int) => void; + /** Sets the number of tears fired in random directions, similar to the Eye Sore effect. */ + SetNumRandomDirTears: (tears: int) => void; + /** Sets the maximum number of tears the player can fire simultaneously. */ SetNumTears: (tears: int) => void; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/NightmareScene.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/NightmareScene.d.ts index 83aa9bb0a..dd0b97d80 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/NightmareScene.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/NightmareScene.d.ts @@ -4,8 +4,8 @@ * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace NightmareScene { /** Returns the sprite used by the background. */ @@ -14,6 +14,7 @@ declare namespace NightmareScene { /** Returns the sprite used by the thought bubble above the player portrait. */ function GetBubbleSprite(): Sprite; + /** Returns the sprite used to display the extra player's portrait. */ function GetPlayerExtraPortraitSprite(): Sprite; function GetProgressBarMap(): int[]; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Options.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Options.d.ts index cf59d02f8..5c354a59f 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Options.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Options.d.ts @@ -1,7 +1,15 @@ declare namespace Options { + let AimLockEnabled: boolean; + let AscentVoiceOver: boolean; + /** Whether The Void will draw from all unlocked floors, including alt path ones. */ let BetterVoidGeneration: boolean; + let BossHPOnBottom: boolean; + let Brightness: number; + let Contrast: number; + let Exposure: number; + /** * Whether the patch for the vanilla bug that causes Hush to have no attack cooldown below 50% * health is applied. @@ -12,7 +20,7 @@ declare namespace Options { let KeyMasterDealChance: boolean; /** Whether mod updates are disabled. */ - let PreventModUpdates: boolean; + const PreventModUpdates: boolean; /** Whether quick room clear is enabled. */ let QuickRoomClear: boolean; @@ -24,4 +32,13 @@ declare namespace Options { * the HUD is rendering. */ let StatHUDPlanetarium: boolean; + + let TouchMode: int; + let WindowHeight: int; + let WindowPosX: int; + let WindowPosY: int; + let WindowWidth: int; + + // While REPENTOGON does expose readonly settings used for Isaac Online, they are excluded as + // Isaac Online is disabled for mods. Therefore, their definitions are redundant. } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/PersistentGameData.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/PersistentGameData.d.ts index c2af38c06..2f6f4b8c9 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/PersistentGameData.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/PersistentGameData.d.ts @@ -1,4 +1,5 @@ import type { + BossID, Challenge, CollectibleType, EntityType, @@ -13,9 +14,20 @@ declare global { * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ - interface PersistentGameData { + interface PersistentGameData extends IsaacAPIClass { + /** + * Adds a kill to the bestiary entry. Returns whether the kill was successfully added. + * + * @param entityType + * @param variant Optional. Default is 0. + */ + AddBestiaryKill: (entityType: EntityType, variant?: int) => boolean; + + /** Marks the boss as killed and unlocks its relevant achievements if conditions are met. */ + AddBossKilled: (bossID: BossID) => void; + /** Returns the number of times a specific entity has been killed, according to the bestiary. */ GetBestiaryDeathCount: (entityType: EntityType, variant: int) => int; @@ -36,19 +48,27 @@ declare global { /** Increases the value of a specified persistent event counter by the provided amount. */ IncreaseEventCounter: (event: EventCounter, count: int) => void; + /** Returns whether the boss has been killed. This is used for tracking numerous unlocks. */ + IsBossKilled: (bossID: BossID) => boolean; + /** Returns whether the provided `Challenge` has been completed. */ - IsChallengeComplete: (challenge: Challenge) => boolean; + IsChallengeCompleted: (challenge: Challenge) => boolean; /** Returns whether the provided collectible is in the items page in the stats menu. */ - IsItemInCollection: (collectible: CollectibleType) => void; + IsItemInCollection: (collectible: CollectibleType) => boolean; /** * Tries to unlock the provided `Achievement`. Returns whether the achievement was unlocked * successfully. * - * @param hideNotification Optional. Default is false. + * @param achievement + * @param hideNotification Optional. If true, the achievement paper will not appear. This is + * only used by modded achievements. Default is false. */ - TryUnlock: (unlock: Achievement, hideNotification?: boolean) => boolean; + TryUnlock: ( + achievement: Achievement, + hideNotification?: boolean, + ) => boolean; /** Returns whether the provided `Achievement` is unlocked. */ Unlocked: (unlock: Achievement) => boolean; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/PlayerManager.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/PlayerManager.d.ts index 8ead9a504..532761761 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/PlayerManager.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/PlayerManager.d.ts @@ -1,5 +1,7 @@ import type { + BabySubType, CollectibleType, + ControllerIndex, PlayerType, TrinketType, } from "isaac-typescript-definitions"; @@ -12,8 +14,8 @@ declare global { * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ namespace PlayerManager { /** Returns whether any player currently has the provided `CollectibleType`. */ @@ -59,6 +61,15 @@ declare global { ignoreModifiers?: boolean, ): boolean; + /** + * Returns the first player whose type matches the provided `playerType` that picked up + * Birthright. Returns undefined if no players of the provided `playerType` has picked up + * Birthright. + */ + function FirstBirthrightOwner( + playerType: PlayerType, + ): EntityPlayer | undefined; + /** * Returns the first player who picked up the provided `CollectibleType` for the first time in * the current run. Returns undefined if the collectible has not been picked up yet. @@ -93,7 +104,13 @@ declare global { lazarusSharedGlobalTag?: boolean, ): EntityPlayer | undefined; - function GetEsauJrState(index?: int): EntityPlayer; + function FirstTrinketOwner( + trinket: TrinketType, + lazarusSharedGlobalTag?: boolean, + ): EntityPlayer | undefined; + + /** @param index Optional. Default is 0. */ + function GetEsauJrState(index?: int): EntityPlayer | undefined; /** * Returns the total number of collectibles of the provided `CollectibleType` held by all @@ -109,6 +126,30 @@ declare global { */ function GetPlayers(): EntityPlayer[]; + /** + * Returns a random player who owns the provided `CollectibleType`, along with the player's + * collectible RNG. Returns undefined if no player has the provided `CollectibleType`. + * + * @param collectible + * @param seed + */ + function GetRandomCollectibleOwner( + collectible: CollectibleType, + seed: Seed, + ): undefined | LuaMultiReturn<[EntityPlayer, RNG]>; + + /** + * Returns a random player who owns the provided `TrinketType`, along with the player's trinket + * RNG. Returns undefined if no player has the provided `TrinketType`. + * + * @param trinket + * @param seed + */ + function GetRandomTrinketOwner( + trinket: TrinketType, + seed: Seed, + ): undefined | LuaMultiReturn<[EntityPlayer, RNG]>; + /** Returns the total multiplier granted by the provided `TrinketType` across all players. */ function GetTotalTrinketMultiplier(trinket: TrinketType): int; @@ -118,13 +159,21 @@ declare global { /** * Safely removes extra player entities such as Strawman. * - * It is not recommended to pass the main player entity to this method. + * This method is extremely dangerous to use as passing the main player entity to this will + * cause the game to crash. Ensure that this method is only used to remove co-players spawned by + * `SpawnCoPlayer2`. */ function RemoveCoPlayer(player: EntityPlayer): void; /** Spawns a second player of the provided `PlayerType`. */ function SpawnCoPlayer2(playerType: PlayerType): EntityPlayer; + /** Spawns a co-op baby tied to the provided controller index. */ + function SpawnSelectedBaby( + babySubType: BabySubType, + controllerIndex: ControllerIndex, + ): void; + /** Triggers the room clear event. */ function TriggerRoomClear(): void; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/PocketItem.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/PocketItem.d.ts index 94b224ed1..f160bcbe6 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/PocketItem.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/PocketItem.d.ts @@ -1,17 +1,48 @@ -import type { PocketItemSlot } from "isaac-typescript-definitions"; +import type { + ActiveSlot, + CardType, + PillColor, +} from "isaac-typescript-definitions"; import type { PocketItemType } from "../../enums/PocketItemType"; declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface PocketItem { - /** Returns the slot of the pocket item. */ - GetSlot: () => PocketItemSlot; + /** + * Returns an identifying value for the pocket item: + * + * - Returns `CardType` if the pocket item is a card. + * - Returns `PillColor` if the pocket item is a pill. + * - Returns an `ActiveSlot` offset by +1 if the pocket item is an active item. + * - Returns 0 if the pocket slot is empty. + * + * **Example** + * + * This snippet obtains the `CollectibleType` of the pocket item in a given pocket slot: + * + * ```ts + * const player = Isaac.GetPlayer(); + * const pocketItem = player.GetPocketItem(PillCardSlot.PRIMARY); + * + * if (pocketItem.GetType() === PocketItemType.ACTIVE_ITEM) { + * const activeSlot = (pocketItem.GetSlot() - 1) as ActiveSlot; + * const activeItemID = player.GetActiveItem(activeSlot); + * print(activeItemID); + * } + * ``` + */ + GetSlot: () => CardType | PillColor | ActiveSlot; - /** Returns the pocket item's `PocketItemType`. */ + /** + * Returns the pocket item's `PocketItemType`. + * + * Do not use this method if the slot is currently empty as the game sometimes does not clear + * the value. + */ GetType: () => PocketItemType; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/PosVel.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/PosVel.d.ts index 12b2b0567..96e488a63 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/PosVel.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/PosVel.d.ts @@ -1,7 +1,7 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface PosVel extends IsaacAPIClass { Position: Vector; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/RNG.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/RNG.d.ts index 9d39217ff..23e0e8130 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/RNG.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/RNG.d.ts @@ -1,4 +1,7 @@ declare interface RNG extends IsaacAPIClass { + /** Returns the RNG object's shift index. */ + GetShiftIdx: () => int; + /** * Returns a random float between 0 and 1. It is inclusive on the lower end and exclusive on the * higher end. @@ -15,7 +18,23 @@ declare interface RNG extends IsaacAPIClass { * This does not call the `RNG.Next` method before retrieving the random number. If this is not * desired, use the `RNG.RandomInt` method instead. */ - PhantomInt: (max: int) => int; + PhantomInt: ((max: int) => int) & ((min: int, max: int) => int); + + /** + * Returns the next seed of the RNG object as if it has been "iterated". + * + * This does not change the RNG object's seed. If you wish to get the next seed and also change + * it, use `RNG.Next` instead. + */ + PhantomNext: () => int; + + /** + * Returns the previous seed of the RNG object. + * + * This does not change the RNG object's seed. If you wish to get the previous seed and also + * change it, use `RNG.Previous` instead. + */ + PhantomPrevious: () => int; /** * Returns a random vector with a length of 1. @@ -25,6 +44,22 @@ declare interface RNG extends IsaacAPIClass { */ PhantomVector: () => Vector; + /** "Iterates" the RNG object's seed backwards and returns the new seed. */ + Previous: () => int; + + /** + * Repentogon's modified `RNG.RandomInt` method. + * + * Behaves the same as `RNG.RandomInt` except you can now specify a range of values. + * + * This method has been renamed to include "Ex" so it can not conflict with the vanilla type + * definitions. However, when the project compiles the method's name will change to what it's + * supposed to be. + * + * @customName RandomInt + */ + RandomIntEx: ((max: int) => int) & ((min: int, max: int) => int); + /** * Returns a random vector with a length of 1. * @@ -32,5 +67,5 @@ declare interface RNG extends IsaacAPIClass { * number. Since this mutates the RNG object, you should use this method with care. If this * behavior is not desired, use the `RNG.PhantomVector` method instead. */ - RandomFloat: () => float; + RandomVector: () => Vector; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/RailManager.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/RailManager.d.ts index 7ce0cbac0..eab002e7d 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/RailManager.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/RailManager.d.ts @@ -1,7 +1,7 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface RailManager extends IsaacAPIClass { GetRailsSprite: () => Sprite; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Room.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Room.d.ts index 69d1f394c..883a6bbed 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Room.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Room.d.ts @@ -3,62 +3,42 @@ import type { EntityType, GridEntityType, ItemPoolType, + Music, PickupVariant, } from "isaac-typescript-definitions"; import type { StbRailVariant } from "../../enums/StbRailVariant"; declare global { interface Room extends IsaacAPIClass { - /** - * Repentogon's modified `Room.SpawnGridEntity` method. - * - * This method has been renamed to include "Ex" so it can not conflict with the vanilla type - * definitions. However, when the project compiles the method's name will change to what it's - * supposed to be. - * - * @param gridIndex - * @param gridEntityType - * @param variant Optional. Default is 0. - * @param seed Optional. - * @param varData Optional. Default is 0. - * @param descriptor - * @customName SpawnGridEntity - */ - SpawnGridEntityEx: (( - gridIndex: int, - gridEntityType: GridEntityType, - variant?: int, - seed?: Seed, - varData?: int, - ) => void) & - ((gridIndex: int, descriptor: GridEntityDesc) => void); - - /** - * Repentogon's modified `Room.TrySpawnSpecialQuestDoor` method. - * - * This method has been renamed to include "Ex" so it can not conflict with the vanilla type - * definitions. However, when the project compiles the method's name will change to what it's - * supposed to be. - * - * @param ignoreStageType Optional. Whether the Mirror & Mineshaft door can spawn outside of - * stages outside of the alt-floor. Default is false. - * @customName TrySpawnSpecialQuestDoor - */ - TrySpawnSpecialQuestDoorEx: (ignoreStageType?: boolean) => boolean; - /** Returns whether the grid entity with the specified GridIndex can be picked up. */ CanPickupGridEntity: (gridIndex: int) => boolean; - CanSpawnObstacleAtPosition: (gridIndex: int, force: boolean) => void; + /** Returns whether an obstacle can be spawned at the provided grid index. */ + CanSpawnObstacleAtPosition: (gridIndex: int, force: boolean) => boolean; + + /** + * @param excludeNPCs Optional. Default is false. + * @param source Optional. Default is undefined. + */ + ClearBossHazards: (excludeNPCs?: boolean, source?: Entity) => void; /** * Creates a lightning strike effect as seen in Downpour. * - * @param seed Optional. The seed determines the intensity and sound pitch. + * @param seed Optional. The seed determines the intensity and sound pitch. The game calculates + * the intensity and pitch using the following formulas: `1.3 + RNG.RandomFloat() * + * 0.6` and `0.9 + RNG.RandomFloat() * 0.2` respectively. Default is a randomized + * seed. */ DoLightningStrike: (seed?: Seed) => void; - // `GetBackdrop` is currently unimplemented as the `Image` class is not complete. + GetBackdrop: () => Backdrop; + + /** Returns the room's `BackdropType`. */ + GetBackdropType: () => BackdropType; + + /** Returns the room's boss victory jingle. */ + GetBossVictoryJingle: () => Music; /** Returns a `Camera` object. */ GetCamera: () => Camera; @@ -80,7 +60,8 @@ declare global { * Returns the grid index from the specified row and column. Returns -1 if no grid index exists * at that point. */ - GetGridIndexByTile: (row: int, column: int) => int; + GetGridIndexByTile: ((row: int, column: int) => int) + & ((tile: [int, int]) => int); /** * Returns the room's current item pool. @@ -88,23 +69,35 @@ declare global { * @param seed Optional. Default is a call to `Random()`. * @param raw Optional. Default is false. */ - GetItemPool: (seed?: Seed, raw?: boolean) => void; + GetItemPool: (seed?: Seed, raw?: boolean) => ItemPoolType; /** Returns the intensity of the lightning effect. */ - GetLightningIntensity: () => number; + GetLightningIntensity: () => float; + + /** Returns a descriptor of the corners of an L-room shape in world coordinates. */ + GetLRoomAreaDesc: () => LRoomAreaDesc; + + /** Returns a descriptor of the corners of an L-room shape in grid coordinates. */ + GetLRoomTileDesc: () => LRoomTileDesc; /** * Returns the approximate number of areas in a room that spawn a rain effect in a tight radius. */ GetNumRainSpawners: () => int; + /** + * Returns the `StbRailVariant` at the provided grid index. Returns undefined if there is no + * rail. + */ GetRail: (gridIndex: int) => StbRailVariant | undefined; + /** Returns the room's `RailManager` object. */ GetRailManager: () => RailManager; /** Returns the rain intensity in the room. */ GetRainIntensity: () => float; + /** Returns the room clear delay. */ GetRoomClearDelay: () => int; /** Returns the price of the item in the current room. */ @@ -114,6 +107,8 @@ declare global { shopItemID: int, ) => int; + GetWallColor: () => Color; + /** * Returns the amount of water in the room. * @@ -125,6 +120,7 @@ declare global { /** Returns the color of the water in the current room. */ GetWaterColor: () => KColor; + /** Returns the water's color multiplier. */ GetWaterColorMultiplier: () => KColor; /** Returns whether boss spawns in this room will be champions. */ @@ -151,6 +147,8 @@ declare global { keepDecoration: boolean, ) => void; + SaveState: () => void; + /** * Sets the room's backdrop. * @@ -164,11 +162,18 @@ declare global { */ SetBackdropType: (backdrop: BackdropType, unknown: int) => void; + GetFXLayers: () => FXLayers; + /** Sets the greed wave timer. */ SetGreedWaveTimer: (time: int) => void; - /** Sets the room's item pool. */ - SetItemPool: (poolType: ItemPoolType) => void; + /** + * Sets the room's item pool. This takes priority over the game's regular pool selection code. + * Passing `ItemPoolType.NULL` will have the game handle item pool selection. + * + * This is reset upon leaving the room. + */ + SetItemPool: (itemPoolType: ItemPoolType) => void; /** Sets the intensity of the lava in the room. */ SetLavaIntensity: (intensity: float) => void; @@ -176,9 +181,22 @@ declare global { /** Sets the intensity of the lightning effect in the room. */ SetLightningIntensity: (intensity: float) => void; + /** + * Sets how many frames the room is paused for. When the room is paused, the AI and animations + * of all NPCs and effects stop updating. + * + * NPCs and effects that are spawned while the room is still paused will still update until the + * method is called again. + */ SetPauseTimer: (duration: int) => void; + + /** Adds a rail at the provided grid index. */ SetRail: (gridIndex: int, railVariant: StbRailVariant) => void; + + /** Sets the room's rain intensity. This is used by the rain effect spawners in Downpour. */ SetRainIntensity: (intensity: number) => void; + + /** Sets the room's clear delay. */ SetRoomClearDelay: (delay: int) => void; /** @@ -189,6 +207,9 @@ declare global { /** Sets the color of the water in the room. */ SetWaterColor: (color: KColor) => void; + /** Sets the water's color multiplier. */ + SetWaterColorMultiplier: (color: KColor) => void; + /** * Sets the strength of the water current in the room. The water current particles and sounds * are automatically handled by the game. @@ -197,8 +218,55 @@ declare global { */ SetWaterCurrent: (current: Vector) => void; + /** + * Repentogon's modified `Room.SpawnGridEntity` method. + * + * This method has been renamed to include "Ex" so it can not conflict with the vanilla type + * definitions. However, when the project compiles the method's name will change to what it's + * supposed to be. + * + * @param gridIndex + * @param gridEntityType + * @param variant Optional. Default is 0. + * @param seed Optional. Default is a random seed. + * @param varData Optional. Default is 0. + * @param descriptor + * @customName SpawnGridEntity + */ + SpawnGridEntityEx: (( + gridIndex: int, + gridEntityType: GridEntityType, + variant?: int, + seed?: Seed, + varData?: int, + ) => void) + & ((gridIndex: int, descriptor: GridEntityDesc) => void); + + /** + * Triggers an event in the room. + * + * @param output Must be between 0 and 9, otherwise the method will error. + */ + TriggerOutput: (output: int) => void; + + TriggerRestock: (gridIndex: int, shopIndex: int) => void; + + /** Returns a discounted price of a shop item. */ TryGetShopDiscount: (shopItem: int, price: int) => int; + /** + * Repentogon's modified `Room.TrySpawnSpecialQuestDoor` method. + * + * This method has been renamed to include "Ex" so it can not conflict with the vanilla type + * definitions. However, when the project compiles the method's name will change to what it's + * supposed to be. + * + * @param ignoreStageType Optional. Whether the Mirror & Mineshaft door can spawn outside of + * stages outside of the alt-floor. Default is false. + * @customName TrySpawnSpecialQuestDoor + */ + TrySpawnSpecialQuestDoorEx: (ignoreStageType?: boolean) => boolean; + /** * Updates the room's color correction with the copy of `FXParams.ColorModifier`. * diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/RoomTransition.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/RoomTransition.d.ts index 401af9612..a0197c76c 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/RoomTransition.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/RoomTransition.d.ts @@ -4,8 +4,8 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ namespace RoomTransition { function GetPlayerExtraPortraitSprite(): Sprite; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Seeds.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Seeds.d.ts new file mode 100644 index 000000000..9f734af9d --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Seeds.d.ts @@ -0,0 +1,7 @@ +import type { LevelStage } from "isaac-typescript-definitions"; + +declare global { + interface Seeds extends IsaacAPIClass { + SetStageSeed: (stage: LevelStage, seed: Seed) => void; + } +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/StageTransition.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/StageTransition.d.ts index f32c1e65c..40216f418 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/StageTransition.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/StageTransition.d.ts @@ -1,8 +1,8 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace StageTransition { /** diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Weapon.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Weapon.d.ts index d64e44e6f..0f195bbde 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/Weapon.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/Weapon.d.ts @@ -9,29 +9,80 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface Weapon extends IsaacAPIClass { + /** Stops the weapon's current collectible animation. */ ClearItemAnim: (collectible: CollectibleType) => void; + + /** Returns the weapon's current charge. */ GetCharge: () => int; + + /** Returns the weapon's current direction. */ GetDirection: () => Vector; + + /** Returns the weapon's current fire delay. */ GetFireDelay: () => int; + + /** + * Returns the active entity used by the weapon. Returns undefined if the active entity is not + * found. + */ + GetMainEntity: () => Entity | undefined; + + /** Returns the max charge of the weapon. */ + GetMaxCharge: () => int; + + /** Returns the weapon's max fire delay. */ GetMaxFireDelay: () => int; + + /** Returns the weapon's modifiers. */ GetModifiers: () => BitFlags; + + /** + * Returns how many times the weapon has fired its attack. This is reset upon leaving the run. + */ GetNumFired: () => int; + + /** Returns the owner of the weapon. Returns undefined if the weapon has no owners. */ GetOwner: () => Entity | undefined; + + /** Returns the weapon's `WeaponType`. */ GetWeaponType: () => WeaponType; + + /** Returns whether the weapon is aligned to its axis. */ IsAxisAligned: () => boolean; + + /** Returns whether the weapon's collectible animation is finished. */ IsItemAnimFinished: (collectible: CollectibleType) => boolean; + + /** Plays the weapon's collectible animation. */ PlayItemAnim: ( collectible: CollectibleType, aimDirection: Direction, position: Vector, charge: int, ) => void; + + /** + * Sets the weapon's charge. If the provided `charge` is higher than the charge capacity, the + * weapon will discharge its attack. + */ SetCharge: (charge: int) => void; - SetFireDelay: (delay: int) => void; - SetHeadLockTime: (time: int) => void; - SetModifiers: (modifiers: BitFlags) => void; + + /** + * Sets the weapon's fire delay for the provided duration in frames. + * + * The fire delay is not used by all weapons in the game, such as Mom's Knife. + */ + SetFireDelay: (duration: int) => void; + + /** Locks the player's head direction for the provided duration in frames. */ + SetHeadLockTime: (duration: int) => void; + + /** Sets the weapon's modifiers. */ + SetModifiers: ( + modifiers: WeaponModifierFlag | BitFlags, + ) => void; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/WeightedOutcomePicker.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/WeightedOutcomePicker.d.ts index 7786cfcf6..158e35206 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/WeightedOutcomePicker.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/WeightedOutcomePicker.d.ts @@ -3,14 +3,14 @@ * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ -declare function WeightedOutcomePicker(): WeightedOutcomePicker; +declare function WeightedOutcomePicker(this: void): WeightedOutcomePicker; /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface WeightedOutcomePicker extends IsaacAPIClass { /** diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/XMLData.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/XMLData.d.ts index 7ff3dd848..5ee89403b 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/XMLData.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/XMLData.d.ts @@ -6,8 +6,8 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ namespace XMLData { /** @@ -98,7 +98,7 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface BossColorsXMLData { anm2path?: string; @@ -113,7 +113,7 @@ declare global { * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface Entities2XMLData { anm2path: string; @@ -174,7 +174,7 @@ declare global { * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface MetadataXMLData { name?: string; @@ -191,7 +191,7 @@ declare global { * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface AchievementsXMLData { gfx: string; @@ -213,7 +213,7 @@ declare global { * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface BackdropsXMLData { bridge?: string; @@ -248,7 +248,7 @@ declare global { * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface Costumes2XMLData { anm2path?: string; @@ -273,7 +273,7 @@ declare global { * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface CursesXMLData { id: string; @@ -290,7 +290,7 @@ declare global { * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface ItemsXMLData { achievement?: string; @@ -346,7 +346,7 @@ declare global { * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface MusicXMLData { id: string; @@ -370,7 +370,7 @@ declare global { * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface PlayersXMLData { achievement?: string; @@ -432,7 +432,7 @@ declare global { * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface SoundsXMLData { name: string; @@ -450,7 +450,7 @@ declare global { * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface WispsXMLData { canshoot?: string; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/boss-pools/BossPool.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/boss-pools/BossPool.d.ts index c3da4101c..ede3760de 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/boss-pools/BossPool.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/boss-pools/BossPool.d.ts @@ -1,11 +1,22 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface BossPool extends IsaacAPIClass { + /** Returns the ID of the Boss Pool's Double Trouble room. */ GetDoubleTroubleRoomID: () => int; + GetDoubleTroubleRoomVariantStart: () => int; + + /** Returns an array of the Boss Pool's entries. */ GetEntries: () => BossPoolEntry[]; + + /** Returns the name of the Boss Pool. */ GetName: () => string; + + /** Returns the RNG object of the Boss Pool. The RNG object is used to select the floor's boss. */ GetRNG: () => RNG; + + /** Returns the Boss Pool's weight. */ + GetWeight: () => float; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/boss-pools/BossPoolManager.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/boss-pools/BossPoolManager.d.ts index 2b28b1761..b11cd7c14 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/boss-pools/BossPoolManager.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/boss-pools/BossPoolManager.d.ts @@ -1,35 +1,41 @@ -import type { StageID } from "isaac-typescript-definitions"; +import type { BossID, StageID } from "isaac-typescript-definitions"; declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ namespace BossPoolManager { + /** Returns a map containing bosses that are blacklisted from the current stage's boss pool. */ + function GetLevelBlacklist(): LuaMap; + + /** Returns the Boss Pool corresponding to the provided `stageID`. */ function GetPool(stageID: StageID): BossPool; /** - * Returns an array of booleans determining which bosses have been removed from the boss pool - * after being encountered. This does not account for bosses that have been encountered in The - * Void. + * Returns a map determining which bosses have been removed from the boss pool after being + * encountered. + * + * This method does not account for bosses that have been encountered in The Void. * - * This method does not account for bosses that the game forcefully spawns in if a certain - * condition is met, such as the Horsemen or The Fallen. If you wish to see if these bosses have - * been removed, use `BossPoolManager.GetRemovedSpecialBosses` instead. + * This method also does not account for bosses that the game forcefully spawns in if a certain + * condition is met, such as the Horsemen or The Fallen. To see if a boss that the game forces + * has been removed, use the `BossPoolManager.GetRemovedSpecialBosses` method instead. */ - function GetRemovedBosses(): boolean[]; + function GetRemovedBosses(): LuaMap; /** - * Returns an array of booleans determining which special bosses have been removed from the boss - * pool after being encountered. This does not account for bosses that have been encountered in - * The Void. + * Returns a map determining which special bosses have been removed from the boss pool after + * being encountered. * * A special boss is a boss that you can only encounter if a certain condition is met, such as * the Horsemen or The Fallen. If wish to check to see if a regular boss has been removed from - * the boss pool, use `BossPoolManager.GetRemovedBosses` instead. + * the boss pool, use the `BossPoolManager.GetRemovedBosses` method instead. + * + * This method does not account for bosses that have been encountered in The Void. */ - function GetRemovedSpecialBosses(): boolean[]; + function GetRemovedSpecialBosses(): LuaMap; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfig.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfig.d.ts index 403d36be9..f72ecb799 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfig.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfig.d.ts @@ -8,8 +8,8 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ namespace EntityConfig { /** diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfigBaby.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfigBaby.d.ts index 59aace0d5..66e151a2c 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfigBaby.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfigBaby.d.ts @@ -5,7 +5,7 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface EntityConfigBaby extends IsaacAPIClass { /** Returns the `Achievement` tied to the baby's unlock. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfigEntity.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfigEntity.d.ts index 1c7705f0f..dc2ab4703 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfigEntity.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfigEntity.d.ts @@ -10,7 +10,7 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface EntityConfigEntity extends IsaacAPIClass { /** Returns true if the entity can be a champion, as defined in `entities2.xml`. */ @@ -20,7 +20,7 @@ declare global { * Returns true if the entity can be rerolled into another entity, as defined in * `entities2.xml`. */ - CanBeReRolledInto: () => boolean; + CanBeRerolledInto: () => boolean; /** * Returns true if the entity causes the doors in an uncleared room to close while alive, as @@ -28,7 +28,7 @@ declare global { */ CanShutDoors: () => boolean; - /** Returns a path to the entity's .anm2 file, , as defined in `entities2.xml`. */ + /** Returns a path to the entity's .anm2 file, as defined in `entities2.xml`. */ GetAnm2Path: () => string; /** Returns the entity's base HP, as defined in `entities2.xml`. */ @@ -52,6 +52,12 @@ declare global { */ GetBestiaryOffset: () => Readonly; + /** + * Returns the overlay animation name of the entity's bestiary animation, as defined in + * `entities2.xml`. + */ + GetBestiaryOverlay: () => string; + /** Returns the scale of the entity's bestiary sprite, as defined in `entities2.xml`. */ GetBestiaryScale: () => number; @@ -68,13 +74,19 @@ declare global { GetCollisionInterval: () => int; /** Returns the entity's collision radius, as defined in `entities2.xml`. */ - GetCollisionRadius: () => int; + GetCollisionRadius: () => number; /** * Returns a read-only `Vector` of the entity's collision radius multiplier, as defined in * `entities2.xml`. */ - readonly GetCollisionRadiusMultiplier: () => Vector; + GetCollisionRadiusMultiplier: () => Readonly; + + /** + * Returns the `EntityConfigEntity` of what this entity would devolve to when using D10. Returns + * undefined there is no valid entity it can devolve into. + */ + GetDevolvedEntity: () => EntityConfigEntity | undefined; /** * Returns an array containing all of the tags defined in the entity's `customtags` attribute in @@ -92,7 +104,10 @@ declare global { GetGibFlags: () => BitFlags; /** Returns the amount of gibs the entity leaves, as defined in `entities2.xml`. */ - GetGibAmount: () => int; + GetGibsAmount: () => int; + + /** Returns the grid collision points the entity has, as defined in `entities2.xml`. */ + GetGridCollisionPoints: () => int; /** Returns the entity's mass, as defined in `entities2.xml`. */ GetMass: () => number; @@ -118,6 +133,9 @@ declare global { /** Returns the entity's stage HP, as defined in `entities2.xml`. */ GetStageHP: () => number; + /** Returns the entity's SubType, as defined in `entities2.xml`. */ + GetSubType: () => int; + /** Returns the entity's `EntityType`. */ GetType: () => EntityType; @@ -131,7 +149,13 @@ declare global { HasCustomTag: (tag: string) => boolean; /** Returns true if the entity has all of the entity tags in the provided bitset. */ - HasEntityTags: (tags: BitFlags) => boolean; + HasEntityTags: (tags: BitFlags | EntityTag) => boolean; + + /** Returns whether the entity has floor alts. */ + HasFloorAlts: () => boolean; + + /** Returns whether the entity has all of the gib flags in the provided bitset. */ + HasGibFlags: (flags: GibFlag | BitFlags) => boolean; /** Returns true if the entity is a boss, as defined in `entities2.xml`. */ IsBoss: () => boolean; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfigPlayer.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfigPlayer.d.ts index 092c2c561..2935536be 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfigPlayer.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity-config/EntityConfigPlayer.d.ts @@ -12,7 +12,7 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface EntityConfigPlayer extends IsaacAPIClass { /** Returns true if the player can shoot, as defined in `players.xml`. */ @@ -47,7 +47,7 @@ declare global { GetCoins: () => int; /** Returns an array of collectibles the player starts with. */ - GetCollectibles: () => CollectibleType; + GetCollectibles: () => CollectibleType[]; /** * Returns the player's starting costume ID, as defined in `players.xml`. If the player has no diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/Entity.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/Entity.d.ts index 9c8c59fa6..6cf78b104 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/Entity.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/Entity.d.ts @@ -2,6 +2,7 @@ import type { BloodExplosionSubType, EntityType, } from "isaac-typescript-definitions"; +import type { WaterClipFlag } from "../../../enums/flags/WaterClipFlag"; declare global { interface Entity extends IsaacAPIClass { @@ -36,7 +37,11 @@ declare global { AddBrimstoneMark: (source: EntityRef, duration: int) => void; /** - * Adds an ice effect to the entity. + * Adds the ice status effect to the entity. + * + * There is no visual indicator that determines if the status effect is active. If the entity + * dies while the status effect is active, they will be frozen similar to how Uranus tears + * freezes enemies. * * @param source Required. If you do not want the effect to have a source, pass * `EntityRef(undefined)`. @@ -51,8 +56,8 @@ declare global { * @param source Required. If you do not want the effect to have a source, pass * `EntityRef(undefined)`. * @param pushDirection The direction to push the entity. - * @param duration The number of frames that the effect should apply for. This must be between 2 - * to 15. + * @param duration The number of frames that the effect should apply for. This is capped at 15 + * frames / 0.5 seconds. * @param takeImpactDamage Whether the entity should take damage if they collide into a solid * grid entity while the knockback effect is active. */ @@ -83,10 +88,10 @@ declare global { */ AddWeakness: (source: EntityRef, duration: int) => void; - ComputeStatusEffectDuration: ( - initialLength: int, - source: EntityRef, - ) => void; + /** Returns whether the entity can devolve from D10. */ + CanDevolve: () => boolean; + + ComputeStatusEffectDuration: (initialLength: int, source: EntityRef) => int; /** * Copies the entity's status effects onto the specified target. @@ -98,8 +103,14 @@ declare global { */ CopyStatusEffects: (target?: Entity, overwrite?: boolean) => void; - /** Fires all related collision related callbacks with the provided parameters. */ - ForceCollide: (target: Entity, low: boolean) => void; + /** + * Attempts force the game to detect a collision between the entity and the provided `target`, + * triggering all collision related code such as contact damage. + * + * @param target + * @param low Optional. Default is false. + */ + ForceCollide: (target: Entity, low?: boolean) => boolean; /** Returns how many frames are left until the baited status effect goes away. */ GetBaitedCountdown: () => int; @@ -127,21 +138,28 @@ declare global { /** Returns how many frames are left until the charmed status effect goes away. */ GetCharmedCountdown: () => int; - /** Returns the entity's collision capsule. */ - GetCollisionCapsule: () => Capsule; + /** + * Returns the entity's collision capsule. + * + * @param offset Optional. Default is `VectorZero`. + */ + GetCollisionCapsule: (offset?: Vector) => Capsule; - /** Returns an array of all of the entity's `ColorParams`. */ + /** + * Returns an array of all of the entity's `ColorParams` queued by the `Entity.SetColor` method. + */ GetColorParams: () => ColorParams[]; /** Returns how many frames are left until the confusion status effect goes away. */ GetConfusionCountdown: () => int; /** - * Returns how many frames until the entity can take damage with `DamageFlag.COUNTDOWN` again. - * This cooldown is only present when the entity takes damage with the `DamageFlag.COUNTDOWN` - * flag. + * Returns how many frames until the entity can take damage with the `DamageFlag.COUNTDOWN` + * damage flag again. This cooldown is only present when the entity takes damage with the + * `DamageFlag.COUNTDOWN` flag. * - * This is not the same as the player's invincibility frames (`EntityPlayer.GetDamageCooldown`). + * This is not the same as the player's invincibility frames. If you wish to see how many more + * invincible frames the player has, use the `EntityPlayer.GetDamageCooldown` method. */ GetDamageCountdown: () => int; @@ -150,7 +168,7 @@ declare global { * * @param unknown The behavior of this parameter is currently unknown and remains undocumented. */ - GetDebugShape: () => Shape; + GetDebugShape: (unknown: boolean) => Shape; /** Returns the entity's corresponding `EntityConfigEntity`. */ GetEntityConfigEntity: () => EntityConfigEntity; @@ -164,6 +182,7 @@ declare global { /** Returns how many frames are left until the freeze status effect goes away. */ GetFreezeCountdown: () => int; + /** Returns the entity's hit list index. */ GetHitListIndex: () => int; /** Returns how many frames are left until the ice status effect goes away. */ @@ -191,13 +210,13 @@ declare global { GetMinecart: () => EntityNPC | undefined; /** Returns the entity's null capsule. */ - GetNullCapsule: (nullLayerName: string) => Capsule; + GetNullCapsule: (name: string) => Capsule; /** * Returns the position of the null layer mark. If the layer is not visible or no frame is - * available for the current animation, `Vector.Zero` is returned instead. + * available for the current animation, `VectorZero` is returned instead. */ - GetNullOffset: (nullLayerName: string) => Vector; + GetNullOffset: (nullLayerName: string | undefined) => Vector; /** Returns how many frames are left until the pause status effect goes away. */ GetPauseTime: () => int; @@ -208,7 +227,7 @@ declare global { /** Returns how many frames until the entity takes damage from the poison status effect. */ GetPoisonDamageTimer: () => int; - /** Returns the entity's position and velocity. */ + /** Returns a dictionary with fields containing the entity's position and velocity. */ GetPosVel: () => PosVel; /** @@ -219,7 +238,7 @@ declare global { * a value of 1 would predict where the target's velocity would take them on the * next update. */ - GetPredictedTargetPosition: (target: Entity, delay: number) => void; + GetPredictedTargetPosition: (target: Entity, delay: number) => Vector; /** Returns the size of the entity's shadow. */ GetShadowSize: () => number; @@ -236,6 +255,9 @@ declare global { /** Returns the entity's `EntityType`. */ GetType: () => EntityType; + /** Returns the entity's water clip flags. */ + GetWaterClipFlags: () => BitFlags; + /** Returns how many frames are left until the weakness status effect goes away. */ GetWeaknessCountdown: () => int; @@ -245,11 +267,26 @@ declare global { GiveMinecart: (position: Vector, velocity: Vector) => EntityNPC; /** Returns whether the entity should ignore status effects from the provided `EntityRef`. */ - IgnoreEffectFromFriendly: (source: EntityRef) => void; + IgnoreEffectFromFriendly: (source: EntityRef) => boolean; + + /** + * Spawns two blood poof effects, one with a sub-type of `Poof2SubType.LARGE_BLOOD_POOF` and + * `Poof2SubType.LARGE_BLOOD_POOF_FOREGROUND`. The former is returned with the latter set as its + * child. + * + * @param position Optional. Default is the entity's current position. + * @param color Optional. + * @param scale Optional. Default is 1. + */ + MakeBloodPoof: ( + position?: Vector, + color?: Color, + scale?: number, + ) => EntityEffect; /** - * Spawns two blood explosion effects, one with a sub-type of `Poof2SubType.LARGE_BLOOD_POOF` - * and `Poof2SubType.LARGE_BLOOD_POOF_FOREGROUND`. The former is returned with the latter set as + * Spawns two poof effects, one with a sub-type of `Poof2SubType.LARGE_GROUND_POOF` and + * `Poof2SubType.LARGE_GROUND_POOF_FOREGROUND`. The former is returned with the latter set as * its child. * * @param position Optional. Default is the entity's current position. @@ -262,6 +299,9 @@ declare global { scale?: number, ) => EntityEffect; + /** Resets the entity's water clip flags. */ + ResetWaterClipFlags: () => void; + /** * Updates the remaining frames until the baited status effect is removed. If the entity does * not have the status effect, then this method will do nothing. @@ -317,7 +357,7 @@ declare global { * Updates the remaining frames until the entity can take damage from the `DamageFlag.COUNTDOWN` * flag again. * - * This is not the same as the player's invincibility frames (EntityPlayer.GetDamageCooldown`). + * This is not the same as the player's invincibility frames. */ SetDamageCountdown: (countdown: int) => void; @@ -411,6 +451,9 @@ declare global { /** Sets the entity's speed multiplier. */ SetSpeedMultiplier: (multiplier: number) => void; + /** Sets the entity's water clip flags. */ + SetWaterClipFlags: (flags: WaterClipFlag | BitFlags) => void; + /** * Updates the remaining frames until the weakness status effect is removed. If the entity does * not have the status effect, then this method will do nothing. @@ -435,7 +478,8 @@ declare global { ) => EntityEffect; /** - * Spawns a water impact effect. If `Room.GetWaterAmount` is less than 0.2, nothing will spawn. + * Spawns a water impact effect. If `Room.GetWaterAmount` is less than or equal to 0.2, nothing + * will spawn. */ SpawnWaterImpactEffects: ( position: Vector, @@ -451,10 +495,22 @@ declare global { */ ToDelirium: () => EntityDelirium | undefined; + /** + * Casts an `Entity` into an `EntitySlot`, which has delirium-specific methods and properties. + * If the associated entity is not a slot, then this method will return undefined. + */ + ToSlot: () => EntitySlot | undefined; + + /** + * Attempts to throw the entity. This is the same effect as when the player is knocked up from a + * Quakey stomping. + * + * Returns whether the entity was thrown successfully. + */ TryThrow: ( source: EntityRef, throwDirection: Vector, force: number, - ) => void; + ) => boolean; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityBomb.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityBomb.d.ts index cfc568f1e..431dbee8b 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityBomb.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityBomb.d.ts @@ -8,8 +8,15 @@ declare global { /** Returns how many frames until the bomb explodes. */ GetExplosionCountdown: () => int; - GetFallingSpeed: () => number; - GetHeight: () => number; + // `GetFallingSpeed` is omitted due to being mislabeled as `GetFallAcceleration`. + + GetFallAcceleration: () => number; + + GetFallSpeed: () => number; + + // `GetHeight` is omitted due to being mislabeled as `GetFallSpeed`. + + /** Returns an array containing all of the entity indexes the bomb hit with its explosion. */ GetHitList: () => int[]; /** @@ -35,9 +42,15 @@ declare global { /** Returns whether the bomb was created through the Angelic Prism effect. */ IsPrismTouched: () => boolean; - SetFallingSpeed: (speed: number) => void; - SetHeight: () => void; - SetLoadCostumes: (load: number) => void; + // `SetFallingSpeed` is omitted due to being mislabeled as `SetFallAcceleration`. + + SetFallAcceleration: (acceleration: number) => void; + + // `SetHeight` is omitted due to being mislabeled as `SetFallSpeed`. + SetFallSpeed: (speed: number) => void; + + /** Sets whether the bomb should load the costumes. */ + SetLoadCostumes: (load: boolean) => void; /** Sets whether the bomb was created through the Angelic Prism effect. */ SetPrismTouched: (touched: boolean) => void; @@ -54,9 +67,13 @@ declare global { */ SetRocketSpeed: (speed: number) => void; - /** Sets the bomb's scale. This should be used with the `EntityBomb.SetLoadCostumes` method. */ + /** + * Sets the bomb's scale. This should be used with the `EntityBomb.SetLoadCostumes` method so + * the costumes can update properly. + */ SetScale: (scale: number) => void; + /** Updates the color of the dirt particles the bomb, if it exists. */ UpdateDirtColor: () => void; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityDelirium.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityDelirium.d.ts index a902b6ac3..a9f700f33 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityDelirium.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityDelirium.d.ts @@ -4,7 +4,7 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface EntityDelirium extends Entity { /** Returns the number of frames remaining until Delirium teleports. */ @@ -36,9 +36,16 @@ declare global { * * The transformation is not effective immediately; it will only take place on the next frame. * + * @param entityType * @param variant Optional. Default is 0. + * @param triggerCallback Optional. Whether to trigger the transformation callback. Default is + * false. */ - Transform: (entityType: EntityType, variant?: int) => void; + Transform: ( + entityType: EntityType, + variant?: int, + triggerCallback?: boolean, + ) => void; /** * Returns the angle of Delirium's projectiles. diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityEffect.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityEffect.d.ts index 14b9f355c..046994e64 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityEffect.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityEffect.d.ts @@ -1,7 +1,8 @@ /** @noSelf */ declare namespace EntityEffect { /** - * Spawns a light effect. + * Spawns a light source. The light illuminates the room and is used by various entities such as + * the player and fireplaces. * * @param position * @param scale Optional. Default is a random number between [0, 1]. @@ -16,4 +17,25 @@ declare namespace EntityEffect { state?: int, color?: Color, ): EntityEffect; + + /** + * Creates a LootList preview effect. This is the same effect used by Guppy's Eye. + * + * @param loot + * @param position + * @param owner + * @param effect The purpose of this argument is currently unknown. + */ + function CreateLootPreview( + loot: LootList, + position: Vector, + owner: EntityPickup, + effect: EntityEffect, + ): EntityEffect; + + /** + * Returns the GridEntityDesc corresponding to the effect if its variant is + * `EffectVariant.GRID_ENTITY_PROJECTILE_HELPER`, otherwise returns undefined. + */ + function GetGridEntityDesc(): GridEntityDesc | undefined; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityFamiliar.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityFamiliar.d.ts index 3e0e37ab1..debf9c88f 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityFamiliar.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityFamiliar.d.ts @@ -1,4 +1,8 @@ -import type { Direction, WeaponType } from "isaac-typescript-definitions"; +import type { + CollectibleType, + Direction, + WeaponType, +} from "isaac-typescript-definitions"; import type { FollowerPriority } from "../../../enums/FollowerPriority"; declare global { @@ -12,9 +16,24 @@ declare global { /** Returns whether the familiar can be damaged by enemy projectiles. */ CanBeDamagedByProjectiles: () => boolean; + /** Returns whether the familiar can block projectiles. */ + CanBlockProjectiles: () => boolean; + /** Returns whether the familiar can charm enemies. */ CanCharm: () => boolean; + /** + * Returns the weapon entity the familiar is holding. Returns undefined if the familiar has no + * weapon. + */ + GetActiveWeaponEntity: () => Entity | undefined; + + /** + * Returns how many times the familiar has attacked with its current weapon. Returns undefined + * for familiars that do not attack with a weapon. + */ + GetActiveWeaponNumFired: () => int | undefined; + /** Returns the familiar's dirt color. */ GetDirtColor: () => Color; @@ -27,6 +46,7 @@ declare global { */ GetItemConfig: () => ItemConfigItem | undefined; + /** Returns the familiar's move delay. */ GetMoveDelayNum: () => int; /** @@ -56,24 +76,53 @@ declare global { /** Returns whether the familiar is charmed. */ IsCharmed: () => boolean; + /** Returns whether the familiar is one of Lil Delirium's morphs. */ + IsLilDelirium: () => boolean; + /** Removes the familiar from the player. */ RemoveFromPlayer: () => void; + /** Sets whether the familiar is one of Lil Delirium's forms. */ + SetLilDelirium: (isLilDelirium: boolean) => void; + + /** Sets the familiar's move delay. */ SetMoveDelayNum: (delay: int) => void; + /** Triggers the familiar's room clear events. */ TriggerRoomClear: () => void; /** - * Attempts to aim at the marked target effect if the player has the Marked collectible. + * Makes the familiar attempt to aim at the marked target effect if the player has the Marked + * collectible. * - * Returns the position of the effect if the familiar successfully targeted it, otherwise - * undefined is returned. + * When called with exactly 2 arguments (aimDirection, direction): Returns the position of the + * effect if the familiar successfully targeted it, otherwise undefined is returned. */ - TryAimAtMarkedTarget: ( + TryAimAtMarkedTarget: (( aimDirection: Vector, direction: Direction, - ) => Vector | undefined; - + ) => Vector | undefined) + & (( + /** + * @param aimDirection + * @param direction + * @param targetPosBuffer + * @returns 2 values: + * - success: Whether the targeting was successful. + * - result: An array containing the modified aim direction Vector, the modified direction + * integer, and the modified target position buffer Vector. + */ + aimDirection?: Vector, + direction?: int, + targetPosBuffer?: Vector, + ) => LuaMultiReturn<[success: boolean, result: [Vector, int, Vector]]>); + + /** Updates the familiar's dirt color. */ UpdateDirtColor: () => void; } } + +/** @noSelf */ +declare namespace EntityFamiliar { + function GetRandomWisp(rng: RNG): CollectibleType; +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityKnife.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityKnife.d.ts index 8436e8b83..89222dc41 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityKnife.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityKnife.d.ts @@ -1,15 +1,59 @@ +import type { TearVariant } from "isaac-typescript-definitions"; +import type { SplitTearType } from "../../../enums/SplitTearType"; + declare interface EntityKnife extends Entity { + /** Adds an entity to the knife's hit list. */ + AddToHitList: (entity: Entity) => void; + + /** + * Fires a split tear. + * + * @param position + * @param velocity + * @param damageMultiplier Optional. Default is 0.5. + * @param sizeMultiplier Optional. Default is 0.6. + * @param variant Optional. Default is `TearVariant.BLUE`. + * @param splitTearType Optional. Default is `SplitTearType.GENERIC`. Custom split tear effects + * can be implemented by passing in a string instead. + */ + FireSplitTear: ( + position: Vector, + velocity: Vector, + damageMultiplier?: number, + sizeMultiplier?: number, + variant?: TearVariant, + splitTearType?: SplitTearType | string, + ) => EntityTear; + + GetHitboxParentKnife: () => EntityKnife | undefined; + + /** Returns an array of entity indexes that the knife is currently hitting. */ GetHitList: () => int[]; + + /** Returns whether the knife is performing a spinning attack. */ GetIsSpinAttack: () => boolean; + + /** Returns whether the entity knife is swinging. */ GetIsSwinging: () => boolean; + /** Returns whether the entity is in the knife's hit list. */ + InHitList: (entity: Entity) => boolean; + /** Returns whether the knife was created through the Multidimensional Baby effect. */ IsMultidimensionalTouched: () => boolean; /** Returns whether the knife was created through the Angelic Prism effect. */ IsPrismTouched: () => boolean; + /** Removes an entity from the knife's hit list. */ + RemoveFromHitList: (entity: Entity) => void; + + SetHitboxParentKnife: (parentKnife: EntityKnife | undefined) => void; + + /** Returns whether the entity knife is performing a spin attack. */ SetIsSpinAttack: (isSpinAttack: boolean) => void; + + /** Sets whether the knife is swinging. */ SetIsSwinging: (isSwinging: boolean) => void; /** Sets whether the knife was created through the Multidimensional Baby effect. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityLaser.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityLaser.d.ts index 8d0f8ec62..8d57c6109 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityLaser.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityLaser.d.ts @@ -1,11 +1,55 @@ +import type { TearVariant } from "isaac-typescript-definitions"; +import type { SplitTearType } from "../../../enums/SplitTearType"; + declare interface EntityLaser extends Entity { + /** Adds an entity to the laser's hit list. */ + AddToHitList: (entity: Entity) => void; + + /** + * Fires a split tear. + * + * @param position + * @param velocity + * @param damageMultiplier Optional. Default is 0.5. + * @param sizeMultiplier Optional. Default is 0.6. + * @param variant Optional. Default is `TearVariant.BLUE`. + * @param splitTearType Optional. Default is `SplitTearType.GENERIC`. Custom split tear effects + * can be implemented by passing in a string instead. + */ + FireSplitTear: ( + position: Vector, + velocity: Vector, + damageMultiplier?: number, + sizeMultiplier?: number, + variant?: TearVariant, + splitTearType?: SplitTearType | string, + ) => EntityTear; + + /** Returns the laser's damage multiplier. */ GetDamageMultiplier: () => number; + + /** Returns whether the laser's origin point doesn't follow its parent's position. */ GetDisableFollowParent: () => boolean; + + /** Returns an array of entity indexes that the laser is hitting. */ GetHitList: () => int[]; - GetOneHit: () => int; - /** Returns whether the laser timed out. */ - GetTimeout: () => boolean; + GetHomingType: () => int; + + /** Returns whether entities can only take damage once from the laser during its lifetime. */ + GetOneHit: () => boolean; + + /** Returns the laser's scale. */ + GetScale: () => number; + + /** Returns whether the laser has shrunk. */ + GetShrink: () => boolean; + + /** Returns how many frames until the laser times out and is removed. */ + GetTimeout: () => int; + + /** Returns whether the entity is in the laser's hit list. */ + InHitList: (entity: Entity) => boolean; /** Returns whether the laser was created through the Multidimensional Baby effect. */ IsMultidimensionalTouched: () => boolean; @@ -13,6 +57,8 @@ declare interface EntityLaser extends Entity { /** Returns whether the laser was created through the Angelic Prism effect. */ IsPrismTouched: () => boolean; + SetHomingType: (homingType: int) => void; + /** * Causes the laser's shape to be fully recalculated on its next update. This can be used to force * the laser to instantly change to its `MaxDistance`/`Radius` properties without transitioning to @@ -23,6 +69,9 @@ declare interface EntityLaser extends Entity { */ RecalculateSamplesNextUpdate: () => void; + /** Removes an entity from the laser's hit list. */ + RemoveFromHitList: (entity: Entity) => void; + /** Resets the laser's sprite scale. */ ResetSpriteScale: () => void; @@ -37,7 +86,7 @@ declare interface EntityLaser extends Entity { SetDamageMultiplier: (multiplier: number) => void; /** Sets whether the laser should not follow its parent. */ - SetDisableFollowParent: (followParent: boolean) => void; + SetDisableFollowParent: (disabled: boolean) => void; /** Sets whether the laser was created through the Angelic Prism effect. */ SetPrismTouched: (touched: boolean) => void; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityNPC.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityNPC.d.ts index 4c8116801..f5a3bbae8 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityNPC.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityNPC.d.ts @@ -3,16 +3,30 @@ import type { ControllerIndex, ProjectilesMode, RockSpiderVariant, + TearFlag, } from "isaac-typescript-definitions"; declare global { interface EntityNPC extends Entity { + /** + * @param position + * @param flags + * @param source Optional. Default is undefined. + * @param damage Optional. Default is 3.5. + */ + ApplyTearflagEffects: ( + position: Vector, + flags: BitFlags, + source?: Entity, + damage?: number, + ) => void; + /** Clears the flying override set by `EntityNPC.SetFlyingOverride`. */ ClearFlyingOverride: () => void; /** - * Behaves the same as `EntityNPC.FireProjectiles` except it returns an array of the projectiles - * fired. + * Behaves the same as `EntityNPC.FireBossProjectiles` except it returns an array of the + * projectiles fired. */ FireBossProjectilesEx: ( numProjectiles: int, @@ -50,12 +64,6 @@ declare global { params: ProjectileParams, ) => EntityProjectile[]; - /** - * Returns the NPC's boss color index, as specified in `bosscolors.xml`. Returns -1 if the NPC - * is not a boss or if the boss color index is not defined. - */ - GetBossColorIdx: () => int; - /** Returns the NPC's `ControllerIndex`, which indicates a player is controlling it. */ GetControllerId: () => ControllerIndex; @@ -68,16 +76,37 @@ declare global { /** Returns the NPC's dynamic dirt color. */ GetDirtColor: () => Color; + /** Returns a unique `LootList` used by fireplaces when they are extinguished. */ GetFireplaceLoot: () => LootList; + /** Returns whether the NPC's flying override was set. */ + GetFlyingOverride: () => boolean; + + /** Returns an array of entity indexes that the NPC is hitting. */ GetHitList: () => int[]; + /** + * Returns the NPC's pathfinder with fixed bindings. + * + * Due to a bug with the vanilla API, accessing the NPC's pathfinder through the + * `EntityNPC.Pathfinder` field returns a version of the Pathfinder with broken bindings, + * leading to multiple methods not working as intended, such as some function arguments not + * working at all. + * + * To not break existing mods, the Pathfinder object returned from the `Pathfinder` field is + * unchanged, so you should use `EntityNPC.GetPathfinder` whenever possible. + */ + GetPathfinder: () => PathFinder; + /** Returns the NPC's shield strength/armor. */ GetShieldStrength: () => number; + /** Returns a unique `LootList` used by Shopkeepers when they are blown up. */ GetShopkeeperLoot: () => LootList; GetSirenPlayerEntity: () => EntityPlayer | undefined; + + /** Returns whether the entity has a boss champion color. */ IsBossColor: () => boolean; /** @@ -93,12 +122,12 @@ declare global { * * @param layerID * @param pngPath The full path to the PNG file. For example: - * "gfx/items/collectibles/questionmark.png" + * "gfx/items/collectibles/questionmark.png" * @param loadGraphics Optional. If true, `Sprite.LoadGraphics()` is immediately fired. Default * is false. */ ReplaceSpritesheet: ( - layerId: int, + layerID: int, pngPath: string, loadGraphics?: boolean, ) => void; @@ -121,8 +150,13 @@ declare global { /** Sets the NPC's shield strength/armor. */ SetShieldStrength: (strength: number) => void; - /** Spawns a blood cloud effect. */ - SpawnBloodCloud: (position: Vector, color: Color) => EntityEffect; + /** + * Spawns a blood cloud effect. + * + * @param position Optional. Default is the entity's current position. + * @param color Optional. Default is `ColorDefault`. + */ + SpawnBloodCloud: (position?: Vector, color?: Color) => EntityEffect; /** Spawns a blood splash effect. */ SpawnBloodSplash: () => void; @@ -131,7 +165,7 @@ declare global { * Attempts to change the NPC's target. This is used by Lost Fly to force NPCs to target it. * Returns whether the NPCs target changed successfully. */ - TryForceTarget: (target: Entity, duration: int) => void; + TryForceTarget: (target: Entity, duration: int) => boolean; /** * Attempts to split the NPC in half. This is used by the Meat Cleaver collectible when @@ -153,6 +187,13 @@ declare global { doScreenEffects?: boolean, ) => boolean; + /** + * Attempts to throw the NPC. Returns whether the NPC was thrown. + * + * @param source + * @param direction + * @param force This is only used by `EntityNPC` poops. + */ TryThrow: (source: EntityRef, direction: Vector, force: number) => boolean; /** @@ -191,12 +232,25 @@ declare global { */ function ThrowLeech( origin: Vector, - source: Entity, + source: Entity | undefined, target: Vector, yPosOffset?: number, big?: number, ): EntityNPC; + /** + * @param origin + * @param target + * @param yOffset Optional. Default is -10. + * @param fallSpeed Optional. Default is -8. + */ + function ThrowMaggot( + origin: Vector, + target: Vector, + yOffset?: number, + fallSpeed?: number, + ): EntityNPC; + /** * @param origin * @param target @@ -217,7 +271,7 @@ declare global { */ function ThrowRockSpider( position: Vector, - source: Entity, + source: Entity | undefined, velocity: Vector, variant?: RockSpiderVariant, yPosOffset?: number, @@ -225,7 +279,7 @@ declare global { function ThrowStrider( position: Vector, - source: Entity, + source: Entity | undefined, target: Vector, ): EntityNPC; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityPickup.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityPickup.d.ts index d5b497022..d4b3890a0 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityPickup.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityPickup.d.ts @@ -5,13 +5,14 @@ import type { declare global { interface EntityPickup extends Entity { - /** Adds a collectible to the cycle, if the pickup is a pedestal. */ + /** Adds a collectible to the cycle if the pickup is a collectible pedestal. */ AddCollectibleCycle: (collectible: CollectibleType) => boolean; /** Returns whether the pickup can be rerolled. */ CanReroll: () => boolean; - GetAlternatePedestal: () => int; + /** Returns the pickup's `CollectiblePedestalType`. */ + GetAlternatePedestal: () => CollectiblePedestalType; /** * Returns an array of all of the collectibles being used in the pickup's collectible cycle, if @@ -19,33 +20,75 @@ declare global { */ GetCollectibleCycle: () => CollectibleType[]; + /** Returns the pickup's drop delay. */ GetDropDelay: () => int; - /** @param shouldAdvance Optional. Default is false. */ - GetLootList: (shouldAdvance?: boolean) => LootList; + /** + * Returns the pickup's flipped collectible. Returns undefined if it does not have a flipped + * collectible. + */ + GetFlipCollectible: () => CollectibleType | undefined; + /** + * Returns a read-only version of the pickup's `LootList`. + * + * @param shouldAdvance Optional. Default is false. + */ + GetLootList: (shouldAdvance?: boolean) => Readonly; + + GetMegaChestLeftCollectible: () => EntityPickupCollectible | undefined; + GetMegaChestOtherCollectible: () => LuaMultiReturn< + [ + otherCollectible: EntityPickupCollectible | undefined, + isRight: boolean | undefined, + ] + >; + GetMegaChestRightCollectible: () => EntityPickupCollectible | undefined; + + /** + * Returns the ghost effect that is visible if a player has Guppy's Eye. Returns undefined if + * the ghost isn't visible. + */ GetPickupGhost: () => EntityEffect | undefined; /** Returns sprite used by the pickup's price label. */ GetPriceSprite: () => Sprite; + /** Returns the pickup's `VarData`. */ GetVarData: () => int; + HasFlipData: () => boolean; + + /** + * @param collectible Optional. Default is `CollectibleType.COLLECTIBLE_NULL`. + * @param loadGraphics Optional. Default is true. + */ + InitFlipState: ( + collectible?: CollectibleType, + loadGraphics?: boolean, + ) => void; + /** * Returns whether the collectible is hidden or not. * * This method does not account for Curse of the Blind, it only reflects the blind state of * pickups that are normally blind without curses involved, such as the extra item in the alt * path treasure rooms. + * + * @param checkForcedBlindOnly Optional. Default is true. */ - IsBlind: () => boolean; + IsBlind: (checkForcedBlindOnly?: boolean) => boolean; + /** Turns the pickup into a shop item, automatically assigning its price. */ MakeShopItem: (shopItemID: int) => void; + + /** Stops the collectible cycle if the pickup is a collectible pedestal. */ RemoveCollectibleCycle: () => void; /** Sets the graphics of the item pedestal. Does nothing if the pickup is not a collectible. */ SetAlternatePedestal: (pedestalType: CollectiblePedestalType) => void; + /** Sets the pickup's drop delay. */ SetDropDelay: (delay: int) => void; /** @@ -54,7 +97,10 @@ declare global { */ SetForceBlind: (blind: boolean) => void; - SetNewOptionsIndex: () => int; + /** Sets the pickup's Options index and returns the new pickup index. */ + SetNewOptionsPickupIndex: () => int; + + SetVarData: (varData: int) => void; /** * Triggers the effect of the "Theres Options" collectible and removes all pickups in the room @@ -70,6 +116,10 @@ declare global { */ TryFlip: () => boolean; + /** + * Causes the pedestal to start cycling through the provided amount of collectibles, including + * its own collectible type. + */ TryInitOptionCycle: (numCycle: int) => boolean; /** @@ -80,6 +130,7 @@ declare global { */ TryRemoveCollectible: () => boolean; + /** Updates the ghost entity effect in accordance to the pickup's `LootList`. */ UpdatePickupGhosts: () => void; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityPlayer.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityPlayer.d.ts index edd71e667..66c9fdb89 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityPlayer.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityPlayer.d.ts @@ -2,19 +2,36 @@ import type { ActiveSlot, BabySubType, CacheFlag, + CardType, CollectibleType, + ControllerIndex, + DamageFlag, + Direction, + EntityGridCollisionClass, FamiliarVariant, + ItemPoolType, + NullItemID, PickupVariant, PillEffect, PlayerForm, + PlayerType, + PoopSpellType, + SoundEffect, TrinketType, WeaponType, } from "isaac-typescript-definitions"; import type { BagOfCraftingPickup } from "../../../enums/BagOfCraftingPickup"; +import type { CambionPregnancyLevel } from "../../../enums/CambionPregnancyLevel"; import type { DeathAnimationName } from "../../../enums/DeathAnimationName"; +import type { ConceptionFamiliarFlag } from "../../../enums/flags/ConceptionFamiliarFlag"; +import type { WeaponModifierFlag } from "../../../enums/flags/WeaponModifierFlag"; import type { HealthType } from "../../../enums/HealthType"; +import type { PillCardSlot } from "../../../enums/PillCardSlot"; +import type { PlayerFoot } from "../../../enums/PlayerFoot"; +import type { PocketItemType } from "../../../enums/PocketItemType"; import type { PurityState } from "../../../enums/PurityState"; -import type { ConceptionFamiliarFlag } from "../../../enums/flags/ConceptionFamiliarFlag"; +import type { SuplexState } from "../../../enums/SuplexState"; +import type { WeaponSlot } from "../../../enums/WeaponSlot"; declare global { interface EntityPlayer extends Entity { @@ -26,7 +43,7 @@ declare global { * @param slot * @param flashHUD Optional. This parameter is redundant as the game will flash the HUD * regardless. Default is true. - * @param overcharge Optional. Whether to allow leftover charges to overcharge the item. Default + * @param overCharge Optional. Whether to allow leftover charges to overcharge the item. Default * is false. * @param force Optional. Default is false. */ @@ -51,11 +68,75 @@ declare global { * definitions. However, when the project compiles the method's name will change to what it's * supposed to be. * + * @param flag * @param evaluateItems Optional. Default is false. * @customName AddCacheFlags */ AddCacheFlagsEx: (flag: CacheFlag, evaluateItems?: boolean) => void; + /** + * Adds a candy heart bonus to the player. + * + * @param cacheFlags Optional. Default is CacheFlagZero. + * @param amount Optional. Default is 1. + */ + AddCandyHeartBonus: ( + cacheFlags?: BitFlags, + amount?: int, + ) => void; + + /** + * Behaves the same as `EntityPlayer.CheckFamiliar` except it returns an array of all of the + * familiars. + * + * @param collectibleType + * @param charge Default is 0. + * @param firstTimePickingUp Setting this to false will not spawn or add consumables for the + * item and will not cause it to count towards transformations. + * Default is true. + * @param activeSlot Sets the active slot this collectible should be added to. Default is + * `ActiveSlot.SLOT_PRIMARY`. + * @param varData Sets the variable data for this collectible (this is used to store extra data + * for some active items like the number of uses for Jar of Wisps). Default is 0. + * @param itemPoolType Optional. Default is `ItemPoolType.TREASURE`. + */ + AddCollectibleEx: ( + collectibleType: CollectibleType, + charge?: int, + firstTimePickingUp?: boolean, + activeSlot?: ActiveSlot.PRIMARY | ActiveSlot.SECONDARY, + varData?: int, + itemPoolType?: ItemPoolType, + ) => void; + + /** + * Adds a collectible effect associated with the provided `collectibleType`. + * + * Collectible effects are not intended to be used as a fake or temporary copy of items. For + * instance, every single active item grants a collectible effect on use and are often tied to + * its effect. Therefore, collectible effects can be seen as more tied to an item's state, such + * as: + * + * - The Holy Mantle tracking how many shield charges the player has. + * - How most familiars are granted to the player. + * - Activating the effects of Whore of Babylon and Crown of Light. + * + * This method is a shortcut to `TemporaryEffects.AddCollectibleEffect` with extra cooldown + * arguments. + * + * @param collectibleType + * @param applyCostume + * @param cooldown Optional. Default is the cooldown as defined in `items.xml`. + * @param additive Optional. If true, calling this method will increment the current cooldown. + * Default is true. + */ + AddCollectibleEffect: ( + collectibleType: CollectibleType, + applyCostume: boolean, + cooldown?: int, + additive?: boolean, + ) => void; + /** * Used to specify the custom stats that should be evaluated the next time the * `EntityPlayer.EvaluateCache` is run. @@ -75,23 +156,61 @@ declare global { /** * Adds an innate collectible to the player. Innate collectibles grant the effects of a * collectible but the collectible itself is not added to the player's inventory, akin to an - * item wisp. + * item wisp. You can use `EntityPlayer.HasCollectibleEx` and `EntityPlayer.GetCollectibleNumEx` + * when checking the player's collectibles to also see if they have it as an innate item. * - * This method is currently partially bugged as it directly modifies the array returned by + * This method is currently bugged as it directly modifies the array returned by * `EntityPlayer.GetWispCollectiblesList`. Furthermore, added innate items are not saved when - * exiting a run. + * exiting a run. You will need to keep track of the player's innate collectible count using + * Isaacscript Common's Save Data Manager feature and the + * `ModCallbackCustom.POST_GAME_STARTED_REORDERED` callback to reapply the innate collectibles. * * @param collectible * @param amount Optional. Default is 1. + * @param evaluateItems Optional. Default is true. */ - AddInnateCollectible: (collectible: CollectibleType, amount?: int) => void; + AddInnateCollectible: ( + collectible: CollectibleType, + amount?: int, + evaluateItems?: boolean, + ) => void; - /** This is capped at a max of three familiars. */ + /** + * Adds a Leprosy orbital to the player. This is capped at a maximum of three Leprosy orbitals. + * This is capped at a max of three familiars. + */ AddLeprosy: () => void; /** Adds an item locust to the player. */ AddLocust: (collectible: CollectibleType, position: Vector) => void; + /** + * Adds a collectible effect associated with the provided `nullItemId`. + * + * Collectible effects are not intended to be used as a fake or temporary copy of items. For + * instance, every single active item grants a collectible effect on use and are often tied to + * its effect. Therefore, collectible effects can be seen as more tied to an item's state, such + * as: + * + * - The Holy Mantle tracking how many shield charges the player has. + * - How most familiars are granted to the player. + * - Activating the effects of Whore of Babylon and Crown of Light. + * + * This method is a shortcut to `TemporaryEffects.AddNullEffect` with extra cooldown arguments. + * + * @param nullItemId + * @param applyCostume + * @param cooldown Optional. Default is the cooldown as defined in `items.xml`. + * @param additive Optional. If true, calling this method will increment the current cooldown. + * Default is true. + */ + AddNullItemEffect: ( + nullItemId: NullItemID, + applyCostume: boolean, + cooldown?: int, + additive?: boolean, + ) => void; + /** * Adds a smelted trinket directly to the player's inventory. * @@ -103,29 +222,89 @@ declare global { AddSmeltedTrinket: ( trinket: TrinketType, firstTimePickingUp?: boolean, + ) => boolean; + + /** + * @param cacheFlags Optional. Default is `CacheFlagZero`. + * @param amount Optional. Default is 1. + */ + AddSoulLocketBonus: ( + cacheFlags?: CacheFlag | BitFlags, + amount?: int, ) => void; /** - * Adds charges to the player's Urn of Souls if they are currently holding it. + * A shortcut of `TemporaryEffects.AddTrinketEffect` with extra cooldown arguments. * - * @param count Optional. Default is 0. + * @param trinket + * @param showCostume + * @param cooldown Optional. Default is the cooldown as defined in `items.xml`. + * @param additive Optional. If true, calling this method will increment the current cooldown. + * Default is true. */ - AddUrnSouls: (count?: number) => void; + AddTrinketEffect: ( + trinket: TrinketType, + showCostume: boolean, + cooldown?: int, + additive?: boolean, + ) => void; - BlockCollectible: (collectible: CollectibleType) => void; + /** + * Adds charges to the player's Urn of Souls if they are currently holding it. This is capped at + * 20 souls. + * + * The game always keeps track of the amount of souls the player has, even if they do not have + * the Urn of Souls in their inventory. + */ + AddUrnSouls: (count: number) => void; + + /** + * Blocks the provided `collectibleType`. + * + * Blocked collectibles causes the game to think the player does not have the collectible, even + * if it's in their inventory. However, collectible related callbacks such as + * `ModCallbackRepentogon.POST_ADD_COLLECTIBLE` will still fire, even if the collectible is + * blocked. + * + * **Example** + * + * ```ts + * const player = Isaac.GetPlayer(0); + * player.BlockCollectible(CollectibleType.SAD_ONION); + * + * print(player.HasCollectible(CollectibleType.SAD_ONION)); // false + * print(player.GetCollectibleNum(CollectibleType.SAD_ONION)); // 0 + * print(player.IsCollectibleBlocked(CollectibleType.SAD_ONION)); // true + * + * player.UnblockCollectible(CollectibleType.SAD_ONION); + * print(player.HasCollectible(CollectibleType.SAD_ONION)); // true + * ``` + */ + BlockCollectible: (collectibleType: CollectibleType) => void; /** Returns whether the collectible can be added to the player's inventory. */ CanAddCollectibleToInventory: (collectible: CollectibleType) => boolean; - /** Returns whether the player can crush rocks and similar grid entities on contact. */ + /** + * Returns whether the player can crush rocks and similar grid entities on contact. + * + * This method only returns true if: + * + * - The player has Leo or Thunder Thighs in their inventory. + * - The effects from The Nail or Mega Mush is active. + * - The player has the Stompy transformation. + */ CanCrushRocks: () => boolean; - CanOverrideActiveItem: (collectible: CollectibleType) => boolean; + /** Returns whether the active item at the provided `slot` can be overridden. */ + CanOverrideActiveItem: (slot: ActiveSlot) => boolean; + + /** Returns whether the player can use the provided `pillEffect`. */ CanUsePill: (pillEffect: PillEffect) => boolean; /** * Behaves the same as `EntityPlayer.CheckFamiliar` except it returns an array of all of the - * familiars. + * spawned familiars. * * @param familiar * @param targetCount @@ -141,6 +320,12 @@ declare global { familiarSubType?: int, ) => EntityFamiliar[]; + /** + * Stops the currently playing costume animation tied to the provided `collectible`. + * + * This method seems to only apply to costumes where they have multiple animations instead of a + * single one (i.e Monstros Lung, Larynx, etc.). + */ ClearCollectibleAnim: (collectible: CollectibleType) => void; /** @@ -158,10 +343,31 @@ declare global { */ ClearDeadEyeChargeEx: (force?: boolean) => void; + /** + * Stops the currently playing costume animation tied to the provided `collectible`. + * + * This method seems to only apply to costumes where they have multiple animations instead of a + * single one (i.e Monstros Lung, Larynx, etc.). + */ ClearItemAnimCollectible: (collectible: CollectibleType) => void; + + /** Stops all playing costume animations tied to Null Items. */ ClearItemAnimNullItems: () => void; + + /** + * Removes the player's queued item. + * + * When the player touches a collectible item, they are not granted it immediately. Instead, the + * item is added to a queue for the duration of the animation where the player holds the item + * above their head. When the animation is finished, the item(s) in the queue will be granted. + * This method adds a new item to the item queue. If the player is not currently playing an + * animation, then the queued item will simply be awarded instantly. + */ ClearQueueItem: () => void; + /** Creates an afterimage of the player that is used by items such as Suplex and A Pony. */ + CreateAfterimage: (duration: int, position: Vector) => void; + /** * Removes the collectible from the player's inventory and spawns a pedestal containing the * collectible. @@ -179,24 +385,26 @@ declare global { ) => void; /** - * Removes the collectible from the player's inventory based on the specified history index and - * spawns a pedestal containing the collectible. + * Removes the collectible from the player's inventory based on the provided index and spawns a + * a pedestal containing the collectible. If `existingPedestal` is defined, this method returns + * an `EntityPickupCollectible`. Otherwise, this method returns undefined. * - * @param index + * @param index The history index starts at 0. * @param existingPedestal Optional. If defined, the collectible the pedestal contains will be * swapped out for the dropped collectible instead of a new pedestal * spawning. Default is undefined. */ DropCollectibleByHistoryIndex: ( index: int, - existingPedestal: EntityPickupCollectible, - ) => void; + existingPedestal?: EntityPickupCollectible, + ) => EntityPickupCollectible; - EnableWeaponType: (weapon: WeaponType, set: boolean) => void; + /** Sets whether the provided `weaponType` is enabled. */ + EnableWeaponType: (weaponType: WeaponType, set: boolean) => void; /** - * Fires a Brimstone ball. If the player has Tech X, the fire will fire a laser as well, with - * the brimstone ball as its parent. + * Fires a Brimstone ball. If the player has Tech X, they will fire a laser as well, with the + * brimstone ball being its parent. Returns the spawned Brimstone Ball. * * @param position * @param velocity @@ -208,43 +416,108 @@ declare global { offset?: Vector, ) => EntityEffect; - /** @param slot Optional. Default is `ActiveSlot.PRIMARY`. */ - GetActiveItemDesc: (slot?: ActiveSlot) => ActiveItemDesc; + /** Returns how many frames the player has been holding the drop trinket button. */ + GetActionHoldDrop: () => int; + + /** + * Returns an `ActiveItemDesc` corresponding to the provided `activeSlot`. + * + * @param activeSlot Optional. Default is `ActiveSlot.PRIMARY`. + */ + GetActiveItemDesc: (activeSlot?: ActiveSlot) => ActiveItemDesc; - /** Returns -1 if the provided collectible is not in any of the player's active slots. */ - GetActiveItemSlot: (collectible: CollectibleType) => ActiveSlot | -1; + /** + * Returns the `ActiveSlot` that the player has the provided `collectibleType` in. Returns -1 if + * the player does not have the collectible in any slot. + * + * If the player has multiple copies of the collectible, this method only returns the slot with + * the highest priority depending on its value, with `ActiveSlot.PRIMARY` being the highest and + * `ActiveSlot.POCKET_SINGLE_USE` being the lowest. If you need to get all of the active slots, + * use Isaacscript Common's `getActiveItemSlots` helper function instead. + */ + GetActiveItemSlot: (collectibleType: CollectibleType) => ActiveSlot | -1; + /** + * Returns the maximum amount of charges the collectible in the provided slot has. This does not + * account for overcharging. Returns 0 if there is no collectible in the slot. + */ GetActiveMaxCharge: (slot: ActiveSlot) => int; + + /** + * Returns the minimum amount of charges the collectible in the provided slot needs in order for + * it to be used. Returns 0 if there is no collectible in the slot. + */ GetActiveMinUsableCharge: (slot: ActiveSlot) => int; - GetActiveWeaponNumFired: () => int; - /** Returns the contents of the player's Bag of Crafting. */ - GetBagOfCraftingContent: () => BagOfCraftingPickup[]; + /** + * Returns how many times the player has attacked with their currently active weapon. The value + * resets if the player's current weapon changes or they exit the run. + * + * Returns undefined if the player has no weapon. + */ + GetActiveWeaponNumFired: () => int | undefined; - /** Returns the player's Bag Of Crafting output. */ - GetBagOfCraftingOutput: () => int; + /** Returns an array containing the contents of the player's Bag of Crafting. */ + GetBagOfCraftingContent: () => BagOfCraftingPickup[]; /** - * Returns the `BagOfCraftingPickup` in the player's Bag of Crafting from the specified index. + * Returns the current output collectible in the player's Bag of Crafting. Returns + * `CollectibleType.NULL` if there is no output collectible. */ + GetBagOfCraftingOutput: () => CollectibleType; + + /** Returns the `ItemPoolType` corresponding to the Bag of Crafting's output. */ + GetBagOfCraftingOutputItemPool: () => ItemPoolType; + + /** Returns the `BagOfCraftingPickup` in the player's Bag of Crafting at the provided index. */ GetBagOfCraftingSlot: (slot: int) => BagOfCraftingPickup; + /** + * Returns the current charge for when the player stops shooting and charges the Kidney Stone + * collectible. This is normally capped at 90 but can be overridden through the + * `EntityPlayer.SetBladderCharge` method. + */ GetBladderCharge: () => int; + /** + * Returns how many times the player has taken damage in the current floor while having Bloody + * Lust in their inventory. + */ GetBloodLustCounter: () => int; /** Returns the direction the player's body is moving. */ GetBodyMoveDirection: () => Vector; + /** Returns the number of frames until the player can place another bomb. */ GetBombPlaceDelay: () => int; + /** + * Returns how many times the player has taken damage while having Cambion Conception in their + * inventory. + */ GetCambionConceptionState: () => int; - GetCambionFamiliarFlags: () => BitFlags; - GetCambionPregnancyLevel: () => int; + + /** Returns the current visible state of Cambion Conception's costume. */ + GetCambionPregnancyLevel: () => CambionPregnancyLevel; /** - * Returns a dictionary containing all of the player's collectibles and the amount for each one - * being held. + * Returns an object of every Candy Heart stat boost and how many times each has been applied to + * the player. + */ + GetCandyHeartBonus: () => { + Damage: int; + FireDelay: int; + Luck: int; + MoveSpeed: int; + ShotSpeed: int; + TearRange: int; + }; + + GetCharmOfTheVampireKills: () => int; + + /** + * Returns a dictionary with the keys being a collectible and their value being how many of the + * collectible the player has in their inventory. Innate collectibles are not counted. */ GetCollectiblesList: () => LuaTable; @@ -252,7 +525,7 @@ declare global { * Repentogon's modified `EntityPlayer.GetCollectibleNum` method. * * Behaves the same as `EntityPlayer.GetCollectibleNum` except you can now choose to have it - * ignore blocked items. + * ignore innate items. * * This method has been renamed to include "Ex" so it can not conflict with the vanilla type * definitions. However, when the project compiles the method's name will change to what it's @@ -262,23 +535,80 @@ declare global { * @param onlyCountTrueItems If set to true, the function only counts collectibles that the * player actually owns and ignores things like Lilith's Incubus, * items granted by 3 Dollar Bill, and so forth. - * @param ignoreBlocked Optional. Default is false. + * @param ignoreInnate Optional. If true, this method will not check the player's innate + * collectibles. Default is false. * @customName GetCollectibleNum */ GetCollectibleNumEx: ( collectibleType: CollectibleType, onlyCountTrueItems?: boolean, - ignoreBlocked?: boolean, + ignoreInnate?: boolean, ) => int; - /** Return the player's sprite layer data for costumes. */ - GetCostumeLayerMap: () => { + /** + * Returns a bitmask corresponding to which familiars have been spawned by Cambion Conception or + * Immaculate Conception. + */ + GetConceptionFamiliarFlags: () => BitFlags; + + /** + * Returns an array of the layer data of all of the player's costumes. + * + * Due to the differences in the starting index of arrays between Lua and C++, you need to + * decrease iterator index by one and increase the `costumeIndex` by one in order to get + * accurate information. + * + * **Example** + * + * ```ts + * const player = Isaac.GetPlayer(); + * const costumeMap = player.GetCostumeLayerMap(); + * + * print("-------------------------------------------------------------------"); + * + * const costumeSpriteDescs = player.GetCostumeSpriteDescs(); + * + * for (const [costumeLayer, mapData] of costumeMap.entries()) { + * if (mapData.costumeIndex == -1) { + * continue; + * } + * + * const desc = costumeSpriteDescs[costumeLayer + 1]; + * + * if (desc === undefined) { + * continue; + * } + * + * const sprite = desc.GetSprite(); + * const itemConfig = desc.GetItemConfig(); + * const spriteLayer = sprite.GetLayer(mapData.layerID); + * + * // `Isaac.GetString` lets you get an item's localized name, so we need to explicitly typecast it. + * const itemName = itemConfig.Name as LanguageAbbreviation; + * + * if (spriteLayer === undefined) { + * continue; + * } + * + * const layerName = spriteLayer.GetName(); + * const costumeName = + * itemConfig.Name != "" + * ? Isaac.GetString("Items", itemName) + * : `NullItemID${itemConfig.ID}`; + * + * const spritePath = sprite.GetFilename(); + * print(`${costumeLayer - 1} - ${layerName} - ${costumeName} - ${spritePath}`); + * } + * ``` + */ + GetCostumeLayerMap: () => Array<{ costumeIndex: int; layerID: int; priority: int; isBodyLayer: boolean; - }; + }>; + /** Returns an array of all of the player's `CostumeSpriteDesc`. */ GetCostumeSpriteDescs: () => CostumeSpriteDesc[]; /** @@ -287,24 +617,43 @@ declare global { */ GetCustomCacheValue: (customCacheTag: string) => number; - GetD8DamageModifier: () => int; - GetD8FireDelayModifier: () => int; - GetD8RangeModifier: () => int; - GetD8SpeedModifier: () => int; - GetDamageModifier: () => int; + /** Returns the damage modifier used by the D8. */ + GetD8DamageModifier: () => number; + + /** Returns the fire delay modifier used by the D8. */ + GetD8FireDelayModifier: () => number; + + /** Returns the range modifier used by the D8. */ + GetD8RangeModifier: () => number; + + /** Returns the speed modifier used by the D8. */ + GetD8SpeedModifier: () => number; + + /** + * Returns the player's current damage modifier. The damage modifier is either set through + * Experimental Treatment or `EntityPlayer.SetDamageModifier`. + */ + GetDamageModifier: () => number; + + /** Returns the current charge of Dead Eye. */ GetDeadEyeCharge: () => int; + + /** Returns the name of the player's death animation. */ GetDeathAnimName: () => DeathAnimationName; - /** Returns the offset of the player's damage stat for Eden's random states. */ + /** Returns the offset of the player's damage stat for Eden's random stats. */ GetEdenDamage: () => number; - /** Returns the offset of the player's fire delay stat for Eden's random states. */ + /** Returns the offset of the player's fire delay stat for Eden's random stats. */ GetEdenFireDelay: () => number; - /** Returns the offset of the player's luck stat for Eden's random states. */ + /** Returns the offset of the player's luck stat for Eden's random stats. */ GetEdenLuck: () => number; - /** Returns the offset of the player's shot speed stat for Eden's random states. */ + /** Returns the offset of the player's range stat for Eden's random stats. */ + GetEdenRange: () => number; + + /** Returns the offset of the player's shot speed stat for Eden's random stats. */ GetEdenShotSpeed: () => number; /** Returns the offset of the player's speed stat for Eden's random states. */ @@ -315,11 +664,20 @@ declare global { /** Returns the player's `EntityConfigPlayer`. */ GetEntityConfigPlayer: () => EntityConfigPlayer; + /** + * Returns how many frames the player has been firing in one direction with Epiphora in their + * inventory. The charge stops increasing when the player's fire rate can no longer increase + * from the effect. + */ GetEpiphoraCharge: () => int; - /** Returns the current charge of Tainted Eve's innate Sumptorium ability. */ + /** Returns how many frames Tainted Eve's innate Sumptorium has been charging. */ GetEveSumptoriumCharge: () => int; + /** + * Returns the player's current fire delay modifier. The fire delay modifier is either set + * through Experimental Treatment or `EntityPlayer.SetFireDelayModifier`. + */ GetFireDelayModifier: () => int; /** @@ -337,15 +695,49 @@ declare global { */ GetFocusEntity: () => Entity | undefined; - GetFootprintColor: (useLeftFootprint: boolean) => Color; + /** Returns the color of the player's footprint. */ + GetFootprintColor: (useLeftFootprint: boolean) => KColor; + + /** + * Returns how many frames until the player can switch between the Skeleton/Soul form as the + * Forgotten. + */ + GetForgottenSwapFormCooldown: () => int; + + /** + * Returns the EntityDesc corresponding to the enemy the player last captured using Friendly + * Ball. + */ + GetFriendBallEnemy: () => EntityDesc; + + /** Returns the SubType of the glitched baby. */ GetGlitchBabySubType: () => BabySubType; + + /** + * Returns an array containing what pickup Glyph of Balance will drop upon the room being + * cleared. + * + * @param variant Optional. Default is -1. + * @param subType Optional. Default is -1. + */ GetGlyphOfBalanceDrop: ( - variant: PickupVariant, - subType: int, + variant?: PickupVariant, + subType?: int, ) => [PickupVariant, int]; + + /** + * Returns how many frames the player has been holding still with Gnawed Leaf in their + * inventory. + */ GetGnawedLeafTimer: () => int; + + /** Returns the amount of heart containers the player has that were given by Greed's Gullet. */ GetGreedsGulletHearts: () => int; + /** + * Returns the amount of frames until the player loses their stat boost from the aura used by + * Hallowed Ground and Star of Bethlehem. The countdown decreases when they leave the aura. + */ GetHallowedGroundCountdown: () => int; /** @@ -369,20 +761,35 @@ declare global { */ GetHeldSprite: () => Sprite; + /** + * Returns the player's `History`. This is used to keep track of the collectibles the player has + * gotten throughout the run. + */ GetHistory: () => History; - /** Returns how many hearts have been collected with Immaculate Conception. */ + /** + * Returns how many hearts have been collected with Immaculate Conception in the player's + * inventory. + */ GetImmaculateConceptionState: () => int; - SetItemState: (collectible: CollectibleType) => void; - /** Returns the number of coins spent while possessing Keeper's Sack. */ GetKeepersSackBonus: () => int; /** Returns the player's laser color. */ GetLaserColor: () => Color; - GetLuckModifier: () => int; + /** + * Returns the player's current luck modifier. The luck modifier is either set through + * Experimental Treatment or `EntityPlayer.SetLuckModifier`. + */ + GetLuckModifier: () => number; + + /** + * Returns how many frames are left until one of Tainted Magdalene's temporary hearts is + * drained. + */ + GetMaggyHealthDrainCooldown: () => int; /** * Returns how many frames are left until Tainted Magdalene's swing attack can be used again. @@ -393,22 +800,42 @@ declare global { /** Returns the Marked target effect, if it exists. Otherwise, returns undefined. */ GetMarkedTarget: () => EntityEffect | undefined; + /** + * Returns the maximum amount of charge until the player stops shooting and charges the Kidney + * Stone collectible. + */ GetMaxBladderCharge: () => int; + + /** Returns the maximum amount of bombs the player can have. */ + GetMaxBombs: () => int; + + /** Returns the maximum amount of coins the player can have. */ + GetMaxCoins: () => int; + + /** Returns the maximum amount of keys the player can have. */ + GetMaxKeys: () => int; + + /** Returns the maximum duration of the Kidney Stone collectible. */ GetMaxPeeBurstCooldown: () => int; + + /** Returns the maximum amount of pocket items. */ GetMaxPocketItems: () => int; /** Returns how many frames until the effects of Mega Blast stop. */ GetMegaBlastDuration: () => int; + /** Returns the `CollectibleType` of the last collectible given by Metronome. */ GetMetronomeCollectibleID: () => CollectibleType; /** * Returns the `EntitiesSaveStateVector` corresponding to the pickups the player has stored * using the Moving Box collectible. */ - GetMovingBoxContents: () => EntitiesSaveStateVector[]; + GetMovingBoxContents: () => EntitiesSaveStateVector; + /** Returns the `MultiShotParams` of the provided `weaponType`. */ GetMultiShotParams: (weaponType: WeaponType) => MultiShotParams; + GetMultiShotPositionVelocity: ( loopIndex: int, weaponType: WeaponType, @@ -429,7 +856,19 @@ declare global { /** Returns the amount of collectibles the player has tied to the specified transformation. */ GetPlayerFormCounter: (playerFormID: PlayerForm) => void; - GetPocketItem: (slotId: ActiveSlot) => PocketItem; + GetPlayerHUD: () => PlayerHUD | undefined; + + /** + * Returns the player's index. + * + * This method should not be confused with Isaacscript Common's `getPlayerIndex` helper + * function. If you need to store any data pertaining to a player, use `getPlayerIndex` over + * this. + */ + GetPlayerIndex: () => int; + + /** Returns the `PocketItem` from the provided `slotId`. */ + GetPocketItem: (slotId: PillCardSlot) => PocketItem; /** * Returns the amount of frames left until the charging effect from the A Pony or White Pony @@ -443,23 +882,124 @@ declare global { */ GetPurityState: () => PurityState; + /** Returns the frames left until the damage bonus from Red Stew expires. */ + GetRedStewBonusDuration: () => int; + + GetRevelationCharge: () => int; + + GetRockBottomDamage: () => number; + GetRockBottomLuck: () => number; + GetRockBottomMaxFireDelay: () => number; + GetRockBottomMoveSpeed: () => number; + GetRockBottomShotSpeed: () => number; + GetRockBottomTearRange: () => number; + + /** + * Returns the player's current shot speed modifier. The shot speed modifier is either set + * through Experimental Treatment or `EntityPlayer.SetShotSpeedModifier`. + */ + GetShotSpeedModifier: () => number; + + /** + * Returns a table with the keys being the `TrinketType` and the value being being a table with + * the corresponding amount of smelted trinkets. + */ + GetSmeltedTrinkets: () => LuaTable< + TrinketType, + { trinketAmount: int; goldenTrinketAmount: int } + >; + + GetSmeltedTrinketDesc: (trinket: TrinketType) => { + trinketAmount: int; + goldenTrinketAmount: int; + }; + + GetSoulLocketBonus: () => { + Damage: int; + FireDelay: int; + TearRange: int; + ShotSpeed: int; + MoveSpeed: int; + Luck: int; + }; + + /** @param position Optional. Default is the player's position. */ + GetSpecialGridCollision: (position?: Vector) => EntityGridCollisionClass; + + /** + * Returns the player's current speed modifier. The speed modifier is either set through + * Experimental Treatment or `EntityPlayer.SetSpeedModifier`. + */ + GetSpeedModifier: () => number; + + /** Returns an array containing information of all of the player's innate collectibles. */ GetSpoofedCollectiblesList: () => Array<{ CollectibleID: CollectibleType; AppendedCount: int; IsBlocked: boolean; }>; + GetStatMultiplier: () => number; + GetSuplexAimCountdown: () => int; + GetSuplexLandPosition: () => Vector; + GetSuplexState: () => SuplexState; + GetSuplexTargetPosition: () => Vector; + /** * Returns the player's tear displacement. The displacement corresponds to the eye the tear is * being fired from, with 1 being the right eye and -1 being the left eye. */ GetTearDisplacement: () => number; + GetTearsCap: () => number; + + /** + * Returns the amount of charges the collectible in the provided slot has. Returns 0 if there is + * no collectible in the slot. + */ + GetTotalActiveCharge: (slot: ActiveSlot) => int; + + /** Returns the amount charges the player has for the Urn of Souls item. */ + GetUrnSouls: () => int; + + /** Returns an array of all active items that were consumed by the Void item. */ + GetVoidedCollectiblesList: () => CollectibleType[]; + + /** Returns a Weapon from the provided slot. Returns undefined if no weapon is in the slot. */ + GetWeapon: (slot: WeaponSlot) => Weapon | undefined; + + /** Returns a bitmask of the player's weapon modifiers. */ + GetWeaponModifiers: () => BitFlags; + + /** + * Returns the item that was used by the player and would be activated again upon using Wild + * Card. + * + * If the player used an active item, its `CollectibleType` is returned. If the player used a + * consumable, its sub type is returned. If the player used the Question Mark card, 1 is + * returned. Otherwise, 0 is returned. + */ + GetWildCardItem: () => CollectibleType | CardType | PillEffect; + + /** + * Returns the type of item that was last used by the player and would be used again upon using + * Wild Card. Returns 255 if no item has been used. + */ + GetWildCardItemType: () => PocketItemType | 255; + + /** + * Returns a dictionary of the Lemegeton wisps the player has, with the keys being the + * `CollectibleType` and the value being the corresponding amount. + */ + GetWispCollectiblesList: () => LuaMap; + + HasCamoEffect: () => boolean; + /** * Repentogon's modified `EntityPlayer.HasCollectible` method. * - * Behaves the same as `EntityPlayer.AddCacheFlags` except you can now choose to have it ignore - * blocked items. + * Behaves the same as `EntityPlayer.HasCollectible` except you can now choose to have it ignore + * innate items. * * This method has been renamed to include "Ex" so it can not conflict with the vanilla type * definitions. However, when the project compiles the method's name will change to what it's @@ -469,13 +1009,14 @@ declare global { * @param ignoreModifiers If set to true, only counts collectibles the player actually owns and * ignores effects granted by items like Zodiac, 3 Dollar Bill and * Lemegeton. Default is false. - * @param ignoreBlocked Optional. Default is false. + * @param ignoreInnate Optional. If true, the method will not check the player's innate + * collectibles. Default is false. * @customName HasCollectible */ HasCollectibleEx: ( collectibleType: CollectibleType, ignoreModifiers?: boolean, - ignoreBlocked?: boolean, + ignoreInnate?: boolean, ) => boolean; /** @@ -484,16 +1025,454 @@ declare global { */ HasChanceRevive: () => boolean; + HasForcedCamoEffect: () => boolean; + + /** Returns whether the player has the golden variant of the provided trinket. */ HasGoldenTrinket: (trinket: TrinketType) => boolean; + /** + * Returns whether the player is in the Lost form triggered by either the white fire in + * Downpour, using Soul of The Lost, or touching Dark Esau if the player is playing as Tainted + * Jacob. + */ + HasInstantDeathCurse: () => boolean; + + /** + * Behaves the same as `EntityPlayer.HasInvincibility` except it now allows for passing an + * EntityRef parameter. + * + * @param damageFlag Optional. Default is 0. + * @param source Optional. Default is undefined. + * @customName HasInvincibility + */ + HasInvincibilityEx: ( + damageFlag?: BitFlags, + source?: EntityRef, + ) => boolean; + + /** Returns whether the player is immune to poison. */ + HasPoisonImmunity: () => boolean; + + /** Increments the counter towards a transformation. */ + IncrementPlayerFormCounter: (form: PlayerForm, count: int) => void; + + /** + * Initializes the "special" tear or weapon type for characters like Forgotten, Lilith, and + * Azazel. + * + * This method should be called after spawning a player using `EntityPlayer.InitTwin`, otherwise + * their special tear/weapon may not be initialized properly. + */ + InitPostLevelInitStats: () => void; + + /** + * Initializes a new player that is controlled by the player's controller. + * + * This method is currently bugged as the spawned twin will desyncs upon exiting a run and + * continuing it. This results in the game prompting the player for a controller, resulting in a + * soft lock. + * + * This method is intended to only work on vanilla characters as this method is hardcoded, as + * confirmed by _Kilburn. + */ + InitTwin: (playerType: PlayerType) => EntityPlayer; + + /** Returns whether the animation associated with the collectible is visible. */ + IsCollectibleAnimFinished: ( + collectible: CollectibleType, + animation: string, + ) => boolean; + + /** + * Returns whether the player has blocked the collectible. + * + * Blocked collectibles causes the game to think the player does not have the collectible, even + * if it's in their inventory. However, collectible related callbacks such as + * `ModCallbackRepentogon.POST_ADD_COLLECTIBLE` will still fire, even if the collectible is + * blocked. + * + * **Example** + * + * ```ts + * const player = Isaac.GetPlayer(0); + * player.BlockCollectible(CollectibleType.SAD_ONION); + * + * print(player.HasCollectible(CollectibleType.SAD_ONION)); // false + * print(player.GetCollectibleNum(CollectibleType.SAD_ONION)); // 0 + * print(player.IsCollectibleBlocked(CollectibleType.SAD_ONION)); // true + * + * player.UnblockCollectible(CollectibleType.SAD_ONION); + * print(player.HasCollectible(CollectibleType.SAD_ONION)); // true + * ``` + */ IsCollectibleBlocked: (collectible: CollectibleType) => boolean; + /** Returns whether the costume associated with the collectible is visible. */ + IsCollectibleCostumeVisible: ( + collectible: CollectibleType, + playerSpriteLayerIDOrName: int | string, + ) => boolean; + + IsEntityValidTarget: (entity: Entity) => boolean; + + /** + * Returns whether the provided foot has touched the ground for the current animation frame if + * the player is walking. + * + * @param foot Optional. Default is `PlayerFoot.RIGHT`. + */ + IsFootstepFrame: (foot?: PlayerFoot) => boolean; + + /** + * Returns whether the player is headless due to collectibles such as Guillotine and Scissors. + */ + IsHeadless: () => boolean; + + /** Returns whether the player is the non-active form of Tainted Lazarus with Birthright. */ + IsHologram: () => boolean; + + /** Returns whether the invisibility effect of Faded Polaroid/Camo Undies is active. */ + IsInvisible: () => boolean; + + /** Returns whether the costume associated with the `ItemConfigItem` is visible. */ + IsItemCostumeVisible: ( + item: ItemConfigItem, + playerSpriteLayerIDOrName: int | string, + ) => boolean; + + /** Returns whether the player is a local player on the machine. */ + IsLocalPlayer: () => boolean; + + /** Returns whether the costume associated with the null item is visible. */ + IsNullItemCostumeVisible: ( + nullItem: NullItemID, + playerSpriteLayerIDOrName: int | string, + ) => boolean; + + IsPacifist: () => boolean; + IsPostLevelInitFinished: () => boolean; + + /** Returns whether the player can no longer shoot due to charging the Kidney Stone item. */ + IsUrethraBlocked: () => boolean; + + /** Turns the player into a co-op ghost. */ + MorphToCoopGhost: () => void; + + /** + * Plays an animation tied to the provided collectible. + * + * @param collectible + * @param checkBodyLayers + * @param animationName + * @param frame Optional. Default is -1. + */ + PlayCollectibleAnim: ( + collectible: CollectibleType, + checkBodyLayers: boolean, + animationName: string, + frame?: int, + ) => void; + + /** + * Plays a sound effect from the player after a delay. + * + * @param soundEffect + * @param soundDelay Optional. How many frames before the sound plays. Default is 0. + * @param frameDelay Optional. Default is 2. + * @param volume Optional. Default is 1. + */ + PlayDelayedSFX: ( + soundEffect: SoundEffect, + soundDelay?: int, + frameDelay?: int, + volume?: number, + ) => void; + + RemoveCollectibleByHistoryIndex: (index: int) => void; + + /** Removes the pocket item from the provided slot. */ + RemovePocketItem: (slot: PillCardSlot) => void; + + /** + * Removes the poop spell from the provided queue position. All spells are shifted to fill the + * space a new spell is added to fill the last position. + * + * Poop spells are only used by Tainted Blue Baby. + * + * @param queuePosition Optional. Default is 0. + */ + RemovePoopSpell: (queuePosition?: int) => void; + + /** Rerolls all of the player's collectibles. */ + RerollAllCollectibles: (rng: RNG, includeActiveItems: boolean) => void; + + // ResetPlayer is bugged and currently does nothing. + + /** + * Revives the player with half a heart if they are a co-op ghost. Returns whether they were + * successfully revived. + */ + ReviveCoopGhost: () => boolean; + + /** + * Spawns a series of pickups the same way Tainted Cain does upon picking up a collectible. + * + * @param collectibleType + * @param position Optional. Default is the player's position. + * @param rng Optional. Default is the player's drop RNG. + * @param itemPoolType Optional. Default is `ItemPoolType.NULL`. + */ + SalvageCollectible: ( + collectibleType: CollectibleType, + position?: Vector, + rng?: RNG, + itemPoolType?: ItemPoolType, + ) => void; + + /** + * Spawns a series of pickups the same way Tainted Cain does upon picking up a collectible. The + * salvaged pickup is removed. + * + * The original name of this method was "SalvageCollectible". However, due to Typescript's poor + * support with method overloads in interfaces, this overload was renamed to `SalvagePickup`. + * When the mod is compiled, all references to `SalvagePickup` are renamed to + * `SalvageCollectible`. + * + * @param pickup + * @param rng Optional. Default is the pickup's drop RNG. + * @param itemPoolType Optional. Default is `ItemPoolType.NULL`. + * @customName SalvageCollectible + */ + SalvagePickup: ( + pickup: EntityPickup, + rng?: RNG, + itemPoolType?: ItemPoolType, + ) => void; + + /** Sets how many frames the player has been holding the drop trinket button. */ + SetActionHoldDrop: (frames: int) => void; + + /** Sets the `VarData` of the collectible at the provided active slot. */ + SetActiveVarData: (varData: int, slot: ActiveSlot) => void; + + SetBabySkin: (skin: BabySubType) => void; + + /** Sets the contents of the player's Bag of Crafting. */ + SetBagOfCraftingContent: (content: readonly BagOfCraftingPickup[]) => void; + + /** Sets the output of the player's Bag of Crafting to the provided collectible. */ + SetBagOfCraftingOutput: (output: CollectibleType) => void; + + /** Sets the provided slot in the player's Bag of Crafting to the provided pickup. */ + SetBagOfCraftingSlot: ( + slotID: int, + bagOfCraftingPickup: BagOfCraftingPickup, + ) => void; + SetBlackHeart: (blackHearts: int) => void; + + /** + * Sets the player's Bladder Charge. This is used by Kidney Stone. + * + * This method is bugged as calling it without having Kidney Stone in the player's inventory + * causes their head to turn pitch black. + */ + SetBladderCharge: (charge: int) => void; + + /** + * Sets how many times the player has hit with Bloody Lust in their inventory. Bloody Lust's + * color and damage cap is respected. + * + * This method does not change the player's damage and color stat immediately. You will need to + * add the appropriate cache flags and call `EntityPlayer.EvaluateItems` if you wish to + * immediately change them. + */ SetBloodLustCounter: (counter: int) => void; + + /** Sets how many frames until the player can place another bomb. */ SetBombPlaceDelay: (delay: int) => void; - SetCambionFamiliarFlags: (flags: BitFlags) => void; + + /** + * Sets how much damage the player has taken with Cambion Conception in their inventory. + * + * This does not spawn the familiar even if it's set to a value where the player gives birth. + * The birth is only triggered once the player takes damage. + */ + SetCambionConceptionState: (state: int) => void; + + /** Sets whether the player can shoot. */ + SetCanShoot: (canShoot: boolean) => void; + + /** + * Sets which familiars were spawned by Cambion/Immaculate Conception. The familiars only spawn + * when the familiars cache is evaluated and the player has one of the two collectibles in their + * inventory. + */ + SetCambionFamiliarFlags: ( + flags: BitFlags | ConceptionFamiliarFlag, + ) => void; + + /** Sets how many kills the player got with Charm of the Vampire. */ + SetCharmOfTheVampireKills: (kills: int) => void; + + /** Sets the player's controller index. */ + SetControllerIndex: (index: ControllerIndex) => void; + + SetD8DamageModifier: (modifier: number) => void; + SetD8FireDelayModifier: (modifier: number) => void; + SetD8RangeModifier: (modifier: number) => void; + SetD8SpeedModifier: (modifier: number) => void; + + /** Sets the player's current damage modifier used by Experimental Treatment. */ + SetDamageModifier: (modifier: number) => void; + + /** + * Sets the offset of the player's damage stat for Eden's random stats. Has no effect if the + * player isn't Eden or Tainted Eden. + */ + SetEdenDamage: (damage: number) => void; + + /** + * Sets the offset of the player's fire delay stat for Eden's random stats. Has no effect if the + * player isn't Eden or Tainted Eden. + */ + SetEdenFireDelay: (fireDelay: number) => void; + + /** + * Sets the offset of the player's luck stat for Eden's random stats. Has no effect if the + * player isn't Eden or Tainted Eden. + */ + SetEdenLuck: (luck: number) => void; + + /** + * Sets the offset of the player's range stat for Eden's random stats. Has no effect if the + * player isn't Eden or Tainted Eden. + */ + SetEdenRange: (range: number) => void; + + /** + * Sets the offset of the player's shot speed stat for Eden's random stats. Has no effect if the + * player isn't Eden or Tainted Eden. + */ + SetEdenShotSpeed: (shotSpeed: number) => void; + + /** + * Sets the offset of the player's speed stat for Eden's random stats. Has no effect if the + * player isn't Eden or Tainted Eden. + */ + SetEdenSpeed: (speed: number) => void; + + /** Sets the current charge of Tainted Eve's innate Sumptorium ability. */ + SetEveSumptoriumCharge: (charge: int) => void; + + /** Sets the player's current fire delay modifier used by Experimental Treatment. */ + SetFireDelayModifier: (modifier: number) => void; + + /** + * Sets the player's footprint color. + * + * @param color + * @param rightFoot Optional. Default is false. + */ + SetFootprintColor: (color: KColor, rightFoot?: boolean) => void; + + SetForceCamoEffect: (force: boolean) => void; + SetForgottenSwapFormCooldown: (cooldown: int) => void; + SetFriendBallEnemy: (desc: EntityDesc) => void; + + /** + * Sets how many frames the player has been holding still with Gnawed Leaf in their inventory. + */ + SetGnawedLeafTimer: (timer: int) => void; + + /** + * Sets how many frames until the player's stat boost from standing in the aura of Hallowed + * Ground/Star of Bethlehem goes away. + */ SetHallowedGroundCountdown: (countdown: int) => void; + /** + * Locks the player's head animation to a direction. + * + * @param direction + * @param time + * @param force Optional. If true, existing head direction locks are overridden. Default is + * false. + */ + SetHeadDirection: ( + direction: Direction, + time: int, + force?: boolean, + ) => void; + + /** Sets how many frames the player's head direction is locked in its current direction. */ + SetHeadDirectionLockTime: (time: int) => void; + + /** + * Sets how many hearts the player has picked up with Immaculate Conception in their inventory. + * This is capped at 14. + * + * This does not spawn the familiar even if it's set to a value where the player gives birth. + * The birth is only triggered once the player picks up a heart. + */ + SetImmaculateConceptionState: (heartsPickedUp: int) => void; + + /** + * Sets the player's item stat to the provided collectible. + * + * Item states are usually used by collectibles that the player holds above their head before + * activating, such as Bob's Rotten Head and Glass Cannon. + */ + SetItemState: (collectible: CollectibleType) => void; + + /** Sets the current coin bonus for the player's Keepers Sack collectible. */ + SetKeepersSackBonus: (bonus: int) => void; + + /** Sets the player's laser color. */ + SetLaserColor: (color: Color) => void; + + /** Sets the player's current luck modifier used by Experimental Treatment. */ + SetLuckModifier: (modifier: int) => void; + + /** Sets how many frames until one of Tainted Magdalene's hearts are drained. */ + SetMaggyHealthDrainCooldown: (cooldown: int) => void; + + /** Sets how many frames until Tainted Magdalene's swing attack can be used again. */ + SetMaggySwingCooldown: (cooldown: int) => void; + + /** + * Sets the maximum charge for when the player stops shooting and charges the Kidney Stone + * collectible. + */ + SetMaxBladderCharge: (charge: int) => void; + + /** + * Sets the countdown in frames until the Mega Blast laser goes away. Setting the countdown to a + * value above 0 will activate the effects of Mega Blast. + */ + SetMegaBlastDuration: (countdown: int) => void; + + /** + * Sets the frame at which the player stops shooting and starts charging the Kidney Stone + * collectible. + */ + SetNextUrethraBlockFrame: (frame: int) => void; + + /** + * Sets the duration of the charge effect used A Pony/White Pony. Calling this method with a + * positive value will activate the charge effect. + */ + SetPonyCharge: (time: int) => void; + + /** + * Sets the provided slot to the provided poop spell. Poop spells are only used by Tainted Blue + * Baby. + */ + SetPoopSpell: (slot: int, poopSpellType: PoopSpellType) => void; + + /** Sets the state of the player's Purity collectible. */ + SetPurityState: (state: PurityState) => void; + /** * Sets the duration of the damage bonus given by the Red Stew collectible to the specified * amount of frames. Setting the duration above 0 will activate the effect if it wasn't active @@ -501,10 +1480,30 @@ declare global { */ SetRedStewBonusDuration: (duration: int) => void; + SetRevelationCharge: (charge: int) => void; + + SetRockBottomDamage: (damage: number) => void; + SetRockBottomLuck: (luck: number) => void; + SetRockBottomMaxFireDelay: (maxFireDelay: number) => void; + SetRockBottomMoveSpeed: (speed: number) => void; + SetRockBottomShotSpeed: (shotSpeed: number) => void; + SetRockBottomTearRange: (range: number) => void; + + /** Sets the player's current shot speed modifier used by Experimental Treatment. */ SetShotSpeedModifier: (modifier: int) => void; + + /** Sets the player's current speed modifier used by Experimental Treatment. */ SetSpeedModifier: (modifier: int) => void; + SetSuplexAimCountdown: (countdown: int) => void; + SetSuplexLandPosition: (position: Vector) => void; + SetSuplexState: (state: SuplexState) => void; + SetSuplexTargetPosition: (position: Vector) => void; + + /** Sets the amount of damage the player's poison tears deals. */ SetTearPoisonDamage: (damage: number) => void; + + /** Sets the player's current tear range modifier used by Experimental Treatment. */ SetTearRangeModifier: (modifier: int) => void; /** @@ -515,13 +1514,14 @@ declare global { */ SetUrethraBlock: (blocked: boolean) => void; - SetWeapon: (weapon: Weapon, slot: int) => void; + /** Sets the player's weapon to the provided slot. */ + SetWeapon: (weapon: Weapon, slot: WeaponSlot) => void; - /** Shoots a blue flame from the Candle collectible. */ + /** Shoots a blue fire from the Candle collectible from the player. */ ShootBlueCandle: (direction: Vector) => void; /** - * Randomizes the player's current costumes. + * Shuffles the player's costumes. * * @param seed Optional. Default is a call to `Random()`. */ @@ -534,7 +1534,7 @@ declare global { * undefined will have the creep inherit the player's current tear params * instead. Default is undefined. */ - SpawnAquariusCreep: (tearParams: TearParams) => EntityEffect; + SpawnAquariusCreep: (tearParams?: TearParams) => EntityEffect; /** * Removes half a heart and spawns a Blood Clot based on the type of heart removed. @@ -546,18 +1546,23 @@ declare global { */ SpawnClot: (pos: Vector, allowOnDeath?: boolean) => void; - /** Spawns a ring of tears that orbit around the player akin to the Saturnus collectible. */ - SpawnSaturnusTears: () => void; + /** + * Spawns a ring of tears that orbit around the player akin to the Saturnus collectible. Returns + * the number of tears fired. + */ + SpawnSaturnusTears: () => int; /** * If the player is The Forgotten/The Soul, the two will swap forms. Otherwise, this method does * nothing. * + * Returns whether the swap was successful. + * * @param force Optional. If true, the two will swap even if the sub-player doesn't have any * health or while a room/stage transition is active. Default is false. * @param noEffects Optional. If true, the dust and fade effect will not play. Default is false. */ - SwapForgottenForm: (force?: boolean, noEffects?: boolean) => void; + SwapForgottenForm: (force?: boolean, noEffects?: boolean) => boolean; SyncConsumableCounts: (player: EntityPlayer, collectibleFlags: int) => void; @@ -576,11 +1581,14 @@ declare global { teleportTwins?: boolean, ) => void; - /** Triggers the room clear events. */ + /** Triggers effects on the player as if a room was cleared (i.e Charging active items). */ TriggerRoomClear: () => void; - /** Attempts to add the specified pickup to the player's Bag of Crafting. */ - TryAddToBagOfCrafting: (pickup: EntityPickup) => void; + /** + * Attempts to add the specified pickup to the player's Bag of Crafting. Returns whether the + * addition was successful. + */ + TryAddToBagOfCrafting: (pickup: EntityPickup) => boolean; /** * Attempts to decrease the uses left for the Glowing Hourglass collectible, if the player has @@ -595,6 +1603,20 @@ declare global { forceHourglass?: boolean, ) => void; + /** + * Spawns a copy of the player at its current position. The fake player will play the death + * sound and animation. + * + * Returns whether the fake player was spawned successfully. + */ + TryFakeDeath: () => boolean; + + /** + * Attempts to throw Tainted Forgotten in the provided direction if the player is holding him. + * Returns whether he was thrown. + */ + TryForgottenThrow: (direction: Vector) => boolean; + /** * Adds a heart container to the player if there are none to prevent death, depending on the * player's `HealthType`. @@ -606,13 +1628,42 @@ declare global { /** Attempts to remove a smelted trinket from the player. */ TryRemoveSmeltedTrinket: (trinket: TrinketType) => void; + /** + * Unblocks the provided collectible. + * + * Blocked collectibles causes the game to think the player does not have the collectible, even + * if it's in their inventory. However, collectible related callbacks such as + * `ModCallbackRepentogon.POST_ADD_COLLECTIBLE` will still fire, even if the collectible is + * blocked. + * + * **Example** + * + * ```ts + * const player = Isaac.GetPlayer(0); + * player.BlockCollectible(CollectibleType.SAD_ONION); + * + * print(player.HasCollectible(CollectibleType.SAD_ONION)); // false + * print(player.GetCollectibleNum(CollectibleType.SAD_ONION)); // 0 + * print(player.IsCollectibleBlocked(CollectibleType.SAD_ONION)); // true + * + * player.UnblockCollectible(CollectibleType.SAD_ONION); + * print(player.HasCollectible(CollectibleType.SAD_ONION)); // true + * ``` + */ UnblockCollectible: (collectible: CollectibleType) => void; + /** + * Updates Isaac's pregnancy state. + * + * @param updateCambion If true, the Cambion Conception costume is updated. Otherwise, the + * Immaculate Conception costume is updated. + */ UpdateIsaacPregnancy: (updateCambion: boolean) => void; /** Returns whether the player has consumed the specified collectible with Void. */ VoidHasCollectible: (collectible: CollectibleType) => boolean; BabySkin: BabySubType; + FriendBallEnemy: EntityDesc; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityProjectile.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityProjectile.d.ts index 273667651..9a68bfccc 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityProjectile.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityProjectile.d.ts @@ -1,3 +1,4 @@ declare interface EntityProjectile extends Entity { + /** Deflects the projectile to the provided direction. */ Deflect: (newVelocity: Vector) => void; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntitySlot.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntitySlot.d.ts index aa02e0202..d1045b9e6 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntitySlot.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntitySlot.d.ts @@ -1,38 +1,96 @@ import type { CollectibleType } from "isaac-typescript-definitions"; +import type { CoinJamAnimation } from "../../../enums/CoinJamAnimation"; +import type { SlotState } from "../../../enums/SlotState"; /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare global { interface EntitySlot extends Entity { /** Forces the slot to drop what it typically would drop if blown up. */ CreateDropsFromExplosion: () => void; + /** + * Returns the slot's donation value. The donation value varies on the slot's variant: + * + * - Beggar: How many coins have been donated. + * - Demon Beggar: How many hearts have been donated. + * - Battery Bum and Rotten Beggar: Increases with each payment by random amounts, up to 3. It + * is reset back to 0 upon giving a reward. + * - For every other variant, it is 0. + * + * The donation value can be overridden by using `EntitySlot.SetDonationValue`. + */ GetDonationValue: () => int; + + /** + * Returns the collectible that the slot will pay out with. This is only used by Crane Game and + * Hell Game. + */ + GetPrizeCollectible: () => CollectibleType; + + GetPrizeSprite: () => Sprite; + + /** Returns the slot's prize type. */ GetPrizeType: () => int; + + /** + * Returns the index used by Shell Game and Hell Game used to determine which animation to play. + */ GetShellGameAnimationIndex: () => int; - GetState: () => int; + + /** Returns the slot's state. */ + GetState: () => SlotState; + + /** Returns the timeout in frames until the slot determines its prize. */ GetTimeout: () => int; - GetTriggerTimerNum: () => int; - /** Returns how many frames a player has been touching the slot. */ + /** + * Returns how many frames a player has been touching the slot. This is reset once no player is + * touching it. + */ GetTouch: () => int; - RandomCoinJamAnim: () => string; + /** + * Returns the slot's trigger timer number. This is only used by Bomb Bums and Reroll Machines. + */ + GetTriggerTimerNum: () => int; + + /** Returns a random coin jam animation name. */ + RandomCoinJamAnim: () => CoinJamAnimation; + + /** Sets the slot's donation value. */ SetDonationValue: (value: int) => void; - /** Sets the prize collectible. Only used by Crane Game, Shell Game and Hell Game. */ + /** + * Sets the collectible that the slot will pay out with. This is only used by Crane Game and + * Hell Game. + */ SetPrizeCollectible: (collectible: CollectibleType) => void; + /** Sets the slot's prize type. */ SetPrizeType: (prizeType: int) => void; + + /** + * Sets the index used by Shell Game and Hell game to determine which prize animation to play. + */ SetShellGameAnimationIndex: (index: int) => void; - SetState: (state: int) => void; + + /** Sets the slot's state. */ + SetState: (state: SlotState) => void; + + /** Sets the slot's timeout. */ SetTimeout: (timeout: int) => void; - SetTriggerTimerNum: (timerNum: int) => void; - /** Sets how many frames a player has been touching the slot. */ + /** + * Sets how many frames a player has been touching the slot. This is reset to 0 once no players + * are touching the slot. + */ SetTouch: (duration: int) => void; + + /** Sets the slot's trigger timer number. */ + SetTriggerTimerNum: (timerNum: int) => void; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityTear.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityTear.d.ts index 274882859..24aeccb10 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityTear.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/entity/EntityTear.d.ts @@ -1,46 +1,107 @@ -/** - * This class is for REPENTOGON, an exe-hack which expands the modding API. - * - * @see https://repentogon.com/index.html - */ -declare interface EntityTear extends Entity { - /** - * Returns the intensity value of the tear as a result of the Dead Eye Collectible. The intensity - * is between 0 and 1. - */ - GetDeadEyeIntensity: () => float; +import type { SoundEffect, TearVariant } from "isaac-typescript-definitions"; +import type { SplitTearType } from "../../../enums/SplitTearType"; +declare global { /** - * Copies the tear and applies the Multidimensional Baby tear effect to it. Returns the copied - * tear. + * This class is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ */ - MakeMultidimensionalCopy: () => EntityTear; + interface EntityTear extends Entity { + /** Adds an entity to the tear's hit list. */ + AddToHitList: (entity: Entity) => void; - GetDeadEyeSprite: () => Sprite; - GetTearEffectSprite: () => Sprite; - GetTearHaloSprite: () => Sprite; + /** Clears the tear's hit list. */ + ClearHitList: () => void; - /** Returns whether the tear was created through the Multidimensional Baby effect. */ - IsMultidimensionalTouched: () => boolean; + /** + * Fires a split tear. + * + * @param position + * @param velocity + * @param damageMultiplier Optional. Default is 0.5. + * @param sizeMultiplier Optional. Default is 0.6. + * @param variant Optional. Default is `TearVariant.BLUE`. + * @param splitTearType Optional. Default is `SplitTearType.GENERIC`. Custom split tear effects + * can be implemented by passing in a string instead. + */ + FireSplitTear: ( + position: Vector, + velocity: Vector, + damageMultiplier?: number, + sizeMultiplier?: number, + variant?: TearVariant, + splitTearType?: SplitTearType | string, + ) => EntityTear; - /** Returns whether the tear was created through the Angelic Prism effect. */ - IsPrismTouched: () => boolean; + /** + * Returns the intensity value of the tear as a result of the Dead Eye collectible. The + * intensity is between 0 and 1. + */ + GetDeadEyeIntensity: () => float; - /** - * Repentogon's modified `EntityTear.ResetSpriteScale` method. - * - * Behaves the same as `EntityTear.ResetSpriteScale` except you can now choose to have it - * re-evaluate which scale animation to play. - * - * @param force Optional. Default is false. - * - * @customName ResetSpriteScale - */ - ResetSpriteScaleEx: (force: boolean) => void; + /** Returns the hit list indices of all entities the tear has hit. */ + GetHitList: () => int[]; + + /** + * Copies the tear and applies the Multidimensional Baby tear effect to it. Returns the copied + * tear. + */ + MakeMultidimensionalCopy: () => EntityTear; + + /** Returns the red aura sprite used by Dead Eye. */ + GetDeadEyeSprite: () => Sprite; + + /** + * Returns the effect sprite used by numerous tear variants such as Fire Mind and Mysterious + * Liquid. + */ + GetTearEffectSprite: () => Sprite; + + /** Returns the aura sprite used by Godhead tears. */ + GetTearHaloSprite: () => Sprite; + + /** Returns whether the entity is in the tear's hit list. */ + InHitList: (entity: Entity) => boolean; + + /** Returns whether the tear was created through the Multidimensional Baby effect. */ + IsMultidimensionalTouched: () => boolean; + + /** Returns whether the tear was created through the Angelic Prism effect. */ + IsPrismTouched: () => boolean; + + /** Removes an entity from the tear's hit list. */ + RemoveFromHitList: (entity: Entity) => void; + + /** + * Repentogon's modified `EntityTear.ResetSpriteScale` method. + * + * Behaves the same as `EntityTear.ResetSpriteScale` except you can now choose to have it + * re-evaluate which scale animation to play. + * + * This method has been renamed to include "Ex" so it can not conflict with the vanilla type + * definitions. However, when the project compiles the method's name will change to what it's + * supposed to be. + * + * @param force Optional. Default is false. + * @customName ResetSpriteScale + */ + ResetSpriteScaleEx: (force?: boolean) => void; + + /** + * Sets the sound that the tear plays when the tear is first spawned. This function must be + * called in `ModCallback.POST_TEAR_INIT`. Use this function over calling `SFXManager.Stop` on + * the default tear manager sound as it's possible for the default sound to still briefly play + * for a single frame. + * + * @param soundId + */ + SetInitSound: (soundId: SoundEffect) => void; - /** Sets whether the tear was created through the Multidimensional Baby effect. */ - SetMultidimensionalTouched: (touched: boolean) => void; + /** Sets whether the tear was created through the Multidimensional Baby effect. */ + SetMultidimensionalTouched: (touched: boolean) => void; - /** Sets whether the tear was created through the Angelic Prism effect. */ - SetPrismTouched: (touched: boolean) => void; + /** Sets whether the tear was created through the Angelic Prism effect. */ + SetPrismTouched: (touched: boolean) => void; + } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/grid-entity/GridEntity.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/grid-entity/GridEntity.d.ts index 6559973c1..28a53e401 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/grid-entity/GridEntity.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/grid-entity/GridEntity.d.ts @@ -1,69 +1,35 @@ -import type { - BackdropType, - DamageFlag, - GridEntityType, -} from "isaac-typescript-definitions"; +import type { DamageFlag } from "isaac-typescript-definitions"; +import type { WaterClipFlag } from "../../../enums/flags/WaterClipFlag"; declare global { interface GridEntity extends IsaacAPIClass { - GetAltRockType: (backdropType: BackdropType) => int; - - /** Returns the rock's render position. */ + /** Returns the grid's render position. */ GetRenderPosition: () => Vector; - /** - * @param entity - * @param damage - * @param damageFlags - * @param unknown1 The behavior of this parameter is currently unknown and is undocumented. - * @param unknown2 The behavior of this parameter is currently unknown and is undocumented. - */ + GetWaterClipFlags: () => BitFlags; + + /** Forces the grid entity to hurt the provided entity. */ HurtDamage: ( entity: Entity, damage: int, - damageFlags: BitFlags, - unknown1: float, - unknown2: boolean, + damageFlags: DamageFlag | BitFlags, + enemyDamage: number, + ignoreGridCollision: boolean, ) => void; - /** - * @param int - * @param damageFlags - * @param unknown1 The behavior of this parameter is currently unknown and is undocumented. - * @param unknown2 The behavior of this parameter is currently unknown and is undocumented. - */ HurtSurroundings: ( - int: DamageFlag, + enemyDistance: number, + playerDistance: number, + enemyDamage: number, + playerDamage: number, damageFlags: BitFlags, - unknown1: float, - unknown2: boolean, + ignoreGridCollisions: boolean, ) => void; /** Returns whether the grid entity is a breakable rock. */ IsBreakableRock: () => boolean; - /** - * Makes the grid entity play the sound it plays when it breaks. - * - * @param gridEntityType The type of grid break sound to play. For example, - * `GridEntityType.ROCK` would play the sound of a rock being broken. - * @param backdrop The backdrop variant of the specified `gridEntityType`. - */ - PlayBreakSound: ( - gridEntityType: GridEntityType, - backdrop: BackdropType, - ) => void; - - RegisterRockDestroyed: (gridEntityType: GridEntityType) => void; - - RenderTop: (offset: Vector) => void; - - // All of the `ToX` methods are not implemented as their associated classes don't have any - // methods yet. - - TrySpawnLadder: () => void; - TrySpawnWorms: () => void; - UpdateCollision: () => void; - UpdateNeighbors: () => void; + ResetWaterClipFlags: () => void; + SetWaterClipFlags: (flags: WaterClipFlag | BitFlags) => void; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/grid-entity/GridEntityDoor.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/grid-entity/GridEntityDoor.d.ts index 1b5c6136b..7d176c287 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/grid-entity/GridEntityDoor.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/grid-entity/GridEntityDoor.d.ts @@ -2,8 +2,12 @@ import type { DoorState, DoorVariant } from "isaac-typescript-definitions"; declare global { interface GridEntityDoor extends GridEntity { + /** Returns the door's extra sprite. */ GetExtraSprite: () => Sprite; + /** Plays the door's animation. */ + PlayAnimation: () => void; + PreviousState: DoorState; PreviousVariant: DoorVariant; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/grid-entity/GridEntityRock.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/grid-entity/GridEntityRock.d.ts new file mode 100644 index 000000000..b169bc832 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/grid-entity/GridEntityRock.d.ts @@ -0,0 +1,62 @@ +import type { + BackdropType, + GridEntityType, +} from "isaac-typescript-definitions"; + +declare global { + interface GridEntityRock extends GridEntity { + /** + * Returns the alternative rock type (i.e. urn, mushroom, etc.) that th rock is. + * + * @param backdropType Optional. The alternative rock type that is returned depends on the + * backdrop. For example, if the backdrop is `BackdropType.CAVES`, the + * alternative rock type is a mushroom. Default is `BackdropType.NULL` (The + * current backdrop). + */ + GetAltRockType: (backdropType?: BackdropType) => int; + + /** + * Plays the grid break sound. + * + * @param gridEntityType The grid entity type that the sound corresponds to. + * @param backdrop Optional. Some grid entities have unique break sounds based on the room's + * current backdrop. Default is `BackdropType.NULL` (The current backdrop). + */ + PlayBreakSound: ( + gridEntityType: GridEntityType, + backdrop?: BackdropType, + ) => void; + + /** Forces the game to treat the rock as if it's been destroyed. */ + RegisterRockDestroyed: (gridEntityType: GridEntityType) => void; + + RenderTop: (offset: Vector) => void; + + TrySpawnLadder: () => void; + TrySpawnWorms: () => void; + + /** Updates the rock's collision. */ + UpdateCollision: () => void; + + UpdateNeighbors: () => void; + } + + namespace GridEntityRock { + /** + * @param position + * @param gridEntityType + * @param gridVariant + * @param seed + * @param unknown + * @param backdrop Optional. Default is `BackdropType.NULL` (The current backdrop). + */ + function SpawnDrops( + position: Vector, + gridEntityType: GridEntityType, + gridVariant: int, + seed: Seed, + unknown: boolean, + backdrop: BackdropType, + ): void; + } +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/history/History.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/history/History.d.ts index 9c3094896..feb3c4061 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/history/History.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/history/History.d.ts @@ -1,7 +1,7 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface History extends IsaacAPIClass { /** Returns an array of the list of `HistoryItem` found in the current run. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/history/HistoryItem.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/history/HistoryItem.d.ts index 8eef2a555..87212d173 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/history/HistoryItem.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/history/HistoryItem.d.ts @@ -10,7 +10,7 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface HistoryItem extends IsaacAPIClass { /** Returns the `CollectibleType` this history item represents. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/DebugRenderer.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/DebugRenderer.d.ts index 33d103786..17c50d585 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/DebugRenderer.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/DebugRenderer.d.ts @@ -1,8 +1,8 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace DebugRenderer { /** diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/HUD.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/HUD.d.ts index 50bfebde0..a7e51bba9 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/HUD.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/HUD.d.ts @@ -14,6 +14,9 @@ declare interface HUD extends IsaacAPIClass { /** Returns the sprite object used to render the charge bar. */ GetChargeBarSprite: () => Sprite; + /** @param index Optional. Must be between 0 and 3. Default is 0. */ + GetCoopPlayerMessage: (index?: int) => HUDMessage; + /** Returns the sprite used to render the co-op player select menu. */ GetCoopMenuSprite: () => Sprite; @@ -23,25 +26,34 @@ declare interface HUD extends IsaacAPIClass { /** Returns the sprite used to render the fortune popup window. */ GetFortuneSprite: () => Sprite; + /** Returns the sprite used to render health. */ GetHeartsSprite: () => Sprite; /** Returns the sprite used to render Tainted Isaac's inventory. */ GetInventorySprite: () => Sprite; + GetMainMessage: () => HUDMessage; + + /** Returns the sprite used to render the pickups HUD. */ GetPickupsHUDSprite: () => Sprite; /** + * Returns the `PlayerHUD` from the provided index. + * * @param index Optional. The index must be between 0 - 7, otherwise an error is thrown. Default * is 0. */ - GetPlayerHUD: (index: int) => PlayerHUD; + GetPlayerHUD: (index?: int) => PlayerHUD; /** Returns the sprite used to render Tainted Blue Baby's poop spells. */ GetPoopSpellSprite: () => Sprite; + /** @param index Optional. Must be between 0 and 5. Default is 0. */ + GetStackedMessage: (index?: int) => HUDMessage; + /** - * Returns the sprite used to render streak popups (Picking up items, displaying floor names, - * etc.). + * Returns the sprite used to render streak popups (e.g. Picking up items, displaying floor + * names). */ GetStreakSprite: () => Sprite; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/HUDMessage.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/HUDMessage.d.ts new file mode 100644 index 000000000..298918fb9 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/HUDMessage.d.ts @@ -0,0 +1,22 @@ +declare interface HUDMessage extends IsaacAPIClass { + GetMainText: () => string; + GetSprite: () => Sprite; + GetSubText: () => string; + Hide: () => void; + IsShowing: () => boolean; + SetMainText: (text: string) => void; + SetSubText: (subText: string) => void; + + /** + * @param text + * @param subText Optional. Default is an empty string. + * @param sticky Optional. Default is false. + * @param curseDisplay Optional. Default is false. + */ + Show: ( + text: string, + subText?: string, + sticky?: boolean, + curseDisplay?: boolean, + ) => void; +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/Minimap.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/Minimap.d.ts index 7eb6129e6..49cb8580f 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/Minimap.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/Minimap.d.ts @@ -3,8 +3,8 @@ import type { MinimapState } from "../../../enums/MinimapState"; /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace Minimap { /** Returns the current display dimensions of the minimap. */ @@ -31,6 +31,9 @@ declare namespace Minimap { /** Returns the current state of the minimap. */ function GetState(): MinimapState; + /** Sets how many frames the minimap has been in its expanded state. */ + function SetHoldTime(holdTime: int): void; + /** Sets the duration (in frames) of the minimap's screen shake effect. */ function SetShakeDuration(duration: int): void; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/PlayerHUD.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/PlayerHUD.d.ts index f59a93a8b..808398a79 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/PlayerHUD.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/PlayerHUD.d.ts @@ -4,7 +4,7 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface PlayerHUD { /** @@ -19,6 +19,9 @@ declare global { /** Returns the `HUD`. */ GetHUD: () => HUD; + GetIndex: () => int; + GetLayout: () => int; + /** Returns the `EntityPlayer` associated with the `PlayerHUD`. */ GetPlayer: () => EntityPlayer; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/PlayerHUDHeart.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/PlayerHUDHeart.d.ts index 27022ee6d..a046f4bec 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/PlayerHUDHeart.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/PlayerHUDHeart.d.ts @@ -4,9 +4,10 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface PlayerHUDHeart extends IsaacAPIClass { + /** Returns the heart's flash type. */ GetFlashType: () => HeartFlashType; /** Returns the name of the animation currently playing on the heart. */ @@ -15,7 +16,10 @@ declare global { /** Returns the name of the overlay animation currently playing on the heart. */ GetHeartOverlayAnim: () => string; + /** Returns whether the Eternal Heart overlay is visible. */ IsEternalHeartOverlayVisible: () => boolean; + + /** Returns whether the heart is fading. */ IsFadingHeart: () => boolean; /** Returns whether the golden heart overlay is visible on the heart. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/ScoreSheet.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/ScoreSheet.d.ts index ffc335cf1..1dbe24ede 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/ScoreSheet.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/hud/ScoreSheet.d.ts @@ -5,8 +5,8 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ namespace ScoreSheet { function AddFinishedStage( diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/item-config/ItemConfig.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/item-config/ItemConfig.d.ts index 9a5c7ca83..31fece957 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/item-config/ItemConfig.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/item-config/ItemConfig.d.ts @@ -10,8 +10,19 @@ declare global { CanRerollCollectible: (collectible: CollectibleType) => boolean; /** Returns an array of `ItemConfigItem` that match the specified tags. */ - GetTaggedItems: (tags: BitFlags) => ItemConfigItem[]; + GetTaggedItems: ( + tags: ItemConfigTag | BitFlags, + ) => ItemConfigItem[]; + /** + * Returns whether the trinket is valid. + * + * @see + * https://github.com/TeamREPENTOGON/REPENTOGON/blob/db50daa92ff366565c699bf09641e8c5b9b2449c/repentogon/LuaInterfaces/LuaItemConfig.cpp#L241-L246 + * @see https://repentogon.com/ItemConfig.html?h=ItemConfig#isvalidtrinket + * @deprecated Not currently exposed to Lua (hook commented out upstream), despite being + * documented. + */ IsValidTrinket: (trinketType: TrinketType) => boolean; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/item-config/ItemConfigCard.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/item-config/ItemConfigCard.d.ts new file mode 100644 index 000000000..3e7cce670 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/item-config/ItemConfigCard.d.ts @@ -0,0 +1,3 @@ +declare interface ItemConfigCard extends IsaacAPIClass { + ModdedCardFront: Sprite; +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/item-config/ItemConfigItem.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/item-config/ItemConfigItem.d.ts index 22bf4343c..b1092eb1b 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/item-config/ItemConfigItem.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/item-config/ItemConfigItem.d.ts @@ -1,6 +1,27 @@ declare interface ItemConfigItem extends IsaacAPIClass { + /** + * Returns an array of the strings defined in the item's `customcache` attribute in `items.xml`. + * + * The tags in the array are always in lowercase regardless of its casing in `items.xml`. + */ GetCustomCacheTags: () => string[]; + + /** + * Returns an array of the strings defined in the item's `customtags` attribute in `items.xml`. + * + * The tags in the array are always in lowercase regardless of its casing in `items.xml`. + */ GetCustomTags: () => string[]; + + /** + * Returns whether the provided cache tag was specified in the item's `customcache` attribute in + * `items.xml`. The tag name is case insensitive. + */ HasCustomCacheTag: (tagName: string) => boolean; + + /** + * Returns whether the provided tag was specified in the item's `customtags` attribute in + * `items.xml`. The tag name is case insensitive. + */ HasCustomTag: (tag: string) => boolean; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/level-generator/LevelGenerator.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/level-generator/LevelGenerator.d.ts index a37c7c97e..057f9d6b0 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/level-generator/LevelGenerator.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/level-generator/LevelGenerator.d.ts @@ -4,7 +4,7 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface LevelGenerator extends IsaacAPIClass { /** Returns an array containing all the rooms that have been generated for the level. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/level-generator/LevelGeneratorEntry.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/level-generator/LevelGeneratorEntry.d.ts index 5f4d7f063..7a147b742 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/level-generator/LevelGeneratorEntry.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/level-generator/LevelGeneratorEntry.d.ts @@ -4,15 +4,12 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface LevelGeneratorEntry extends IsaacAPIClass { - SetAllowedDoors: ( - room: LevelGeneratorRoom, - doors: BitFlags, - ) => void; + SetAllowedDoors: (doors: DoorSlotFlag | BitFlags) => void; - SetColIdx: (room: LevelGeneratorRoom, columnIndex: int) => void; - SetLineIdx: (room: LevelGeneratorRoom, columnIndex: int) => void; + SetColIdx: (columnIndex: int) => void; + SetLineIdx: (lineIndex: int) => void; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/level-generator/LevelGeneratorRoom.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/level-generator/LevelGeneratorRoom.d.ts index 979da068d..68dc7bcdf 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/level-generator/LevelGeneratorRoom.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/level-generator/LevelGeneratorRoom.d.ts @@ -4,7 +4,7 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface LevelGeneratorRoom extends IsaacAPIClass { /** Returns the column position of the room within the level grid (zero-based index). */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/BestiaryMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/BestiaryMenu.d.ts index f9f8a2a78..6d1224727 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/BestiaryMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/BestiaryMenu.d.ts @@ -1,8 +1,8 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace BestiaryMenu { /** Returns the sprite used for the bestiary menu. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/ChallengeMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/ChallengeMenu.d.ts index fcae844e7..00b9ba9f5 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/ChallengeMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/ChallengeMenu.d.ts @@ -4,8 +4,8 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ namespace ChallengeMenu { /** Returns the sprite used for the Challenge Menu. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CharacterMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CharacterMenu.d.ts index e0e57f879..4131e97d8 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CharacterMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CharacterMenu.d.ts @@ -6,8 +6,8 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ namespace CharacterMenu { /** Returns the menu's current status. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CollectionMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CollectionMenu.d.ts index 84daaba99..4c9d37d26 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CollectionMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CollectionMenu.d.ts @@ -1,8 +1,8 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace CollectionMenu { /** Returns the sprite used to display the collection menu. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/ControllerSelectMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/ControllerSelectMenu.d.ts index 9ffb86b3c..aa91416ba 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/ControllerSelectMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/ControllerSelectMenu.d.ts @@ -1,8 +1,8 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace ControllerSelectMenu { /** Returns the sprite used to display the controller select menu. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CustomChallengeMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CustomChallengeMenu.d.ts index e3818a210..7fe7bdaf6 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CustomChallengeMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CustomChallengeMenu.d.ts @@ -4,8 +4,8 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ namespace CustomChallengeMenu { /** Returns the sprite used to display the custom challenge menu. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CutscenesMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CutscenesMenu.d.ts index 9920be0ae..b4996c3b4 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CutscenesMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/CutscenesMenu.d.ts @@ -1,8 +1,8 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace CutscenesMenu { /** Returns the sprite used for the cutscenes menu. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/DailyChallengeMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/DailyChallengeMenu.d.ts index dff9e85a4..f08ab32a5 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/DailyChallengeMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/DailyChallengeMenu.d.ts @@ -4,8 +4,8 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ namespace DailyChallengeMenu { /** Returns the sprite used for the daily challenge menu. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/KeyConfigMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/KeyConfigMenu.d.ts index 4c5c9be56..faec10256 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/KeyConfigMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/KeyConfigMenu.d.ts @@ -1,8 +1,8 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace KeyConfigMenu { /** Returns the sprite used for the key config menu. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/MenuManager.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/MenuManager.d.ts index 569c80a9a..dfad89975 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/MenuManager.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/MenuManager.d.ts @@ -5,8 +5,8 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ namespace MenuManager { /** Retrieves the currently active `MainMenuType`. */ @@ -24,6 +24,7 @@ declare global { /** Returns the current color modifier of the menu. */ function GetCurrentColorModifier(): ColorModifier; + /** Returns a bitmask of the allowed inputs on the main menu. */ function GetInputMask(): BitFlags; /** Returns the sprite used for the select widget. */ @@ -51,7 +52,10 @@ declare global { rate?: number, ): void; - function SetInputMask(mask: BitFlags): void; + /** Sets the allowed inputs on the main menu. */ + function SetInputMask( + mask: ButtonActionFlag | BitFlags, + ): void; /** Sets the position of the main menu camera. */ function SetViewPosition(position: Vector): void; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/ModsMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/ModsMenu.d.ts index 3c6d9d6c7..052e33235 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/ModsMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/ModsMenu.d.ts @@ -1,8 +1,8 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace ModsMenu { /** Returns the sprite used for the mods menu. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/OptionsMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/OptionsMenu.d.ts index 91ac991c5..a6af4653c 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/OptionsMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/OptionsMenu.d.ts @@ -1,8 +1,8 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace OptionsMenu { /** Returns the sprite used for the gamma widget in the options menu. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/PauseMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/PauseMenu.d.ts index 53bee2224..32827178e 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/PauseMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/PauseMenu.d.ts @@ -4,8 +4,8 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ namespace PauseMenu { /** Returns the sprite used to display the completion marks. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/SaveMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/SaveMenu.d.ts index f44c2e907..139f2ba20 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/SaveMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/SaveMenu.d.ts @@ -1,8 +1,8 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace SaveMenu { /** Returns the sprite used for the save select menu. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/SpecialSeedsMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/SpecialSeedsMenu.d.ts index 1281d214b..89200b066 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/SpecialSeedsMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/SpecialSeedsMenu.d.ts @@ -1,8 +1,8 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace SpecialSeedsMenu { /** Returns the sprite used by the special seeds menu. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/StatsMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/StatsMenu.d.ts index fee0114ec..3b4866c7e 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/StatsMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/StatsMenu.d.ts @@ -1,8 +1,8 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace StatsMenu { /** Returns the sprites used by the secrets menu. */ @@ -24,9 +24,15 @@ declare namespace StatsMenu { function GetSecretsMiniSprite8(): Sprite; function GetSecretsMiniSprite9(): Sprite; + /** Returns the selected element. */ + function GetSelectedElement(): int; + /** Returns the sprites used by the stats menu. */ function GetStatsMenuSprite(): Sprite; /** Returns whether the secrets menu is active. */ function IsSecretsMenuVisible(): boolean; + + /** Sets the menu's selected element. */ + function SetSelectedMenu(): boolean; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/TitleMenu.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/TitleMenu.d.ts index 3492e6f05..d2404b4ac 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/TitleMenu.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/menus/TitleMenu.d.ts @@ -1,8 +1,8 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ declare namespace TitleMenu { /** Returns the sprite used by the title menu. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/procedural-items/ProceduralEffect.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/procedural-items/ProceduralEffect.d.ts index 433649b34..838879bfb 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/procedural-items/ProceduralEffect.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/procedural-items/ProceduralEffect.d.ts @@ -6,7 +6,7 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface ProceduralEffect { /** @@ -40,7 +40,11 @@ declare global { */ GetConditionType: () => ProceduralEffectConditionType; + GetScore: () => number; + /** Returns the chance (between 0 and 1) for the effect to be triggered. */ GetTriggerChance: () => float; + + GetTriggerChanceScale: () => number; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/procedural-items/ProceduralItem.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/procedural-items/ProceduralItem.d.ts index aaf957771..28399dab4 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/procedural-items/ProceduralItem.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/procedural-items/ProceduralItem.d.ts @@ -1,7 +1,7 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface ProceduralItem { /** Returns the damage the item grants. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/procedural-items/ProceduralItemManager.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/procedural-items/ProceduralItemManager.d.ts index c86172ee8..296ff346c 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/procedural-items/ProceduralItemManager.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/procedural-items/ProceduralItemManager.d.ts @@ -4,7 +4,7 @@ import type { CollectibleType } from "isaac-typescript-definitions"; * This class is for REPENTOGON, an exe-hack which expands the modding API. * * @noSelf - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare namespace ProceduralItemManager { /** diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/Beam.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/Beam.d.ts index ddfef57a6..e7bf6550a 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/Beam.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/Beam.d.ts @@ -3,14 +3,13 @@ * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html - * * @param this * @param sprite The sprite used must share the same scope as the beam you are creating, otherwise * the beam won't work. * @param layerOrLayerName * @param useOverlay * @param unknownBool The behavior of this argument is currently unknown. + * @see https://repentogon.com/ */ declare function Beam( this: void, @@ -23,7 +22,7 @@ declare function Beam( /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface RenderBeam extends IsaacAPIClass { /** @@ -34,11 +33,19 @@ declare interface RenderBeam extends IsaacAPIClass { * * @param point * @param position - * @param spritesheetCoordinate + * @param spritesheetCoordinate Optional. Default is 0. * @param width Optional. Default is 1. + * @param color Optional. Default is `ColorDefault`. + * @param worldSpace Optional. Default is false. */ - Add: ((point: Point) => void) & - ((position: Vector, spritesheetCoordinate: number, width?: number) => void); + Add: ((point: Point) => void) + & (( + position: Vector, + spritesheetCoordinate?: number, + width?: number, + color?: Color, + worldSpace?: boolean, + ) => void); /** Returns the layer of the beam. */ GetLayer: () => int; @@ -49,6 +56,12 @@ declare interface RenderBeam extends IsaacAPIClass { /** Returns the beam's sprite. */ GetSprite: () => Sprite; + /** + * Returns the unknown boolean set from the beam's constructor. The exact behavior of this boolean + * is unknown. + */ + GetUnkBool: () => boolean; + /** Returns whether the beam is an overlay. */ GetUseOverlay: () => boolean; @@ -66,13 +79,19 @@ declare interface RenderBeam extends IsaacAPIClass { SetPoints: (points: readonly Point[]) => void; /** Sets the sprite of the beam. */ - SetSprite: ((sprite: Sprite) => void) & - (( + SetSprite: ((sprite: Sprite) => void) + & (( sprite: Sprite, layerNameOrId: string | int, useOverlay: boolean, ) => void); + /** + * Sets the unknown boolean used in the beam's constructor. The exact behavior of this boolean is + * unknown. + */ + SetUnkBool: (bool: boolean) => void; + /** Sets whether the beam is an overlay. */ SetUseOverlay: (useOverlay: boolean) => void; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/BlendMode.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/BlendMode.d.ts index 6977dd223..255ff052b 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/BlendMode.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/BlendMode.d.ts @@ -1,17 +1,32 @@ +import type { BlendEquation } from "../../../enums/BlendEquation"; import type { BlendFactor } from "../../../enums/BlendFactor"; -import type { BlendType } from "../../../enums/BlendType"; declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface BlendMode extends IsaacAPIClass { - SetMode: (blendType: BlendType) => void; + /** + * @param rgbSrc Optional. Default is its current value. + * @param rgbDst Optional. Default is its current value. + * @param alphaSrc Optional. Default is its current value. + * @param alphaDst Optional. Default is its current value. + * @param equation Optional. Default is its current value. + */ + SetMode: ((blendMode: BlendMode) => void) + & (( + rgbSrc?: BlendFactor, + rgbDst?: BlendFactor, + alphaSrc?: BlendFactor, + alphaDst?: BlendFactor, + equation?: BlendEquation, + ) => void); AlphaDestinationFactor: BlendFactor; AlphaSourceFactor: BlendFactor; + Equation: BlendEquation; RGBDestinationFactor: BlendFactor; RGBSourceFactor: BlendFactor; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/DestinationQuad.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/DestinationQuad.d.ts index 6c4a057e3..ee0892547 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/DestinationQuad.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/DestinationQuad.d.ts @@ -3,7 +3,7 @@ * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare function DestinationQuad( this: void, @@ -16,7 +16,7 @@ declare function DestinationQuad( /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface DestinationQuad extends IsaacAPIClass { GetBottomLeft: () => Vector; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/Point.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/Point.d.ts index 3172ae1e8..0ea849322 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/Point.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/Point.d.ts @@ -8,22 +8,35 @@ * `spritesheetCoordinate` of 0 and 64 will render the spritesheet * starting from `y = 0` to `y = 64`, while an additional third point * of 0 will draw it in reverse from `y = 64` to `y = 0`. - * @param widthMultiplier A multiplier for how wide the beam should be. This is interpolated between - * points. + * @param widthMultiplier Optional. A multiplier for how wide the beam should be. This is + * interpolated between points. Default is 1. + * @param color Optional. Default is `ColorDefault`. + * @param isWorldSpace Optional. Default is false. */ declare function Point( this: void, position: Vector, spritesheetCoordinate: number, - widthMultiplier: number, + widthMultiplier?: number, + color?: Color, + isWorldSpace?: boolean, ): Point; /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface Point extends IsaacAPIClass { + /** Returns the point's color. */ + GetColor: () => Color; + + /** + * Returns whether the game automatically converts the point's position from world space to screen + * space when rendering. + */ + GetIsWorldSpace: () => boolean; + /** Returns the vertical position of the point. */ GetSpritesheetCoordinate: () => number; @@ -33,6 +46,15 @@ declare interface Point extends IsaacAPIClass { /** Returns the position of the point. */ GetPosition: () => Vector; + /** Sets the point's color. */ + SetColor: (color: Color) => void; + + /** + * Sets whether the game automatically converts the point's position from world space to screen + * space when rendering. + */ + SetIsWorldSpace: (isWorldSpace: boolean) => void; + /** Sets the vertical position of the point. */ SetSpritesheetCoordinate: (height: number) => void; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/Shape.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/Shape.d.ts index 08b6d5366..3e94dcc02 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/Shape.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/Shape.d.ts @@ -1,11 +1,11 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface Shape extends IsaacAPIClass { + Circle: (pos: Vector, size: number) => void; GetTimeout: () => int; - SetTimeout: (timeout: int) => void; /** Assigns a capsule collider to the shape. */ diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/SourceQuad.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/SourceQuad.d.ts index 9eba12c9a..8a81a0497 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/SourceQuad.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/rendering/SourceQuad.d.ts @@ -3,7 +3,7 @@ * * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare function SourceQuad( this: void, @@ -16,7 +16,7 @@ declare function SourceQuad( /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface SourceQuad extends IsaacAPIClass { GetBottomLeft: () => Vector; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/EntitiesSaveState.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/EntitiesSaveState.d.ts index d5bcbffef..34b7c6e54 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/EntitiesSaveState.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/EntitiesSaveState.d.ts @@ -4,7 +4,7 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface EntitiesSaveState extends IsaacAPIClass { GetB1: () => boolean; @@ -27,7 +27,9 @@ declare global { GetSpawnerVariant: () => int; GetSubType: () => int; GetType: () => EntityType; - GetU1: () => int; + + /** Returns a boolean if the entity is an `EntityPickup`, otherwise it returns an integer. */ + GetU1: () => boolean | int; GetVariant: () => int; SetB1: (b1: boolean) => void; SetB2: (b2: boolean) => void; @@ -44,7 +46,7 @@ declare global { SetPos: (position: Vector) => void; SetSubType: (subType: int) => void; SetType: (entityType: EntityType) => void; - SetU1: (num: int) => void; + SetU1: (num: boolean | int) => void; SetVariant: (variant: int) => void; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/EntitiesSaveStateVector.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/EntitiesSaveStateVector.d.ts index 5f991fafa..23437eac7 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/EntitiesSaveStateVector.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/EntitiesSaveStateVector.d.ts @@ -4,10 +4,12 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface EntitiesSaveStateVector extends IsaacAPIClass { - Get: (index: int) => EntitiesSaveState | undefined; + Clear: () => void; + + Get: (index: int) => EntitiesSaveState; /** * @param entityType @@ -18,6 +20,8 @@ declare global { entityType: EntityType, variant?: int, subType?: int, - ) => EntitiesSaveState | undefined; + ) => EntitiesSaveState[]; + + len: LuaLengthMethod; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/GridEntitiesSaveStateVector.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/GridEntitiesSaveStateVector.d.ts index b548839df..f436fbecc 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/GridEntitiesSaveStateVector.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/GridEntitiesSaveStateVector.d.ts @@ -4,11 +4,12 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface GridEntitiesSaveStateVector extends IsaacAPIClass { - Get: (index: int) => GridEntityDesc | undefined; - GetByType: (gridEntityType: GridEntityType) => GridEntityDesc | undefined; + Clear: () => void; + Get: (index: int) => GridEntityDesc; + GetByType: (gridEntityType: GridEntityType) => GridEntityDesc[]; len: LuaLengthMethod; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomConfig.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomConfig.d.ts index 881352ab1..c65d520bc 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomConfig.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomConfig.d.ts @@ -1,8 +1,99 @@ -import type { StageID } from "isaac-typescript-definitions"; +import type { + DoorSlot, + DoorSlotFlag, + RoomShape, + RoomType, + StageID, +} from "isaac-typescript-definitions"; +import type { GameMode } from "../../../enums/GameMode"; declare global { + interface LuaRoomSpawnEntryREPENTOGON { + TYPE: int; + VARIANT?: int; + SUBTYPE?: int; + WEIGHT?: number; + } + + interface LuaRoomDoorREPENTOGON { + ISDOOR: true; // cspell:ignore ISDOOR + EXISTS: boolean; + SLOT?: DoorSlot; + GRIDX?: int; // cspell:ignore GRIDX + GRIDY?: int; // cspell:ignore GRIDY + } + + interface LuaRoomSpawnREPENTOGON { + GRIDX: int; // cspell:ignore GRIDX + GRIDY: int; // cspell:ignore GRIDY + [index: int]: LuaRoomSpawnEntryREPENTOGON; + } + + interface LuaRoomREPENTOGON { + TYPE: RoomType; + VARIANT: int; + NAME: string; + SHAPE: RoomShape; + SUBTYPE?: int; + DIFFICULTY?: int; + WEIGHT?: number; + [index: int]: LuaRoomDoorREPENTOGON | LuaRoomSpawnREPENTOGON; + } + interface RoomConfig extends IsaacAPIClass { - GetStage: (stbType: StageID.BLUE_WOMB) => void; Mode: int; } + + /** @noSelf */ + namespace RoomConfig { + function AddRooms( + stbType: StageID, + gameMode: GameMode | -1, + rooms: readonly LuaRoomREPENTOGON[], + ): Array; + + /** + * @param seed + * @param reduceWeight + * @param stage + * @param roomType + * @param shape Optional. If undefined, any RoomShape can be chosen. + * @param minVariant Optional. Default is 0. + * @param maxVariant Optional. Default is -1. + * @param minDifficulty Optional. Default is 0. + * @param maxDifficulty Optional. Default is 10. + * @param doors Optional. Default allows for any DoorSlots. + * @param subType Optional. Default is -1. + * @param gameMode Optional. Default allows any room regardless of the game mode to be chosen. + */ + function GetRandomRoom( + seed: Seed, + reduceWeight: boolean, + stage: StageID, + roomType: RoomType, + shape?: RoomShape, + minVariant?: int, + maxVariant?: int, + minDifficulty?: int, + maxDifficulty?: int, + doors?: DoorSlotFlag | BitFlags, + subType?: int, + gameMode?: GameMode, + ): RoomConfig; + + /** + * @param stage + * @param roomType + * @param variant + * @param gameMode Optional. Default allows any room regardless of the game mode to be chosen. + */ + function GetRoomByStageTypeAndVariant( + stage: StageID, + roomType: RoomType, + variant: int, + gameMode?: GameMode, + ): RoomConfig | undefined; + + function GetStage(stbType: StageID): RoomConfigStage; + } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomConfigHolder.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomConfigHolder.d.ts index 08be8ce2e..e8194aa29 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomConfigHolder.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomConfigHolder.d.ts @@ -3,13 +3,14 @@ import type { RoomType, StageID, } from "isaac-typescript-definitions"; +import type { GameMode } from "../../../enums/GameMode"; declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ namespace RoomConfigHolder { /** @@ -26,7 +27,7 @@ declare global { * @param maxDifficulty Optional. Default is 10. * @param requiredDoors Optional. Default is 0. * @param subType Optional. Default is -1. - * @param mode Optional. Default is -1. + * @param mode Optional. Default is the current game mode. */ function GetRandomRoom( seed: Seed, @@ -40,7 +41,7 @@ declare global { maxDifficulty?: int, requiredDoors?: int, subType?: int, - mode?: int, + mode?: GameMode, ): RoomConfig | undefined; /** diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomConfigSet.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomConfigSet.d.ts new file mode 100644 index 000000000..ffa8daa28 --- /dev/null +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomConfigSet.d.ts @@ -0,0 +1,22 @@ +/** + * This class is for REPENTOGON, an exe-hack which expands the modding API. + * + * @see https://repentogon.com/ + */ +declare interface RoomConfigSet extends IsaacAPIClass { + /** + * Adds REPENTOGON LuaRooms to the `RoomConfigSet`. Returns a `RoomConfig` array of the newly + * created rooms. + */ + AddRooms: (rooms: readonly LuaRoomREPENTOGON[]) => RoomConfig[]; + + /** + * Returns a `RoomConfig` at the provided index. Returns undefined if no `RoomConfig` was found. + */ + Get: (index: int) => RoomConfig | undefined; + + /** The number of rooms in the list. */ + readonly Size: int; + + len: LuaLengthMethod; +} diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomConfigStage.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomConfigStage.d.ts index 741af3d8f..c4b53db83 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomConfigStage.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomConfigStage.d.ts @@ -1,23 +1,68 @@ -import type { BackdropType, Music } from "isaac-typescript-definitions"; +import type { + BackdropType, + Music, + StageID, +} from "isaac-typescript-definitions"; +import type { GameMode } from "../../../enums/GameMode"; declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface RoomConfigStage extends IsaacAPIClass { + /** Returns the `BackdropType` used in default rooms. */ GetBackdrop: () => BackdropType; + + /** Returns the sprite path for the boss spot used in the boss intro. */ GetBossSpot: () => string; + + /** Returns the stage's name. */ GetDisplayName: () => string; + + /** Returns the stage's `StageID`. */ + GetID: () => StageID; + + /** Returns the music that is played in default rooms. */ GetMusic: () => Music; + + /** + * Returns the sprite path for the player spot used in the boss intro and nightmare transition. + */ GetPlayerSpot: () => string; + + /** Returns a `RoomConfigSet`, which contains every `RoomConfig` in the stage. */ + GetRoomSet: (gameMode: GameMode) => RoomConfigSet; + + /** Returns the suffix used by the stage for stage-unique sprites. */ GetSuffix: () => string; + + /** Returns the name of the stage's rooms XML file. */ + GetXMLName: () => string; + + /** Returns whether the `RoomConfigSet` of the provided `GameMode` has loaded. */ + IsLoaded: (gameMode: GameMode) => boolean; + + /** Sets the backdrop used in default rooms. */ SetBackdrop: (backdrop: BackdropType) => void; - SetBossSpot: (bossSpot: string) => void; + + /** Sets the sprite path for the boss spot used in the boss intro. */ + SetBossSpot: (spritePath: string) => void; + + /** Sets the stage's display name. */ SetDisplayName: (name: string) => void; + + /** Sets the music used in default rooms. */ SetMusic: (music: Music) => void; + + /** Sets the sprite path for the player spot used in the boss intro and nightmare transition. */ SetPlayerSpot: (playerSpot: string) => void; + + /** Sets the suffix used by the stage for stage-unique sprites. */ SetSuffix: (suffix: string) => void; + + /** Sets the name of the stage's rooms XML file. */ + SetXMLName: (name: string) => void; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomDescriptor.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomDescriptor.d.ts index 711cd494a..f086e9e0a 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomDescriptor.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/room-config/RoomDescriptor.d.ts @@ -1,14 +1,43 @@ -import type { DoorSlotFlag } from "isaac-typescript-definitions"; +import type { + Dimension, + DoorSlot, + DoorSlotFlag, +} from "isaac-typescript-definitions"; declare global { interface RoomDescriptor extends IsaacAPIClass { AddRestrictedGridIndex: (gridIndex: int) => void; + + /** Returns the `EntitiesSaveStateVector` of the room's decorations. */ + GetDecoSaveState: () => EntitiesSaveStateVector; + + /** Returns the dimension that the room is in. */ + GetDimension: () => Dimension; + GetEntitiesSaveState: () => EntitiesSaveStateVector; GetGridEntitiesSaveState: () => GridEntitiesSaveStateVector; + + /** + * Returns a map that maps the door slots to a `RoomDescriptor` for all of the room's current + * neighbors. + */ + GetNeighboringRooms: () => LuaMap; + GetRestrictedGridIndexes: () => int[]; InitSeeds: (rng: RNG) => void; - AllowedDoors: BitFlags; - Doors: BitFlags; + /** Bitflags corresponding to which door slots are currently enabled. */ + readonly AllowedDoors: BitFlags; + + /** + * Which level grid index each `DoorSlot` connects to. Returns -1 if the room's shape doesn't + * allow a door in that slot. + * + * This typically provides a valid index even if there is no door present and if the room itself + * doesn't allow a door in that slot. + */ + readonly Doors: LuaTable; + + readonly BossDeathSeed: Seed; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/AnimationData.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/AnimationData.d.ts index 7065ef507..5ad0f1be1 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/AnimationData.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/AnimationData.d.ts @@ -1,7 +1,7 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface AnimationData extends IsaacAPIClass { /** diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/AnimationFrame.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/AnimationFrame.d.ts index 5e81dccb5..0d90628c1 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/AnimationFrame.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/AnimationFrame.d.ts @@ -1,7 +1,7 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface AnimationFrame extends IsaacAPIClass { /** Returns the frame's color. */ @@ -10,6 +10,9 @@ declare interface AnimationFrame extends IsaacAPIClass { /** Returns the frame's crop. */ GetCrop: () => Readonly; + /** Returns the final frame of the animation. */ + GetEndFrame: () => int; + /** Returns the frame's height. */ GetHeight: () => number; @@ -25,6 +28,9 @@ declare interface AnimationFrame extends IsaacAPIClass { /** Returns the frame's scale. */ GetScale: () => Readonly; + /** Returns the starting frame. */ + GetStartFrame: () => number; + /** Returns the frame's width. */ GetWidth: () => number; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/AnimationLayer.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/AnimationLayer.d.ts index bf0865b89..6be21508e 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/AnimationLayer.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/AnimationLayer.d.ts @@ -1,7 +1,7 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface AnimationLayer extends IsaacAPIClass { /** diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/LayerState.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/LayerState.d.ts index 801c5d198..59b8b1ed1 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/LayerState.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/LayerState.d.ts @@ -4,14 +4,14 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface LayerState extends IsaacAPIClass { /** Clears the custom shader. */ - ClearCustomShader: () => void; + ClearCustomChampionShader: () => void; /** Clears the custom shader. */ - ClearCustomChampionShader: () => void; + ClearCustomShader: () => void; /** Returns the layer's `BlendMode`. */ GetBlendMode: () => BlendMode; @@ -56,10 +56,10 @@ declare global { GetWrapTMode: () => int; /** Returns whether the shader from the specified path is active. */ - HasCustomShader: (path: string) => boolean; + HasCustomChampionShader: (path: string) => boolean; /** Returns whether the shader from the specified path is active. */ - HasCustomChampionShader: (path: string) => boolean; + HasCustomShader: (path: string) => boolean; /** Returns whether the layer is visible. */ IsVisible: () => boolean; @@ -71,20 +71,29 @@ declare global { SetCropOffset: (cropOffset: Vector) => void; /** - * Overrides the default color offset shader the sprite uses. + * Overrides the `coloroffset_champion` shader the sprite uses with a custom one. This shader is + * only used if the entity is a champion. + * + * The custom shader must take the same inputs as the `coloroffset_champion` shader the game + * uses. * * @param shaderPath A path to the folder containing the shaders. The path starts on the * resources folder and expects to find both a `.vs` and `.fs` file. */ - SetCustomShader: (shaderPath: string) => void; + SetCustomChampionShader: (shaderPath: string) => void; /** - * Overrides the champion color offset shader the sprite uses. + * Overrides the `coloroffset` shader the sprite uses with a custom one. + * + * The game will not use the shader if the entity is a champion or if the Gold/Dogma shader is + * active. + * + * The custom shader must take the exact same inputs as the `coloroffset` shader the game uses. * * @param shaderPath A path to the folder containing the shaders. The path starts on the * resources folder and expects to find both a `.vs` and `.fs` file. */ - SetCustomChampionShader: (shaderPath: string) => void; + SetCustomShader: (shaderPath: string) => void; /** Sets whether the layer is flipped on the X axis. */ SetFlipX: (flipped: boolean) => void; @@ -96,7 +105,9 @@ declare global { SetPos: (position: Vector) => void; /** Sets the layer's animation render flags. */ - SetRenderFlags: (flags: BitFlags) => void; + SetRenderFlags: ( + flags: AnimationRenderFlag | BitFlags, + ) => void; /** Sets the layer's rotation. */ SetRotation: (rotation: number) => void; diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/NullLayer.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/NullFrame.d.ts similarity index 82% rename from packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/NullLayer.d.ts rename to packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/NullFrame.d.ts index 3bd5ae926..394d2292f 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/NullLayer.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/NullFrame.d.ts @@ -1,7 +1,7 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface NullFrame extends IsaacAPIClass { /** Returns the frame's color. */ @@ -16,6 +16,6 @@ declare interface NullFrame extends IsaacAPIClass { /** Returns the frame's scale. */ GetScale: () => Vector; - /* *Returns whether the frame is visible. */ + /** Returns whether the frame is visible. */ IsVisible: () => boolean; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/Sprite.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/Sprite.d.ts index eb020848a..2045ed8af 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/Sprite.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/classes/sprite/Sprite.d.ts @@ -10,10 +10,10 @@ declare global { interface Sprite extends IsaacAPIClass { /** Clears the custom shader. */ - ClearCustomShader: () => void; + ClearCustomChampionShader: () => void; /** Clears the custom shader. */ - ClearCustomChampionShader: () => void; + ClearCustomShader: () => void; /** * If the animation is currently stopped, it will start playing again from the current frame. @@ -29,26 +29,36 @@ declare global { * frame. * * This will not restart a finished non-looping animation. - * - * @param continueOverlay */ ContinueOverlay: () => void; + /** Returns an array of all `LayerState` in the sprite. */ + GetAllLayers: () => LayerState[]; + /** * Returns an array of `AnimationData` representing all of the animations in the sprite's .anm2 * file. */ GetAllAnimationData: () => AnimationData[]; - /** Returns an array of all `LayerState` in the sprite. */ - GetAllLayers: () => LayerState[]; + /** + * Returns the animation data from the provided animation name. Returns undefined if the + * animation does not exist. + */ + GetAnimationData: (animationName: string) => AnimationData | undefined; - /** Returns the current animation data. */ - GetCurrentAnimationData: () => AnimationData; + /** Returns the current animation data. Returns undefined if no animation is playing. */ + GetCurrentAnimationData: () => AnimationData | undefined; /** Returns the layer data from the specified layer id. Returns undefined if none were found. */ GetLayer: (layerIdOrName: string | int) => LayerState | undefined; + /** + * Returns the `AnimationFrame` currently being displayed on the provided layer ID of the + * current animation. Returns undefined if the layer ID is invalid. + */ + GetLayerFrameData: (layerId: int) => AnimationFrame | undefined; + /** * Returns the null frame from the specified layer name. Returns undefined if the null frame * does not exist. @@ -61,20 +71,26 @@ declare global { */ GetOverlayAnimationData: () => AnimationData | undefined; + /** + * Returns the `AnimationFrame` currently being displayed on the provided layer ID of the + * current overlay animation. Returns undefined if the layer ID is invalid. + */ + GetOverlayLayerFrameData: (layerId: int) => AnimationFrame | undefined; + /** * Returns the null frame from the specified layer name of the current overlay animation. * Returns undefined if the null frame does not exist. */ - GetOverlayNullFrame: () => AnimationData | undefined; + GetOverlayNullFrame: () => NullFrame | undefined; /** Returns a bitmask of the sprite's `AnimationRenderFlag`. */ GetRenderFlags: () => BitFlags; /** Returns whether the shader from the specified path is active. */ - HasCustomShader: (path: string) => boolean; + HasCustomChampionShader: (path: string) => boolean; /** Returns whether the shader from the specified path is active. */ - HasCustomChampionShader: (path: string) => boolean; + HasCustomShader: (path: string) => boolean; /** * Returns true if the specified event in the overlay animation is currently being triggered. @@ -85,7 +101,8 @@ declare global { * Repentogon's modified `Sprite.ReplaceSpritesheet` method. * * Behaves the same as `Sprite.ReplaceSpritesheet` except specify an additional parameter that - * forces the sprite to immediately load its graphics after replacing the spritesheet. + * forces the sprite to immediately load its graphics after replacing the spritesheet. It also + * returns a boolean whether the sprite has been loaded successfully. * * This method has been renamed to include "Ex" so it can not conflict with the vanilla type * definitions. However, when the project compiles the method's name will change to what it's @@ -100,23 +117,32 @@ declare global { layerID: int, pngFileName: string, loadGraphics?: boolean, - ) => void; + ) => boolean; /** - * Overrides the default color offset shader the sprite uses. + * Overrides the `coloroffset_champion` shader the sprite uses with a custom one. This shader is + * only used if the entity is a champion. + * + * The custom shader must take the same inputs as the `coloroffset_champion` shader the game + * uses. * * @param shaderPath A path to the folder containing the shaders. The path starts on the * resources folder and expects to find both a `.vs` and `.fs` file. */ - SetCustomShader: (shaderPath: string) => void; + SetCustomChampionShader: (shaderPath: string) => void; /** - * Overrides the champion color offset shader the sprite uses. + * Overrides the `coloroffset` shader the sprite uses with a custom one. + * + * The game will not use the shader if the entity is a champion or if the Gold/Dogma shader is + * active. + * + * The custom shader must take the exact same inputs as the `coloroffset` shader the game uses. * * @param shaderPath A path to the folder containing the shaders. The path starts on the * resources folder and expects to find both a `.vs` and `.fs` file. */ - SetCustomChampionShader: (shaderPath: string) => void; + SetCustomShader: (shaderPath: string) => void; /** * Repentogon's modified `Sprite.SetOverlayFrame` method. @@ -132,6 +158,9 @@ declare global { */ SetOverlayFrameEx: (frameNumber: int) => void; + /** Sets the overlay layer's frame. */ + SetOverlayLayerFrame: (layer: int, frame: int) => void; + /** Sets the animation's render flags. */ SetRenderFlags: ( flags: AnimationRenderFlag | BitFlags, diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/index.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/index.d.ts index f03025d9c..43af050fd 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/index.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/index.d.ts @@ -1,3 +1,10 @@ +/** + * In a file where any import occurs, the "declare global" directive must be used: + * https://stackoverflow.com/questions/39040108/import-class-in-definition-file-d-ts + * + * In a file without imports, "declare global" cannot be used. + */ + // ------- // Classes // ------- @@ -23,15 +30,18 @@ /// /// /// +/// /// /// /// /// +/// /// /// /// /// /// +/// /// /// /// @@ -62,20 +72,24 @@ /// /// /// +/// /// /// /// /// /// /// +/// /// /// /// /// /// -/// +/// /// +/// /// +/// /// /// /// @@ -86,7 +100,9 @@ /// /// /// +/// /// +/// /// /// /// @@ -98,6 +114,8 @@ /// /// /// +/// +/// /// /// /// @@ -113,6 +131,7 @@ /// /// /// +/// /// /// /// diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/AddCallbackParametersRepentogon.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/AddCallbackParametersRepentogon.d.ts index 9ad6e489d..84298ed4a 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/AddCallbackParametersRepentogon.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/AddCallbackParametersRepentogon.d.ts @@ -1,6 +1,7 @@ import type { ActiveSlot, BackdropType, + BedSubType, BombVariant, BossID, ButtonAction, @@ -20,35 +21,44 @@ import type { LaserVariant, LevelStage, Music, + PickupPrice, PickupVariant, PillColor, PillEffect, PlayerType, PlayerVariant, ProjectileVariant, + RoomTransitionAnim, SlotVariant, SoundEffect, StageType, + TearFlag, TearVariant, TrinketSlot, TrinketType, UseFlag, WeaponType, } from "isaac-typescript-definitions"; +import type { Achievement } from "../../enums/Achievement"; +import type { BagOfCraftingPickup } from "../../enums/BagOfCraftingPickup"; import type { CompletionMarkType } from "../../enums/CompletionMarkType"; +import type { EvaluateStatStage } from "../../enums/EvaluateStatStage"; +import type { AddHealthTypeFlag } from "../../enums/flags/AddHealthTypeFlag"; +import type { ConceptionFamiliarFlag } from "../../enums/flags/ConceptionFamiliarFlag"; import type { FollowerPriority } from "../../enums/FollowerPriority"; import type { GiantbookType } from "../../enums/GiantbookType"; import type { HealthType } from "../../enums/HealthType"; import type { ModCallbackRepentogon } from "../../enums/ModCallbackRepentogon"; +import type { NullPickupSubType } from "../../enums/NullPickupSubType"; import type { PillCardSlot } from "../../enums/PillCardSlot"; -import type { AddHealthTypeFlag } from "../../enums/flags/AddHealthTypeFlag"; -import type { ConceptionFamiliarFlag } from "../../enums/flags/ConceptionFamiliarFlag"; +import type { SplitTearType } from "../../enums/SplitTearType"; +import type { StatusEffect } from "../../enums/StatusEffect"; declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface AddCallbackParametersRepentogon { // 10 @@ -120,6 +130,24 @@ declare global { playerVariant?: PlayerVariant, ]; + // 37 + [ModCallbackRepentogon.POST_PICKUP_SELECTION]: [ + callback: ( + pickup: EntityPickup, + variant: PickupVariant, + subType: int | NullPickupSubType, + requestedVariant: PickupVariant, + requestedSubType: int, + rng: RNG, + ) => + | [ + pickupVariant: PickupVariant, + subType: int | NullPickupSubType, + continueSelection?: boolean, + ] + | undefined, + ]; + // 38 [ModCallbackRepentogon.PRE_PICKUP_COLLISION]: [ callback: ( @@ -185,6 +213,12 @@ declare global { bombVariant?: BombVariant, ]; + // 68 + [ModCallbackRepentogon.POST_ENTITY_KILL]: [ + callback: (entity: Entity, source: EntityRef) => void, + entityType?: EntityType, + ]; + // 1004 [ModCallbackRepentogon.PRE_ADD_COLLECTIBLE]: [ callback: ( @@ -196,14 +230,14 @@ declare global { player: EntityPlayer, ) => | boolean - | { - Type?: CollectibleType; - Charge?: int; - FirstTime?: boolean; - Slot?: ActiveSlot; - VarData?: int; - Player?: EntityPlayer; - } + | [ + collectibleType?: CollectibleType, + charge?: int, + firstTime?: boolean, + slot?: ActiveSlot, + varData?: int, + player?: EntityPlayer, + ] | CollectibleType | undefined, collectibleType?: CollectibleType, @@ -274,6 +308,7 @@ declare global { rock: GridEntityRock, gridEntityType: GridEntityType, immediate: boolean, + source: EntityRef | undefined, ) => void, gridEntityType?: GridEntityType, ]; @@ -283,10 +318,10 @@ declare global { callback: ( gridEntity: GridEntity, entity: Entity, - damageAmount: number, + playerDamageAmount: number, damageFlags: BitFlags, - unknownFloat: float, - unknownBoolean: boolean, + damageAmount: float, + ignoreGridCollisionClass: boolean, ) => boolean | undefined, gridEntityType?: GridEntityType, ]; @@ -296,14 +331,40 @@ declare global { callback: ( gridEntity: GridEntity, entity: Entity, - damageAmount: number, + playerDamageAmount: number, damageFlags: BitFlags, - unknownFloat: number, - unknownBoolean: boolean, + damageAmount: float, + ignoreGridCollisionClass: boolean, ) => void, gridEntityType?: GridEntityType, ]; + // 1014 + [ModCallbackRepentogon.PRE_ADD_TRINKET]: [ + callback: ( + player: EntityPlayer, + trinketType: TrinketType, + firstTime: boolean, + ) => TrinketType | boolean | undefined, + trinketType?: TrinketType, + ]; + + // 1015 + [ModCallbackRepentogon.PRE_ADD_TO_BAG_OF_CRAFTING]: [ + callback: ( + player: EntityPlayer, + pickup: EntityPickup, + bagOfCraftingPickups: readonly BagOfCraftingPickup[], + ) => BagOfCraftingPickup[] | boolean | undefined, + pickupVariant?: PickupVariant, + ]; + + // 1016 + [ModCallbackRepentogon.POST_ADD_TO_BAG_OF_CRAFTING]: [ + callback: (player: EntityPlayer, pickup: EntityPickup) => void, + pickupVariant?: PickupVariant, + ]; + // 1020 [ModCallbackRepentogon.PRE_HUD_UPDATE]: [callback: () => void]; @@ -319,6 +380,16 @@ declare global { // 1024 [ModCallbackRepentogon.POST_HUD_RENDER]: [callback: () => void]; + // 1025 + [ModCallbackRepentogon.POST_FIRE_SPLIT_TEAR]: [ + callback: ( + tear: EntityTear, + source: EntityTear | EntityLaser | EntityKnife, + splitType: SplitTearType | string, + ) => void, + splitTearType?: SplitTearType | string, + ]; + // 1030 [ModCallbackRepentogon.PRE_SFX_PLAY]: [ callback: ( @@ -330,7 +401,14 @@ declare global { pan: number, ) => | SoundEffect - | [SoundEffect, number, int, boolean, number, number] + | [ + sound?: SoundEffect, + volume?: number, + frameDelay?: int, + loop?: boolean, + pitch?: number, + pan?: number, + ] | boolean | undefined, soundEffect?: SoundEffect, @@ -369,7 +447,7 @@ declare global { isFade: boolean, ) => | Music - | { ID?: Music; Volume?: float; FadeRate?: float } + | [music?: Music, volumeOrFadeRate?: number] | boolean | undefined, music?: Music, @@ -377,8 +455,8 @@ declare global { // 1035 [ModCallbackRepentogon.PRE_MUSIC_LAYER_TOGGLE]: [ - callback: (music: Music, enabled: boolean) => boolean | Music | undefined, - music?: Music, + callback: (layerID: int, enabled: boolean) => boolean | int | undefined, + layerID?: int, ]; // 1038 @@ -428,8 +506,11 @@ declare global { callback: (player: EntityPlayer, newLevel: boolean) => void, ]; + // 1044 + [ModCallbackRepentogon.POST_ROOM_RENDER_ENTITIES]: [callback: () => void]; + // 1047 - [ModCallbackRepentogon.PRE_COMPLETION_MARK_GET]: [ + [ModCallbackRepentogon.PRE_COMPLETION_MARK_SET]: [ callback: ( completion: CompletionMarkType, playerType: PlayerType, @@ -438,7 +519,7 @@ declare global { ]; // 1048 - [ModCallbackRepentogon.POST_COMPLETION_MARK_GET]: [ + [ModCallbackRepentogon.POST_COMPLETION_MARK_SET]: [ callback: ( completion: CompletionMarkType, playerType: PlayerType, @@ -448,7 +529,9 @@ declare global { // 1049 [ModCallbackRepentogon.PRE_COMPLETION_EVENT]: [ - callback: (completion: CompletionMarkType) => boolean | undefined, + callback: ( + completion: CompletionMarkType, + ) => boolean | CompletionMarkType | undefined, ]; // 1050 @@ -461,6 +544,11 @@ declare global { callback: (player: EntityPlayer) => boolean | undefined, ]; + // 1052 + [ModCallbackRepentogon.POST_COMPLETION_EVENT]: [ + callback: (completion: CompletionMarkType) => void, + ]; + // 1060 [ModCallbackRepentogon.PRE_LEVEL_INIT]: [callback: () => void]; @@ -484,7 +572,9 @@ declare global { // 1063 [ModCallbackRepentogon.GET_FOLLOWER_PRIORITY]: [ - callback: (familiar: EntityFamiliar) => FollowerPriority | undefined, + callback: ( + familiar: EntityFamiliar, + ) => FollowerPriority | int | undefined, familiarVariant?: FamiliarVariant, ]; @@ -495,6 +585,7 @@ declare global { player: EntityPlayer, useFlags: BitFlags, ) => boolean | undefined, + cardType?: CardType, ]; // 1065 @@ -505,6 +596,7 @@ declare global { player: EntityPlayer, useFlags: BitFlags, ) => boolean | undefined, + pillEffect?: PillEffect, ]; // 1066 @@ -514,7 +606,7 @@ declare global { pickupSubType: int, shopItemID: int, price: int, - ) => int | undefined, + ) => int | PickupPrice | undefined, pickupVariant?: PickupVariant, ]; @@ -529,6 +621,12 @@ declare global { callback: (playSound: boolean) => void, ]; + // 1069 + [ModCallbackRepentogon.PRE_PLAYER_TRIGGER_ROOM_CLEAR]: [ + callback: (player: EntityPlayer) => boolean | undefined, + playerVariant?: PlayerVariant, + ]; + // 1070 [ModCallbackRepentogon.PRE_RESTOCK_SHOP]: [ callback: (partial: boolean) => boolean | undefined, @@ -545,13 +643,18 @@ declare global { collectible: CollectibleType, player: EntityPlayer, varData: int, + currentMaxCharges: int, ) => int | undefined, collectibleType?: CollectibleType, ]; // 1073 [ModCallbackRepentogon.GET_ACTIVE_MIN_USABLE_CHARGE]: [ - callback: (slot: ActiveSlot, player: EntityPlayer) => int | undefined, + callback: ( + slot: ActiveSlot, + player: EntityPlayer, + currentMinUsableCharge: int, + ) => int | undefined, collectibleType?: CollectibleType, ]; @@ -566,7 +669,9 @@ declare global { ]; // 1075 - [ModCallbackRepentogon.POST_ITEM_OVERLAY_UPDATE]: [callback: () => void]; + [ModCallbackRepentogon.POST_ITEM_OVERLAY_UPDATE]: [ + callback: (giantbookID: GiantbookType, skipAnimation: boolean) => void, + ]; // 1076 [ModCallbackRepentogon.PRE_ITEM_OVERLAY_SHOW]: [ @@ -586,7 +691,11 @@ declare global { // 1078 [ModCallbackRepentogon.POST_PLAYER_NEW_LEVEL]: [ - callback: (player: EntityPlayer) => void, + callback: ( + player: EntityPlayer, + fromPlayerUpdate: boolean, + postLevelInitFinished: boolean, + ) => void, playerType?: PlayerType, ]; @@ -600,6 +709,7 @@ declare global { scale: float, chargeBarOffset: Vector, ) => void, + collectible?: CollectibleType, ]; // 1080 @@ -704,7 +814,7 @@ declare global { offset: Vector, heartsSprite: Sprite, position: Vector, - unknown: float, + spriteScale: float, player: EntityPlayer, ) => void, ]; @@ -727,7 +837,12 @@ declare global { // 1095 [ModCallbackRepentogon.POST_COLLECTIBLE_REMOVED]: [ - callback: (player: EntityPlayer, collectible: CollectibleType) => void, + callback: ( + player: EntityPlayer, + collectible: CollectibleType, + removeFromPlayerForm: boolean, + wisp: boolean, + ) => void, collectibleType?: CollectibleType, ]; @@ -775,12 +890,12 @@ declare global { ) => | GridEntityDesc | boolean - | { - Type?: GridEntityType; - Variant?: int; - Vardata?: int; - SpawnSeed?: Seed; - } + | [ + type?: GridEntityType, + variant?: int, + vardata?: int, + spawnSeed?: Seed, + ] | undefined, gridEntityType?: GridEntityType, ]; @@ -791,17 +906,20 @@ declare global { gridEntityType?: GridEntityType, ]; + // 1102 + [ModCallbackRepentogon.POST_NIGHTMARE_SCENE_RENDER]: [callback: () => void]; + // 1103 [ModCallbackRepentogon.POST_NIGHTMARE_SCENE_SHOW]: [ - callback: (unknown: boolean) => void, + callback: (isDogmaNightmare: boolean) => void, ]; // 1104 [ModCallbackRepentogon.PRE_LEVEL_SELECT]: [ callback: ( - level: LevelStage, + levelStage: LevelStage, stageType: StageType, - ) => [LevelStage?, StageType?] | undefined, + ) => [levelStage?: LevelStage, stageType?: StageType] | undefined, ]; // 1105 @@ -816,10 +934,14 @@ declare global { ]; // 1106 - [ModCallbackRepentogon.PRE_BACKDROP_RENDER_WALLS]: [callback: () => void]; + [ModCallbackRepentogon.PRE_BACKDROP_RENDER_WALLS]: [ + callback: (wallColor: Color) => void, + ]; // 1107 - [ModCallbackRepentogon.PRE_BACKDROP_RENDER_FLOOR]: [callback: () => void]; + [ModCallbackRepentogon.PRE_BACKDROP_RENDER_FLOOR]: [ + callback: (floorColor: Color) => void, + ]; // 1108 [ModCallbackRepentogon.PRE_BACKDROP_RENDER_WATER]: [callback: () => void]; @@ -841,7 +963,7 @@ declare global { // 1112 [ModCallbackRepentogon.PRE_PLANETARIUM_APPLY_TREASURE_ROOM_PENALTY]: [ - callback: () => boolean | undefined, + callback: (treasureRoomsVisited: int) => boolean | int | undefined, ]; // 1113 @@ -861,13 +983,16 @@ declare global { // 1116 [ModCallbackRepentogon.PRE_REPLACE_SPRITESHEET]: [ - callback: (layerId: int, fileName: string) => [int, string] | undefined, + callback: ( + layerID: int, + fileName: string, + ) => [layerID?: int, pngFileName?: string] | undefined, fileName?: string, ]; // 1117 [ModCallbackRepentogon.POST_REPLACE_SPRITESHEET]: [ - callback: (layerId: int, fileName: string) => void, + callback: (layerID: int, fileName: string) => void, fileName?: string, ]; @@ -877,7 +1002,7 @@ declare global { offset: Vector, heartsSprite: Sprite, position: Vector, - unknown: float, + spriteScale: float, player: EntityPlayer, ) => boolean | undefined, ]; @@ -887,11 +1012,20 @@ declare global { callback: ( player: EntityPlayer, slot: ActiveSlot, - offset: Vector, + position: Vector, alpha: float, scale: number, - chargeBarOffset: Vector, - ) => boolean | undefined, + chargeBarPosition: Vector, + ) => + | { + HideItem?: boolean; + HideOutline?: boolean; + HideChargeBar?: boolean; + CropOffset?: Vector; + } + | boolean + | undefined, + collectible?: CollectibleType, ]; // 1120 @@ -899,7 +1033,7 @@ declare global { callback: ( command: string, params: string, - ) => Array | undefined, + ) => Array | undefined, command?: string, ]; @@ -948,6 +1082,17 @@ declare global { playerType?: PlayerType, ]; + // 1128 + [ModCallbackRepentogon.POST_PLAYER_HEALTH_TYPE_CHANGE]: [ + callback: ( + player: EntityPlayer, + newHealthType: HealthType, + previousHealthType: HealthType, + defaultHealthType: HealthType, + ) => void, + playerType?: PlayerType, + ]; + // 1129 [ModCallbackRepentogon.POST_FORCE_ADD_PILL_EFFECT]: [ callback: (pillEffect: PillEffect, pillColor: PillColor) => void, @@ -986,6 +1131,9 @@ declare global { // 1135 [ModCallbackRepentogon.PRE_RENDER]: [callback: () => void]; + // ModCallbackRepentogon.PRE_OPEN_GL_RENDER is currently omitted for the time being until custom + // shader support is fully fleshed out as it's currently in its infancy. + // 1137 [ModCallbackRepentogon.PRE_LEVEL_PLACE_ROOM]: [ callback: ( @@ -995,9 +1143,55 @@ declare global { ) => RoomConfig | undefined, ]; + // 1138 + [ModCallbackRepentogon.POST_PLAYER_TRIGGER_ROOM_CLEAR]: [ + callback: (player: EntityPlayer) => void, + playerVariant?: PlayerVariant, + ]; + + // 1139 + [ModCallbackRepentogon.POST_ITEM_OVERLAY_RENDER]: [ + callback: (giantbookType: GiantbookType) => void, + giantbookType?: GiantbookType, + ]; + + // 1140 + [ModCallbackRepentogon.POST_DISCHARGE_ACTIVE_ITEM]: [ + callback: ( + collectible: EntityPlayer, + collectibleRemoved: boolean, + player: EntityPlayer, + slot: ActiveSlot, + ) => void, + collectibleType?: CollectibleType, + ]; + // 1141 [ModCallbackRepentogon.PRE_BACKDROP_CHANGE]: [ - callback: (backdrop: BackdropType) => BackdropType, + callback: (backdrop: BackdropType) => BackdropType | undefined, + ]; + + // 1142 + [ModCallbackRepentogon.POST_BACKDROP_CHANGE]: [ + callback: (backdrop: BackdropType) => void, + backdropType?: BackdropType, + ]; + + // 1143 + [ModCallbackRepentogon.POST_ROOM_TRIGGER_CLEAR]: [ + callback: (playSound: boolean) => void, + ]; + + // 1144 + [ModCallbackRepentogon.POST_PLAYER_DROP_TRINKET]: [ + callback: ( + trinketType: TrinketType, + dropPos: Vector, + player: EntityPlayer, + isGoldenTrinket: boolean, + replacedTrinket: boolean, + ) => void, + trinketType?: TrinketType, ]; // 1150 @@ -1048,17 +1242,17 @@ declare global { ]; // 1164 - [ModCallbackRepentogon.PRE_KNIFE_UPDATE]: [ - callback: (knife: EntityKnife) => boolean | undefined, - knifeVariant?: KnifeVariant, - ]; - - // 1165 [ModCallbackRepentogon.PRE_PICKUP_UPDATE]: [ callback: (pickup: EntityPickup) => boolean | undefined, pickupVariant?: PickupVariant, ]; + // 1165 + [ModCallbackRepentogon.PRE_KNIFE_UPDATE]: [ + callback: (knife: EntityKnife) => boolean | undefined, + knifeVariant?: KnifeVariant, + ]; + // 1166 [ModCallbackRepentogon.PRE_PROJECTILE_UPDATE]: [ callback: (projectile: EntityProjectile) => boolean | undefined, @@ -1090,7 +1284,7 @@ declare global { gridIndex: int, gridEntity: GridEntity | undefined, ) => boolean | undefined, - gridEntityType?: GridEntityType, + playerVariant?: PlayerVariant, ]; // 1172 @@ -1100,7 +1294,7 @@ declare global { gridIndex: int, gridEntity: GridEntity | undefined, ) => void, - gridEntityType?: GridEntityType, + playerVariant?: PlayerVariant, ]; // 1173 @@ -1110,7 +1304,7 @@ declare global { gridIndex: int, gridEntity: GridEntity | undefined, ) => boolean | undefined, - gridEntityType?: GridEntityType, + tearVariant?: TearVariant, ]; // 1174 @@ -1120,7 +1314,7 @@ declare global { gridIndex: int, gridEntity: GridEntity | undefined, ) => void, - gridEntityType?: GridEntityType, + tearVariant?: TearVariant, ]; // 1175 @@ -1130,7 +1324,7 @@ declare global { gridIndex: int, gridEntity: GridEntity | undefined, ) => boolean | undefined, - gridEntityType?: GridEntityType, + familiarVariant?: FamiliarVariant, ]; // 1176 @@ -1140,7 +1334,7 @@ declare global { gridIndex: int, gridEntity: GridEntity | undefined, ) => void, - gridEntityType?: GridEntityType, + familiarVariant?: FamiliarVariant, ]; // 1177 @@ -1150,7 +1344,7 @@ declare global { gridIndex: int, gridEntity: GridEntity | undefined, ) => boolean | undefined, - gridEntityType?: GridEntityType, + bombVariant?: BombVariant, ]; // 1178 @@ -1160,7 +1354,7 @@ declare global { gridIndex: int, gridEntity: GridEntity | undefined, ) => void, - gridEntityType?: GridEntityType, + bombVariant?: BombVariant, ]; // 1179 @@ -1170,7 +1364,7 @@ declare global { gridIndex: int, gridEntity: GridEntity | undefined, ) => boolean | undefined, - gridEntityType?: GridEntityType, + pickupVariant?: PickupVariant, ]; // 1180 @@ -1180,7 +1374,7 @@ declare global { gridIndex: int, gridEntity: GridEntity | undefined, ) => void, - gridEntityType?: GridEntityType, + pickupVariant?: PickupVariant, ]; // 1181 @@ -1190,7 +1384,7 @@ declare global { gridIndex: int, gridEntity: GridEntity | undefined, ) => boolean | undefined, - gridEntityType?: GridEntityType, + projectileVariant?: ProjectileVariant, ]; // 1182 @@ -1200,7 +1394,7 @@ declare global { gridIndex: int, gridEntity: GridEntity | undefined, ) => void, - gridEntityType?: GridEntityType, + projectileVariant?: ProjectileVariant, ]; // 1183 @@ -1210,7 +1404,7 @@ declare global { gridIndex: int, gridEntity: GridEntity | undefined, ) => boolean | undefined, - gridEntityType?: GridEntityType, + entityType?: EntityType, ]; // 1184 @@ -1220,7 +1414,7 @@ declare global { gridIndex: int, gridEntity: GridEntity | undefined, ) => void, - gridEntityType?: GridEntityType, + entityType?: EntityType, ]; // 1190 @@ -1245,7 +1439,15 @@ declare global { varData: int, gridIndex: int, spawnSeed: Seed, - ) => boolean | [GridEntityType, int, int, Seed] | undefined, + ) => + | boolean + | [ + gridType?: GridEntityType, + variant?: int, + varData?: int, + spawnSeed?: Seed, + ] + | undefined, gridEntityType?: GridEntityType, ]; @@ -1270,7 +1472,15 @@ declare global { variant: int, subType: int, championColor: ChampionColor, - ) => boolean | [EntityType, int, int, ChampionColor?] | undefined, + ) => + | boolean + | [ + entityType: EntityType, + variant: int, + subType: int, + championColor?: ChampionColor, + ] + | undefined, ]; // 1213 @@ -1285,7 +1495,14 @@ declare global { ignoreModifiers: boolean, ) => | boolean - | [EntityType, int, int, boolean?, boolean?, boolean?] + | [ + entityType: EntityType, + variant: int, + subType: int, + keepPrice?: boolean, + keepSeed?: boolean, + ignoreModifiers?: boolean, + ] | undefined, ]; @@ -1386,6 +1603,16 @@ declare global { familiarVariant?: FamiliarVariant, ]; + // 1226 + [ModCallbackRepentogon.EVALUATE_STAT]: [ + callback: ( + player: EntityPlayer, + stat: EvaluateStatStage, + currentValue: number, + ) => void, + stat?: EvaluateStatStage, + ]; + // 1231 [ModCallbackRepentogon.POST_PLAYER_COLLISION]: [ callback: (player: EntityPlayer, collider: Entity, low: boolean) => void, @@ -1480,8 +1707,13 @@ declare global { ]; // 1251 + // eslint-disable-next-line @typescript-eslint/no-deprecated [ModCallbackRepentogon.PRE_PLAYER_GET_MULTI_SHOT_PARAMS]: [ - callback: (player: EntityPlayer) => MultiShotParams | undefined, + callback: ( + player: EntityPlayer, + multiShotParams: MultiShotParams, + weaponType: WeaponType, + ) => MultiShotParams | undefined, playerType?: PlayerType, ]; @@ -1551,7 +1783,6 @@ declare global { // 1264 [ModCallbackRepentogon.PRE_PLAYER_HUD_RENDER_TRINKET]: [ callback: ( - slot: TrinketSlot, position: Vector, scale: number, player: EntityPlayer, @@ -1560,6 +1791,7 @@ declare global { | { Position?: Vector; Scale?: number; CropOffset?: Vector } | boolean | undefined, + slot?: TrinketSlot, ]; // 1265 @@ -1585,7 +1817,11 @@ declare global { // 1268 [ModCallbackRepentogon.POST_PLAYER_TRIGGER_EFFECT_REMOVED]: [ - callback: (player: EntityPlayer, itemConfigItem: ItemConfigItem) => void, + callback: ( + player: EntityPlayer, + itemConfigItem: ItemConfigItem, + count: int, + ) => void, ]; // 1269 @@ -1599,10 +1835,87 @@ declare global { ]; // 1271 - [ModCallbackRepentogon.POST_ROOM_TRANSITION_UPDATE]: [callback: () => void]; + [ModCallbackRepentogon.POST_ROOM_TRANSITION_UPDATE]: [ + callback: () => void, + transitionAnim?: RoomTransitionAnim, + ]; // 1272 - [ModCallbackRepentogon.POST_ROOM_TRANSITION_RENDER]: [callback: () => void]; + [ModCallbackRepentogon.POST_ROOM_TRANSITION_RENDER]: [ + callback: () => void, + transitionAnim?: RoomTransitionAnim, + ]; + + // 1273 + [ModCallbackRepentogon.POST_PLAYER_ADD_EFFECT]: [ + callback: ( + player: EntityPlayer, + itemConfigItem: ItemConfigItem, + addCostume: boolean, + count: int, + ) => void, + itemConfigItem?: ItemConfigItem, + ]; + + // 1274 + [ModCallbackRepentogon.POST_ROOM_ADD_EFFECT]: [ + callback: (itemConfigItem: ItemConfigItem) => void, + itemConfigItem?: ItemConfigItem, + ]; + + // 1275 + [ModCallbackRepentogon.POST_BOMB_DAMAGE]: [ + callback: ( + position: Vector, + damage: number, + radius: number, + lineCheck: boolean, + source: Entity | undefined, + tearFlags: BitFlags, + damageFlags: BitFlags, + damageSource: boolean, + ) => void, + entityType?: EntityType, + ]; + + // 1276 + [ModCallbackRepentogon.POST_BOMB_TEAR_FLAG_EFFECTS]: [ + callback: ( + position: Vector, + radius: number, + tearFlags: BitFlags, + source: Entity | undefined, + radiusMulti: number, + ) => void, + entityType?: EntityType, + ]; + + // 1277 + [ModCallbackRepentogon.PRE_APPLY_TEAR_FLAG_EFFECTS]: [ + callback: ( + npc: EntityNPC, + position: Vector, + tearFlags: BitFlags, + source: Entity | undefined, + damage: number, + ) => + | boolean + | { Position?: Vector; TearFlags?: BitFlags; Damage?: number } + | undefined, + entityType?: EntityType, + ]; + + // 1278 + [ModCallbackRepentogon.POST_APPLY_TEAR_FLAG_EFFECTS]: [ + callback: ( + npc: EntityNPC, + position: Vector, + tearFlags: BitFlags, + source: Entity | undefined, + damage: number, + ) => void, + entityType?: EntityType, + ]; // 1280 [ModCallbackRepentogon.PRE_BOSS_SELECT]: [ @@ -1646,6 +1959,49 @@ declare global { callback: (itemConfig: ItemConfigItem, player: EntityPlayer) => void, ]; + // 1285 + [ModCallbackRepentogon.PRE_TRIGGER_BED_SLEEP_EFFECT]: [ + callback: (player: EntityPlayer) => boolean | undefined, + ]; + + // 1286 + [ModCallbackRepentogon.POST_TRIGGER_BED_SLEEP_EFFECT]: [ + callback: (player: EntityPlayer) => void, + ]; + + // 1287 + [ModCallbackRepentogon.PRE_PLAYER_POCKET_ITEMS_SWAP]: [ + callback: (player: EntityPlayer) => boolean | undefined, + ]; + + // 1288 + [ModCallbackRepentogon.PRE_BED_SLEEP]: [ + callback: ( + player: EntityPlayer, + bed: EntityPickup, + ) => boolean | undefined, + bedSubType?: BedSubType, + ]; + + // 1289 + [ModCallbackRepentogon.EVALUATE_MULTI_SHOT_PARAMS]: [ + callback: ( + player: EntityPlayer, + multiShotParams: MultiShotParams, + weaponType: WeaponType, + ) => MultiShotParams | undefined, + playerType?: PlayerType, + ]; + + // 1290 + [ModCallbackRepentogon.PRE_GET_RANDOM_ROOM_INDEX]: [ + callback: ( + roomIndex: int, + iAmErrorRoom: boolean, + seed: Seed, + ) => int | undefined, + ]; + // 1300 [ModCallbackRepentogon.POST_GLOWING_HOURGLASS_SAVE]: [ callback: (slot: int) => void, @@ -1656,6 +2012,49 @@ declare global { callback: (slot: int) => void, ]; + // 1302 + [ModCallbackRepentogon.PRE_GLOWING_HOURGLASS_SAVE]: [ + callback: (slot: int) => void, + ]; + + // 1303 + [ModCallbackRepentogon.PRE_GLOWING_HOURGLASS_LOAD]: [ + callback: (slot: int) => void, + ]; + + // 1304 + [ModCallbackRepentogon.POST_ROOM_SAVE_STATE]: [ + callback: (room: Room, roomDescriptor: RoomDescriptor) => void, + ]; + + // 1305 + [ModCallbackRepentogon.PRE_ROOM_RESTORE_STATE]: [ + callback: (room: Room, roomDescriptor: RoomDescriptor) => void, + ]; + + // 1306 + [ModCallbackRepentogon.POST_SWAP_ROOMS]: [ + callback: (roomDesc1: RoomDescriptor, roomDesc2: RoomDescriptor) => void, + ]; + + // 1307 + [ModCallbackRepentogon.POST_BACKWARDS_ROOM_SAVE]: [ + callback: ( + stage: LevelStage, + roomDesc: RoomDescriptor, + id: string, + ) => void, + ]; + + // 1308 + [ModCallbackRepentogon.POST_BACKWARDS_ROOM_RESTORE]: [ + callback: ( + stage: LevelStage, + roomDesc: RoomDescriptor, + id: string, + ) => void, + ]; + // 1333 [ModCallbackRepentogon.PRE_RENDER_CUSTOM_CHARACTER_MENU]: [ callback: ( @@ -1736,7 +2135,7 @@ declare global { pill: PillColor, slot: PillCardSlot, ) => void, - pillColor?: PillCardSlot, + pillColor?: PillColor, ]; // 1356 @@ -1766,7 +2165,7 @@ declare global { // 1359 [ModCallbackRepentogon.POST_PLAYER_COLLECT_PILL]: [ callback: (player: EntityPlayer, pickup: EntityPickup) => void, - pillColor?: CardType, + pillColor?: PillColor, ]; // 1360 @@ -2219,6 +2618,28 @@ declare global { inputHook?: InputHook, ]; + // 1465 + [ModCallbackRepentogon.PRE_STATUS_EFFECT_APPLY]: [ + callback: ( + statusEffect: StatusEffect, + entity: Entity, + source: EntityRef, + duration: int, + ) => boolean | undefined, + statusEffectType?: StatusEffect, + ]; + + // 1466 + [ModCallbackRepentogon.POST_STATUS_EFFECT_APPLY]: [ + callback: ( + statusEffect: StatusEffect, + entity: Entity, + source: EntityRef, + duration: int, + ) => void, + statusEffectType?: StatusEffect, + ]; + // 1470 [ModCallbackRepentogon.POST_SAVE_SLOT_LOAD]: [ callback: (saveSlot: int, isSlotSelected: boolean, rawSlot: int) => void, @@ -2239,6 +2660,12 @@ declare global { challenge?: Challenge, ]; + // 1473 + [ModCallbackRepentogon.PRE_FAMILIAR_CAN_CHARM]: [ + callback: (familiar: EntityFamiliar) => boolean | undefined, + familiarVariant?: FamiliarVariant, + ]; + // 1474 [ModCallbackRepentogon.PRE_PLAYER_GIVE_BIRTH_CAMBION]: [ callback: ( @@ -2257,6 +2684,24 @@ declare global { conceptionFamiliarFlag?: ConceptionFamiliarFlag, ]; + // 1476 + [ModCallbackRepentogon.POST_ACHIEVEMENT_UNLOCK]: [ + callback: (achievement: Achievement) => void, + achievementType?: Achievement, + ]; + + // 1477 + [ModCallbackRepentogon.PRE_MINIMAP_UPDATE]: [callback: () => void]; + + // 1478 + [ModCallbackRepentogon.POST_MINIMAP_UPDATE]: [callback: () => void]; + + // 1479 + [ModCallbackRepentogon.PRE_MINIMAP_RENDER]: [callback: () => void]; + + // 1480 + [ModCallbackRepentogon.POST_MINIMAP_RENDER]: [callback: () => void]; + // 1481 [ModCallbackRepentogon.PRE_PLAYER_REVIVE]: [ callback: (player: EntityPlayer) => boolean | undefined, @@ -2283,5 +2728,73 @@ declare global { isCurseDisplay: boolean, ) => boolean | undefined, ]; + + // 1485 + [ModCallbackRepentogon.GET_STATUS_EFFECT_TARGET]: [ + callback: (entity: Entity) => Entity | undefined, + entityType?: EntityType, + ]; + + // 1486 + [ModCallbackRepentogon.PRE_ENTITY_SET_COLOR]: [ + callback: ( + entity: Entity, + color: Color, + duration: int, + priority: int, + fadeOut: boolean, + share: boolean, + ) => Color | boolean | undefined, + entityType?: EntityType, + ]; + + // 1487 + [ModCallbackRepentogon.POST_ENTITY_SET_COLOR]: [ + callback: ( + entity: Entity, + color: Color, + duration: int, + priority: int, + fadeOut: boolean, + share: boolean, + ) => void, + entityType?: EntityType, + ]; + + // 1488 + [ModCallbackRepentogon.POST_START_AMBUSH_WAVE]: [ + callback: (bossAmbush: boolean) => void, + ]; + + // 1489 + [ModCallbackRepentogon.POST_START_GREED_WAVE]: [callback: () => void]; + + // 1490 + [ModCallbackRepentogon.EVALUATE_TEAR_HIT_PARAMS]: [ + callback: ( + player: EntityPlayer, + tearParams: TearParams, + weaponType: WeaponType, + damageScale: float, + tearDisplacement: int, + source: Entity, + ) => TearParams | undefined, + entityType?: EntityType, + ]; + + // 1491 + [ModCallbackRepentogon.PRE_OPEN_CHEST]: [ + callback: ( + chest: EntityPickup, + player: EntityPlayer | undefined, + ) => boolean | undefined, + pickupVariant?: PickupVariant, + ]; + + // 1492 + [ModCallbackRepentogon.POST_OPEN_CHEST]: [ + callback: (chest: EntityPickup, player: EntityPlayer | undefined) => void, + pickupVariant?: PickupVariant, + ]; } } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/AddUpdateParametersImGui.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/AddUpdateParametersImGui.d.ts index 9e850d173..d8e75069f 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/AddUpdateParametersImGui.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/AddUpdateParametersImGui.d.ts @@ -4,8 +4,8 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html * @noSelf + * @see https://repentogon.com/ */ interface AddUpdateParametersImGui { [ImGuiData.COLOR_VALUES]: LuaMultiReturn< diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/BossPoolEntry.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/BossPoolEntry.d.ts index 8de70f650..958ecf0ad 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/BossPoolEntry.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/BossPoolEntry.d.ts @@ -5,11 +5,12 @@ declare global { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ interface BossPoolEntry { achievementID: Achievement; - bossId: BossID; + bossID: BossID; + initialWeight: float; weight: float; weightAlt: float; } diff --git a/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/RGBValue.d.ts b/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/RGBValue.d.ts index 2a5c79b9e..ab8537943 100644 --- a/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/RGBValue.d.ts +++ b/packages/isaac-typescript-definitions-repentogon/src/types/unofficial/RGBValue.d.ts @@ -1,7 +1,7 @@ /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface RGBValue { R: float; @@ -12,7 +12,7 @@ declare interface RGBValue { /** * This class is for REPENTOGON, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ declare interface RGBAValue extends RGBValue { A: float; diff --git a/packages/isaac-typescript-definitions-repentogon/tsconfig.json b/packages/isaac-typescript-definitions-repentogon/tsconfig.json index edc5e1062..d0ce2defe 100644 --- a/packages/isaac-typescript-definitions-repentogon/tsconfig.json +++ b/packages/isaac-typescript-definitions-repentogon/tsconfig.json @@ -2,12 +2,17 @@ "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-isaacscript-schema.json", "extends": [ - "../isaacscript-tsconfig/tsconfig.base.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + "../isaacscript-tsconfig/tsconfig.mod.json", ], // https://www.typescriptlang.org/docs/handbook/compiler-options.html "compilerOptions": { + // We need to negate the default "outDir" of "mod". + "outDir": "${configDir}/dist", + // Needed so that the output goes to "./dist/index.lua" instead of "./dist/src/index.lua". "rootDir": "src", diff --git a/packages/isaac-typescript-definitions/README.md b/packages/isaac-typescript-definitions/README.md index fbca8e541..de9d83661 100644 --- a/packages/isaac-typescript-definitions/README.md +++ b/packages/isaac-typescript-definitions/README.md @@ -1,4 +1,4 @@ -# isaac-typescript-definitions +# `isaac-typescript-definitions` [![npm version](https://img.shields.io/npm/v/isaac-typescript-definitions.svg)](https://www.npmjs.com/package/isaac-typescript-definitions) diff --git a/packages/isaac-typescript-definitions/eslint.config.mjs b/packages/isaac-typescript-definitions/eslint.config.mjs index bbcfd37d5..496f88c63 100644 --- a/packages/isaac-typescript-definitions/eslint.config.mjs +++ b/packages/isaac-typescript-definitions/eslint.config.mjs @@ -1,17 +1,17 @@ -import tseslint from "typescript-eslint"; -import { base } from "../eslint-config-isaacscript/base.js"; -import { mod } from "../eslint-config-isaacscript/mod.js"; -import { monorepo } from "../eslint-config-isaacscript/monorepo.js"; -// @ts-expect-error There are no TypeScript definitions for this plugin. +// @ts-check + +import { completeConfigBase } from "eslint-config-complete"; import ESLintPluginSortExports from "eslint-plugin-sort-exports"; +import { defineConfig } from "eslint/config"; +import { isaacScriptModConfigBase } from "../eslint-config-isaacscript/src/mod.js"; -export default tseslint.config( - ...base, - ...mod, - ...monorepo, +export default defineConfig( + ...completeConfigBase, + ...isaacScriptModConfigBase, { plugins: { + // @ts-expect-error https://github.com/jrdrg/eslint-plugin-sort-exports/issues/44 "sort-exports": ESLintPluginSortExports, }, @@ -37,6 +37,9 @@ export default tseslint.config( sortDir: "asc", }, ], + + // TODO: https://github.com/eslint/eslint/issues/20272 + "@typescript-eslint/unified-signatures": "off", }, }, diff --git a/packages/isaac-typescript-definitions/package.json b/packages/isaac-typescript-definitions/package.json index 980e78265..3d7b2a9c0 100644 --- a/packages/isaac-typescript-definitions/package.json +++ b/packages/isaac-typescript-definitions/package.json @@ -1,6 +1,6 @@ { "name": "isaac-typescript-definitions", - "version": "42.2.0", + "version": "43.0.6", "description": "TypeScript definitions for The Binding of Isaac: Repentance.", "keywords": [ "isaac", @@ -23,10 +23,7 @@ "types": "./dist/index.d.ts", "files": [ "dist", - "src", - "LICENSE", - "package.json", - "README.md" + "src" ], "scripts": { "build": "tsx --tsconfig ./scripts/tsconfig.json ./scripts/build.mts", @@ -34,6 +31,12 @@ "lint": "tsx --tsconfig ./scripts/tsconfig.json ./scripts/lint.mts" }, "dependencies": { - "lua-types": "^2.13.1" + "lua-types": "2.14.1" + }, + "devDependencies": { + "complete-node": "16.4.0", + "eslint-plugin-sort-exports": "0.9.1", + "typescript-eslint": "8.57.1", + "typescript-to-lua": "1.34.0" } } diff --git a/packages/isaac-typescript-definitions/scripts/build.mts b/packages/isaac-typescript-definitions/scripts/build.mts index e1f0e2041..9b74b73ea 100644 --- a/packages/isaac-typescript-definitions/scripts/build.mts +++ b/packages/isaac-typescript-definitions/scripts/build.mts @@ -1,32 +1,33 @@ -import { $, buildScript, cp, prependFile } from "isaacscript-common-node"; -import { assertDefined } from "isaacscript-common-ts"; +import { + $, + buildScript, + copyFileOrDirectory, + prependFile, +} from "complete-node"; import path from "node:path"; -await buildScript(async ({ packageRoot, outDir }) => { - assertDefined( - outDir, - 'Failed to get the "outDir" from the "tsconfig.json" file.', - ); - - const promises = [ +await buildScript(import.meta.dirname, async (packageRoot) => { + await Promise.all([ $`tstl`, // We need to create JavaScript files in addition to Lua files because we want this package to // be usable in Jest tests. We disable declarations because running `tstl` will create // declarations and we don't want the two processes to stomp on each other. $`tsc --declaration false --declarationMap false`, - ]; - - await Promise.all(promises); + ]); // If we let the triple slash reference in the "./dist/index.ts" file point to the // "./src/types/index.d.ts", things will not work properly because the compiled enums are // different from the TypeScript source enums. Specifically, the `strict-enums` lint rule will // start to complain about e.g. `RoomType` not matching `RoomType`. Thus, we need to copy all of // the types into the "dist" directory so that they resolve properly. + const outDir = "dist"; const indexDTSPath = path.join(outDir, "index.d.ts"); - prependFile(indexDTSPath, '/// \n\n'); + await prependFile( + indexDTSPath, + '/// \n\n', + ); const srcPath = path.join(packageRoot, "src", "types"); const dstPath = path.join(outDir, "types"); - cp(srcPath, dstPath); + await copyFileOrDirectory(srcPath, dstPath); }); diff --git a/packages/isaac-typescript-definitions/scripts/lint.mts b/packages/isaac-typescript-definitions/scripts/lint.mts index 290fcfe0d..d828f8792 100644 --- a/packages/isaac-typescript-definitions/scripts/lint.mts +++ b/packages/isaac-typescript-definitions/scripts/lint.mts @@ -1,10 +1,7 @@ -import { $, lintScript } from "isaacscript-common-node"; +import { lintCommands } from "complete-node"; -await lintScript(async () => { - const promises = [ - $`tsc --noEmit`, - $`tsc --noEmit --project ./scripts/tsconfig.json`, - $`eslint --max-warnings 0 .`, - ]; - await Promise.all(promises); -}); +await lintCommands(import.meta.dirname, [ + "tsc --noEmit", + "tsc --noEmit --project ./scripts/tsconfig.json", + "eslint --max-warnings 0 .", +]); diff --git a/packages/isaac-typescript-definitions/scripts/tsconfig.json b/packages/isaac-typescript-definitions/scripts/tsconfig.json index 0327cd449..0055fe1b2 100644 --- a/packages/isaac-typescript-definitions/scripts/tsconfig.json +++ b/packages/isaac-typescript-definitions/scripts/tsconfig.json @@ -1,10 +1,12 @@ { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../../isaacscript-tsconfig/tsconfig.base.json", - "../../isaacscript-tsconfig/tsconfig.node.json", - "../../../tsconfig.monorepo.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], "include": ["*.mts"], diff --git a/packages/isaac-typescript-definitions/src/enums/BackdropType.ts b/packages/isaac-typescript-definitions/src/enums/BackdropType.ts index 6f165a532..4bc2b48c8 100644 --- a/packages/isaac-typescript-definitions/src/enums/BackdropType.ts +++ b/packages/isaac-typescript-definitions/src/enums/BackdropType.ts @@ -67,4 +67,10 @@ export enum BackdropType { MINES_SHAFT = 58, ASHPIT_SHAFT = 59, DARK_CLOSET = 60, + + /** Added in Repentance+. */ + DEATHMATCH = 61, + + /** Added in Repentance+. */ + LIL_PORTAL = 62, } diff --git a/packages/isaac-typescript-definitions/src/enums/ButtonAction.ts b/packages/isaac-typescript-definitions/src/enums/ButtonAction.ts index 3cedb3764..effd46686 100644 --- a/packages/isaac-typescript-definitions/src/enums/ButtonAction.ts +++ b/packages/isaac-typescript-definitions/src/enums/ButtonAction.ts @@ -52,16 +52,64 @@ export enum ButtonAction { /** This only fires on `InputHook.IS_ACTION_TRIGGERED` (1). */ MENU_BACK = 15, - /** This only fires on `InputHook.IS_ACTION_PRESSED` (0). */ - RESTART = 16, + /** + * This only fires on `InputHook.IS_ACTION_PRESSED` (0). + * + * - Restart is 16 in Repentance. + * - Restart is 18 in Repentance+. + * - Fullscreen is 16 in Repentance+. + */ + RESTART_REPENTANCE = 16, - /** This only fires on `InputHook.IS_ACTION_TRIGGERED` (1). */ - FULLSCREEN = 17, + /** + * This only fires on `InputHook.IS_ACTION_TRIGGERED` (1). + * + * - Fullscreen is 17 in Repentance. + * - Fullscreen is 16 in Repentance+. + * - Restart is 16 in Repentance. + */ + // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values + FULLSCREEN_REPENTANCE_PLUS = 16, - /** This only fires on `InputHook.IS_ACTION_TRIGGERED` (1). */ - MUTE = 18, + /** + * This only fires on `InputHook.IS_ACTION_TRIGGERED` (1). + * + * - Fullscreen is 17 in Repentance. + * - Fullscreen is 16 in Repentance+. + * - Mute is 17 in Repentance+. + */ + FULLSCREEN_REPENTANCE = 17, - // Does not seem to trigger any input hooks while on keyboard. + /** + * This only fires on `InputHook.IS_ACTION_TRIGGERED` (1). + * + * - Mute is 18 in Repentance. + * - Mute is 17 in Repentance+. + * - Fullscreen is 17 in Repentance. + */ + // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values + MUTE_REPENTANCE_PLUS = 17, + + /** + * This only fires on `InputHook.IS_ACTION_TRIGGERED` (1). + * + * - Mute is 18 in Repentance. + * - Mute is 17 in Repentance+. + * - Restart is 18 in Repentance+. + */ + MUTE_REPENTANCE = 18, + + /** + * This only fires on `InputHook.IS_ACTION_PRESSED` (0). + * + * - Restart is 16 in Repentance. + * - Restart is 18 in Repentance+. + * - Mute is 18 in Repentance. + */ + // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values + RESTART_REPENTANCE_PLUS = 18, + + /** Does not seem to trigger any input hooks while on keyboard. */ JOIN_MULTIPLAYER = 19, /** This only fires on `InputHook.IS_ACTION_TRIGGERED` (1). */ @@ -70,21 +118,97 @@ export enum ButtonAction { /** This only fires on `InputHook.IS_ACTION_TRIGGERED` (1). */ MENU_RIGHT = 21, - // Does not seem to trigger any input hooks while on keyboard. + /** Does not seem to trigger any input hooks while on keyboard. */ MENU_UP = 22, - // Does not seem to trigger any input hooks while on keyboard. + /** Does not seem to trigger any input hooks while on keyboard. */ MENU_DOWN = 23, - // Does not seem to trigger any input hooks while on keyboard. - MENU_LT = 24, + /** + * Does not seem to trigger any input hooks while on keyboard. + * + * - Menu left trigger is 24 in Repentance. + * - Menu left trigger is 26 in Repentance+. + * - Menu left shoulder is 24 in Repentance+. + */ + MENU_LEFT_TRIGGER_REPENTANCE = 24, - // Does not seem to trigger any input hooks while on keyboard. - MENU_RT = 25, + /** Added in Repentance+. (It took the old value for "MENU_LEFT_TRIGGER".) */ + // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values + MENU_LEFT_SHOULDER = 24, - // Does not seem to trigger any input hooks while on keyboard. - MENU_TAB = 26, + /** + * Does not seem to trigger any input hooks while on keyboard. + * + * - Menu right trigger is 25 in Repentance. + * - Menu right trigger is 27 in Repentance+. + * - Menu right shoulder is 25 in Repentance+. + */ + MENU_RIGHT_TRIGGER_REPENTANCE = 25, - /** This only fires on `InputHook.IS_ACTION_TRIGGERED` (1). */ - CONSOLE = 28, + /** Added in Repentance+. (It took the old value for "MENU_RIGHT_TRIGGER".) */ + // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values + MENU_RIGHT_SHOULDER = 25, + + /** + * Does not seem to trigger any input hooks while on keyboard. + * + * - Menu tab is 26 in Repentance. + * - Menu tab is 28 in Repentance+. + * - Menu left trigger is 26 in Repentance+. + */ + MENU_TAB_REPENTANCE = 26, + + /** + * Does not seem to trigger any input hooks while on keyboard. + * + * - Menu left trigger is 24 in Repentance. + * - Menu left trigger is 26 in Repentance+. + * - Menu tab is 26 in Repentance. + */ + // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values + MENU_LEFT_TRIGGER_REPENTANCE_PLUS = 26, + + /** + * Does not seem to trigger any input hooks while on keyboard. + * + * - Menu right trigger is 25 in Repentance. + * - Menu right trigger is 27 in Repentance+. + * - No enum values are equal to 27 in Repentance. + */ + MENU_RIGHT_TRIGGER_REPENTANCE_PLUS = 27, + + /** + * This only fires on `InputHook.IS_ACTION_TRIGGERED` (1). + * + * - Console is 28 in Repentance. + * - Console is 32 in Repentance+. + * - Menu tab is 28 in Repentance+. + */ + CONSOLE_REPENTANCE = 28, + + /** + * Does not seem to trigger any input hooks while on keyboard. + * + * - Menu tab is 26 in Repentance. + * - Menu tab is 28 in Repentance+. + * - Console is 28 in Repentance. + */ + // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values + MENU_TAB_REPENTANCE_PLUS = 28, + + /** Added in Repentance+. */ + MENU_EX = 29, + + /** Added in Repentance+. */ + EMOTES = 30, + + /** + * This only fires on `InputHook.IS_ACTION_TRIGGERED` (1). + * + * - Console is 28 in Repentance. + * - Console is 32 in Repentance+. + * - No enum values are equal to 32 in Repentance. + */ + CONSOLE_REPENTANCE_PLUS = 32, } diff --git a/packages/isaac-typescript-definitions/src/enums/Controller.ts b/packages/isaac-typescript-definitions/src/enums/Controller.ts index dcf933f8d..094d1f9a3 100644 --- a/packages/isaac-typescript-definitions/src/enums/Controller.ts +++ b/packages/isaac-typescript-definitions/src/enums/Controller.ts @@ -15,10 +15,10 @@ export enum Controller { /** B, O and A on Xbox, Playstation and Nintendo respectively. */ BUTTON_B = 5, - /** X, □ and Y on Xbox, Playstation and Nintendo respectively. */ + /** X, square and Y on Xbox, Playstation and Nintendo respectively. */ BUTTON_X = 6, - /** Y, Δ and X on Xbox, Playstation and Nintendo respectively. */ + /** Y, triangle and X on Xbox, Playstation and Nintendo respectively. */ BUTTON_Y = 7, /** Left shoulder button. */ diff --git a/packages/isaac-typescript-definitions/src/enums/ControllerIndex.ts b/packages/isaac-typescript-definitions/src/enums/ControllerIndex.ts index 6c75448e4..7c5539739 100644 --- a/packages/isaac-typescript-definitions/src/enums/ControllerIndex.ts +++ b/packages/isaac-typescript-definitions/src/enums/ControllerIndex.ts @@ -2,7 +2,7 @@ export enum ControllerIndex { /** * Used for Repentogon, an exe-hack which expands the modding API. * - * @see https://repentogon.com/index.html + * @see https://repentogon.com/ */ NONE = -1, diff --git a/packages/isaac-typescript-definitions/src/enums/DrawStringAlignment.ts b/packages/isaac-typescript-definitions/src/enums/DrawStringAlignment.ts new file mode 100644 index 000000000..64e4eaa0d --- /dev/null +++ b/packages/isaac-typescript-definitions/src/enums/DrawStringAlignment.ts @@ -0,0 +1,12 @@ +/** Added in Repentance+. */ +export enum DrawStringAlignment { + TOP_LEFT = 0, + TOP_CENTER = 1, + TOP_RIGHT = 2, + MIDDLE_LEFT = 3, + MIDDLE_CENTER = 4, + MIDDLE_RIGHT = 5, + BOTTOM_LEFT = 6, + BOTTOM_CENTER = 7, + BOTTOM_RIGHT = 8, +} diff --git a/packages/isaac-typescript-definitions/src/enums/GameStateFlag.ts b/packages/isaac-typescript-definitions/src/enums/GameStateFlag.ts index 376dd1b38..21722277b 100644 --- a/packages/isaac-typescript-definitions/src/enums/GameStateFlag.ts +++ b/packages/isaac-typescript-definitions/src/enums/GameStateFlag.ts @@ -97,4 +97,16 @@ export enum GameStateFlag { /** Set when the player takes Dad's Note. The "backwards path" refers to the Ascent. */ BACKWARDS_PATH = 48, + + /** Added in Repentance+. */ + MEGA_SATAN_DOOR_OPENED = 49, + + /** Added in Repentance+. */ + URIEL_KILLED = 50, + + /** Added in Repentance+. */ + GABRIEL_KILLED = 51, + + /** Added in Repentance+. */ + MOTHER_HEART_DOOR_OPENED = 52, } diff --git a/packages/isaac-typescript-definitions/src/enums/GridRoom.ts b/packages/isaac-typescript-definitions/src/enums/GridRoom.ts index 1a97e8304..363af2420 100644 --- a/packages/isaac-typescript-definitions/src/enums/GridRoom.ts +++ b/packages/isaac-typescript-definitions/src/enums/GridRoom.ts @@ -61,4 +61,10 @@ export enum GridRoom { /** The shop that you go to when you climb the ladder from The Stairway. */ ANGEL_SHOP = -18, + + /** Added in Repentance+. */ + DEATHMATCH = -19, + + /** Added in Repentance+. */ + LIL_PORTAL = -20, } diff --git a/packages/isaac-typescript-definitions/src/enums/JacobEsauControls.ts b/packages/isaac-typescript-definitions/src/enums/JacobEsauControls.ts new file mode 100644 index 000000000..586ae7aed --- /dev/null +++ b/packages/isaac-typescript-definitions/src/enums/JacobEsauControls.ts @@ -0,0 +1,5 @@ +/** Added in Repentance+. */ +export enum JacobEsauControls { + CLASSIC = 0, + BETTER = 1, +} diff --git a/packages/isaac-typescript-definitions/src/enums/Music.ts b/packages/isaac-typescript-definitions/src/enums/Music.ts index 1ada559bc..8ca5598a8 100644 --- a/packages/isaac-typescript-definitions/src/enums/Music.ts +++ b/packages/isaac-typescript-definitions/src/enums/Music.ts @@ -97,4 +97,7 @@ export enum Music { MINESHAFT_AMBIENT = 116, MINESHAFT_ESCAPE = 117, REVERSE_GENESIS = 118, + + /** Added in Repentance+. */ + MUSIC_DEATHMATCH = 119, } diff --git a/packages/isaac-typescript-definitions/src/enums/PickupPrice.ts b/packages/isaac-typescript-definitions/src/enums/PickupPrice.ts index c03eab040..8f6c47848 100644 --- a/packages/isaac-typescript-definitions/src/enums/PickupPrice.ts +++ b/packages/isaac-typescript-definitions/src/enums/PickupPrice.ts @@ -6,6 +6,8 @@ export enum PickupPrice { TWO_HEARTS = -2, THREE_SOUL_HEARTS = -3, ONE_HEART_AND_TWO_SOUL_HEARTS = -4, + + /** A Pound of Flesh causes non-collectible shop pickups to be surrounded by spikes. */ SPIKES = -5, /** @@ -17,5 +19,15 @@ export enum PickupPrice { ONE_SOUL_HEART = -7, TWO_SOUL_HEARTS = -8, ONE_HEART_AND_ONE_SOUL_HEART = -9, + + /** + * Added in Repentance+. + * + * The official in-game enum does not have this value, but it is the correct value used by game. + * It corresponds to the Devil Room mechanic with the `devilsacrifice` collectible tag. + */ + DEVIL_SACRIFICE_SPIKES = -10, + + /** The Store Credit trinket causes items in the shop to cost 0 cents. */ FREE = -1000, } diff --git a/packages/isaac-typescript-definitions/src/enums/RoomShape.ts b/packages/isaac-typescript-definitions/src/enums/RoomShape.ts index 24acaca42..67b575cdb 100644 --- a/packages/isaac-typescript-definitions/src/enums/RoomShape.ts +++ b/packages/isaac-typescript-definitions/src/enums/RoomShape.ts @@ -39,15 +39,18 @@ export enum RoomShape { */ SHAPE_2x2 = 8, // eslint-disable-line @typescript-eslint/naming-convention,isaacscript/enum-member-number-separation + // eslint-disable-next-line complete/require-ascii /** Looks like a "⅃" with a gap in the top-left-hand corner. */ LTL = 9, /** Looks like an "L" with a gap in the top-right-hand corner. */ LTR = 10, + // eslint-disable-next-line complete/require-ascii /** Looks like a "⅂" with a gap in the bottom-left-hand corner. */ LBL = 11, + // eslint-disable-next-line complete/require-ascii /** Looks like a "Г" with a gap in the bottom-right-hand corner. */ LBR = 12, } diff --git a/packages/isaac-typescript-definitions/src/enums/RoomType.ts b/packages/isaac-typescript-definitions/src/enums/RoomType.ts index ef481b2f5..f74a7d40e 100644 --- a/packages/isaac-typescript-definitions/src/enums/RoomType.ts +++ b/packages/isaac-typescript-definitions/src/enums/RoomType.ts @@ -50,4 +50,7 @@ export enum RoomType { BLUE = 28, ULTRA_SECRET = 29, + + /** Added in Repentance+. */ + DEATHMATCH = 30, } diff --git a/packages/isaac-typescript-definitions/src/enums/SoundEffect.ts b/packages/isaac-typescript-definitions/src/enums/SoundEffect.ts index a8c0afd4d..78dfee289 100644 --- a/packages/isaac-typescript-definitions/src/enums/SoundEffect.ts +++ b/packages/isaac-typescript-definitions/src/enums/SoundEffect.ts @@ -827,4 +827,778 @@ export enum SoundEffect { G_FUEL_GUNSHOT_MINI = 830, G_FUEL_BULLET_RICOCHET = 831, G_FUEL_ROCKET_LAUNCHER = 832, + + /** Added in Repentance+. */ + DEATHMATCH_INTRO = 833, + + /** Added in Repentance+. */ + ABYSS = 834, + + /** Added in Repentance+. */ + BIG_CHUBBY_ATTACK = 835, + + /** Added in Repentance+. */ + BOOMERANG_THROW = 836, + + /** Added in Repentance+. */ + BOOMERANG_LOOP = 837, + + /** Added in Repentance+. */ + BOOMERANG_CATCH = 838, + + /** Added in Repentance+. */ + BOOMERANG_HIT = 839, + + /** Added in Repentance+. */ + BOX_OF_FRIENDS = 840, + + /** Added in Repentance+. */ + BROWN_NUGGET = 841, + + /** Added in Repentance+. */ + BUMBO_1 = 842, + + /** Added in Repentance+. */ + BUMBO_2 = 843, + + /** Added in Repentance+. */ + BUMBO_3 = 844, + + /** Added in Repentance+. */ + BUMBO_4 = 845, + + /** Added in Repentance+. */ + PORTAL_ENTITY_LOOP = 846, + + /** Added in Repentance+. */ + PORTAL_ENTITY_ENTER = 847, + + /** Added in Repentance+. */ + CONVERTER = 848, + + /** Added in Repentance+. */ + LITTLE_CHUBBY_ATTACK = 849, + + /** Added in Repentance+. */ + CRACKED_ORB = 850, + + /** Added in Repentance+. */ + CROOKED_PENNY = 851, + + /** Added in Repentance+. */ + CUBE_BABY_KICK = 852, + + /** Added in Repentance+. */ + DARK_BUM_PAYOUT = 853, + + /** Added in Repentance+. */ + DATAMINER = 854, + + /** Added in Repentance+. */ + DR_REMOTE_WARNING = 855, + + /** Added in Repentance+. */ + FLIP_POOF = 856, + + /** Added in Repentance+. */ + ERASER_HIT = 857, + + /** Added in Repentance+. */ + GNAWED_LEAF = 858, + + /** Added in Repentance+. */ + LIL_HAUNT_CHASE = 859, + + /** Added in Repentance+. */ + LINGER_BEAN = 860, + + /** Added in Repentance+. */ + GLOWING_HOURGLASS_ACTIVATE = 861, + + /** Added in Repentance+. */ + GLOWING_HOURGLASS_FIZZLE = 862, + + /** Added in Repentance+. */ + INFAMY_DEFLECT = 863, + + /** Added in Repentance+. */ + IBS_GURGLE = 864, + + /** Added in Repentance+. */ + POOP_THROW = 865, + + /** Added in Repentance+. */ + GLITTER_BOOM = 866, + + /** Added in Repentance+. */ + GLITTER_FUSE = 867, + + /** Added in Repentance+. */ + LITTLE_HORN_SHOOT = 868, + + /** Added in Repentance+. */ + MEGA_BEAN_BLAST = 869, + + /** Added in Repentance+. */ + MOM_BOTTLE = 870, + + /** Added in Repentance+. */ + SUMMON_PENTAGRAM = 871, + + /** Added in Repentance+. */ + SUMMON_WAVE = 872, + + /** Added in Repentance+. */ + BIGHORN_APPEAR = 873, + + /** Added in Repentance+. */ + BIGHORN_CLOSE_BIG = 874, + + /** Added in Repentance+. */ + BIGHORN_CRACK_BIG = 875, + + /** Added in Repentance+. */ + BIGHORN_OPEN_BIG = 876, + + /** Added in Repentance+. */ + BIGHORN_SHAKE_BIG = 877, + + /** Added in Repentance+. */ + BIGHORN_DEATH = 878, + + /** Added in Repentance+. */ + BIGHORN_DIZZY_SHAKE = 879, + + /** Added in Repentance+. */ + BIGHORN_HAND_APPEAR = 880, + + /** Added in Repentance+. */ + BIGHORN_HAND_HIDE = 881, + + /** Added in Repentance+. */ + BIGHORN_HIDE = 882, + + /** Added in Repentance+. */ + BIGHORN_HURT = 883, + + /** Added in Repentance+. */ + BIGHORN_PRE_SPIT = 884, + + /** Added in Repentance+. */ + BIGHORN_CLOSE_SMALL = 885, + + /** Added in Repentance+. */ + BIGHORN_CRACK_SMALL = 886, + + /** Added in Repentance+. */ + BIGHORN_OPEN_SMALL = 887, + + /** Added in Repentance+. */ + BIGHORN_SHAKE_SMALL = 888, + + /** Added in Repentance+. */ + BIGHORN_SPIT = 889, + + /** Added in Repentance+. */ + MOMS_BOX = 890, + + /** Added in Repentance+. */ + MONSTRO_LUNG_BARF = 891, + + /** Added in Repentance+. */ + MOVING_BOX_PACK = 892, + + /** Added in Repentance+. */ + MOVING_BOX_UNPACK = 893, + + /** Added in Repentance+. */ + PANDORAS_BOX = 894, + + /** Added in Repentance+. */ + PAUSE_FREEZE = 895, + + /** Added in Repentance+. */ + MONSTRO_LUNG_CHARGE = 896, + + /** Added in Repentance+. */ + PLAN_C = 897, + + /** Added in Repentance+. */ + PORTABLE_SLOT_USE = 898, + + /** Added in Repentance+. */ + PORTABLE_SLOT_WIN = 899, + + /** Added in Repentance+. */ + SAFETY_SCISSORS = 900, + + /** Added in Repentance+. */ + BUTTER_DROP = 901, + + /** Added in Repentance+. */ + BUTTER_LAND = 902, + + /** Added in Repentance+. */ + PRIDE_ZAP = 903, + + /** Added in Repentance+. */ + R_KEY = 904, + + /** Added in Repentance+. */ + TEAR_BOUNCE = 905, + + /** Added in Repentance+. */ + SHARP_PLUG = 906, + + /** Added in Repentance+. */ + RIB_DEFLECT = 907, + + /** Added in Repentance+. */ + SMELTER = 908, + + // cspell:disable-next-line-next-line + /** Added in Repentance+. Note that the vanilla enum is incorrectly spelled as "TELEKENESIS". */ + TELEKINESIS = 909, + + /** Added in Repentance+. */ + // eslint-disable-next-line isaacscript/enum-member-number-separation + D6_ROLL = 910, + + /** Added in Repentance+. */ + TICK_BURN = 911, + + /** Added in Repentance+. */ + TELEPORT_UNDEFINED = 912, + + /** Added in Repentance+. */ + VOID_CONSUME = 913, + + /** Added in Repentance+. */ + YO_LISTEN = 914, + + /** Added in Repentance+. */ + SPIN_TO_WIN = 915, + + /** Added in Repentance+. */ + SHOVEL_DIG_2 = 916, + + /** Added in Repentance+. */ + SHOVEL_HOLE_OPEN = 917, + + /** Added in Repentance+. */ + CAGE_DEATH = 918, + + /** Added in Repentance+. */ + CAGE_JUMP = 919, + + /** Added in Repentance+. */ + CAGE_RIBS = 920, + + /** Added in Repentance+. */ + CAGE_ROLL_START = 921, + + /** Added in Repentance+. */ + CAGE_PREP_SHOOT = 922, + + /** Added in Repentance+. */ + CAGE_ROLL_STOP = 923, + + /** Added in Repentance+. */ + CAGE_ROLL_BOUNCE = 924, + + /** Added in Repentance+. */ + DEATH_HOURGLASS = 925, + + /** Added in Repentance+. */ + DEATH_SICKLE = 926, + + /** Added in Repentance+. */ + DEATH_LEAN = 927, + + /** Added in Repentance+. */ + DEATH_VOX = 928, + + /** Added in Repentance+. */ + DEATH_SPAWN_PREP = 929, + + /** Added in Repentance+. */ + DEATH_HORSE_ATTACK = 930, + + /** Added in Repentance+. */ + DEATH_HORSE_WOOSH = 931, + + /** Added in Repentance+. */ + PIN_DIVE = 932, + + /** Added in Repentance+. */ + PIN_POPUP = 933, + + /** Added in Repentance+. */ + PIN_PUDDLE = 934, + + /** Added in Repentance+. */ + PIN_SPIT = 935, + + /** Added in Repentance+. */ + GISH_JUMP = 936, + + /** Added in Repentance+. */ + GISH_JUMP_HIGH = 937, + + /** Added in Repentance+. */ + GISH_SPIT = 938, + + /** Added in Repentance+. */ + GURDY_FACE_ATTACK_APPEAR = 939, + + /** Added in Repentance+. */ + GURDY_FACE_ATTACK_HIDE = 940, + + /** Added in Repentance+. */ + GURDY_FACE_SMILE_APPEAR = 941, + + /** Added in Repentance+. */ + GURDY_FACE_SMILE_HIDE = 942, + + /** Added in Repentance+. */ + GURGLING_ATTACK = 943, + + /** Added in Repentance+. */ + LITTLE_HORN_DEATH = 944, + + /** Added in Repentance+. */ + LITTLE_HORN_BOMB_DROP = 945, + + /** Added in Repentance+. */ + LITTLE_HORN_DIVE = 946, + + /** Added in Repentance+. */ + LITTLE_HORN_HOLE_OPEN = 947, + + /** Added in Repentance+. */ + LITTLE_HORN_HOLE_EXIT = 948, + + /** Added in Repentance+. */ + LOKI_GIGGLE = 949, + + /** Added in Repentance+. */ + LOKI_JUMP_OUT = 950, + + /** Added in Repentance+. */ + LOKI_JUMP_IN = 951, + + /** Added in Repentance+. */ + LOKI_SHOOT = 952, + + /** Added in Repentance+. */ + LOKI_SHOOT_8 = 953, + + /** Added in Repentance+. */ + MASK_INFAMY_MAD = 954, + + /** Added in Repentance+. */ + MASK_INFAMY_DASH = 955, + + /** Added in Repentance+. */ + MEGA_FATTY_GULP = 956, + + /** Added in Repentance+. */ + MEGA_FATTY_SUCKING = 957, + + /** Added in Repentance+. */ + MEGA_FATTY_VOMIT = 958, + + /** Added in Repentance+. */ + STAIN_ATTACK_VOX = 959, + + /** Added in Repentance+. */ + SISTERS_VIS_SCARE = 960, + + /** Added in Repentance+. */ + STEVEN_DEATH_BIG = 961, + + /** Added in Repentance+. */ + STEVEN_DEATH_SMALL = 963, + + /** Added in Repentance+. */ + FALLEN_FLAP_CHASE = 964, + + /** Added in Repentance+. */ + FALLEN_GROWL = 965, + + /** Added in Repentance+. */ + FALLEN_FLAP = 966, + + /** Added in Repentance+. */ + FALLEN_OPEN_WINGS = 967, + + /** Added in Repentance+. */ + TERATOMA_BOUNCE_BIG = 968, + + /** Added in Repentance+. */ + TERATOMA_BOUNCE_MEDIUM = 969, + + /** Added in Repentance+. */ + TERATOMA_BOUNCE_SMALL = 970, + + /** Added in Repentance+. */ + FORSAKEN_LASER = 971, + + /** Added in Repentance+. */ + FORSAKEN_ARMS_UP = 972, + + /** Added in Repentance+. */ + FORSAKEN_FADE = 973, + + /** Added in Repentance+. */ + FISTULA_BOUNCE_LARGE = 974, + + /** Added in Repentance+. */ + FISTULA_BOUNCE_MEDIUM = 975, + + /** Added in Repentance+. */ + FISTULA_BOUNCE_SMALL = 976, + + /** Added in Repentance+. */ + FISTULA_BURST_LARGE = 977, + + /** Added in Repentance+. */ + FISTULA_GROWL_LARGE = 978, + + /** Added in Repentance+. */ + FISTULA_GROWL_MEDIUM = 979, + + /** Added in Repentance+. */ + FISTULA_GROWL_SMALL = 980, + + /** Added in Repentance+. */ + RAG_MEGA_BALL_ATTACK = 981, + + /** Added in Repentance+. */ + RAG_MEGA_BEAM = 982, + + /** Added in Repentance+. */ + RAG_MEGA_INHALE = 983, + + /** Added in Repentance+. */ + RAG_MEGA_EXHALE = 984, + + /** Added in Repentance+. */ + RAG_MEGA_INVINCIBLE_ON = 985, + + /** Added in Repentance+. */ + RAG_MEGA_INVINCIBLE_OFF = 986, + + /** Added in Repentance+. */ + BLASTOCYST_JUMP_BIG = 987, + + /** Added in Repentance+. */ + BLASTOCYST_JUMP = 988, + + /** Added in Repentance+. */ + BLASTOCYST_JUMP_SMALL = 989, + + /** Added in Repentance+. */ + POOP_DROP = 990, + + /** Added in Repentance+. */ + CARRION_QUEEN_BOUNCE = 991, + + /** Added in Repentance+. */ + CARRION_QUEEN_DIAGONAL_START = 992, + + /** Added in Repentance+. */ + CARRION_QUEEN_DIAGONAL_VOX = 993, + + /** Added in Repentance+. */ + CARRION_QUEEN_ROAR = 994, + + /** Added in Repentance+. */ + HAUNT_CHARGE = 995, + + /** Added in Repentance+. */ + HAUNT_DEATH = 996, + + /** Added in Repentance+. */ + HAUNT_ROAR = 997, + + /** Added in Repentance+. */ + HAUNT_RELEASE_LIL = 998, + + /** Added in Repentance+. */ + LARRY_JR_DEATH_1 = 999, + + /** Added in Repentance+. */ + LARRY_JR_DEATH_2 = 1000, + + /** Added in Repentance+. */ + LARRY_JR_ROAR = 1001, + + /** Added in Repentance+. */ + MEGA_FATTY_MEGA_FART = 1002, + + /** Added in Repentance+. */ + HOLLOW_DEATH_1 = 1003, + + /** Added in Repentance+. */ + HOLLOW_DEATH_2 = 1004, + + /** Added in Repentance+. */ + HOLLOW_ROAR = 1005, + + /** Added in Repentance+. */ + WAR_KNOCKDOWN = 1006, + + /** Added in Repentance+. */ + WAR_CHARGE = 1007, + + /** Added in Repentance+. */ + BOSS_NEAR = 1008, + + /** Added in Repentance+. */ + CAMBION_CONCEPTION = 1009, + + /** Added in Repentance+. */ + IMMACULATE_CONCEPTION = 1010, + + /** Added in Repentance+. */ + CHARGED_BABY_BATTERY = 1011, + + /** Added in Repentance+. */ + CHARGED_BABY_CHARGE = 1012, + + /** Added in Repentance+. */ + CHARGED_BABY_STUN = 1013, + + /** Added in Repentance+. */ + ROCK_SHINE = 1014, + + /** Added in Repentance+. */ + BLUE_SPIDER_DIE = 1015, + + /** Added in Repentance+. */ + SISSY_LONGLEGS_CHARM = 1016, + + /** Added in Repentance+. */ + ITEM_RAISE = 1017, + + /** Added in Repentance+. */ + CLOG_POOP_SMOKE = 1018, + + /** Added in Repentance+. */ + FRIENDLY_BALL_CAPTURE = 1019, + + /** Added in Repentance+. */ + FRIENDLY_BALL_LAND = 1020, + + /** Added in Repentance+. */ + FRIENDLY_BALL_PICKUP = 1021, + + /** Added in Repentance+. */ + FRIENDLY_BALL_RAISE = 1022, + + /** Added in Repentance+. */ + FRIENDLY_BALL_RELEASE = 1023, + + /** Added in Repentance+. */ + FRIENDLY_BALL_THROW = 1024, + + /** Added in Repentance+. */ + BEST_FRIEND = 1025, + + /** Added in Repentance+. */ + BOOK_SHADOWS_START = 1026, + + /** Added in Repentance+. */ + BOOK_SHADOWS_END = 1027, + + /** Added in Repentance+. */ + BOOK_SHADOWS_SIGIL = 1028, + + /** Added in Repentance+. */ + BOX_SPIDERS = 1029, + + /** Added in Repentance+. */ + SUPLEX_ACTIVATE = 1030, + + /** Added in Repentance+. */ + SUPLEX_GRAB = 1031, + + /** Added in Repentance+. */ + SUPLEX_JUMP = 1032, + + /** Added in Repentance+. */ + SUPLEX_LAND = 1033, + + /** Added in Repentance+. */ + DEAD_SEA_SCROLLS = 1034, + + /** Added in Repentance+. */ + MOMS_BRA = 1035, + + /** Added in Repentance+. */ + RED_CANDLE = 1036, + + /** Added in Repentance+. */ + SATANIC_BIBLE = 1037, + + /** Added in Repentance+. */ + BIBLE = 1038, + + /** Added in Repentance+. */ + HOURGLASS = 1039, + + /** Added in Repentance+. */ + MEGA_MUSH_SHRINK = 1040, + + /** Added in Repentance+. */ + MAGIC_SKIN = 1041, + + /** Added in Repentance+. */ + BOOK_OF_SIN = 1042, + + /** Added in Repentance+. */ + BROKEN_SHOVEL = 1043, + + /** Added in Repentance+. */ + DULL_RAZOR = 1044, + + /** Added in Repentance+. */ + DARK_ARTS = 1045, + + /** Added in Repentance+. */ + DECAP_ACTIVATE = 1046, + + // cspell:disable-next-line + /** Added in Repentance+. */ + DECAP_THROW = 1047, + + /** Added in Repentance+. */ + ESAU_JR = 1048, + + /** Added in Repentance+. */ + NECROMANCER = 1049, + + /** Added in Repentance+. */ + GELLO = 1050, + + /** Added in Repentance+. */ + HEAVENS_DOOR_ENTER = 1051, + + /** Added in Repentance+. */ + TRAP_DOOR_LEVEL = 1052, + + /** Added in Repentance+. */ + CRYSTAL_BALL = 1053, + + /** Added in Repentance+. */ + FORGET_ME_NOW = 1054, + + /** Added in Repentance+. */ + HOW_TO_JUMP = 1055, + + /** Added in Repentance+. */ + IV_BAG = 1056, + + /** Added in Repentance+. */ + NOTCHED_AXE = 1057, + + /** Added in Repentance+. */ + RAZOR_BLADE = 1058, + + /** Added in Repentance+. */ + TELEPATHY_DUMMY = 1059, + + /** Added in Repentance+. */ + JAR_OF_FLIES = 1060, + + /** Added in Repentance+. */ + DIPLOPIA = 1061, + + /** Added in Repentance+. */ + MINE_CRAFTER = 1062, + + /** Added in Repentance+. */ + TEAR_DETONATOR = 1063, + + /** Added in Repentance+. */ + VENTRICLE_RAZOR = 1064, + + /** Added in Repentance+. */ + WOODEN_NICKEL = 1065, + + /** Added in Repentance+. */ + WOODEN_NICKEL_SPAWN = 1066, + + /** Added in Repentance+. */ + BLACK_HOLE_ACTIVATE = 1067, + + /** Added in Repentance+. */ + BLACK_HOLE_THROW = 1068, + + /** Added in Repentance+. */ + MR_ME = 1069, + + /** Added in Repentance+. */ + SPRINKLER_SPAWN = 1070, + + /** Added in Repentance+. */ + VOID_SUCCESS = 1071, + + /** Added in Repentance+. */ + VOID_FAIL = 1072, + + /** Added in Repentance+. */ + ABYSS_SUCCESS = 1073, + + /** Added in Repentance+. */ + BAG_OF_CRAFTING = 1074, + + /** Added in Repentance+. */ + GIANT_CHEST_OPEN = 1075, + + /** Added in Repentance+. */ + IMP_GROWL = 1076, + + /** Added in Repentance+. */ + IMP_SHOOT = 1077, + + /** Added in Repentance+. */ + IMP_WARP_OUT = 1078, + + /** Added in Repentance+. */ + IMP_WARP_IN = 1079, + + /** Added in Repentance+. */ + BRAIN_MOVE = 1080, + + /** Added in Repentance+. */ + POISON_MIND_HURT = 1081, + + /** Added in Repentance+. */ + KNIGHT_GROWL = 1082, + + /** Added in Repentance+. */ + SELFLESS_KNIGHT_GROWL = 1083, + + /** Added in Repentance+. */ + FLOATING_KNIGHT_GROWL = 1084, + + /** Added in Repentance+. */ + BUTTLICKER_GROWL = 1085, + + /** Added in Repentance+. */ + LADDER = 1086, + + /** Added in Repentance+. */ + OCULAR_RIFT_SHOOT = 1087, + + /** Added in Repentance+. */ + OCULAR_RIFT_PORTAL = 1088, + + /** Added in Repentance+. */ + UNBORN_GROWL = 1089, + + /** Added in Repentance+. */ + UNBORN_WARP = 1090, } diff --git a/packages/isaac-typescript-definitions/src/enums/collections/variants.ts b/packages/isaac-typescript-definitions/src/enums/collections/variants.ts index 1f57eb50d..1cbf28fb8 100644 --- a/packages/isaac-typescript-definitions/src/enums/collections/variants.ts +++ b/packages/isaac-typescript-definitions/src/enums/collections/variants.ts @@ -1636,4 +1636,19 @@ export enum EffectVariant { DEAD_BIRD = 197, GENERIC_TRACER = 198, ULTRA_DEATH_SCYTHE = 199, + + /** Added in Repentance+. */ + BULLET_POOF_STATIC = 200, + + /** Added in Repentance+. */ + UMBILICAL_CORD_HELPER = 201, + + /** Added in Repentance+. */ + MEGA_BEAN_EXPLOSION = 202, + + /** Added in Repentance+. */ + SPAWN_PENTAGRAM = 203, + + /** Added in Repentance+. */ + PLAYER_CREEP_YELLOW = 204, } diff --git a/packages/isaac-typescript-definitions/src/enums/flags/EntityPartition.ts b/packages/isaac-typescript-definitions/src/enums/flags/EntityPartition.ts index 430538c54..1f751ba57 100644 --- a/packages/isaac-typescript-definitions/src/enums/flags/EntityPartition.ts +++ b/packages/isaac-typescript-definitions/src/enums/flags/EntityPartition.ts @@ -32,7 +32,6 @@ const EntityPartitionInternal = { * Since effects do not have collision, they will never be returned. Thus, this enum * is useless. */ - // eslint-disable-next-line deprecation/deprecation EFFECT: 1 << 6, } as const; diff --git a/packages/isaac-typescript-definitions/src/enums/mods/EncyclopediaItemPoolType.ts b/packages/isaac-typescript-definitions/src/enums/mods/EncyclopediaItemPoolType.ts index c721ddb5f..3e5b3200d 100644 --- a/packages/isaac-typescript-definitions/src/enums/mods/EncyclopediaItemPoolType.ts +++ b/packages/isaac-typescript-definitions/src/enums/mods/EncyclopediaItemPoolType.ts @@ -1,3 +1,9 @@ +/** + * This is an enum for the third-party Encyclopedia mod, which provides descriptions for items and + * is often utilized by other mods that include items. + * + * @see https://steamcommunity.com/workshop/filedetails/?id=2376005362 + */ export enum EncyclopediaItemPoolType { POOL_TREASURE = 1, POOL_SHOP = 2, diff --git a/packages/isaac-typescript-definitions/src/enums/mods/ModConfigMenuOptionType.ts b/packages/isaac-typescript-definitions/src/enums/mods/ModConfigMenuOptionType.ts index 4dd079859..85268804d 100644 --- a/packages/isaac-typescript-definitions/src/enums/mods/ModConfigMenuOptionType.ts +++ b/packages/isaac-typescript-definitions/src/enums/mods/ModConfigMenuOptionType.ts @@ -1,3 +1,9 @@ +/** + * This is an enum for the third-party Mod Config Menu mod, which provides a menu and is often + * utilized by other mods. + * + * @see https://steamcommunity.com/sharedfiles/filedetails/?id=2681875787 + */ export enum ModConfigMenuOptionType { TEXT = 1, SPACE = 2, diff --git a/packages/isaac-typescript-definitions/src/enums/mods/StageAPIEnums.ts b/packages/isaac-typescript-definitions/src/enums/mods/StageAPIEnums.ts index 013251584..4c8c3a045 100644 --- a/packages/isaac-typescript-definitions/src/enums/mods/StageAPIEnums.ts +++ b/packages/isaac-typescript-definitions/src/enums/mods/StageAPIEnums.ts @@ -1,5 +1,10 @@ // cspell:ignore STAGEAPI GRIDENTITY +/** + * This is an enum for the third-party Stage API mod, which allows mods to create custom stages. + * + * @see https://steamcommunity.com/sharedfiles/filedetails/?id=1348031964 + */ export enum StageAPICallback { POST_CHANGE_ROOM_GFX = "POST_CHANGE_ROOM_GFX", @@ -156,6 +161,11 @@ export enum StageAPICallback { PRE_UPDATE_GRID_GFX = "PRE_UPDATE_GRID_GFX", } +/** + * This is an enum for the third-party Stage API mod, which allows mods to create custom stages. + * + * @see https://steamcommunity.com/sharedfiles/filedetails/?id=1348031964 + */ export enum StageAPILayoutButtonVariant { ROOM_CLEAR = 0, REWARD = 1, @@ -164,11 +174,21 @@ export enum StageAPILayoutButtonVariant { RAIL = 3, } +/** + * This is an enum for the third-party Stage API mod, which allows mods to create custom stages. + * + * @see https://steamcommunity.com/sharedfiles/filedetails/?id=1348031964 + */ export enum StageAPILayoutCornyPoopSubtype { NORMAL = 0, NON_REPLACEABLE = 1, } +/** + * This is an enum for the third-party Stage API mod, which allows mods to create custom stages. + * + * @see https://steamcommunity.com/sharedfiles/filedetails/?id=1348031964 + */ export enum StageAPILayoutGridType { ROCK = 1000, ROCK_ALT = 1002, @@ -202,22 +222,42 @@ export enum StageAPILayoutGridType { PROP_C = 30, } +/** + * This is an enum for the third-party Stage API mod, which allows mods to create custom stages. + * + * @see https://steamcommunity.com/sharedfiles/filedetails/?id=1348031964 + */ export enum StageAPILayoutPitfallVariant { NORMAL = 0, SUCTION = 1, TELEPORT = 2, } +/** + * This is an enum for the third-party Stage API mod, which allows mods to create custom stages. + * + * @see https://steamcommunity.com/sharedfiles/filedetails/?id=1348031964 + */ export enum StageAPILayoutPoopSubtype { NORMAL = 0, NON_REPLACEABLE = 1, } +/** + * This is an enum for the third-party Stage API mod, which allows mods to create custom stages. + * + * @see https://steamcommunity.com/sharedfiles/filedetails/?id=1348031964 + */ export enum StageAPILayoutRockSubtype { NORMAL = 0, NON_REPLACEABLE = 1, } +/** + * This is an enum for the third-party Stage API mod, which allows mods to create custom stages. + * + * @see https://steamcommunity.com/sharedfiles/filedetails/?id=1348031964 + */ export enum StageAPILayoutSpikesOnOffVariant { NORMAL = 0, DOWN_1_FIFTH = 1, @@ -232,6 +272,11 @@ export enum StageAPILayoutSpikesOnOffVariant { UP_5_FIFTHS = 10, } +/** + * This is an enum for the third-party Stage API mod, which allows mods to create custom stages. + * + * @see https://steamcommunity.com/sharedfiles/filedetails/?id=1348031964 + */ export enum StageAPIPickupRandomGroupVariant { ANY = 0, NOT_CHEST_ITEM = 1, diff --git a/packages/isaac-typescript-definitions/src/index.ts b/packages/isaac-typescript-definitions/src/index.ts index 9b075971f..8134e48ff 100644 --- a/packages/isaac-typescript-definitions/src/index.ts +++ b/packages/isaac-typescript-definitions/src/index.ts @@ -27,6 +27,7 @@ export * from "./enums/Difficulty"; export * from "./enums/Dimension"; export * from "./enums/Direction"; export * from "./enums/DoorSlot"; +export * from "./enums/DrawStringAlignment"; export * from "./enums/EntityCollisionClass"; export * from "./enums/EntityGridCollisionClass"; export * from "./enums/EntityType"; @@ -59,6 +60,7 @@ export * from "./enums/ItemConfigPillEffectClass"; export * from "./enums/ItemConfigPillEffectType"; export * from "./enums/ItemPoolType"; export * from "./enums/ItemType"; +export * from "./enums/JacobEsauControls"; export * from "./enums/Keyboard"; export * from "./enums/LanguageAbbreviation"; export * from "./enums/LaserOffset"; diff --git a/packages/isaac-typescript-definitions/src/types/classes/Entity.d.ts b/packages/isaac-typescript-definitions/src/types/classes/Entity.d.ts index aed35a9bf..82c395131 100644 --- a/packages/isaac-typescript-definitions/src/types/classes/Entity.d.ts +++ b/packages/isaac-typescript-definitions/src/types/classes/Entity.d.ts @@ -17,8 +17,14 @@ declare global { * @param duration The number of frames that the effect should apply for. The minimum is 2 * frames. * @param damage The damage taken per tick. Each damage tick is 20 frames apart. + * @param ignoreBosses Optional. Defaults to false. This parameter was added in Repentance+. */ - AddBurn: (source: EntityRef, duration: int, damage: float) => void; + AddBurn: ( + source: EntityRef, + duration: int, + damage: float, + ignoreBosses?: boolean, + ) => void; /** * Adds a charmed effect to the entity. @@ -27,8 +33,13 @@ declare global { * `EntityRef(undefined)`. * @param duration The number of frames that the effect should apply for. If set to -1, the * effect will be permanent and the entity will follow you to different rooms. + * @param ignoreBosses Optional. Defaults to false. This parameter was added in Repentance+. */ - AddCharmed: (source: EntityRef, duration: int) => void; + AddCharmed: ( + source: EntityRef, + duration: int, + ignoreBosses?: boolean, + ) => void; /** * Adds a confusion effect to the entity. @@ -36,12 +47,12 @@ declare global { * @param source Required. If you do not want the effect to have a source, pass * `EntityRef(undefined)`. * @param duration The number of frames that the effect should apply for. The maximum is 150. - * @param ignoreBosses + * @param ignoreBosses Optional. Defaults to false. This parameter was added in Repentance+. */ AddConfusion: ( source: EntityRef, duration: int, - ignoreBosses: boolean, + ignoreBosses?: boolean, ) => void; /** @@ -56,8 +67,9 @@ declare global { * @param source Required. If you do not want the effect to have a source, pass * `EntityRef(undefined)`. * @param duration The number of frames that the effect should apply for. The maximum is 150. + * @param ignoreBosses Optional. Defaults to false. This parameter was added in Repentance+. */ - AddFear: (source: EntityRef, duration: int) => void; + AddFear: (source: EntityRef, duration: int, ignoreBosses?: boolean) => void; /** * Adds a freeze effect to the entity. @@ -65,8 +77,13 @@ declare global { * @param source Required. If you do not want the effect to have a source, pass * `EntityRef(undefined)`. * @param duration The number of frames that the effect should apply for. The maximum is 150. + * @param ignoreBosses Optional. Defaults to false. This parameter was added in Repentance+. */ - AddFreeze: (source: EntityRef, duration: int) => void; + AddFreeze: ( + source: EntityRef, + duration: int, + ignoreBosses?: boolean, + ) => void; /** Heals the entity. */ AddHealth: (hitPoints: float) => void; @@ -80,8 +97,13 @@ declare global { * @param duration The number of frames that the effect should apply for. The maximum is 150. * (However, if a value higher than 150 is passed, the freeze will be reduced to * 150 frames, but the gold color will persist for the full duration.) + * @param ignoreBosses Optional. Defaults to false. This parameter was added in Repentance+. */ - AddMidasFreeze: (source: EntityRef, duration: int) => void; + AddMidasFreeze: ( + source: EntityRef, + duration: int, + ignoreBosses?: boolean, + ) => void; /** * Adds a poison effect to the entity. @@ -91,8 +113,14 @@ declare global { * @param duration The number of frames that the effect should apply for. The minimum is 2 * frames. The maximum is 150. * @param damage The damage taken per tick. Each damage tick is 20 frames apart. + * @param ignoreBosses Optional. Defaults to false. This parameter was added in Repentance+. */ - AddPoison: (source: EntityRef, duration: int, damage: float) => void; + AddPoison: ( + source: EntityRef, + duration: int, + damage: float, + ignoreBosses?: boolean, + ) => void; /** * Adds a shrink effect to the entity. @@ -100,8 +128,13 @@ declare global { * @param source Required. If you do not want the effect to have a source, pass * `EntityRef(undefined)`. * @param duration The number of frames that the effect should apply for. + * @param ignoreBosses Optional. Defaults to false. This parameter was added in Repentance+. */ - AddShrink: (source: EntityRef, duration: int) => void; + AddShrink: ( + source: EntityRef, + duration: int, + ignoreBosses?: boolean, + ) => void; /** * Adds a slowing effect to the entity. @@ -111,16 +144,28 @@ declare global { * @param duration The number of frames that the effect should apply for. * @param slowValue This is the multiplier applied to the entity's movement speed. For example, * a value of 0.5 would slow down the entity by 50%. - * @param slowColor + * @param slowColor The color modification to make to the enemy. + * @param ignoreBosses Optional. Defaults to false. This parameter was added in Repentance+. */ AddSlowing: ( source: EntityRef, duration: int, slowValue: float, slowColor: Color, + ignoreBosses?: boolean, ) => void; - AddVelocity: (velocity: Vector) => void; + /** + * Adds velocity to the entity. This can be used to move them in a certain direction. (For + * example, as a result of collision.) + * + * @param velocity + * @param ignoreTimeScale Optional. If true, the time scale is treated as if it were 1.0, + * ignoring effects that would otherwise slow down or speed up the entity + * (like Stopwatch). Defaults to false. + */ + AddVelocity: (velocity: Vector, ignoreTimeScale: boolean) => void; + BloodExplode: () => void; // `CanShutDoors` is deliberately not implemented here because it conflicts with @@ -209,6 +254,10 @@ declare global { IsVulnerableEnemy: () => boolean; Kill: () => void; + + /** Added in Repentance+. */ + KillWithSource: (source: EntityRef) => void; + MultiplyFriction: (value: float) => void; PostRender: () => void; Remove: () => void; diff --git a/packages/isaac-typescript-definitions/src/types/classes/EntityNPC.d.ts b/packages/isaac-typescript-definitions/src/types/classes/EntityNPC.d.ts index 7670cfef4..503048740 100644 --- a/packages/isaac-typescript-definitions/src/types/classes/EntityNPC.d.ts +++ b/packages/isaac-typescript-definitions/src/types/classes/EntityNPC.d.ts @@ -47,7 +47,7 @@ declare global { */ MakeChampion: ( seed: Seed, - championColorIdx?: ChampionColor, + championColor?: ChampionColor, init?: boolean, ) => void; diff --git a/packages/isaac-typescript-definitions/src/types/classes/EntityPlayer.d.ts b/packages/isaac-typescript-definitions/src/types/classes/EntityPlayer.d.ts index ae00c9c0f..a5ca8e446 100644 --- a/packages/isaac-typescript-definitions/src/types/classes/EntityPlayer.d.ts +++ b/packages/isaac-typescript-definitions/src/types/classes/EntityPlayer.d.ts @@ -20,6 +20,7 @@ import type { CacheFlag } from "../../enums/flags/CacheFlag"; import type { DamageFlag } from "../../enums/flags/DamageFlag"; import type { TearFlag } from "../../enums/flags/TearFlag"; import type { UseFlag } from "../../enums/flags/UseFlag"; +import type { ItemPoolType } from "../../enums/ItemPoolType"; import type { LaserOffset } from "../../enums/LaserOffset"; import type { NullItemID } from "../../enums/NullItemID"; import type { PillEffect } from "../../enums/PillEffect"; @@ -86,6 +87,7 @@ declare global { * `ActiveSlot.SLOT_PRIMARY`. * @param varData Sets the variable data for this collectible (this is used to store extra data * for some active items like the number of uses for Jar of Wisps). Default is 0. + * @param itemPoolType This parameter was added in Repentance+. */ AddCollectible: ( collectibleType: CollectibleType, @@ -93,6 +95,7 @@ declare global { firstTimePickingUp?: boolean, activeSlot?: ActiveSlot.PRIMARY | ActiveSlot.SECONDARY, varData?: int, + itemPoolType?: ItemPoolType, ) => void; AddControlsCooldown: (cooldown: int) => void; @@ -398,7 +401,7 @@ declare global { * Altar will work properly. (It informs the game which collectible * should be removed if the familiar is tagged with the * "cansacrifice" entity tag.) This can be obtained with: - * `Isaac.GetItemConfig().GetCollectible(collectibleType)` + * `Isaac.GetItemConfig().GetCollectible(collectibleType)` * @param familiarSubType The subtype of the familiar to check. Default is -1, which matches * every sub-type. */ @@ -680,7 +683,7 @@ declare global { */ GetHearts: () => int; - GetItemState: () => int; + GetItemState: () => CollectibleType; GetJarFlies: () => int; GetJarHearts: () => int; GetLaserOffset: (laserOffset: LaserOffset, direction: Vector) => Vector; @@ -1159,8 +1162,8 @@ declare global { useFlag?: UseFlag | BitFlags, activeSlot?: ActiveSlot | -1, customVarData?: int, - ) => void) & - (( + ) => void) + & (( collectibleType: CollectibleType, showAnim: boolean, keepActiveItem: boolean, diff --git a/packages/isaac-typescript-definitions/src/types/classes/EntityPtr.d.ts b/packages/isaac-typescript-definitions/src/types/classes/EntityPtr.d.ts index dddce0734..04a578034 100644 --- a/packages/isaac-typescript-definitions/src/types/classes/EntityPtr.d.ts +++ b/packages/isaac-typescript-definitions/src/types/classes/EntityPtr.d.ts @@ -1,7 +1,7 @@ -declare function EntityPtr(this: void, entity: Entity): EntityPtr; +declare function EntityPtr(this: void, entity: Entity | undefined): EntityPtr; declare interface EntityPtr extends IsaacAPIClass { - SetReference: (ref: Entity) => void; + SetReference: (ref: Entity | undefined) => void; readonly Ref?: Entity; } diff --git a/packages/isaac-typescript-definitions/src/types/classes/Font.d.ts b/packages/isaac-typescript-definitions/src/types/classes/Font.d.ts index 5c5067857..2f96815e9 100644 --- a/packages/isaac-typescript-definitions/src/types/classes/Font.d.ts +++ b/packages/isaac-typescript-definitions/src/types/classes/Font.d.ts @@ -13,6 +13,8 @@ declare interface Font extends IsaacAPIClass { * - If `boxWidth` is not zero, and the `center` parameter is true, then the text will be centered * inside the `boxWidth` size. * + * Repentance+ added a separate overload for drawing a string with a custom size. + * * @param str * @param positionX * @param positionY @@ -20,14 +22,23 @@ declare interface Font extends IsaacAPIClass { * @param boxWidth Default is 0. * @param center Default is false. */ - DrawString: ( + DrawString: (( str: string, positionX: float, positionY: float, renderColor: KColor, boxWidth?: int, center?: boolean, - ) => void; + ) => void) + & (( + str: string, + positionX: float, + positionY: float, + sizeX: float, + sizeY: float, + renderColor: KColor, + fontRenderSettings: FontRenderSettings, + ) => void); /** * Converts UTF8 to UTF16, then draws the scaled string on the screen. diff --git a/packages/isaac-typescript-definitions/src/types/classes/FontRenderSettings.d.ts b/packages/isaac-typescript-definitions/src/types/classes/FontRenderSettings.d.ts new file mode 100644 index 000000000..9235a0757 --- /dev/null +++ b/packages/isaac-typescript-definitions/src/types/classes/FontRenderSettings.d.ts @@ -0,0 +1,26 @@ +import type { DrawStringAlignment } from "../../enums/DrawStringAlignment"; + +declare global { + function FontRenderSettings(this: void): FontRenderSettings; + + /** Added in Repentance+. */ + interface FontRenderSettings extends IsaacAPIClass { + EnableAutoWrap: (enabled: boolean) => void; + EnableTruncation: (enabled: boolean) => void; + GetAlignment: () => DrawStringAlignment; + GetLineHeightModifier: () => float; + GetMaxCharacters: () => int; + GetMissingCharacterOverride: () => int; + IsAutoWrapEnabled: () => boolean; + IsTruncationEnabled: () => boolean; + SetAlignment: (drawStringAlignment: DrawStringAlignment) => void; + SetLineHeightModifier: (value: float) => void; + SetMaxCharacters: (maxChars: int) => void; + + /** + * Sets the character that will be used when a missing character in the font needs to be + * rendered. This overrides previous `Font:SetMissingCharacter` settings. + */ + SetMissingCharacterOverride: (character: int) => void; + } +} diff --git a/packages/isaac-typescript-definitions/src/types/classes/Game.d.ts b/packages/isaac-typescript-definitions/src/types/classes/Game.d.ts index f18c0f786..65c3bcbbd 100644 --- a/packages/isaac-typescript-definitions/src/types/classes/Game.d.ts +++ b/packages/isaac-typescript-definitions/src/types/classes/Game.d.ts @@ -132,17 +132,26 @@ declare global { /** * @param speed A value between 0 and 1. Using a value of 0 will soft-lock the game. Using a * value of 1 will instantaneously fade in. + * @param showIcon Optional. Defaults to true. This parameter was added in Repentance+. + * @param kColor Optional. Defaults to `K_COLORS.Black`. This parameter was added in + * Repentance+. */ - Fadein: (speed: float) => void; + Fadein: (speed: float, showIcon?: boolean, kColor?: KColor) => void; /** - * Using non-valid `FadeoutTarget` values will be interpreted the same as `FadeoutTarget.NONE`. + * Using a non-valid `FadeoutTarget` value will be interpreted the same as `FadeoutTarget.NONE`. * * @param speed A value between 0 and 1. Using a value of 0 will never trigger the fade out * target. Using a value of 1 will instantaneously trigger the fade out target. - * @param fadeoutTarget + * @param fadeoutTarget The place to go after the fade out is completed. + * @param kColor Optional. Defaults to `K_COLORS.Black`. This parameter was added in + * Repentance+. */ - Fadeout: (speed: float, fadeoutTarget: FadeoutTarget) => void; + Fadeout: ( + speed: float, + fadeoutTarget: FadeoutTarget, + kColor?: KColor, + ) => void; /** * @param position @@ -253,8 +262,8 @@ declare global { /** * @param frameCount - * @param backdrop Default is a random backdrop, similar to what happens after using the - * Delirious collectible. + * @param backdropType Default is a random backdrop, similar to what happens after using the + * Delirious collectible. */ ShowHallucination: (frameCount: int, backdropType?: BackdropType) => void; @@ -332,7 +341,7 @@ declare global { * * @param roomGridIndex The room grid index of the destination room. * @param direction - * @param roomTransition Default is `RoomTransitionAnim.WALK`. + * @param roomTransitionAnim Default is `RoomTransitionAnim.WALK`. * @param player Default is undefined. * @param dimension Default is `Dimension.CURRENT`. */ diff --git a/packages/isaac-typescript-definitions/src/types/classes/GridEntity.d.ts b/packages/isaac-typescript-definitions/src/types/classes/GridEntity.d.ts index bde5f2f4a..6653634e7 100644 --- a/packages/isaac-typescript-definitions/src/types/classes/GridEntity.d.ts +++ b/packages/isaac-typescript-definitions/src/types/classes/GridEntity.d.ts @@ -4,6 +4,10 @@ import type { GridEntityType } from "../../enums/GridEntityType"; declare global { interface GridEntity extends IsaacAPIClass { Destroy: (immediate: boolean) => boolean; + + /** Added in Repentance+. */ + DestroyWithSource: (immediate: boolean, source: EntityRef) => boolean; + GetGridIndex: () => int; /** The RNG returned is a reference (i.e. not a copy). */ @@ -17,6 +21,10 @@ declare global { GetType: () => GridEntityType; GetVariant: () => int; Hurt: (damage: int) => boolean; + + /** Added in Repentance+. */ + HurtWithSource: (damage: int, source: EntityRef) => boolean; + Init: (seed: Seed) => void; PostInit: () => void; Render: (offset: Vector) => void; diff --git a/packages/isaac-typescript-definitions/src/types/classes/HUD.d.ts b/packages/isaac-typescript-definitions/src/types/classes/HUD.d.ts index 18f69cbc0..4feb4d75e 100644 --- a/packages/isaac-typescript-definitions/src/types/classes/HUD.d.ts +++ b/packages/isaac-typescript-definitions/src/types/classes/HUD.d.ts @@ -45,9 +45,23 @@ declare global { /** * Shows the pickup text for the specified item as if it was picked up by the specified player. * The overloaded method supports showing custom pickup text. + * + * The `stackUpText` parameter was added in Repentance+. If it is missing or true, then it + * clears the message stack (Repentance functionality). If it is false, then the text will stack + * up (Repentance+ functionality). These values are counterintuitive, so it seems likely that + * the developers made a mistake. */ - ShowItemText: ((player: EntityPlayer, item: ItemConfigItem) => void) & - ((name: string, description?: string, paper?: boolean) => void); + ShowItemText: (( + player: EntityPlayer, + item: ItemConfigItem, + stackUpText: boolean, + ) => void) + & (( + mainString: string, + secondaryString?: string, + isCurseDisplay?: boolean, + stackUpText?: boolean, + ) => void); Update: () => void; } diff --git a/packages/isaac-typescript-definitions/src/types/classes/ItemPool.d.ts b/packages/isaac-typescript-definitions/src/types/classes/ItemPool.d.ts index 00334f931..e66214dbe 100644 --- a/packages/isaac-typescript-definitions/src/types/classes/ItemPool.d.ts +++ b/packages/isaac-typescript-definitions/src/types/classes/ItemPool.d.ts @@ -26,12 +26,15 @@ declare global { * @param decrease Default is false. * @param seed Default is `Random()`. * @param defaultItem Default is `CollectibleType.NULL`. + * @param backupItemPoolType Default is `ItemPoolType.POOL_NULL`. This parameter was added in + * Repentance+. */ GetCollectible: ( itemPoolType: ItemPoolType, decrease?: boolean, seed?: Seed, defaultItem?: CollectibleType, + backupItemPoolType?: ItemPoolType, ) => CollectibleType; GetLastPool: () => ItemPoolType; @@ -56,13 +59,13 @@ declare global { ) => PillEffect | -1; /** - * Note that this function will return `ItemPoolType.NULL` for `RoomType.DEFAULT`, which may be - * unexpected. + * Note that this function will return `ItemPoolType.NULL` (-1) for `RoomType.DEFAULT` (1), + * which may be unexpected. * * @param roomType * @param seed */ - GetPoolForRoom: (roomType: RoomType, seed: Seed) => ItemPoolType; + GetPoolForRoom: (roomType: RoomType, seed: Seed) => ItemPoolType | -1; /** @param dontAdvanceRNG Default is false. */ GetTrinket: (dontAdvanceRNG?: boolean) => TrinketType; diff --git a/packages/isaac-typescript-definitions/src/types/classes/Level.d.ts b/packages/isaac-typescript-definitions/src/types/classes/Level.d.ts index fcde9c902..d5cde9e8e 100644 --- a/packages/isaac-typescript-definitions/src/types/classes/Level.d.ts +++ b/packages/isaac-typescript-definitions/src/types/classes/Level.d.ts @@ -34,10 +34,10 @@ declare global { CanStageHaveCurseOfLabyrinth: (levelStage: LevelStage) => boolean; /** - * @deprecated This method does not update the "fxlayers" properly. Use the `Game.ChangeRoom` - * method instead. * @param roomGridIndex The room grid index of the destination room. * @param dimension Default is `Dimension.CURRENT`. + * @deprecated This method does not update the "fxlayers" properly. Use the `Game.ChangeRoom` + * method instead. */ ChangeRoom: (roomGridIndex: int | GridRoom, dimension?: Dimension) => void; @@ -70,8 +70,8 @@ declare global { /** Returns the current room's grid index. */ GetCurrentRoomIndex: () => int; + /* eslint-disable complete/require-ascii */ // cspell:ignore Maldición oscuridad - /** * Returns the name of the current floor's curse, like "Curse of the Unknown!". If there are two * or more curses on the floor, this will only return the name of the curse with the lowest ID. @@ -79,6 +79,7 @@ declare global { * of Darkness in Spanish. */ GetCurseName: () => string; + /* eslint-enable complete/require-ascii */ GetCurses: () => BitFlags; GetDevilAngelRoomRNG: () => RNG; diff --git a/packages/isaac-typescript-definitions/src/types/classes/Options.d.ts b/packages/isaac-typescript-definitions/src/types/classes/Options.d.ts index 56a7e75c9..fe0d5f7ed 100644 --- a/packages/isaac-typescript-definitions/src/types/classes/Options.d.ts +++ b/packages/isaac-typescript-definitions/src/types/classes/Options.d.ts @@ -2,6 +2,7 @@ import type { AnnouncerVoiceMode } from "../../enums/AnnouncerVoiceMode"; import type { CameraStyle } from "../../enums/CameraStyle"; import type { ConsoleFont } from "../../enums/ConsoleFont"; import type { ExtraHudStyle } from "../../enums/ExtraHudStyle"; +import type { JacobEsauControls } from "../../enums/JacobEsauControls"; import type { LanguageAbbreviation } from "../../enums/LanguageAbbreviation"; declare global { @@ -120,6 +121,15 @@ declare global { */ let BulletVisibility: boolean; + /** + * Toggles the way to activate Esau's items. + * + * This can be changed from the in-game options menu. + * + * Added in Repentance+. + */ + let JacobEsauControls: JacobEsauControls; + /** * Whether the announcer voice should play when using items, pills, cards, and runes. * diff --git a/packages/isaac-typescript-definitions/src/types/classes/Room.d.ts b/packages/isaac-typescript-definitions/src/types/classes/Room.d.ts index 97a5b8854..c5535ba83 100644 --- a/packages/isaac-typescript-definitions/src/types/classes/Room.d.ts +++ b/packages/isaac-typescript-definitions/src/types/classes/Room.d.ts @@ -36,7 +36,23 @@ declare global { ) => LuaMultiReturn<[clear: boolean, collidePos: Vector]>; DamageGrid: (index: int, damage: int) => boolean; + + /** Added in Repentance+. */ + DamageGridWithSource: ( + index: int, + damage: int, + source: EntityRef, + ) => boolean; + DestroyGrid: (index: int, immediate: boolean) => boolean; + + /** Added in Repentance+. */ + DestroyGridWithSource: ( + index: int, + immediate: boolean, + source: EntityRef, + ) => boolean; + EmitBloodFromWalls: (duration: int, count: int) => void; /** @@ -204,7 +220,15 @@ declare global { IsPositionInRoom: (position: Vector, margin: float) => boolean; IsSacrificeDone: () => boolean; KeepDoorsClosed: () => void; - MamaMegaExplosion: (position: Vector) => void; + + /** + * @param position Optional. The position where the explosion should originate. Default is + * `Vector.Zero`. + * @param player Optional. The player that the explosion should come from. This parameter was + * added in Repentance+. + */ + MamaMegaExplosion: (position?: Vector, player?: EntityPlayer) => void; + PlayMusic: () => void; RemoveDoor: (doorSlot: DoorSlot) => void; diff --git a/packages/isaac-typescript-definitions/src/types/classes/Sprite.d.ts b/packages/isaac-typescript-definitions/src/types/classes/Sprite.d.ts index 3f74808f3..71f3dc681 100644 --- a/packages/isaac-typescript-definitions/src/types/classes/Sprite.d.ts +++ b/packages/isaac-typescript-definitions/src/types/classes/Sprite.d.ts @@ -186,9 +186,12 @@ declare interface Sprite extends IsaacAPIClass { * * @param layerID * @param pngPath The full path to the PNG file. For example: - * "gfx/items/collectibles/questionmark.png" + * "gfx/items/collectibles/questionmark.png" + * @returns `true` if the spritesheet at the given layer ID was successfully replaced and if the + * new spritesheet is not the same as the old one, otherwise `false`. This return value + * was added in Repentance+. */ - ReplaceSpritesheet: (layerID: int, pngPath: string) => void; + ReplaceSpritesheet: (layerID: int, pngPath: string) => boolean; /** * Resets the sprite such that it will be equivalent to a new sprite created with the `Sprite` @@ -219,8 +222,8 @@ declare interface Sprite extends IsaacAPIClass { * * @param frameNum The frame number of the current animation to set. */ - SetFrame: ((frameNum: int) => void) & - ((animation: string, frameNum: int) => void); + SetFrame: ((frameNum: int) => void) + & ((animation: string, frameNum: int) => void); SetLastFrame: () => void; SetLayerFrame: (layerID: int, frameNum: int) => void; @@ -232,7 +235,7 @@ declare interface Sprite extends IsaacAPIClass { * @param reset Default is true. Passing false will continue the animation from the current frame. * This can be useful for seamlessly switching between two similar animations. */ - SetOverlayAnimation: (animation: string) => boolean; + SetOverlayAnimation: (animation: string, reset?: boolean) => boolean; SetOverlayFrame: (animation: string, frameNum: int) => void; SetOverlayRenderPriority: (renderFirst: boolean) => void; diff --git a/packages/isaac-typescript-definitions/src/types/functions.d.ts b/packages/isaac-typescript-definitions/src/types/functions.d.ts index 952443904..7cbba6bf3 100644 --- a/packages/isaac-typescript-definitions/src/types/functions.d.ts +++ b/packages/isaac-typescript-definitions/src/types/functions.d.ts @@ -2,8 +2,8 @@ * These are global functions provided by C++ code. Note that additional global functions are * located in the "main.d.ts" file (which corresponds to the "main.lua" file). * - * @noSelfInFile * @module + * @noSelfInFile */ /** diff --git a/packages/isaac-typescript-definitions/src/types/index.d.ts b/packages/isaac-typescript-definitions/src/types/index.d.ts index 866aa3fa3..9abf7cb90 100644 --- a/packages/isaac-typescript-definitions/src/types/index.d.ts +++ b/packages/isaac-typescript-definitions/src/types/index.d.ts @@ -45,6 +45,7 @@ /// /// /// +/// /// /// /// @@ -96,8 +97,6 @@ // Unofficial Classes and Types // ---------------------------- -/// - /// /// /// @@ -105,6 +104,7 @@ /// /// /// +/// /// /// /// diff --git a/packages/isaac-typescript-definitions/src/types/main.d.ts b/packages/isaac-typescript-definitions/src/types/main.d.ts index 90abda12b..467bc2b91 100644 --- a/packages/isaac-typescript-definitions/src/types/main.d.ts +++ b/packages/isaac-typescript-definitions/src/types/main.d.ts @@ -5,8 +5,8 @@ * C:\Program Files (x86)\Steam\steamapps\common\The Binding of Isaac Rebirth\resources\main.lua * ``` * - * @noSelfInFile * @module + * @noSelfInFile */ /** @@ -32,3 +32,11 @@ declare function StartDebug(): void; * @deprecated */ declare const REPENTANCE: never; + +/** + * This can be overwritten by other mods, so it is not safe to use. Use the `isRepentancePlus` + * helper function instead. + * + * @deprecated + */ +declare const REPENTANCE_PLUS: never; diff --git a/packages/isaac-typescript-definitions/src/types/mods/EID.d.ts b/packages/isaac-typescript-definitions/src/types/mods/EID.d.ts index 78649b55c..e69462450 100644 --- a/packages/isaac-typescript-definitions/src/types/mods/EID.d.ts +++ b/packages/isaac-typescript-definitions/src/types/mods/EID.d.ts @@ -1,3 +1,9 @@ +/** + * This is the global variable exposed by the third-party External Item Descriptions mod, which + * provides descriptions for items and is often utilized by other mods that include items. + * + * @see https://steamcommunity.com/sharedfiles/filedetails/?id=836319872 + */ declare const EID: EIDInterface | undefined; declare interface EIDDescriptionObject { @@ -77,9 +83,10 @@ declare interface EIDInterface { ) => void; /** - * Adds Description object modifiers. Used for altering descriptions. Examples: Spindown Dice, + * Adds description object modifiers. Used for altering descriptions. Examples: Spindown Dice, * Tarot Cloth, etc. * + * @param modifierName * @param condition A function that returns `true` if `callback` should be called on the given * EIDDescriptionObject. * @param callback A function that returns a modified version of the given EIDDescriptionObject. @@ -327,7 +334,7 @@ declare interface EIDInterface { Type: int, Variant: int, SubType: int, - ) => ["", "", string] | ["", string, string] | undefined; + ) => ["", string, string] | undefined; /** Get `KColor` object of "Entity Name" texts. */ getNameColor: () => KColor; diff --git a/packages/isaac-typescript-definitions/src/types/mods/Encyclopedia.d.ts b/packages/isaac-typescript-definitions/src/types/mods/Encyclopedia.d.ts index 73783126a..fa078f9c0 100644 --- a/packages/isaac-typescript-definitions/src/types/mods/Encyclopedia.d.ts +++ b/packages/isaac-typescript-definitions/src/types/mods/Encyclopedia.d.ts @@ -2,6 +2,12 @@ import type { PlayerType } from "../../enums/collections/subTypes"; import type { EncyclopediaItemPoolType } from "../../enums/mods/EncyclopediaItemPoolType"; declare global { + /** + * This is the global variable exposed by the third-party Encyclopedia mod, which provides + * descriptions for items and is often utilized by other mods that include items. + * + * @see https://steamcommunity.com/workshop/filedetails/?id=2376005362 + */ const Encyclopedia: EncyclopediaInterface | undefined; /** @noSelf */ diff --git a/packages/isaac-typescript-definitions/src/types/mods/MinimapAPI.d.ts b/packages/isaac-typescript-definitions/src/types/mods/MinimapAPI.d.ts index cb8d9c51b..b62c35e8a 100644 --- a/packages/isaac-typescript-definitions/src/types/mods/MinimapAPI.d.ts +++ b/packages/isaac-typescript-definitions/src/types/mods/MinimapAPI.d.ts @@ -7,6 +7,12 @@ import type { RoomShape } from "../../enums/RoomShape"; import type { RoomType } from "../../enums/RoomType"; declare global { + /** + * This is the global variable exposed by the third-party MiniMAPI mod, which provides + * descriptions for items and is often utilized by other mods that include items. + * + * @see https://steamcommunity.com/sharedfiles/filedetails/?id=1978904635 + */ const MinimapAPI: MinimapAPIInterface | undefined; interface MinimapAPIInterface { diff --git a/packages/isaac-typescript-definitions/src/types/mods/ModConfigMenu.d.ts b/packages/isaac-typescript-definitions/src/types/mods/ModConfigMenu.d.ts index 51c6a352c..8a07ffa05 100644 --- a/packages/isaac-typescript-definitions/src/types/mods/ModConfigMenu.d.ts +++ b/packages/isaac-typescript-definitions/src/types/mods/ModConfigMenu.d.ts @@ -3,6 +3,12 @@ import type { Keyboard } from "../../enums/Keyboard"; import type { ModConfigMenuOptionType } from "../../enums/mods/ModConfigMenuOptionType"; declare global { + /** + * This is the global variable exposed by the third-party Mod Config Menu mod, which provides a + * menu and is often utilized by other mods. + * + * @see https://steamcommunity.com/sharedfiles/filedetails/?id=2681875787 + */ const ModConfigMenu: ModConfigMenuInterface | undefined; /** @noSelf */ diff --git a/packages/isaac-typescript-definitions/src/types/mods/MusicModCallback.d.ts b/packages/isaac-typescript-definitions/src/types/mods/MusicModCallback.d.ts index 69b75d332..cb3b77fca 100644 --- a/packages/isaac-typescript-definitions/src/types/mods/MusicModCallback.d.ts +++ b/packages/isaac-typescript-definitions/src/types/mods/MusicModCallback.d.ts @@ -1,6 +1,12 @@ import type { Music } from "../../enums/Music"; declare global { + /** + * This is the global variable exposed by the third-party Music Mod Callback mod, which is often + * utilized by other mods to play custom music tracks. + * + * @see https://steamcommunity.com/workshop/filedetails/?id=2491006386 + */ const MMC: MusicModCallback | undefined; /** @noSelf */ diff --git a/packages/isaac-typescript-definitions/src/types/mods/Sandbox.d.ts b/packages/isaac-typescript-definitions/src/types/mods/Sandbox.d.ts index ada1323f5..5106b95e8 100644 --- a/packages/isaac-typescript-definitions/src/types/mods/Sandbox.d.ts +++ b/packages/isaac-typescript-definitions/src/types/mods/Sandbox.d.ts @@ -1,6 +1,9 @@ -// This is the Racing+ sandbox provided by the Electron client. - -/** @noSelf */ +/** + * This is the Racing+ sandbox provided by the Electron client. + * + * @noSelf + * @see https://isaacracing.net/ + */ declare interface Sandbox { connect: ( hostname: string, diff --git a/packages/isaac-typescript-definitions/src/types/mods/SandboxGlobals.d.ts b/packages/isaac-typescript-definitions/src/types/mods/SandboxGlobals.d.ts index ea51c4af5..bc52f8834 100644 --- a/packages/isaac-typescript-definitions/src/types/mods/SandboxGlobals.d.ts +++ b/packages/isaac-typescript-definitions/src/types/mods/SandboxGlobals.d.ts @@ -3,6 +3,8 @@ /** * This is a global function provided by the Racing+ client sandbox. If the sandbox is not present, * it will be undefined. + * + * @see https://isaacracing.net/ */ declare const SandboxGetDate: (() => string) | undefined; @@ -11,6 +13,7 @@ declare const SandboxGetDate: (() => string) | undefined; * it will be undefined. * * @param levels The amount of levels to look backwards in the call stack. + * @see https://isaacracing.net/ */ declare const SandboxGetParentFunctionDescription: | ((levels: int) => string) @@ -19,17 +22,23 @@ declare const SandboxGetParentFunctionDescription: /** * This is a global function provided by the Racing+ client sandbox. If the sandbox is not present, * it will be undefined. + * + * @see https://isaacracing.net/ */ declare const SandboxGetTime: (() => float) | undefined; /** * This is a global function provided by the Racing+ client sandbox. If the sandbox is not present, * it will be undefined. + * + * @see https://isaacracing.net/ */ declare const SandboxGetTraceback: (() => string) | undefined; /** * This is a global function provided by the Racing+ client sandbox. If the sandbox is not present, * it will be undefined. + * + * @see https://isaacracing.net/ */ declare const SandboxTraceback: (() => void) | undefined; diff --git a/packages/isaac-typescript-definitions/src/types/mods/StageAPI.d.ts b/packages/isaac-typescript-definitions/src/types/mods/StageAPI.d.ts index fd7a49cc2..1ba618556 100644 --- a/packages/isaac-typescript-definitions/src/types/mods/StageAPI.d.ts +++ b/packages/isaac-typescript-definitions/src/types/mods/StageAPI.d.ts @@ -11,6 +11,12 @@ import type { StageType } from "../../enums/StageType"; import type { StageAPICallback } from "../../enums/mods/StageAPIEnums"; declare global { + /** + * This is the global variable exposed by the third-party StageAPI mod, which allows mods to + * create custom stages. + * + * @see https://steamcommunity.com/sharedfiles/filedetails/?id=1348031964 + */ const StageAPI: StageAPIInterface | undefined; interface StageAPICallbackParameters { @@ -222,6 +228,7 @@ declare global { /** * Convenience function that assembles filenames and packages them in a Backdrop for you. * + * @param backdrop * @param prefix The path to the directory containing the backdrop sprite sheets, as well as any * shared prefix. Example: `gfx/backdrop/revel1/glacier/main_` * @param suffix Generally the file extension, e.g.: `".png"` @@ -236,8 +243,8 @@ declare global { backdrop: StageAPIBackdrop, justWalls?: boolean, storeBackdropEntities?: false, - ) => void) & - (( + ) => void) + & (( backdrop: StageAPIBackdrop, justWalls: boolean, storeBackdropEntities: true, @@ -277,13 +284,20 @@ declare global { * usage. * * @param name NAME IS NOT OPTIONAL. USED FOR IDENTIFICATION AFTER SAVING. + * @param gridEntityType + * @param baseVariant * @param anm2 Path to the anm2 file for this entity. * @param animation The animation name to play. * @param frame Which frame to display. + * @param variantFrames + * @param offset + * @param overrideGridSpawns + * @param overrideGridSpawnAtState + * @param forceSpawning */ CustomGrid: ( name: string, - GridEntityType: GridEntityType, + gridEntityType: GridEntityType, baseVariant: number, anm2: string, animation: string, @@ -299,6 +313,7 @@ declare global { * Creates a new custom stage. * * @param name MUST BE UNIQUE. USED TO IDENTIFY STAGE AND FOR SAVING CURRENT STAGE. + * @param stageOverrideStage * @param noSetReplaces Replaces defaults to catacombs one if noSetReplaces is not set. */ CustomStage: ( diff --git a/packages/isaac-typescript-definitions/src/types/mods/StageAPIInterfaces.d.ts b/packages/isaac-typescript-definitions/src/types/mods/StageAPIInterfaces.d.ts index 4957954b3..6f06081a2 100644 --- a/packages/isaac-typescript-definitions/src/types/mods/StageAPIInterfaces.d.ts +++ b/packages/isaac-typescript-definitions/src/types/mods/StageAPIInterfaces.d.ts @@ -116,9 +116,9 @@ declare global { /** * Sets the RoomGfx used by the stage. * - * @param RoomTypes The room types these gfx apply to. - * - * Can be a string identifier, a `RoomType`, or an array of either. + * @param roomGfx + * @param roomTypes The room types these gfx apply to. Can be a string identifier, a `RoomType`, + * or an array of either. */ SetRoomGfx: ( roomGfx: StageAPIRoomGfx, @@ -198,8 +198,8 @@ declare global { filename: string, altPitsFilename?: string, hasExtraFrames?: boolean, - ) => void) & - (( + ) => void) + & (( filenames: ReadonlyArray<{ filename: string; hasExtraFrames?: boolean; diff --git a/packages/isaac-typescript-definitions/src/types/socket.d.ts b/packages/isaac-typescript-definitions/src/types/socket.d.ts index 894645ecf..0d7eb3a2b 100644 --- a/packages/isaac-typescript-definitions/src/types/socket.d.ts +++ b/packages/isaac-typescript-definitions/src/types/socket.d.ts @@ -99,7 +99,10 @@ declare interface SocketClient { * timeout during the operation. Also, after the error message, the function returns the partial * result of the transmission. */ - receive: () => LuaMultiReturn<[data: string | undefined, errMsg: string]>; + receive: ( + pattern?: "*a" | "*l" | int, + prefix?: string, + ) => LuaMultiReturn<[data: string | undefined, errMsg: string]>; /** * Sends data through client object. diff --git a/packages/isaac-typescript-definitions/src/types/unofficial/AddCallbackParameters.d.ts b/packages/isaac-typescript-definitions/src/types/unofficial/AddCallbackParameters.d.ts index decfee89e..db63ca29e 100644 --- a/packages/isaac-typescript-definitions/src/types/unofficial/AddCallbackParameters.d.ts +++ b/packages/isaac-typescript-definitions/src/types/unofficial/AddCallbackParameters.d.ts @@ -1,4 +1,4 @@ -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ import type { ActiveSlot } from "../../enums/ActiveSlot"; import type { ButtonAction } from "../../enums/ButtonAction"; diff --git a/packages/isaac-typescript-definitions/tsconfig.json b/packages/isaac-typescript-definitions/tsconfig.json index 156033dc8..43ecfe08d 100644 --- a/packages/isaac-typescript-definitions/tsconfig.json +++ b/packages/isaac-typescript-definitions/tsconfig.json @@ -2,12 +2,17 @@ "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-isaacscript-schema.json", "extends": [ - "../isaacscript-tsconfig/tsconfig.base.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + "../isaacscript-tsconfig/tsconfig.mod.json", ], // https://www.typescriptlang.org/docs/handbook/compiler-options.html "compilerOptions": { + // We need to negate the default "outDir" of "mod". + "outDir": "${configDir}/dist", + // Needed so that the output goes to "./dist/index.lua" instead of "./dist/src/index.lua". "rootDir": "src", diff --git a/packages/isaacscript-cli/README.md b/packages/isaacscript-cli/README.md index ed36d8a8d..c6cf49658 100644 --- a/packages/isaacscript-cli/README.md +++ b/packages/isaacscript-cli/README.md @@ -1,4 +1,4 @@ -# isaacscript-cli +# `isaacscript-cli` [![npm version](https://img.shields.io/npm/v/isaacscript.svg)](https://www.npmjs.com/package/isaacscript) diff --git a/packages/isaacscript-cli/eslint.config.mjs b/packages/isaacscript-cli/eslint.config.mjs index 043799caf..871257c6f 100644 --- a/packages/isaacscript-cli/eslint.config.mjs +++ b/packages/isaacscript-cli/eslint.config.mjs @@ -1,20 +1,28 @@ -import tseslint from "typescript-eslint"; -import { base } from "../eslint-config-isaacscript/base.js"; -import { monorepo } from "../eslint-config-isaacscript/monorepo.js"; +// @ts-check -export default tseslint.config( - ...base, - ...monorepo, +import { completeConfigBase } from "eslint-config-complete"; +import { defineConfig } from "eslint/config"; + +export default defineConfig( + ...completeConfigBase, + + { + rules: { + // TODO: https://github.com/eslint/eslint/issues/20272 + "@typescript-eslint/unified-signatures": "off", + }, + }, { + files: ["**/copied/*.ts"], rules: { /** - * Defined in: "isaacscript/recommended" + * Defined in: "complete/recommended" * * Enums that are used with the API must be numbers since that is what the API expects. We * also prefer that unofficial enums are also number enums for consistency. */ - "isaacscript/no-number-enums": "off", + "complete/no-number-enums": "off", }, }, @@ -28,8 +36,8 @@ export default tseslint.config( { ignores: [ - // We don't want to lint template files, since they won't actually have valid code inside of - // them yet. + // We do not want to lint template files, since they do not have valid code inside of them + // yet. "**/file-templates/**", // We do not want to lint the compiled plugins. (Unlike other files, they are compiled to the diff --git a/packages/isaacscript-cli/file-templates/dynamic/.github/workflows/setup/action.yml b/packages/isaacscript-cli/file-templates/dynamic/.github/workflows/setup/action.yml index 377788441..a418d43fe 100644 --- a/packages/isaacscript-cli/file-templates/dynamic/.github/workflows/setup/action.yml +++ b/packages/isaacscript-cli/file-templates/dynamic/.github/workflows/setup/action.yml @@ -2,11 +2,6 @@ runs: using: composite steps: - # https://github.com/actions/setup-node/issues/899 - - name: Enable corepack to work around a setup-node bug - run: corepack enable - shell: bash # Composite jobs must specify the shell. - - name: Setup Node.js uses: actions/setup-node@v4 with: diff --git a/packages/isaacscript-cli/file-templates/dynamic/.yarnrc.yml b/packages/isaacscript-cli/file-templates/dynamic/.yarnrc.yml deleted file mode 100644 index 3186f3f07..000000000 --- a/packages/isaacscript-cli/file-templates/dynamic/.yarnrc.yml +++ /dev/null @@ -1 +0,0 @@ -nodeLinker: node-modules diff --git a/packages/isaacscript-cli/file-templates/dynamic/Node.gitignore b/packages/isaacscript-cli/file-templates/dynamic/Node.gitignore index c6bba5913..2aa8c99a5 100644 --- a/packages/isaacscript-cli/file-templates/dynamic/Node.gitignore +++ b/packages/isaacscript-cli/file-templates/dynamic/Node.gitignore @@ -5,7 +5,6 @@ npm-debug.log* yarn-debug.log* yarn-error.log* lerna-debug.log* -.pnpm-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -57,12 +56,6 @@ web_modules/ # Optional stylelint cache .stylelintcache -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - # Optional REPL history .node_repl_history @@ -74,10 +67,8 @@ web_modules/ # dotenv environment variable files .env -.env.development.local -.env.test.local -.env.production.local -.env.local +.env.* +!.env.example # parcel-bundler cache (https://parceljs.org/) .cache @@ -90,6 +81,7 @@ out # Nuxt.js build / generate output .nuxt dist +.output # Gatsby files .cache/ @@ -104,6 +96,15 @@ dist .temp .cache +# Sveltekit cache directory +.svelte-kit/ + +# vitepress build output +**/.vitepress/dist + +# vitepress cache directory +**/.vitepress/cache + # Docusaurus cache and generated files .docusaurus @@ -116,15 +117,28 @@ dist # DynamoDB Local files .dynamodb/ +# Firebase cache directory +.firebase/ + # TernJS port file .tern-port # Stores VSCode versions used for testing VSCode extensions .vscode-test -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz +# pnpm +.pnpm-store + +# yarn v3 .pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +# Vite files +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +.vite/ diff --git a/packages/isaacscript-cli/file-templates/dynamic/README.mod.md b/packages/isaacscript-cli/file-templates/dynamic/README.md similarity index 94% rename from packages/isaacscript-cli/file-templates/dynamic/README.mod.md rename to packages/isaacscript-cli/file-templates/dynamic/README.md index c4c38a656..b13a998cd 100644 --- a/packages/isaacscript-cli/file-templates/dynamic/README.mod.md +++ b/packages/isaacscript-cli/file-templates/dynamic/README.md @@ -19,6 +19,6 @@ If you are a developer, or if the mod is not yet uploaded to the Steam Workshop, - Open the command prompt (or another shell of your choice). - Use the `cd` command to navigate to the place where you unzipped the repository. - Use the `PACKAGE-MANAGER-INSTALL-COMMAND` command to install the project dependencies. -- Use the `npx isaacscript` command to start the IsaacScript watcher. +- Use the `PACKAGE-MANAGER-EXEC-COMMAND isaacscript` command to start the IsaacScript watcher. - If IsaacScript is successful, you will see "Compilation successful." (You can continue to leave the terminal window open; it will monitor for changes in your project, and recompile if necessary.) - Completely close Isaac if it is already open, and then open the game again, and the mod should be in the list of mods. You can now play or test the mod. diff --git a/packages/isaacscript-cli/file-templates/dynamic/README.ts.md b/packages/isaacscript-cli/file-templates/dynamic/README.ts.md deleted file mode 100644 index 5d0d81368..000000000 --- a/packages/isaacscript-cli/file-templates/dynamic/README.ts.md +++ /dev/null @@ -1,3 +0,0 @@ -# PROJECT-NAME - -PROJECT-NAME is a [TypeScript](https://www.typescriptlang.org/) project. diff --git a/packages/isaacscript-cli/file-templates/dynamic/_gitignore b/packages/isaacscript-cli/file-templates/dynamic/_gitignore index b5da5e74d..481dff98c 100644 --- a/packages/isaacscript-cli/file-templates/dynamic/_gitignore +++ b/packages/isaacscript-cli/file-templates/dynamic/_gitignore @@ -2,13 +2,11 @@ .DS_Store thumbs.db -# @template-mod-start # Per-user IsaacScript settings isaacscript.json # The transpiled Lua output mod/main.lua -# @template-mod-end # ------------------------------ # GitHub Node.gitignore template diff --git a/packages/isaacscript-cli/file-templates/dynamic/package.json b/packages/isaacscript-cli/file-templates/dynamic/package.json new file mode 100644 index 000000000..859cddb1f --- /dev/null +++ b/packages/isaacscript-cli/file-templates/dynamic/package.json @@ -0,0 +1,33 @@ +{ + "name": "project-name", + "version": "0.0.0", + "description": "A mod for The Binding of Isaac: Repentance.", + "keywords": [ + "isaac", + "mod", + "rebirth", + "afterbirth", + "repentance" + ], + "license": "GPL-3.0", + "type": "module", + "scripts": { + "build": "tstl", + "lint": "tsx ./scripts/lint.ts", + "nuke": "isaacscript nuke", + "publish": "isaacscript publish", + "start": "isaacscript monitor", + "update": "isaacscript update" + }, + "dependencies": { + "isaac-typescript-definitions": "0.0.1", + "isaacscript-common": "0.0.1" + }, + "devDependencies": { + "complete-node": "0.0.1", + "isaacscript": "0.0.1", + "isaacscript-lint": "0.0.1", + "typescript": "0.0.1", + "typescript-to-lua": "0.0.1" + } +} diff --git a/packages/isaacscript-cli/file-templates/dynamic/package.mod.json b/packages/isaacscript-cli/file-templates/dynamic/package.mod.json deleted file mode 100644 index fab5812ba..000000000 --- a/packages/isaacscript-cli/file-templates/dynamic/package.mod.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "PROJECT_NAME", - "version": "0.0.0", - "description": "A mod for The Binding of Isaac: Repentance.", - "keywords": ["isaac", "mod", "rebirth", "afterbirth", "repentance"], - "license": "GPL-3.0", - "type": "module", - "scripts": { - "build": "tstl", - "lint": "tsx ./scripts/lint.ts", - "nuke": "isaacscript nuke", - "publish": "isaacscript publish", - "start": "isaacscript monitor", - "update": "isaacscript update" - }, - "dependencies": { - "isaac-typescript-definitions": "^0.0.1", - "isaacscript-common": "^0.0.1" - }, - "devDependencies": { - "isaacscript": "^0.0.1", - "isaacscript-common-node": "^0.0.1", - "isaacscript-lint": "^0.0.1", - "isaacscript-spell": "^0.0.1", - "isaacscript-tsconfig": "^0.0.1", - "tsx": "^0.0.1", - "typescript": "5.5.2", - "typescript-to-lua": "^0.0.1" - } -} diff --git a/packages/isaacscript-cli/file-templates/dynamic/package.ts.json b/packages/isaacscript-cli/file-templates/dynamic/package.ts.json deleted file mode 100644 index 684d275bc..000000000 --- a/packages/isaacscript-cli/file-templates/dynamic/package.ts.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "PROJECT_NAME", - "version": "0.0.0", - "description": "", - "keywords": [], - "homepage": "https://github.com/AUTHOR_NAME/PROJECT_NAME", - "bugs": { - "url": "https://github.com/AUTHOR_NAME/PROJECT_NAME/issues" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/AUTHOR_NAME/PROJECT_NAME.git" - }, - "license": "GPL-3.0", - "author": "AUTHOR_NAME", - "type": "module", - "files": ["dist", "LICENSE", "package.json", "README.md"], - "scripts": { - "build": "tsx ./scripts/build.ts", - "lint": "tsx ./scripts/lint.ts", - "nuke": "isaacscript nuke", - "publish": "isaacscript publish-ts", - "start": "tsx ./src/main.ts", - "update": "isaacscript update" - }, - "devDependencies": { - "@types/node": "^0.0.1", - "isaacscript": "^0.0.1", - "isaacscript-common-node": "^0.0.1", - "isaacscript-lint": "^0.0.1", - "isaacscript-tsconfig": "^0.0.1", - "tsx": "^0.0.1", - "typescript": "^0.0.1" - } -} diff --git a/packages/isaacscript-cli/file-templates/static-mod/_eslint.config.mjs b/packages/isaacscript-cli/file-templates/static-mod/_eslint.config.mjs deleted file mode 100644 index 8ea62530d..000000000 --- a/packages/isaacscript-cli/file-templates/static-mod/_eslint.config.mjs +++ /dev/null @@ -1,21 +0,0 @@ -// This is the configuration file for ESLint, the TypeScript linter: -// https://eslint.org/docs/latest/use/configure/ - -export default { - extends: [ - // The linter base is the IsaacScript mod config: - // https://github.com/IsaacScript/isaacscript/blob/main/packages/eslint-config-isaacscript/mod.js - "eslint-config-isaacscript/mod", - ], - - parserOptions: { - // ESLint needs to know about the project's TypeScript settings in order for TypeScript-specific - // things to lint correctly. We do not point this at "./tsconfig.json" because certain files - // (such at this file) should be linted but not included in the actual project output. - project: "./tsconfig.eslint.json", - }, - - rules: { - // Insert changed or disabled rules here, if necessary. - }, -}; diff --git a/packages/isaacscript-cli/file-templates/static-ts/.prettierignore b/packages/isaacscript-cli/file-templates/static-ts/.prettierignore deleted file mode 100644 index 97432bcfe..000000000 --- a/packages/isaacscript-cli/file-templates/static-ts/.prettierignore +++ /dev/null @@ -1,11 +0,0 @@ -# Compiled output -dist - -# Package manager lock files -package-lock.json -yarn.lock -pnpm-lock.yaml - -# Minified files -*.min.js -*.min.css diff --git a/packages/isaacscript-cli/file-templates/static-ts/.vscode/extensions.json b/packages/isaacscript-cli/file-templates/static-ts/.vscode/extensions.json deleted file mode 100644 index 0f8d1ccc3..000000000 --- a/packages/isaacscript-cli/file-templates/static-ts/.vscode/extensions.json +++ /dev/null @@ -1,9 +0,0 @@ -// These are Visual Studio Code extensions that are intended to be used with this particular -// repository: https://go.microsoft.com/fwlink/?LinkId=827846 -{ - "recommendations": [ - "esbenp.prettier-vscode", // The TypeScript formatter - "dbaeumer.vscode-eslint", // The TypeScript linter - "streetsidesoftware.code-spell-checker", // A spell-checker extension based on CSpell - ], -} diff --git a/packages/isaacscript-cli/file-templates/static-ts/.vscode/settings.json b/packages/isaacscript-cli/file-templates/static-ts/.vscode/settings.json deleted file mode 100644 index 11ebde683..000000000 --- a/packages/isaacscript-cli/file-templates/static-ts/.vscode/settings.json +++ /dev/null @@ -1,71 +0,0 @@ -// These are Visual Studio Code settings that should apply to this particular repository. -{ - // ---------------- - // Vanilla settings - // ---------------- - - // This matches the Airbnb JavaScript style guide. - "editor.rulers": [100], - "editor.tabSize": 2, - - "files.associations": { - ".env*": "shellscript", // e.g. ".env.example" is the same as ".env". - }, - - // We want to always use "lf" to be consistent with all platforms. - "files.eol": "\n", - - // Automatically remove all trailing whitespace when saving a file. - "files.trimTrailingWhitespace": true, - - // Configure glob patterns for excluding files and folders in full text searches and quick open. - "search.exclude": { - "**/*.mp3": true, - "**/*.png": true, - "**/*.svg": true, - "**/*.wav": true, - "**/.yarn/": true, - "**/dist/": true, - "**/node_modules/": true, - "LICENSE": true, - }, - - // ------------------ - // Extension settings - // ------------------ - - // Use Prettier to format "cspell.jsonc". - "cSpell.autoFormatConfigFile": true, - - // ----------------- - // Language settings - // ----------------- - - // By default, VSCode will not automatically fill-in function arguments. - "javascript.suggest.completeFunctionCalls": true, - "typescript.suggest.completeFunctionCalls": true, - - // By default, VSCode will prefer non-relative paths for deeply nested files. - "javascript.preferences.importModuleSpecifier": "relative", - "typescript.preferences.importModuleSpecifier": "relative", - - // By default, VSCode will not add `import type` automatically. - "typescript.preferences.preferTypeOnlyAutoImports": true, - - // Show TypeScript errors for files that don't happen to be currently open, which makes TypeScript - // work similar to other compiled languages like Golang or Rust. - "typescript.tsserver.experimental.enableProjectDiagnostics": true, - - // Automatically run the formatter when certain files are saved. - "[javascript][typescript][javascriptreact][typescriptreact]": { - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit", - }, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true, - }, - "[css][html][json][jsonc][markdown][postcss][yaml]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true, - }, -} diff --git a/packages/isaacscript-cli/file-templates/static-ts/_cspell.jsonc b/packages/isaacscript-cli/file-templates/static-ts/_cspell.jsonc deleted file mode 100644 index 0fbac874e..000000000 --- a/packages/isaacscript-cli/file-templates/static-ts/_cspell.jsonc +++ /dev/null @@ -1,33 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json", - "version": "0.2", - "import": ["@cspell/cspell-bundled-dicts"], - "files": ["**"], - "enableFiletypes": ["*"], - "enableGlobDot": true, - "useGitignore": true, - "ignorePaths": [ - "*.min.js", - "*.mp3", - "*.pyc", - "*.svg", - ".git/**", - ".yarn/**", - "dist/**", - "LICENSE", - "node_modules/**", - "package-lock.json", - "pnpm-lock.yaml", - "yarn.lock", - ], - "words": [ - "autocrlf", - "dbaeumer", - "esbenp", - "isaacscript", - "knip", - "packagejson", - "sarisia", - "Zamiell", - ], -} diff --git a/packages/isaacscript-cli/file-templates/static-ts/_eslint.config.mjs b/packages/isaacscript-cli/file-templates/static-ts/_eslint.config.mjs deleted file mode 100644 index ded67b882..000000000 --- a/packages/isaacscript-cli/file-templates/static-ts/_eslint.config.mjs +++ /dev/null @@ -1,24 +0,0 @@ -// This is the configuration file for ESLint, the TypeScript linter: -// https://eslint.org/docs/latest/use/configure/ - -export default { - extends: [ - // The linter base is the shared IsaacScript config: - // https://github.com/IsaacScript/isaacscript/blob/main/packages/eslint-config-isaacscript/base.js - "eslint-config-isaacscript/base", - ], - - // Don't bother linting compiled output. - ignorePatterns: ["**/dist/**", "*.min.js"], - - parserOptions: { - // ESLint needs to know about the project's TypeScript settings in order for TypeScript-specific - // things to lint correctly. We do not point this at "./tsconfig.json" because certain files - // (such at this file) should be linted but not included in the actual project output. - project: "./tsconfig.eslint.json", - }, - - rules: { - // Insert changed or disabled rules here, if necessary. - }, -}; diff --git a/packages/isaacscript-cli/file-templates/static-ts/knip.jsonc b/packages/isaacscript-cli/file-templates/static-ts/knip.jsonc deleted file mode 100644 index baa15b636..000000000 --- a/packages/isaacscript-cli/file-templates/static-ts/knip.jsonc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$schema": "https://unpkg.com/knip@3/schema-jsonc.json", - "ignore": [".eslintrc.cjs", "prettier.config.mjs"], - "ignoreDependencies": ["isaacscript-lint"], -} diff --git a/packages/isaacscript-cli/file-templates/static-ts/prettier.config.mjs b/packages/isaacscript-cli/file-templates/static-ts/prettier.config.mjs deleted file mode 100644 index 91359fab4..000000000 --- a/packages/isaacscript-cli/file-templates/static-ts/prettier.config.mjs +++ /dev/null @@ -1,22 +0,0 @@ -// This is the configuration file for Prettier, the auto-formatter: -// https://prettier.io/docs/en/configuration.html - -/** @type {import("prettier").Config} */ -const config = { - plugins: [ - "prettier-plugin-organize-imports", // Prettier does not format imports by default. - "prettier-plugin-packagejson", // Prettier does not format "package.json" by default. - ], - - overrides: [ - // Allow proper formatting of JSONC files that have JSON file extensions. - { - files: ["**/.vscode/*.json", "**/tsconfig.json", "**/tsconfig.*.json"], - options: { - parser: "jsonc", - }, - }, - ], -}; - -export default config; diff --git a/packages/isaacscript-cli/file-templates/static-ts/scripts/build.ts b/packages/isaacscript-cli/file-templates/static-ts/scripts/build.ts deleted file mode 100644 index 1f962a680..000000000 --- a/packages/isaacscript-cli/file-templates/static-ts/scripts/build.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { $s, buildScript } from "isaacscript-common-node"; - -await buildScript(() => { - $s`tsc`; -}); diff --git a/packages/isaacscript-cli/file-templates/static-ts/scripts/lint.ts b/packages/isaacscript-cli/file-templates/static-ts/scripts/lint.ts deleted file mode 100644 index 94704f4a5..000000000 --- a/packages/isaacscript-cli/file-templates/static-ts/scripts/lint.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { $, lintScript } from "isaacscript-common-node"; - -await lintScript(async () => { - const promises = [ - // Use Prettier to check formatting. - // - "--log-level=warn" makes it only output errors. - $`prettier --log-level=warn --check .`, - - // Type-check the code using the TypeScript compiler. - $`tsc --noEmit`, - - // Use ESLint to lint the TypeScript. - // - "--max-warnings 0" makes warnings fail, since we set all ESLint errors to warnings. - $`eslint --max-warnings 0 .`, - - // Check for unused files, dependencies, and exports. - $`knip --no-progress`, - - // Spell check every file using CSpell. - // - "--no-progress" and "--no-summary" make it only output errors. - $`cspell --no-progress --no-summary .`, - - // Check for unused CSpell words. - $`cspell-check-unused-words`, - ]; - - await Promise.all(promises); -}); diff --git a/packages/isaacscript-cli/file-templates/static-ts/src/main.ts b/packages/isaacscript-cli/file-templates/static-ts/src/main.ts deleted file mode 100644 index 2401f0216..000000000 --- a/packages/isaacscript-cli/file-templates/static-ts/src/main.ts +++ /dev/null @@ -1,5 +0,0 @@ -main(); - -function main() { - console.log("Hello world."); -} diff --git a/packages/isaacscript-cli/file-templates/static-ts/tsconfig.json b/packages/isaacscript-cli/file-templates/static-ts/tsconfig.json deleted file mode 100644 index 179cba8e0..000000000 --- a/packages/isaacscript-cli/file-templates/static-ts/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -// The configuration file for TypeScript. -{ - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", - - "extends": [ - // https://github.com/IsaacScript/isaacscript/blob/main/packages/isaacscript-tsconfig/tsconfig.base.json - "isaacscript-tsconfig/tsconfig.base.json", - - // https://github.com/IsaacScript/isaacscript/blob/main/packages/isaacscript-tsconfig/tsconfig.node.json - "isaacscript-tsconfig/tsconfig.node.json", - ], -} diff --git a/packages/isaacscript-cli/file-templates/static-mod/.luarc.json b/packages/isaacscript-cli/file-templates/static/.luarc.json similarity index 100% rename from packages/isaacscript-cli/file-templates/static-mod/.luarc.json rename to packages/isaacscript-cli/file-templates/static/.luarc.json diff --git a/packages/isaacscript-cli/file-templates/static-mod/.prettierignore b/packages/isaacscript-cli/file-templates/static/.prettierignore similarity index 97% rename from packages/isaacscript-cli/file-templates/static-mod/.prettierignore rename to packages/isaacscript-cli/file-templates/static/.prettierignore index c6ee5bed9..0029839c9 100644 --- a/packages/isaacscript-cli/file-templates/static-mod/.prettierignore +++ b/packages/isaacscript-cli/file-templates/static/.prettierignore @@ -5,6 +5,7 @@ dist package-lock.json yarn.lock pnpm-lock.yaml +bun.lock # Minified files *.min.js diff --git a/packages/isaacscript-cli/file-templates/static-mod/.vscode/extensions.json b/packages/isaacscript-cli/file-templates/static/.vscode/extensions.json similarity index 100% rename from packages/isaacscript-cli/file-templates/static-mod/.vscode/extensions.json rename to packages/isaacscript-cli/file-templates/static/.vscode/extensions.json index 8e4fd0ad1..8743c9751 100644 --- a/packages/isaacscript-cli/file-templates/static-mod/.vscode/extensions.json +++ b/packages/isaacscript-cli/file-templates/static/.vscode/extensions.json @@ -2,8 +2,8 @@ // repository: https://go.microsoft.com/fwlink/?LinkId=827846 { "recommendations": [ - "esbenp.prettier-vscode", // The TypeScript formatter "dbaeumer.vscode-eslint", // The TypeScript linter + "esbenp.prettier-vscode", // The TypeScript formatter "streetsidesoftware.code-spell-checker", // A spell-checker extension based on CSpell "typescript-to-lua.vscode-typescript-to-lua", // The TypeScriptToLua extension "redhat.vscode-xml", // The XML language server diff --git a/packages/isaacscript-cli/file-templates/static-mod/.vscode/settings.json b/packages/isaacscript-cli/file-templates/static/.vscode/settings.json similarity index 50% rename from packages/isaacscript-cli/file-templates/static-mod/.vscode/settings.json rename to packages/isaacscript-cli/file-templates/static/.vscode/settings.json index 2848aa8f3..40c84398e 100644 --- a/packages/isaacscript-cli/file-templates/static-mod/.vscode/settings.json +++ b/packages/isaacscript-cli/file-templates/static/.vscode/settings.json @@ -29,16 +29,24 @@ "**/.yarn/": true, "**/dist/": true, "**/node_modules/": true, + "bun.lock": true, "LICENSE": true, + "package-lock.json": true, + "pnpm-lock.yaml": true, + "yarn.lock": true, }, // ------------------ // Extension settings // ------------------ - // Use Prettier to format "cspell.jsonc". + // Use Prettier to format "cspell.config.jsonc". "cSpell.autoFormatConfigFile": true, + // Change all ESLint errors to have yellow squigglies instead of red squigglies. + // https://www.joshuakgoldberg.com/blog/if-i-wrote-a-linter-part-2-developer-experience/#only-errors + "eslint.rules.customizations": [{ "rule": "*", "severity": "warn" }], + // ----------------- // Language settings // ----------------- @@ -48,8 +56,8 @@ "typescript.suggest.completeFunctionCalls": true, // By default, VSCode will prefer non-relative paths for deeply nested files. - "javascript.preferences.importModuleSpecifier": "relative", - "typescript.preferences.importModuleSpecifier": "relative", + "javascript.preferences.importModuleSpecifier": "project-relative", + "typescript.preferences.importModuleSpecifier": "project-relative", // By default, VSCode will not add `import type` automatically. "typescript.preferences.preferTypeOnlyAutoImports": true, @@ -58,15 +66,65 @@ // work similar to other compiled languages like Golang or Rust. "typescript.tsserver.experimental.enableProjectDiagnostics": true, - // Automatically run the formatter when certain files are saved. - "[javascript][typescript][javascriptreact][typescriptreact]": { + // Automatically run the formatter when certain files are saved. We intentionally do not group + // languages together because of this bug: https://github.com/microsoft/vscode/issues/168411 + "[javascript]": { + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + }, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[typescript]": { + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + }, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[javascriptreact]": { + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + }, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[typescriptreact]": { "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit", }, "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, }, - "[css][html][json][jsonc][markdown][postcss][xml][yaml]": { + "[css]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[jsonc]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[markdown]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[postcss]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[xml]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + }, + "[yaml]": { "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, }, diff --git a/packages/isaacscript-cli/file-templates/static-mod/_cspell.jsonc b/packages/isaacscript-cli/file-templates/static/_cspell.config.jsonc similarity index 97% rename from packages/isaacscript-cli/file-templates/static-mod/_cspell.jsonc rename to packages/isaacscript-cli/file-templates/static/_cspell.config.jsonc index cc3c9cea9..216cc0507 100644 --- a/packages/isaacscript-cli/file-templates/static-mod/_cspell.jsonc +++ b/packages/isaacscript-cli/file-templates/static/_cspell.config.jsonc @@ -13,6 +13,7 @@ "*.svg", ".git/**", ".yarn/**", + "bun.lock", "dist/**", "LICENSE", "node_modules/**", diff --git a/packages/isaacscript-cli/file-templates/static/_gitattributes b/packages/isaacscript-cli/file-templates/static/_gitattributes index 8af7d17bf..f6ed6746e 100644 --- a/packages/isaacscript-cli/file-templates/static/_gitattributes +++ b/packages/isaacscript-cli/file-templates/static/_gitattributes @@ -1,7 +1,18 @@ -# Prevent Windows systems from cloning this repository with "\r\n" line endings. +# https://git-scm.com/docs/git-config/#Documentation/git-config.txt-coreautocrlf +# Default value: input +# Explicitly setting it to false prevents Git from changing line endings at any point, which can +# prevent issues when Windows users collaborate with MacOS/Linus users. core.autocrlf=false -# Prevent people from making merge commits: +# https://git-scm.com/docs/git-config/#Documentation/git-config.txt-coreignoreCase +# Default value: false (on Linux machines) or true (on Windows machines) +# Explicitly setting it to false prevents the issue where Windows users cannot pull down +# casing-related file renames. +core.ignoreCase=false + +# https://git-scm.com/docs/git-config/#Documentation/git-config.txt-pullrebase +# Default value: false +# Setting this prevents spurious merge commits: # https://www.endoflineblog.com/gitflow-considered-harmful pull.rebase=true @@ -23,3 +34,4 @@ tsconfig*.json linguist-language=JSON-with-Comments package-lock.json linguist-generated=true yarn.lock linguist-generated=true pnpm-lock.yaml linguist-generated=true +bun.lock linguist-generated=true diff --git a/packages/isaacscript-cli/file-templates/static/eslint.config.mjs b/packages/isaacscript-cli/file-templates/static/eslint.config.mjs new file mode 100644 index 000000000..d3ff66924 --- /dev/null +++ b/packages/isaacscript-cli/file-templates/static/eslint.config.mjs @@ -0,0 +1,22 @@ +// This is the configuration file for ESLint, the TypeScript linter: +// https://eslint.org/docs/latest/use/configure/ + +// @ts-check + +import { completeConfigBase } from "eslint-config-complete"; +import { isaacScriptModConfigBase } from "eslint-config-isaacscript"; +import { defineConfig } from "eslint/config"; + +export default defineConfig( + // https://github.com/complete-ts/complete/blob/main/packages/eslint-config-complete/src/base.js + ...completeConfigBase, + + // https://github.com/IsaacScript/isaacscript/blob/main/packages/eslint-config-isaacscript/src/base.js + ...isaacScriptModConfigBase, + + { + rules: { + // Insert changed or disabled rules here, if necessary. + }, + }, +); diff --git a/packages/isaacscript-cli/file-templates/static-mod/prettier.config.mjs b/packages/isaacscript-cli/file-templates/static/prettier.config.mjs similarity index 79% rename from packages/isaacscript-cli/file-templates/static-mod/prettier.config.mjs rename to packages/isaacscript-cli/file-templates/static/prettier.config.mjs index 1b44f6552..fe7947f82 100644 --- a/packages/isaacscript-cli/file-templates/static-mod/prettier.config.mjs +++ b/packages/isaacscript-cli/file-templates/static/prettier.config.mjs @@ -1,6 +1,8 @@ // This is the configuration file for Prettier, the auto-formatter: // https://prettier.io/docs/en/configuration.html +// @ts-check + /** @type {import("prettier").Config} */ const config = { plugins: [ @@ -33,6 +35,11 @@ const config = { }, }, ], + + // We break from the default Prettier config for only a single option: operator position. There + // are no known arguments for placing operators at the end of the line, as outlined in this + // thread: https://github.com/prettier/prettier/issues/3806 + experimentalOperatorPosition: "start", }; export default config; diff --git a/packages/isaacscript-cli/file-templates/static-mod/scripts/lint.ts b/packages/isaacscript-cli/file-templates/static/scripts/lint.ts similarity index 54% rename from packages/isaacscript-cli/file-templates/static-mod/scripts/lint.ts rename to packages/isaacscript-cli/file-templates/static/scripts/lint.ts index 09aa72c4f..7a29f8365 100644 --- a/packages/isaacscript-cli/file-templates/static-mod/scripts/lint.ts +++ b/packages/isaacscript-cli/file-templates/static/scripts/lint.ts @@ -1,32 +1,34 @@ -import { $, $s, commandExists, lintScript } from "isaacscript-common-node"; +import { $, commandExists, lintScript } from "complete-node"; -await lintScript(async () => { +await lintScript(import.meta.dirname, async () => { const promises = [ - // Use Prettier to check formatting. - // - "--log-level=warn" makes it only output errors. - $`prettier --log-level=warn --check .`, - - // Type-check the code using the TypeScript compiler. + // Use TypeScript to type-check the code. $`tsc --noEmit`, + $`tsc --noEmit --project ./scripts/tsconfig.json`, - // Use ESLint to lint the TypeScript. + // Use ESLint to lint the TypeScript code. // - "--max-warnings 0" makes warnings fail, since we set all ESLint errors to warnings. $`eslint --max-warnings 0 .`, - // Check for unused exports. + // Use Prettier to check formatting. + // - "--log-level=warn" makes it only output errors. + $`prettier --log-level=warn --check .`, + + // Use ts-prune to check for unused exports. // - "--error" makes it return an error code of 1 if unused exports are found. $`ts-prune --error`, - // Spell check every file using CSpell. + // Use CSpell to spell check every file. // - "--no-progress" and "--no-summary" make it only output errors. $`cspell --no-progress --no-summary .`, - // Check for unused CSpell words. + // Check for unused words in the CSpell configuration file. $`cspell-check-unused-words`, ]; - if (commandExists("python")) { - $s`pip install isaac-xml-validator --upgrade --quiet`; + const pythonExists = await commandExists("python"); + if (pythonExists) { + await $`python -m pip install isaac-xml-validator --upgrade --quiet`; promises.push($`isaac-xml-validator --quiet`); } diff --git a/packages/isaacscript-cli/file-templates/static/scripts/tsconfig.json b/packages/isaacscript-cli/file-templates/static/scripts/tsconfig.json index 69a255a4e..a613dd6fe 100644 --- a/packages/isaacscript-cli/file-templates/static/scripts/tsconfig.json +++ b/packages/isaacscript-cli/file-templates/static/scripts/tsconfig.json @@ -1,34 +1,14 @@ // A TypeScript configuration file, used by project scripts. { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - // https://github.com/IsaacScript/isaacscript/blob/main/packages/isaacscript-tsconfig/tsconfig.base.json - "isaacscript-tsconfig/tsconfig.base.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", - // https://github.com/IsaacScript/isaacscript/blob/main/packages/isaacscript-tsconfig/tsconfig.node.json - "isaacscript-tsconfig/tsconfig.node.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], - // We want to lint every file in this directory. Two entries for each file extension are needed - // because TypeScript will exclude files that begin with a period from an asterisk glob by - // default. - "include": [ - "./**/*.js", - "./**/.*.js", - "./**/*.cjs", - "./**/.*.cjs", - "./**/*.mjs", - "./**/.*.mjs", - "./**/*.jsx", - "./**/.*.jsx", - "./**/*.ts", - "./**/.*.ts", - "./**/*.cts", - "./**/.*.cts", - "./**/*.mts", - "./**/.*.mts", - "./**/*.tsx", - "./**/.*.tsx", - ], + "include": ["./**/*.ts"], } diff --git a/packages/isaacscript-cli/file-templates/static-mod/src/bundleEntry.ts b/packages/isaacscript-cli/file-templates/static/src/bundleEntry.ts similarity index 100% rename from packages/isaacscript-cli/file-templates/static-mod/src/bundleEntry.ts rename to packages/isaacscript-cli/file-templates/static/src/bundleEntry.ts diff --git a/packages/isaacscript-cli/file-templates/static/tsconfig.eslint.json b/packages/isaacscript-cli/file-templates/static/tsconfig.eslint.json deleted file mode 100644 index 446c95bea..000000000 --- a/packages/isaacscript-cli/file-templates/static/tsconfig.eslint.json +++ /dev/null @@ -1,28 +0,0 @@ -// A special TypeScript configuration file, used by ESLint only. -{ - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", - - "extends": "./tsconfig.json", - - // We want to lint every file in the repository, regardless of whether it is actually bundled into - // the TypeScript output. Two entries for each file extension are needed because TypeScript will - // exclude files that begin with a period from an asterisk glob by default. - "include": [ - "./**/*.js", - "./**/.*.js", - "./**/*.cjs", - "./**/.*.cjs", - "./**/*.mjs", - "./**/.*.mjs", - "./**/*.jsx", - "./**/.*.jsx", - "./**/*.ts", - "./**/.*.ts", - "./**/*.cts", - "./**/.*.cts", - "./**/*.mts", - "./**/.*.mts", - "./**/*.tsx", - "./**/.*.tsx", - ], -} diff --git a/packages/isaacscript-cli/file-templates/static-mod/tsconfig.json b/packages/isaacscript-cli/file-templates/static/tsconfig.json similarity index 87% rename from packages/isaacscript-cli/file-templates/static-mod/tsconfig.json rename to packages/isaacscript-cli/file-templates/static/tsconfig.json index a92007c78..82ce37439 100644 --- a/packages/isaacscript-cli/file-templates/static-mod/tsconfig.json +++ b/packages/isaacscript-cli/file-templates/static/tsconfig.json @@ -5,8 +5,8 @@ // We extend the standard IsaacScript configs. "extends": [ - // https://github.com/IsaacScript/isaacscript/blob/main/packages/isaacscript-tsconfig/tsconfig.base.json - "isaacscript-tsconfig/tsconfig.base.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", // https://github.com/IsaacScript/isaacscript/blob/main/packages/isaacscript-tsconfig/tsconfig.mod.json "isaacscript-tsconfig/tsconfig.mod.json", @@ -15,7 +15,7 @@ // TypeScriptToLua settings "tstl": { "luaTarget": "5.3", - "luaBundle": "./mod/main.lua", // Will bundle all output Lua files into a single file. + "luaBundle": "main.lua", // Will bundle all output Lua files into a single file of "./mod/main.lua". "luaBundleEntry": "./src/bundleEntry.ts", "luaPlugins": [ // A plugin to add an explanatory comment at the top of the compiled "main.lua" file. diff --git a/packages/isaacscript-cli/package.json b/packages/isaacscript-cli/package.json index 3328e144b..34961debd 100644 --- a/packages/isaacscript-cli/package.json +++ b/packages/isaacscript-cli/package.json @@ -1,6 +1,6 @@ { "name": "isaacscript", - "version": "4.4.4", + "version": "6.0.2", "description": "A command line tool for managing Isaac mods written in TypeScript.", "keywords": [ "isaac", @@ -31,33 +31,40 @@ "file-templates", "isaacscript-watcher", "plugins", - "schemas", - "LICENSE", - "package.json", - "README.md" + "schemas" ], "scripts": { "build": "tsx ./scripts/build.ts", "lint": "tsx ./scripts/lint.ts", "start": "tsx ./src/main.ts", - "test": "glob \"./src/**/*.test.ts\" --cmd=\"node --import tsx --test --test-reporter spec\"" + "test": "tsx --test \"src/**/*.test.ts\"" }, "dependencies": { - "@commander-js/extra-typings": "^12.1.0", - "@zamiell/sync-directory": "^6.0.5", - "ajv": "^8.17.1", - "chalk": "^5.3.0", - "commander": "^12.1.0", - "figlet": "^1.7.0", - "isaacscript-common-node": "^4.0.5", - "isaacscript-common-ts": "^16.1.0", - "jsonc-parser": "^3.3.1", - "klaw-sync": "^6.0.0", - "moment": "^2.30.1", - "prompt": "^1.3.0", - "source-map-support": "^0.5.21", - "xml2js": "^0.6.2", - "yaml": "^2.5.0" + "@commander-js/extra-typings": "14.0.0", + "@zamiell/sync-directory": "6.0.5", + "ajv": "8.18.0", + "chalk": "5.6.2", + "commander": "14.0.3", + "complete-common": "2.21.0", + "complete-node": "16.4.0", + "figlet": "1.9.2-beta.0", + "jsonc-parser": "3.3.1", + "klaw-sync": "7.0.0", + "moment": "2.30.1", + "prompt": "1.3.0", + "source-map": "0.7.6", + "source-map-support": "0.5.21", + "xml2js": "0.6.2", + "yaml": "2.8.2" + }, + "devDependencies": { + "@types/figlet": "1.7.0", + "@types/klaw-sync": "6.0.5", + "@types/prompt": "1.1.9", + "@types/source-map-support": "0.5.10", + "@types/xml2js": "0.4.14", + "ts-json-schema-generator": "2.9.0", + "typescript-eslint": "8.57.1" }, "peerDependencies": { "typescript": ">= 5.0.0", diff --git a/packages/isaacscript-cli/plugins/addCrashDebugStatements.cjs b/packages/isaacscript-cli/plugins/addCrashDebugStatements.cjs index 8685edcd0..975339ebf 100644 --- a/packages/isaacscript-cli/plugins/addCrashDebugStatements.cjs +++ b/packages/isaacscript-cli/plugins/addCrashDebugStatements.cjs @@ -26,13 +26,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? ( }) : function(o, v) { o["default"] = v; }); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; diff --git a/packages/isaacscript-cli/plugins/noExtendedEnums.cjs b/packages/isaacscript-cli/plugins/noExtendedEnums.cjs index a325e5dba..e3af4a182 100644 --- a/packages/isaacscript-cli/plugins/noExtendedEnums.cjs +++ b/packages/isaacscript-cli/plugins/noExtendedEnums.cjs @@ -56,13 +56,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? ( }) : function(o, v) { o["default"] = v; }); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); Object.defineProperty(exports, "__esModule", { value: true }); const ts = __importStar(require("typescript")); const tstl = __importStar(require("typescript-to-lua")); @@ -80,9 +90,9 @@ const plugin = { // local ____exports.Foo = Foo or ({}) // ``` const oldDeclaration = statements[0]; - if (oldDeclaration !== undefined && - (tstl.isAssignmentStatement(oldDeclaration) || - tstl.isVariableDeclarationStatement(oldDeclaration))) { + if (oldDeclaration !== undefined + && (tstl.isAssignmentStatement(oldDeclaration) + || tstl.isVariableDeclarationStatement(oldDeclaration))) { // Replace the right side of the assignment with a blank Lua table, e.g. // ```lua // local ____exports.Foo = {} diff --git a/packages/isaacscript-cli/plugins/noExtendedEnums.ts b/packages/isaacscript-cli/plugins/noExtendedEnums.ts index 241eff10f..2e86bbdfb 100644 --- a/packages/isaacscript-cli/plugins/noExtendedEnums.ts +++ b/packages/isaacscript-cli/plugins/noExtendedEnums.ts @@ -62,9 +62,9 @@ const plugin: tstl.Plugin = { // ``` const oldDeclaration = statements[0]; if ( - oldDeclaration !== undefined && - (tstl.isAssignmentStatement(oldDeclaration) || - tstl.isVariableDeclarationStatement(oldDeclaration)) + oldDeclaration !== undefined + && (tstl.isAssignmentStatement(oldDeclaration) + || tstl.isVariableDeclarationStatement(oldDeclaration)) ) { // Replace the right side of the assignment with a blank Lua table, e.g. diff --git a/packages/isaacscript-cli/plugins/tsconfig.json b/packages/isaacscript-cli/plugins/tsconfig.json index d83960e49..87edcf80f 100644 --- a/packages/isaacscript-cli/plugins/tsconfig.json +++ b/packages/isaacscript-cli/plugins/tsconfig.json @@ -1,9 +1,12 @@ { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../../isaacscript-tsconfig/tsconfig.base.json", - "../../isaacscript-tsconfig/tsconfig.node.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], "compilerOptions": { diff --git a/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json b/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json deleted file mode 100644 index 7e19302c7..000000000 --- a/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "title": "tsconfig.json with IsaacScript", - "description": "JSON schema for the TypeScript compiler's configuration file. Unlike the one that is built-in to VSCode, this one does not allow additional properties.", - "$schema": "http://json-schema.org/draft-07/schema", - "allOf": [ - { - "$ref": "https://json.schemastore.org/tsconfig" - } - ], - "properties": { - "$schema": { - "type": "string" - } - }, - "allowTrailingCommas": true, - "unevaluatedProperties": false -} diff --git a/packages/isaacscript-cli/scripts/build.ts b/packages/isaacscript-cli/scripts/build.ts index 76b6c0954..dd1837c0f 100644 --- a/packages/isaacscript-cli/scripts/build.ts +++ b/packages/isaacscript-cli/scripts/build.ts @@ -1,15 +1,12 @@ import { $, - $op, buildScript, - fixMonorepoPackageDistDirectory, getFileNamesInDirectory, - mkdir, - mv, + makeDirectory, + moveFileOrDirectory, readFile, writeFile, -} from "isaacscript-common-node"; -import { assertDefined } from "isaacscript-common-ts"; +} from "complete-node"; import path from "node:path"; const INTERFACE_FILE_NAMES = ["CustomStageTSConfig", "JSONRoomsFile"] as const; @@ -20,22 +17,15 @@ const OBJECT_FILE_NAMES = [ "roomShapeToDoorSlotCoordinates", ] as const; -await buildScript(async ({ packageRoot, outDir }) => { - assertDefined( - outDir, - 'Failed to get the "outDir" from the "tsconfig.json" file.', - ); - - copyIsaacScriptCommonFiles(packageRoot); +await buildScript(import.meta.dirname, async (packageRoot) => { + await copyIsaacScriptCommonFiles(packageRoot); - const promises = [ - compile(packageRoot, outDir), + await Promise.all([ + compile(), + compilePlugins(packageRoot), generateJSONSchemaForTSConfigJSON(), generateJSONSchemaForIsaacScriptJSON(), - compilePlugins(packageRoot), - ]; - - await Promise.all(promises); + ]); }); /** @@ -45,21 +35,18 @@ await buildScript(async ({ packageRoot, outDir }) => { * https://github.com/TypeScriptToLua/TypeScriptToLua/issues/1514 * * Additionally, we do not want to create a "isaacscript-common-types" package because then it - * becomes harder to get the types documented on the Docusaurus website. Furthermore, a hypothetical - * "isaacscript-common-types" package would have to contain a copied `Immutable` type, since - * "isaacscript-common-types" would not be able to import from either "isaacscript-common" or - * "isaacscript-common-ts". + * becomes harder to get the types documented on the Docusaurus website. */ -function copyIsaacScriptCommonFiles(packageRoot: string) { - copyITDEnums(packageRoot); - copyITDEnumsFlag(packageRoot); - copyISCInterfaces(packageRoot); - copyISCObjects(packageRoot); +async function copyIsaacScriptCommonFiles(packageRoot: string) { + await copyITDEnums(packageRoot); + await copyITDEnumsFlag(packageRoot); + await copyISCInterfaces(packageRoot); + await copyISCObjects(packageRoot); } -function copyITDEnums(packageRoot: string) { +async function copyITDEnums(packageRoot: string) { const sourcePackage = "isaac-typescript-definitions"; - const sourceDirectoryPath = path.join( + const sourceDirectoryPath = path.resolve( packageRoot, "..", sourcePackage, @@ -72,12 +59,13 @@ function copyITDEnums(packageRoot: string) { "enums", "copied", ); - mkdir(destinationDirectoryPath); + await makeDirectory(destinationDirectoryPath); for (const fileName of ENUM_FILE_NAMES) { const fullFileName = `${fileName}.ts`; const sourcePath = path.join(sourceDirectoryPath, fullFileName); - let fileContents = readFile(sourcePath); + // eslint-disable-next-line no-await-in-loop + let fileContents = await readFile(sourcePath); switch (fileName) { case "RoomShape": { @@ -88,7 +76,7 @@ function copyITDEnums(packageRoot: string) { break; } - default: { + case "DoorSlot": { break; } } @@ -97,13 +85,14 @@ function copyITDEnums(packageRoot: string) { fileContents = copiedFileHeader + fileContents; const destinationPath = path.join(destinationDirectoryPath, fullFileName); - writeFile(destinationPath, fileContents); + // eslint-disable-next-line no-await-in-loop + await writeFile(destinationPath, fileContents); } } -function copyITDEnumsFlag(packageRoot: string) { +async function copyITDEnumsFlag(packageRoot: string) { const sourcePackage = "isaac-typescript-definitions"; - const sourceDirectoryPath = path.join( + const sourceDirectoryPath = path.resolve( packageRoot, "..", sourcePackage, @@ -117,12 +106,13 @@ function copyITDEnumsFlag(packageRoot: string) { "enums", "copied", ); - mkdir(destinationDirectoryPath); + await makeDirectory(destinationDirectoryPath); for (const fileName of ENUM_FLAG_FILE_NAMES) { const fullFileName = `${fileName}.ts`; const sourcePath = path.join(sourceDirectoryPath, fullFileName); - let fileContents = readFile(sourcePath); + // eslint-disable-next-line no-await-in-loop + let fileContents = await readFile(sourcePath); // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (fileName === "DoorSlotFlag") { @@ -139,13 +129,14 @@ function copyITDEnumsFlag(packageRoot: string) { fileContents = copiedFileHeader + fileContents; const destinationPath = path.join(destinationDirectoryPath, fullFileName); - writeFile(destinationPath, fileContents); + // eslint-disable-next-line no-await-in-loop + await writeFile(destinationPath, fileContents); } } -function copyISCInterfaces(packageRoot: string) { +async function copyISCInterfaces(packageRoot: string) { const sourcePackage = "isaacscript-common"; - const sourceDirectoryPath = path.join( + const sourceDirectoryPath = path.resolve( packageRoot, "..", sourcePackage, @@ -158,23 +149,24 @@ function copyISCInterfaces(packageRoot: string) { "interfaces", "copied", ); - mkdir(destinationDirectoryPath); + await makeDirectory(destinationDirectoryPath); for (const fileName of INTERFACE_FILE_NAMES) { const fullFileName = `${fileName}.ts`; const sourcePath = path.join(sourceDirectoryPath, fullFileName); - let fileContents = readFile(sourcePath); + // eslint-disable-next-line no-await-in-loop + let fileContents = await readFile(sourcePath); switch (fileName) { case "CustomStageTSConfig": { fileContents = fileContents.replace( 'import type { Immutable } from "../types/Immutable";', - 'import type { Immutable } from "isaacscript-common-ts";', + 'import type { Immutable } from "complete-common";', ); break; } - default: { + case "JSONRoomsFile": { break; } } @@ -183,13 +175,14 @@ function copyISCInterfaces(packageRoot: string) { fileContents = copiedFileHeader + fileContents; const destinationPath = path.join(destinationDirectoryPath, fullFileName); - writeFile(destinationPath, fileContents); + // eslint-disable-next-line no-await-in-loop + await writeFile(destinationPath, fileContents); } } -function copyISCObjects(packageRoot: string) { +async function copyISCObjects(packageRoot: string) { const sourcePackage = "isaacscript-common"; - const sourceDirectoryPath = path.join( + const sourceDirectoryPath = path.resolve( packageRoot, "..", sourcePackage, @@ -202,12 +195,13 @@ function copyISCObjects(packageRoot: string) { "objects", "copied", ); - mkdir(destinationDirectoryPath); + await makeDirectory(destinationDirectoryPath); for (const fileName of OBJECT_FILE_NAMES) { const fullFileName = `${fileName}.ts`; const sourcePath = path.join(sourceDirectoryPath, fullFileName); - let fileContents = readFile(sourcePath); + // eslint-disable-next-line no-await-in-loop + let fileContents = await readFile(sourcePath); switch (fileName) { case "doorSlotToDoorSlotFlag": { @@ -232,7 +226,8 @@ function copyISCObjects(packageRoot: string) { fileContents = copiedFileHeader + fileContents; const destinationPath = path.join(destinationDirectoryPath, fullFileName); - writeFile(destinationPath, fileContents); + // eslint-disable-next-line no-await-in-loop + await writeFile(destinationPath, fileContents); } } @@ -245,9 +240,28 @@ function getCopiedFileHeader(packageName: string): string { `.trimStart(); } -async function compile(packageRoot: string, outDir: string) { +async function compile() { await $`tsc`; - fixMonorepoPackageDistDirectory(packageRoot, outDir); +} + +async function compilePlugins(packageRoot: string) { + const pluginsDirPath = path.join(packageRoot, "plugins"); + const $$ = $({ cwd: pluginsDirPath }); + await $$`tsc`; + await renamePluginJSToCJS(pluginsDirPath); +} + +async function renamePluginJSToCJS(pluginsDirPath: string) { + const fileNames = await getFileNamesInDirectory(pluginsDirPath); + for (const fileName of fileNames) { + if (fileName.endsWith(".js")) { + const oldFilePath = path.join(pluginsDirPath, fileName); + const newFileName = fileName.replace(".js", ".cjs"); + const newFilePath = path.join(pluginsDirPath, newFileName); + // eslint-disable-next-line no-await-in-loop + await moveFileOrDirectory(oldFilePath, newFilePath); + } + } } /** Generate the JSON schema for the special "isaacscript" section in "tsconfig.json". */ @@ -264,22 +278,3 @@ async function generateJSONSchemaForIsaacScriptJSON() { await $`ts-json-schema-generator --path src/classes/Config.ts --tsconfig tsconfig.json --out ${ISAACSCRIPT_SCHEMA_PATH}`; await $`prettier ${ISAACSCRIPT_SCHEMA_PATH} --write --log-level=warn`; } - -async function compilePlugins(packageRoot: string) { - const pluginsDirPath = path.join(packageRoot, "plugins"); - const $$ = $op({ cwd: pluginsDirPath }); - await $$`tsc`; - renamePluginJSToCJS(pluginsDirPath); -} - -function renamePluginJSToCJS(pluginsDirPath: string) { - const fileNames = getFileNamesInDirectory(pluginsDirPath); - for (const fileName of fileNames) { - if (fileName.endsWith(".js")) { - const oldFilePath = path.join(pluginsDirPath, fileName); - const newFileName = fileName.replace(".js", ".cjs"); - const newFilePath = path.join(pluginsDirPath, newFileName); - mv(oldFilePath, newFilePath); - } - } -} diff --git a/packages/isaacscript-cli/scripts/lint.ts b/packages/isaacscript-cli/scripts/lint.ts index 263f1bb8a..7055f3836 100644 --- a/packages/isaacscript-cli/scripts/lint.ts +++ b/packages/isaacscript-cli/scripts/lint.ts @@ -1,19 +1,10 @@ import chalk from "chalk"; -import { - $, - $s, - commandExists, - diff, - echo, - exit, - lintScript, - readFile, -} from "isaacscript-common-node"; +import { $, diff, echo, exit, lintCommands, readFile } from "complete-node"; import path from "node:path"; -const REPO_ROOT = path.join(import.meta.dirname, ".."); +const PACKAGE_ROOT = path.resolve(import.meta.dirname, ".."); const LOCAL_GITIGNORE_PATH = path.join( - REPO_ROOT, + PACKAGE_ROOT, "file-templates", "dynamic", "Node.gitignore", @@ -21,24 +12,19 @@ const LOCAL_GITIGNORE_PATH = path.join( const GITIGNORE_URL = "https://raw.githubusercontent.com/github/gitignore/master/Node.gitignore"; -await lintScript(async () => { - const promises = [ - $`tsc --noEmit`, - $`tsc --noEmit --project ./scripts/tsconfig.json`, - $`eslint --max-warnings 0 .`, - checkGitIgnoreUpdates(), - ]; +await $`python -m pip install isaac-xml-validator --upgrade --quiet`; - if (commandExists("python")) { - $s`pip install isaac-xml-validator --upgrade --quiet`; - promises.push($`isaac-xml-validator --quiet`); - } - - await Promise.all(promises); -}); +await lintCommands(import.meta.dirname, [ + "tsc --noEmit", + "tsc --noEmit --project ./scripts/tsconfig.json", + "eslint --max-warnings 0 .", + "isaac-xml-validator --quiet", + // eslint-disable-next-line unicorn/prefer-top-level-await + ["checkGitIgnoreUpdates", checkGitIgnoreUpdates()], +]); -async function checkGitIgnoreUpdates(): Promise { - const localGitIgnore = readFile(LOCAL_GITIGNORE_PATH); +async function checkGitIgnoreUpdates() { + const localGitIgnore = await readFile(LOCAL_GITIGNORE_PATH); const response = await fetch(GITIGNORE_URL); const remoteGitIgnore = await response.text(); diff --git a/packages/isaacscript-cli/scripts/tsconfig.json b/packages/isaacscript-cli/scripts/tsconfig.json index 5afad029c..81e995789 100644 --- a/packages/isaacscript-cli/scripts/tsconfig.json +++ b/packages/isaacscript-cli/scripts/tsconfig.json @@ -1,10 +1,12 @@ { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../../isaacscript-tsconfig/tsconfig.base.json", - "../../isaacscript-tsconfig/tsconfig.node.json", - "../../../tsconfig.monorepo.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], "include": ["*.ts"], diff --git a/packages/isaacscript-cli/src/banner.ts b/packages/isaacscript-cli/src/banner.ts index 7177e1c15..7c270ae39 100644 --- a/packages/isaacscript-cli/src/banner.ts +++ b/packages/isaacscript-cli/src/banner.ts @@ -1,14 +1,13 @@ import chalk from "chalk"; -import * as figlet from "figlet"; -import { fatalError, getPackageJSONVersion } from "isaacscript-common-node"; -import { PROJECT_NAME, REPO_ROOT } from "./constants.js"; +import { fatalError } from "complete-node"; +import figlet from "figlet"; // Cannot be "import * as figlet" or else run-time errors occur. +import { PROJECT_NAME, PROJECT_VERSION } from "./constants.js"; -export function printBanner(): void { - const banner = figlet.textSync(PROJECT_NAME); +export async function printBanner(): Promise { + const banner = await figlet.text(PROJECT_NAME); console.log(chalk.green(banner)); - const isaacScriptCLIVersion = getPackageJSONVersion(REPO_ROOT); - const versionString = `v${isaacScriptCLIVersion}`; + const versionString = `v${PROJECT_VERSION}`; const bannerLines = banner.split("\n"); const firstBannerLine = bannerLines[0]; if (firstBannerLine === undefined) { diff --git a/packages/isaacscript-cli/src/checkForWindowsTerminalBugs.ts b/packages/isaacscript-cli/src/checkForWindowsTerminalBugs.ts deleted file mode 100644 index 5a463b52f..000000000 --- a/packages/isaacscript-cli/src/checkForWindowsTerminalBugs.ts +++ /dev/null @@ -1,90 +0,0 @@ -import chalk from "chalk"; -import { appendFile, isFile, readFile } from "isaacscript-common-node"; -import path from "node:path"; -import { HOME_DIR, PROJECT_NAME } from "./constants.js"; -import { getInputYesNo } from "./prompt.js"; - -const BASH_PROFILE_PATH = path.join(HOME_DIR, ".bash_profile"); - -/** - * By default, Git Bash for Windows uses MINGW64. This will not work correctly with the prompt - * library. Try to detect this and warn the end-user. - */ -export async function checkForWindowsTerminalBugs(): Promise { - if (process.platform !== "win32") { - return; - } - - if ( - process.env["SHELL"] !== String.raw`C:\Program Files\Git\usr\bin\bash.exe` - ) { - return; - } - - await checkForWindowsBugColor(); -} - -async function checkForWindowsBugColor() { - if (process.env["FORCE_COLOR"] === "true") { - return; - } - - console.error( - chalk.red( - `Error: It looks like you are using Git Bash for Windows (MINGW64) without the "${chalk.green( - "FORCE_COLOR", - )}" environment variable.`, - ), - ); - console.error( - "This is necessary in order for colors to work properly in the terminal.", - ); - - const shouldFixColors = await getInputYesNo( - "Do you want me to fix this for you?", - ); - if (!shouldFixColors) { - return; - } - - applyFixesToBashProfile(); -} - -function applyFixesToBashProfile() { - // Check to see if the Bash profile has data. - const bashProfileContents = isFile(BASH_PROFILE_PATH) - ? readFile(BASH_PROFILE_PATH) - : ""; - - const appendText = getBashProfileAppendText(bashProfileContents); - appendFile(BASH_PROFILE_PATH, appendText); - - console.log( - `The terminal fixes have been added to: ${chalk.green(BASH_PROFILE_PATH)}`, - chalk.red( - "Please close and re-open your terminal, then run this program again.", - ), - ); - process.exit(0); -} - -function getBashProfileAppendText(bashProfileContents: string) { - let newText = ""; - - if (bashProfileContents !== "" && !bashProfileContents.endsWith("\n")) { - // If the Bash profile exists and has data, it should end in a newline. Add an extra newline if - // this is not the case. - newText += "\n"; - } - - if (bashProfileContents !== "") { - // If the Bash profile exists and has data, add an extra newline between the existing stuff and - // the new lines added by us. - newText += "\n"; - } - - newText += `# Terminal fixes added by ${PROJECT_NAME}\n`; - newText += "export FORCE_COLOR=true\n"; - - return newText; -} diff --git a/packages/isaacscript-cli/src/commands/check/check.ts b/packages/isaacscript-cli/src/commands/check/check.ts index 12ab550e1..6ab24baef 100644 --- a/packages/isaacscript-cli/src/commands/check/check.ts +++ b/packages/isaacscript-cli/src/commands/check/check.ts @@ -1,30 +1,26 @@ import { Command } from "@commander-js/extra-typings"; import chalk from "chalk"; +import { ReadonlySet, getEnumValues, trimPrefix } from "complete-common"; import { - PACKAGE_MANAGER_LOCK_FILE_NAMES, PackageManager, deleteFileOrDirectory, fatalError, + getPackageManagerLockFileNames, isDirectory, isFile, readFile, writeFile, -} from "isaacscript-common-node"; -import { ReadonlySet, getEnumValues, trimPrefix } from "isaacscript-common-ts"; +} from "complete-node"; import klawSync from "klaw-sync"; import path from "node:path"; import { ACTION_YML, ACTION_YML_TEMPLATE_PATH, CWD, - TEMPLATES_DIR, TEMPLATES_DYNAMIC_DIR, TEMPLATES_STATIC_DIR, - YARNRC_TEMPLATE_PATH, - YARNRC_YML, } from "../../constants.js"; import { execShell } from "../../exec.js"; -import { getPackageManagerUsedForExistingProject } from "../../packageManager.js"; const URL_PREFIX = "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/file-templates"; @@ -40,7 +36,7 @@ const PACKAGE_MANAGER_STRINGS = [ "PACKAGE_MANAGER_INSTALL_COMMAND", "PACKAGE_MANAGER_LOCK_FILE_NAME", ...getEnumValues(PackageManager), - ...PACKAGE_MANAGER_LOCK_FILE_NAMES, + ...getPackageManagerLockFileNames(), ] as const; export const checkCommand = new Command() @@ -55,28 +51,8 @@ export const checkCommand = new Command() "Comma separated list of file names to ignore.", ) .option("-v, --verbose", "Enable verbose output.", false) - .action((options) => { - check(options, false); - }); - -/** - * Even though all of the options are identical, we make a "-ts" version of the command to keep the - * symmetry with the "init" and "init-ts" commands. - */ -export const checkTSCommand = new Command() - .command("check-ts") - .description( - "Check the template files of the current TypeScript project to see if they are up to date.", - ) - .allowExcessArguments(false) // By default, Commander.js will allow extra positional arguments. - .helpOption("-h, --help", "Display the list of options for this command.") - .option( - "--ignore ", - "Comma separated list of file names to ignore.", - ) - .option("-v, --verbose", "Enable verbose output.", false) - .action((options) => { - check(options, true); + .action(async (options) => { + await check(options); }); // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -84,32 +60,27 @@ const checkOptions = checkCommand.opts(); // The options are identical for both, so we do not create a union. type CheckOptions = typeof checkOptions; -function check(options: CheckOptions, typeScript: boolean) { +async function check(options: CheckOptions) { const { verbose } = options; - const packageManager = getPackageManagerUsedForExistingProject(); - let oneOrMoreErrors = false; const ignore = options.ignore ?? ""; const ignoreFileNames = ignore.split(","); const ignoreFileNamesSet = new ReadonlySet(ignoreFileNames); // First, check the static files that are shared between TypeScript projects and IsaacScript mods. - if ( - checkTemplateDirectory(TEMPLATES_STATIC_DIR, ignoreFileNamesSet, verbose) - ) { - oneOrMoreErrors = true; - } - - // Second, check the files that are specific to either a TypeScript project or an IsaacScript mod. - const staticDirSuffix = typeScript ? "ts" : "mod"; - const staticDirPath = path.join(TEMPLATES_DIR, `static-${staticDirSuffix}`); - if (checkTemplateDirectory(staticDirPath, ignoreFileNamesSet, verbose)) { + const templateDirectoryErrors = await checkTemplateDirectory( + TEMPLATES_STATIC_DIR, + ignoreFileNamesSet, + verbose, + ); + if (templateDirectoryErrors) { oneOrMoreErrors = true; } - // Third, check dynamic files that require specific logic. - if (checkIndividualFiles(ignoreFileNamesSet, packageManager, verbose)) { + // Second, check dynamic files that require specific logic. + const filesError = await checkIndividualFiles(ignoreFileNamesSet, verbose); + if (filesError) { oneOrMoreErrors = true; } @@ -118,17 +89,20 @@ function check(options: CheckOptions, typeScript: boolean) { } } -function checkTemplateDirectory( +/** @returns oneOrMoreErrors */ +async function checkTemplateDirectory( templateDirectory: string, ignoreFileNamesSet: ReadonlySet, verbose: boolean, -): boolean { +): Promise { let oneOrMoreErrors = false; for (const klawItem of klawSync(templateDirectory)) { const templateFilePath = klawItem.path; - if (isDirectory(templateFilePath)) { + // eslint-disable-next-line no-await-in-loop + const directory = await isDirectory(templateFilePath); + if (directory) { continue; } @@ -145,18 +119,17 @@ function checkTemplateDirectory( let projectFilePath = path.join(CWD, relativeTemplateFilePath); switch (templateFileName) { - case "_eslintrc.cjs": { - projectFilePath = path.join(projectFilePath, "..", ".eslintrc.cjs"); - break; - } - - case "_cspell.jsonc": { - projectFilePath = path.join(projectFilePath, "..", "cspell.jsonc"); + case "_cspell.config.jsonc": { + projectFilePath = path.resolve( + projectFilePath, + "..", + "cspell.config.jsonc", + ); break; } case "_gitattributes": { - projectFilePath = path.join(projectFilePath, "..", ".gitattributes"); + projectFilePath = path.resolve(projectFilePath, "..", ".gitattributes"); break; } @@ -170,7 +143,13 @@ function checkTemplateDirectory( continue; } - if (!compareTextFiles(projectFilePath, templateFilePath, verbose)) { + // eslint-disable-next-line no-await-in-loop + const valid = await compareTextFiles( + projectFilePath, + templateFilePath, + verbose, + ); + if (!valid) { oneOrMoreErrors = true; } } @@ -178,9 +157,9 @@ function checkTemplateDirectory( return oneOrMoreErrors; } -function checkIndividualFiles( +/** @returns oneOrMoreErrors */ +async function checkIndividualFiles( ignoreFileNamesSet: ReadonlySet, - packageManager: PackageManager, verbose: boolean, ) { let oneOrMoreErrors = false; @@ -192,22 +171,12 @@ function checkIndividualFiles( templateFilePath, ); const projectFilePath = path.join(CWD, relativeTemplateFilePath); - if (!compareTextFiles(projectFilePath, templateFilePath, verbose)) { - oneOrMoreErrors = true; - } - } - - if ( - packageManager === PackageManager.yarn && - !ignoreFileNamesSet.has(YARNRC_YML) - ) { - const templateFilePath = YARNRC_TEMPLATE_PATH; - const relativeTemplateFilePath = path.relative( - TEMPLATES_DYNAMIC_DIR, + const valid = await compareTextFiles( + projectFilePath, templateFilePath, + verbose, ); - const projectFilePath = path.join(CWD, relativeTemplateFilePath); - if (!compareTextFiles(projectFilePath, templateFilePath, verbose)) { + if (!valid) { oneOrMoreErrors = true; } } @@ -216,25 +185,26 @@ function checkIndividualFiles( } /** @returns Whether the project file is valid in reference to the template file. */ -function compareTextFiles( +async function compareTextFiles( projectFilePath: string, templateFilePath: string, verbose: boolean, -): boolean { - if (!isFile(projectFilePath)) { +): Promise { + const file = await isFile(projectFilePath); + if (!file) { console.log(`Failed to find the following file: ${projectFilePath}`); printTemplateLocation(templateFilePath); return false; } - const projectFileObject = getTruncatedFileText( + const projectFileObject = await getTruncatedFileText( projectFilePath, new Set(), new Set(), ); - const templateFileObject = getTruncatedFileText( + const templateFileObject = await getTruncatedFileText( templateFilePath, projectFileObject.ignoreLines, projectFileObject.linesBeforeIgnore, @@ -252,8 +222,8 @@ function compareTextFiles( printTemplateLocation(templateFilePath); if (verbose) { - const originalTemplateFile = readFile(templateFilePath); - const originalProjectFile = readFile(projectFilePath); + const originalTemplateFile = await readFile(templateFilePath); + const originalProjectFile = await readFile(projectFilePath); console.log("--- Original template file: ---\n"); console.log(originalTemplateFile); @@ -272,8 +242,8 @@ function compareTextFiles( const tempProjectFilePath = path.join(CWD, "tempProjectFile.txt"); const tempTemplateFilePath = path.join(CWD, "tempTemplateFile.txt"); - writeFile(tempProjectFilePath, projectFileObject.text); - writeFile(tempTemplateFilePath, templateFileObject.text); + await writeFile(tempProjectFilePath, projectFileObject.text); + await writeFile(tempTemplateFilePath, templateFileObject.text); const { stdout } = execShell( "diff", @@ -284,19 +254,19 @@ function compareTextFiles( console.log(`${stdout}\n`); - deleteFileOrDirectory(tempProjectFilePath); - deleteFileOrDirectory(tempTemplateFilePath); + await deleteFileOrDirectory(tempProjectFilePath); + await deleteFileOrDirectory(tempTemplateFilePath); return false; } -function getTruncatedFileText( +async function getTruncatedFileText( filePath: string, ignoreLines: ReadonlySet, linesBeforeIgnore: ReadonlySet, ) { const fileName = path.basename(filePath); - const fileContents = readFile(filePath); + const fileContents = await readFile(filePath); return getTruncatedText( fileName, @@ -420,7 +390,10 @@ export function getTruncatedText( } // End-users can have different ignored words. - if (fileName === "cspell.jsonc" || fileName === "_cspell.jsonc") { + if ( + fileName === "cspell.config.jsonc" + || fileName === "_cspell.config.jsonc" + ) { if (line.match(/"words": \[.*]/) !== null) { continue; } diff --git a/packages/isaacscript-cli/src/commands/copy/copy.ts b/packages/isaacscript-cli/src/commands/copy/copy.ts index ef777037d..7e8a7e4ce 100644 --- a/packages/isaacscript-cli/src/commands/copy/copy.ts +++ b/packages/isaacscript-cli/src/commands/copy/copy.ts @@ -1,10 +1,10 @@ import { Command } from "@commander-js/extra-typings"; -import type { PackageManager } from "isaacscript-common-node"; +import type { PackageManager } from "complete-node"; import { copyFileOrDirectory, deleteFileOrDirectory, getPackageManagerExecCommand, -} from "isaacscript-common-node"; +} from "complete-node"; import path from "node:path"; import { getConfigFromFile } from "../../configFile.js"; import { MOD_SOURCE_PATH } from "../../constants.js"; @@ -27,26 +27,33 @@ export const copyCommand = new Command() const copyOptions = copyCommand.opts(); type CopyOptions = typeof copyOptions; -async function copy(options: CopyOptions): Promise { +async function copy(options: CopyOptions) { const { verbose } = options; - const packageManager = getPackageManagerUsedForExistingProject(); + const packageManager = await getPackageManagerUsedForExistingProject(); const config = await getConfigFromFile(); const modTargetDirectoryName = getModTargetDirectoryName(config); const modTargetPath = path.join(config.modsDirectory, modTargetDirectoryName); - await compileAndCopy(MOD_SOURCE_PATH, modTargetPath, packageManager, verbose); + await compileAndCopy( + MOD_SOURCE_PATH, + modTargetPath, + packageManager, + config.isaacScriptCommonDev, + verbose, + ); } export async function compileAndCopy( modSourcePath: string, modTargetPath: string, packageManager: PackageManager, + isaacScriptCommonDev: boolean | undefined, verbose: boolean, ): Promise { - await prepareCustomStages(packageManager, verbose); + await prepareCustomStages(packageManager, isaacScriptCommonDev, verbose); compile(packageManager, verbose); - copyMod(modSourcePath, modTargetPath); + await copyMod(modSourcePath, modTargetPath); } function compile(packageManager: PackageManager, verbose: boolean) { @@ -55,8 +62,8 @@ function compile(packageManager: PackageManager, verbose: boolean) { console.log("Mod compiled successfully."); } -function copyMod(modSourcePath: string, modTargetPath: string) { - deleteFileOrDirectory(modTargetPath); - copyFileOrDirectory(modSourcePath, modTargetPath); +async function copyMod(modSourcePath: string, modTargetPath: string) { + await deleteFileOrDirectory(modTargetPath); + await copyFileOrDirectory(modSourcePath, modTargetPath); console.log("Mod copied successfully."); } diff --git a/packages/isaacscript-cli/src/commands/init/checkIfProjectPathExists.ts b/packages/isaacscript-cli/src/commands/init/checkIfProjectPathExists.ts index d6bf01521..e22567df5 100644 --- a/packages/isaacscript-cli/src/commands/init/checkIfProjectPathExists.ts +++ b/packages/isaacscript-cli/src/commands/init/checkIfProjectPathExists.ts @@ -1,25 +1,39 @@ import chalk from "chalk"; import { deleteFileOrDirectory, + exists, fatalError, - fileOrDirectoryExists, isDirectory, -} from "isaacscript-common-node"; + isFile, +} from "complete-node"; import { CWD } from "../../constants.js"; import { getInputYesNo } from "../../prompt.js"; +/** @throws If the project path exists and is not a file or a directory. */ export async function checkIfProjectPathExists( projectPath: string, yes: boolean, ): Promise { - if (projectPath === CWD || !fileOrDirectoryExists(projectPath)) { + if (projectPath === CWD) { return; } - const fileType = isDirectory(projectPath) ? "directory" : "file"; + const projectPathExists = await exists(projectPath); + if (!projectPathExists) { + return; + } + + const file = await isFile(projectPath); + const directory = await isDirectory(projectPath); + if (!file && !directory) { + throw new Error( + `Failed to detect if the path was a file or a directory: ${projectPath}`, + ); + } + const fileType = directory ? "directory" : "file"; if (yes) { - deleteFileOrDirectory(projectPath); + await deleteFileOrDirectory(projectPath); console.log(`Deleted ${fileType}: ${chalk.green(projectPath)}`); return; } @@ -33,5 +47,5 @@ export async function checkIfProjectPathExists( fatalError("Ok then. Goodbye."); } - deleteFileOrDirectory(projectPath); + await deleteFileOrDirectory(projectPath); } diff --git a/packages/isaacscript-cli/src/commands/init/checkModSubdirectory.ts b/packages/isaacscript-cli/src/commands/init/checkModSubdirectory.ts index 38bf25421..acffb5a3c 100644 --- a/packages/isaacscript-cli/src/commands/init/checkModSubdirectory.ts +++ b/packages/isaacscript-cli/src/commands/init/checkModSubdirectory.ts @@ -1,5 +1,5 @@ import chalk from "chalk"; -import { fatalError, isSubdirectoryOf } from "isaacscript-common-node"; +import { fatalError, isSubdirectoryOf } from "complete-node"; import { CWD } from "../../constants.js"; export function checkModSubdirectory( diff --git a/packages/isaacscript-cli/src/commands/init/checkModTargetDirectory.ts b/packages/isaacscript-cli/src/commands/init/checkModTargetDirectory.ts index d663c5cd0..8729634ab 100644 --- a/packages/isaacscript-cli/src/commands/init/checkModTargetDirectory.ts +++ b/packages/isaacscript-cli/src/commands/init/checkModTargetDirectory.ts @@ -1,10 +1,11 @@ import chalk from "chalk"; import { deleteFileOrDirectory, + exists, fatalError, - fileOrDirectoryExists, isDirectory, -} from "isaacscript-common-node"; + isFile, +} from "complete-node"; import path from "node:path"; import { PROJECT_NAME } from "../../constants.js"; import { getInputYesNo } from "../../prompt.js"; @@ -15,14 +16,22 @@ export async function checkModTargetDirectory( yes: boolean, ): Promise { const modTargetPath = path.join(modsDirectory, projectName); - if (!fileOrDirectoryExists(modTargetPath)) { + const modTargetPathExists = await exists(modTargetPath); + if (!modTargetPathExists) { return; } - const fileType = isDirectory(modTargetPath) ? "directory" : "file"; + const file = await isFile(modTargetPath); + const directory = await isDirectory(modTargetPath); + if (!file && !directory) { + throw new Error( + `Failed to detect if the path was a file or a directory: ${modTargetPath}`, + ); + } + const fileType = directory ? "directory" : "file"; if (yes) { - deleteFileOrDirectory(modTargetPath); + await deleteFileOrDirectory(modTargetPath); console.log(`Deleted ${fileType}: ${chalk.green(modTargetPath)}`); return; } @@ -41,5 +50,5 @@ export async function checkModTargetDirectory( fatalError("Ok then. Goodbye."); } - deleteFileOrDirectory(modTargetPath); + await deleteFileOrDirectory(modTargetPath); } diff --git a/packages/isaacscript-cli/src/commands/init/createProject.ts b/packages/isaacscript-cli/src/commands/init/createProject.ts index d3c6b2a07..c87bee49c 100644 --- a/packages/isaacscript-cli/src/commands/init/createProject.ts +++ b/packages/isaacscript-cli/src/commands/init/createProject.ts @@ -1,9 +1,13 @@ import chalk from "chalk"; import { - PACKAGE_JSON, - PackageManager, + isObject, + removeLinesBetweenMarkers, + removeLinesMatching, + repeat, +} from "complete-common"; +import type { PackageManager } from "complete-node"; +import { copyFileOrDirectory, - deleteFileOrDirectory, fatalError, getFileNamesInDirectory, getPackageManagerExecCommand, @@ -13,16 +17,10 @@ import { isFile, makeDirectory, readFile, - renameFile, - updatePackageJSON, + renameFileOrDirectory, + updatePackageJSONDependencies, writeFile, -} from "isaacscript-common-node"; -import { - parseSemanticVersion, - removeLinesBetweenMarkers, - removeLinesMatching, - repeat, -} from "isaacscript-common-ts"; +} from "complete-node"; import path from "node:path"; import { Config } from "../../classes/Config.js"; import { createConfigFile } from "../../configFile.js"; @@ -36,16 +34,14 @@ import { METADATA_XML, METADATA_XML_TEMPLATE_PATH, README_MD, - TEMPLATES_DIR, TEMPLATES_DYNAMIC_DIR, TEMPLATES_STATIC_DIR, } from "../../constants.js"; import { execShell, execShellString } from "../../exec.js"; import { initGitRepository } from "../../git.js"; -export function createProject( +export async function createProject( projectName: string, - authorName: string | undefined, projectPath: string, createNewDir: boolean, modsDirectory: string | undefined, @@ -53,104 +49,87 @@ export function createProject( gitRemoteURL: string | undefined, skipInstall: boolean, packageManager: PackageManager, - typeScript: boolean, dev: boolean, verbose: boolean, -): void { +): Promise { if (createNewDir) { - makeDirectory(projectPath); + await makeDirectory(projectPath); } - if (!typeScript) { - const config = new Config(modsDirectory, saveSlot, dev); - createConfigFile(projectPath, config); - } + const config = new Config(modsDirectory, saveSlot, dev); + await createConfigFile(projectPath, config); - copyStaticFiles(projectPath, typeScript); - copyDynamicFiles( - projectName, - authorName, - projectPath, - packageManager, - dev, - typeScript, - ); - upgradeYarn(projectPath, packageManager, verbose); + await copyStaticFiles(projectPath); + await copyDynamicFiles(projectName, projectPath, packageManager, dev); // There is no package manager lock files yet, so we have to pass "false" to this function. - const updated = updatePackageJSON(projectPath, false, true); + const updated = await updatePackageJSONDependencies(projectPath, false, true); if (!updated) { fatalError('Failed to update the dependencies in the "package.json" file.'); } + await fixTypeScriptVersionInPackageJSON(projectPath); + installNodeModules(projectPath, skipInstall, packageManager, verbose); formatFiles(projectPath, packageManager, verbose); // Only make the initial commit once all of the files have been copied and formatted. - initGitRepository(projectPath, gitRemoteURL, verbose); + await initGitRepository(projectPath, gitRemoteURL, verbose); - const noun = typeScript ? "project" : "mod"; - console.log(`Successfully created ${noun}: ${chalk.green(projectName)}`); + console.log(`Successfully created mod: ${chalk.green(projectName)}`); } -/** Copy static files, like ".eslintrc.cjs", "tsconfig.json", etc. */ -function copyStaticFiles(projectPath: string, typeScript: boolean) { +/** Copy static files, like "eslint.config.mjs", "tsconfig.json", etc. */ +async function copyStaticFiles(projectPath: string) { // First, copy the static files that are shared between TypeScript projects and IsaacScript mods. - copyTemplateDirectoryWithoutOverwriting(TEMPLATES_STATIC_DIR, projectPath); - - // Second, copy the files that are specific to either a TypeScript project or an IsaacScript mod. - const staticDirSuffix = typeScript ? "ts" : "mod"; - const staticDirPath = path.join(TEMPLATES_DIR, `static-${staticDirSuffix}`); - copyTemplateDirectoryWithoutOverwriting(staticDirPath, projectPath); - - // Rename "_eslintrc.cjs" to ".eslintrc.cjs". (If it is kept as ".eslintrc.cjs", then local - // linting will fail.) - const ESLintConfigPath = path.join(projectPath, "_eslintrc.cjs"); - const correctESLintConfigPath = path.join(projectPath, ".eslintrc.cjs"); - renameFile(ESLintConfigPath, correctESLintConfigPath); + await copyTemplateDirectoryWithoutOverwriting( + TEMPLATES_STATIC_DIR, + projectPath, + ); // Rename "_gitattributes" to ".gitattributes". (If it is kept as ".gitattributes", then it won't // be committed to git.) const gitAttributesPath = path.join(projectPath, "_gitattributes"); const correctGitAttributesPath = path.join(projectPath, ".gitattributes"); - renameFile(gitAttributesPath, correctGitAttributesPath); + await renameFileOrDirectory(gitAttributesPath, correctGitAttributesPath); - // Rename "_cspell.jsonc" to "cspell.jsonc". (If it is kept as "cspell.jsonc", then local spell - // checking will fail.) - const cSpellConfigPath = path.join(projectPath, "_cspell.jsonc"); - const correctCSpellConfigPath = path.join(projectPath, "cspell.jsonc"); - renameFile(cSpellConfigPath, correctCSpellConfigPath); + // Rename "_cspell.config.jsonc" to "cspell.config.jsonc". (If it is kept as + // "cspell.config.jsonc", then local spell checking will fail.) + const cSpellConfigPath = path.join(projectPath, "_cspell.config.jsonc"); + const correctCSpellConfigPath = path.join(projectPath, "cspell.config.jsonc"); + await renameFileOrDirectory(cSpellConfigPath, correctCSpellConfigPath); } -function copyTemplateDirectoryWithoutOverwriting( +async function copyTemplateDirectoryWithoutOverwriting( templateDirPath: string, projectPath: string, ) { - const fileNames = getFileNamesInDirectory(templateDirPath); + const fileNames = await getFileNamesInDirectory(templateDirPath); for (const fileName of fileNames) { const templateFilePath = path.join(templateDirPath, fileName); const destinationFilePath = path.join(projectPath, fileName); - if (!isFile(destinationFilePath)) { - copyFileOrDirectory(templateFilePath, destinationFilePath); + // eslint-disable-next-line no-await-in-loop + const file = await isFile(destinationFilePath); + if (!file) { + // eslint-disable-next-line no-await-in-loop + await copyFileOrDirectory(templateFilePath, destinationFilePath); } } } /** Copy files that need to have text replaced inside of them. */ -function copyDynamicFiles( +async function copyDynamicFiles( projectName: string, - authorName: string | undefined, projectPath: string, packageManager: PackageManager, dev: boolean, - typeScript: boolean, ) { // `.github/workflows/setup/action.yml` { const fileName = ACTION_YML; const templatePath = ACTION_YML_TEMPLATE_PATH; - const templateRaw = readFile(templatePath); - const template = parseTemplate(templateRaw, typeScript); + const templateRaw = await readFile(templatePath); + const template = parseTemplate(templateRaw); const lockFileName = getPackageManagerLockFileName(packageManager); const installCommand = getPackageManagerInstallCICommand(packageManager); @@ -160,16 +139,16 @@ function copyDynamicFiles( .replaceAll("PACKAGE_MANAGER_INSTALL_COMMAND", installCommand); const setupPath = path.join(projectPath, ".github", "workflows", "setup"); - makeDirectory(setupPath); + await makeDirectory(setupPath); const destinationPath = path.join(setupPath, fileName); - writeFile(destinationPath, actionYML); + await writeFile(destinationPath, actionYML); } // `.gitignore` { const templatePath = GITIGNORE_TEMPLATE_PATH; - const templateRaw = readFile(templatePath); - const template = parseTemplate(templateRaw, typeScript); + const templateRaw = await readFile(templatePath); + const template = parseTemplate(templateRaw); // Prepend a header with the project name. let separatorLine = "# "; @@ -182,100 +161,95 @@ function copyDynamicFiles( TEMPLATES_DYNAMIC_DIR, "Node.gitignore", ); - const nodeGitIgnore = readFile(nodeGitIgnorePath); + const nodeGitIgnore = await readFile(nodeGitIgnorePath); // eslint-disable-next-line prefer-template const gitignore = gitIgnoreHeader + template + "\n" + nodeGitIgnore; // We need to replace the underscore with a period. const destinationPath = path.join(projectPath, ".gitignore"); - writeFile(destinationPath, gitignore); + await writeFile(destinationPath, gitignore); } // `package.json` { - // There are two versions of the template, one for TypeScript, and one for IsaacScript mods. - const packageJSONTemplateFileName = typeScript - ? "package.ts.json" - : "package.mod.json"; + const packageJSONTemplateFileName = "package.json"; const templatePath = path.join( TEMPLATES_DYNAMIC_DIR, packageJSONTemplateFileName, ); - const template = readFile(templatePath); + const template = await readFile(templatePath); - const packageJSON = template - .replaceAll("PROJECT_NAME", projectName) - .replaceAll("AUTHOR_NAME", authorName ?? "unknown"); + const packageJSON = template.replaceAll("project-name", projectName); - const destinationPath = path.join(projectPath, PACKAGE_JSON); - writeFile(destinationPath, packageJSON); + const destinationPath = path.join(projectPath, "package.json"); + await writeFile(destinationPath, packageJSON); } // `README.md` { - // There are two versions of the template, one for TypeScript, and one for IsaacScript mods. - const readmeMDTemplateFileName = typeScript - ? "README.ts.md" - : "README.mod.md"; + const readmeMDTemplateFileName = "README.md"; const templatePath = path.join( TEMPLATES_DYNAMIC_DIR, readmeMDTemplateFileName, ); - const template = readFile(templatePath); + const template = await readFile(templatePath); // "PROJECT-NAME" must be hyphenated, as using an underscore will break Prettier for some // reason. - const command = getPackageManagerInstallCICommand(packageManager); + const installCommand = getPackageManagerInstallCICommand(packageManager); + const execCommand = getPackageManagerExecCommand(packageManager); const readmeMD = template .replaceAll("PROJECT-NAME", projectName) - .replaceAll("PACKAGE-MANAGER-INSTALL-COMMAND", command); + .replaceAll("PACKAGE-MANAGER-INSTALL-COMMAND", installCommand) + .replaceAll("PACKAGE-MANAGER-EXEC-COMMAND", execCommand); + const destinationPath = path.join(projectPath, README_MD); - writeFile(destinationPath, readmeMD); + await writeFile(destinationPath, readmeMD); } // `mod/metadata.xml` - if (!typeScript) { + { const modPath = path.join(projectPath, "mod"); - makeDirectory(modPath); + await makeDirectory(modPath); const fileName = METADATA_XML; const templatePath = METADATA_XML_TEMPLATE_PATH; - const template = readFile(templatePath); + const template = await readFile(templatePath); const metadataXML = template.replaceAll("PROJECT_NAME", projectName); const destinationPath = path.join(modPath, fileName); - writeFile(destinationPath, metadataXML); + await writeFile(destinationPath, metadataXML); } const srcPath = path.join(projectPath, "src"); - makeDirectory(srcPath); + await makeDirectory(srcPath); // `src/main.ts` (TypeScript projects use the simple version from the "static-ts" directory.) - if (!typeScript) { + { // Convert snake_case and kebab-case to camelCase. (Kebab-case in particular will make the // example TypeScript file fail to compile.) const fileName = MAIN_TS; const templatePath = MAIN_TS_TEMPLATE_PATH; - const template = readFile(templatePath); + const template = await readFile(templatePath); const mainTS = template.replaceAll("PROJECT_NAME", projectName); const destinationPath = path.join(srcPath, fileName); - writeFile(destinationPath, mainTS); + await writeFile(destinationPath, mainTS); } // If we are initializing an IsaacScript project intended to be used for development, we can // include a better starter file. - if (!typeScript && dev) { + if (dev) { const fileName = MAIN_TS; const templatePath = MAIN_DEV_TS_TEMPLATE_PATH; - const template = readFile(templatePath); + const template = await readFile(templatePath); const mainTS = template; // No replacements are necessary for this file. const destinationPath = path.join(srcPath, fileName); - writeFile(destinationPath, mainTS); + await writeFile(destinationPath, mainTS); } } -function parseTemplate(template: string, typeScript: boolean): string { - const otherTemplateKind = typeScript ? "mod" : "ts"; +function parseTemplate(template: string): string { + const otherTemplateKind = "ts"; const otherTemplateMarker = `@template-${otherTemplateKind}`; const templateWithoutMarkers = removeLinesBetweenMarkers( template, @@ -292,61 +266,41 @@ function parseTemplate(template: string, typeScript: boolean): string { } /** - * If we are using yarn, assume that we want to use the latest version, which requires some - * additional commands to be performed. + * Since TypeScriptToLua needs a specific version of TypeScript, the latest version of TypeScript at + * the time of mod initialization may not work. Thus, we manually retrieve the correct version and + * manually set it. */ -function upgradeYarn( - projectPath: string, - packageManager: PackageManager, - verbose: boolean, -) { - if (packageManager !== PackageManager.yarn) { - return; +async function fixTypeScriptVersionInPackageJSON(projectPath: string) { + // We need the get the version of TypeScript that corresponds to the latest version of + // TypeScriptToLua. + const response = await fetch( + "https://raw.githubusercontent.com/TypeScriptToLua/TypeScriptToLua/refs/heads/master/package.json", + ); + const TSTLPackageJSON = await response.json(); + if (!isObject(TSTLPackageJSON)) { + throw new Error("Failed to parse the TSTL package.json file."); } - - // First, check to see if they have already done "corepack enable". If they have not, then yarn - // might still be on version 1. Otherwise it will be version 3. - const { stdout } = execShellString("yarn --version", verbose); - const yarnVersion = parseSemanticVersion(stdout); - if (yarnVersion === undefined) { - fatalError( - `Failed to parse the Yarn version when running the "yarn --version" command: ${stdout}`, + const { peerDependencies } = TSTLPackageJSON; + if (!isObject(peerDependencies)) { + throw new Error( + "Failed to parse the peer dependencies in the TSTL package.json file.", ); } - if (yarnVersion.majorVersion === 1) { - // They have not done a "corepack enable", so let them use Yarn 1 to reduce the complexity. - if (verbose) { - console.log('Yarn 1 detected; skipping ".yarnrc.yml" configuration.'); - } - return; + const TSTLTypeScriptVersion = peerDependencies["typescript"]; + if (typeof TSTLTypeScriptVersion !== "string") { + throw new TypeError( + 'Failed to parse the "typescript" peer dependency in the TSTL package.json file.', + ); } - // Yarn v3.5.1 is the default in Node.js v20 (once corepack has been enabled). On this version of - // node, the command will do two things: - // - It creates `./.yarn/releases/yarn-#.#.#.cjs`. - // - It creates the following string in the "package.json" file: `"packageManager": "yarn@#.#.#"` - execShellString("yarn set version latest", verbose, false, projectPath); - - // Having the "yarn-#.#.#.cjs" file inside of the repository is now discouraged in Yarn 4+, so we - // can safely delete this directory. - const yarnDirectoryPath = path.join(projectPath, ".yarn"); - deleteFileOrDirectory(yarnDirectoryPath); - - // - The ".yarnrc.yml" file will now look like this: `yarnPath: .yarn/releases/yarn-4.0.1.cjs` - // - As mentioned above, we do not need the "yarnPath" setting if the "yarn-#.#.#.cjs" file is not - // inside of the repository, so we need to delete it. - // - Additionally, since there is not a setting specified for "nodeLinker", it will use `pnp`, - // which is not desired: - // https://yarnpkg.com/features/linkers - // - `pnp` is the default, but it requires a VSCode extension. - // - `pnpm` is fast, but it does not work with a D drive: - // https://github.com/yarnpkg/berry/issues/5326 - // - Thus, we use `node-modules`, which can be set with: `yarn config set nodeLinker node-modules` - // - However, in order to fix both of these at the same time, we just overwrite the file, which is - // simpler than running commands or manually editing the file. - const yarnConfigPath = path.join(projectPath, ".yarnrc.yml"); - writeFile(yarnConfigPath, "nodeLinker: node-modules\n"); + const packageJSONPath = path.join(projectPath, "package.json"); + const packageJSON = await readFile(packageJSONPath); + const updatedPackageJSON = packageJSON.replace( + /"typescript": "[^"]*"/, + `"typescript": "${TSTLTypeScriptVersion}"`, + ); + await writeFile(packageJSONPath, updatedPackageJSON); } function installNodeModules( diff --git a/packages/isaacscript-cli/src/commands/init/getAuthorName.ts b/packages/isaacscript-cli/src/commands/init/getAuthorName.ts deleted file mode 100644 index 27e8b5c41..000000000 --- a/packages/isaacscript-cli/src/commands/init/getAuthorName.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { fatalError } from "isaacscript-common-node"; -import { getGitHubUsername } from "../../git.js"; -import { getInputString } from "../../prompt.js"; - -export async function getAuthorName( - typeScript: boolean, -): Promise { - const gitHubUsername = getGitHubUsername(); - if (gitHubUsername !== undefined) { - return gitHubUsername; - } - - if (!typeScript) { - // In IsaacScript mods, putting the author in the "package.json" file is not necessary. - return undefined; - } - - return getNewAuthorName(); -} - -async function getNewAuthorName(): Promise { - console.log( - "The author name was not found from the GitHub CLI configuration file.", - ); - const authorName = await getInputString("Enter the author of the project:"); - if (authorName === "") { - fatalError("You must enter an author name."); - } - - return authorName; -} diff --git a/packages/isaacscript-cli/src/commands/init/getModsDirectory.ts b/packages/isaacscript-cli/src/commands/init/getModsDirectory.ts index fb69e8c4c..054fe8676 100644 --- a/packages/isaacscript-cli/src/commands/init/getModsDirectory.ts +++ b/packages/isaacscript-cli/src/commands/init/getModsDirectory.ts @@ -1,5 +1,5 @@ import chalk from "chalk"; -import { fatalError, isDirectory } from "isaacscript-common-node"; +import { fatalError, isDirectory } from "complete-node"; import path from "node:path"; import { HOME_DIR } from "../../constants.js"; import { getInputString } from "../../prompt.js"; @@ -37,7 +37,8 @@ export async function getModsDirectory( const defaultModsPath = getDefaultModsPath(process.platform); - if (isDirectory(defaultModsPath)) { + const defaultModsExists = await isDirectory(defaultModsPath); + if (defaultModsExists) { return defaultModsPath; } @@ -52,7 +53,8 @@ export async function getModsDirectory( fatalError("Error: You did not provide a response; exiting."); } - if (!isDirectory(modsDir)) { + const modsExists = await isDirectory(modsDir); + if (!modsExists) { fatalError( `Error: The directory of "${chalk.green( modsDir, diff --git a/packages/isaacscript-cli/src/commands/init/getProjectPath.ts b/packages/isaacscript-cli/src/commands/init/getProjectPath.ts index 61ef88f4c..41fdf7865 100644 --- a/packages/isaacscript-cli/src/commands/init/getProjectPath.ts +++ b/packages/isaacscript-cli/src/commands/init/getProjectPath.ts @@ -1,6 +1,6 @@ import chalk from "chalk"; -import { fatalError } from "isaacscript-common-node"; -import { hasWhitespace, isKebabCase } from "isaacscript-common-ts"; +import { hasWhitespace, isKebabCase } from "complete-common"; +import { fatalError } from "complete-node"; import path from "node:path"; import { CURRENT_DIRECTORY_NAME, CWD } from "../../constants.js"; import { getInputString, getInputYesNo } from "../../prompt.js"; @@ -24,7 +24,7 @@ export async function getProjectPath( customDirectory: string | undefined, yes: boolean, forceName: boolean, -): Promise<[string, boolean]> { +): Promise<{ projectPath: string; createNewDir: boolean }> { let projectName = name; let projectPath: string; let createNewDir: boolean; @@ -54,7 +54,7 @@ export async function getProjectPath( validateProjectName(projectName, forceName); console.log(`Using a project name of: ${chalk.green(projectName)}`); - return [projectPath, createNewDir]; + return { projectPath, createNewDir }; } async function getNewProjectName(): Promise<[string, string, boolean]> { diff --git a/packages/isaacscript-cli/src/commands/init/getSaveSlot.ts b/packages/isaacscript-cli/src/commands/init/getSaveSlot.ts index aa9d44ed7..44059ad2b 100644 --- a/packages/isaacscript-cli/src/commands/init/getSaveSlot.ts +++ b/packages/isaacscript-cli/src/commands/init/getSaveSlot.ts @@ -1,4 +1,4 @@ -import { fatalError } from "isaacscript-common-node"; +import { fatalError } from "complete-node"; import { getInputInt } from "../../prompt.js"; export async function getSaveSlot( diff --git a/packages/isaacscript-cli/src/commands/init/init.ts b/packages/isaacscript-cli/src/commands/init/init.ts index 88cf3a707..baad588e5 100644 --- a/packages/isaacscript-cli/src/commands/init/init.ts +++ b/packages/isaacscript-cli/src/commands/init/init.ts @@ -3,9 +3,9 @@ import { InvalidOptionArgumentError, } from "@commander-js/extra-typings"; import chalk from "chalk"; -import type { PackageManager } from "isaacscript-common-node"; -import { getPackageManagerExecCommand } from "isaacscript-common-node"; -import { parseIntSafe } from "isaacscript-common-ts"; +import { parseIntSafe } from "complete-common"; +import type { PackageManager } from "complete-node"; +import { getPackageManagerExecCommand } from "complete-node"; import path from "node:path"; import { printBanner } from "../../banner.js"; import { CWD, PROJECT_NAME } from "../../constants.js"; @@ -15,7 +15,6 @@ import { checkIfProjectPathExists } from "./checkIfProjectPathExists.js"; import { checkModSubdirectory } from "./checkModSubdirectory.js"; import { checkModTargetDirectory } from "./checkModTargetDirectory.js"; import { createProject } from "./createProject.js"; -import { getAuthorName } from "./getAuthorName.js"; import { getModsDirectory } from "./getModsDirectory.js"; import { getProjectPath } from "./getProjectPath.js"; import { getSaveSlot } from "./getSaveSlot.js"; @@ -72,7 +71,7 @@ export const initCommand = new Command() ) .option("-v, --verbose", "Enable verbose output.", false) .action(async (name, options) => { - await init(name, options, false); + await init(name, options); }); function validateSaveSlot(valueString: string): number { @@ -92,56 +91,11 @@ function validateSaveSlot(valueString: string): number { return valueNumber; } -export const initTSCommand = new Command() - .command("init-ts [name]") - .description("Initialize a new TypeScript project.") - .allowExcessArguments(false) // By default, Commander.js will allow extra positional arguments. - .helpOption("-h, --help", "Display the list of options for this command.") - .option( - "-y, --yes", - 'Answer yes to every dialog option, similar to how "npm init --yes" works.', - false, - ) - .option( - "--use-current-directory", - "Use the current directory as the root for the project.", - false, - ) - .option( - "--custom-directory ", - "The directory to create the project in (instead of the current working directory).", - ) - .option("--vscode", "Open the project in VSCode after initialization.", false) - .option("--npm", "Use npm as the package manager.", false) - .option("--yarn", "Use Yarn as the package manager.", false) - .option("--pnpm", "Use pnpm as the package manager.", false) - .option("--skip-git", "Do not initialize Git.", false) // https://github.com/tj/commander.js/issues/2068 - .option( - "--skip-install", - "Do not automatically install the dependencies after initializing the project.", - false, - ) - .option( - "-f, --force-name", - "Allow project names that are normally illegal", - false, - ) - .option("-v, --verbose", "Enable verbose output.", false) - .action(async (name, options) => { - await init(name, options, true); - }); - // eslint-disable-next-line @typescript-eslint/no-unused-vars const initOptions = initCommand.opts(); -// eslint-disable-next-line @typescript-eslint/no-unused-vars -const initTSOptions = initTSCommand.opts(); -type InitOptions = typeof initOptions | typeof initTSOptions; +type InitOptions = typeof initOptions; -async function init( - name: string | undefined, - options: InitOptions, - typeScript: boolean, -): Promise { +async function init(name: string | undefined, options: InitOptions) { const { forceName, skipGit, @@ -153,12 +107,12 @@ async function init( yes, } = options; - printBanner(); + await printBanner(); - const packageManager = getPackageManagerUsedForNewProject(options); + const packageManager = await getPackageManagerUsedForNewProject(options); // Prompt the end-user for some information (and validate it as we go). - const [projectPath, createNewDir] = await getProjectPath( + const { projectPath, createNewDir } = await getProjectPath( name, useCurrentDirectory, customDirectory, @@ -168,7 +122,6 @@ async function init( await checkIfProjectPathExists(projectPath, yes); const projectName = path.basename(projectPath); - const authorName = await getAuthorName(typeScript); const dev = "dev" in options ? options.dev : false; const gitRemoteURL = await promptGitHubRepoOrGitRemoteURL( projectName, @@ -180,23 +133,16 @@ async function init( const modsDirectoryOption = "modsDirectory" in options ? options.modsDirectory : undefined; - const modsDirectory = typeScript - ? undefined - : await getModsDirectory(modsDirectoryOption); - if (modsDirectory !== undefined) { - checkModSubdirectory(projectPath, modsDirectory); - await checkModTargetDirectory(modsDirectory, projectName, yes); - } + const modsDirectory = await getModsDirectory(modsDirectoryOption); + checkModSubdirectory(projectPath, modsDirectory); + await checkModTargetDirectory(modsDirectory, projectName, yes); const saveSlotOption = "saveSlot" in options ? options.saveSlot : undefined; - const saveSlot = typeScript - ? undefined - : await getSaveSlot(saveSlotOption, yes); + const saveSlot = await getSaveSlot(saveSlotOption, yes); // Now that we have asked the user all of the questions we need, we can create the project. - createProject( + await createProject( projectName, - authorName, projectPath, createNewDir, modsDirectory, @@ -204,15 +150,12 @@ async function init( gitRemoteURL, skipInstall, packageManager, - typeScript, dev, verbose, ); await vsCodeInit(projectPath, vscode, yes, verbose); - if (!typeScript) { - printIsaacScriptMessage(projectPath, projectName, packageManager); - } + printIsaacScriptMessage(projectPath, projectName, packageManager); } function printIsaacScriptMessage( diff --git a/packages/isaacscript-cli/src/commands/init/vsCode.ts b/packages/isaacscript-cli/src/commands/init/vsCode.ts index 9f1d755d9..32f57e51b 100644 --- a/packages/isaacscript-cli/src/commands/init/vsCode.ts +++ b/packages/isaacscript-cli/src/commands/init/vsCode.ts @@ -1,9 +1,5 @@ -import { - commandExists, - fatalError, - getJSONC, - isFile, -} from "isaacscript-common-node"; +import { assertObject, isArray } from "complete-common"; +import { commandExists, fatalError, getJSONC, isFile } from "complete-node"; import path from "node:path"; import { execShell } from "../../exec.js"; import { getInputYesNo } from "../../prompt.js"; @@ -21,7 +17,7 @@ export async function vsCodeInit( yes: boolean, verbose: boolean, ): Promise { - const VSCodeCommand = getVSCodeCommand(); + const VSCodeCommand = await getVSCodeCommand(); if (VSCodeCommand === undefined) { console.log( 'VSCode does not seem to be installed. (The "code" command is not in the path.) Skipping VSCode-related things.', @@ -29,15 +25,23 @@ export async function vsCodeInit( return; } - installVSCodeExtensions(projectPath, VSCodeCommand, verbose); + await installVSCodeExtensions(projectPath, VSCodeCommand, verbose); await promptVSCode(projectPath, VSCodeCommand, vscode, yes, verbose); } -function getVSCodeCommand(): string | undefined { - return VS_CODE_COMMANDS.find((command) => commandExists(command)); +async function getVSCodeCommand(): Promise { + for (const command of VS_CODE_COMMANDS) { + // eslint-disable-next-line no-await-in-loop + const exists = await commandExists(command); + if (exists) { + return command; + } + } + + return undefined; } -function installVSCodeExtensions( +async function installVSCodeExtensions( projectPath: string, VSCodeCommand: string, verbose: boolean, @@ -49,27 +53,34 @@ function installVSCodeExtensions( return; } - const extensions = getExtensionsFromJSON(projectPath); + const extensions = await getExtensionsFromJSON(projectPath); for (const extensionName of extensions) { execShell(VSCodeCommand, ["--install-extension", extensionName], verbose); } } -function getExtensionsFromJSON(projectPath: string): readonly string[] { +async function getExtensionsFromJSON( + projectPath: string, +): Promise { const extensionsJSONPath = path.join( projectPath, ".vscode", "extensions.json", ); - if (!isFile(extensionsJSONPath)) { + const file = await isFile(extensionsJSONPath); + if (!file) { return []; } - const extensionsJSON = getJSONC(extensionsJSONPath); + const extensionsJSON = await getJSONC(extensionsJSONPath); + assertObject( + extensionsJSON, + `The extensions file was not an object at: ${extensionsJSONPath}`, + ); const { recommendations } = extensionsJSON; - if (!Array.isArray(recommendations)) { + if (!isArray(recommendations)) { fatalError( 'The "recommendations" field in the "extensions.json" file is not an array.', ); @@ -92,7 +103,7 @@ async function promptVSCode( vscode: boolean, yes: boolean, verbose: boolean, -): Promise { +) { if (vscode) { // They supplied the "--vscode" command-line flag, so there is no need to prompt the user. openVSCode(projectPath, VSCodeCommand, verbose); diff --git a/packages/isaacscript-cli/src/commands/monitor/copyWatcherMod.ts b/packages/isaacscript-cli/src/commands/monitor/copyWatcherMod.ts index 6b72755e9..6870db502 100644 --- a/packages/isaacscript-cli/src/commands/monitor/copyWatcherMod.ts +++ b/packages/isaacscript-cli/src/commands/monitor/copyWatcherMod.ts @@ -4,7 +4,7 @@ import { isFile, readFile, writeFile, -} from "isaacscript-common-node"; +} from "complete-node"; import path from "node:path"; import type { ValidatedConfig } from "../../classes/ValidatedConfig.js"; import { @@ -14,26 +14,26 @@ import { WATCHER_MOD_SOURCE_PATH, } from "../../constants.js"; -export function copyWatcherMod(config: ValidatedConfig): void { +export async function copyWatcherMod(config: ValidatedConfig): Promise { // Check to see if this mod was disabled. const watcherModPath = path.join(config.modsDirectory, WATCHER_MOD_NAME); const disableItPath = path.join(watcherModPath, DISABLE_IT_FILE); - const watcherModDisabled = isFile(disableItPath); + const watcherModDisabled = await isFile(disableItPath); // Delete and re-copy the watcher mod every time IsaacScript starts. This ensures that it is // always the latest version. - deleteFileOrDirectory(watcherModPath); - copyFileOrDirectory(WATCHER_MOD_SOURCE_PATH, watcherModPath); + await deleteFileOrDirectory(watcherModPath); + await copyFileOrDirectory(WATCHER_MOD_SOURCE_PATH, watcherModPath); if (watcherModDisabled) { // Since we deleted the directory, the "disable.it" file was deleted. Restore it. - writeFile(disableItPath, ""); + await writeFile(disableItPath, ""); } // By default, the IsaacScript watcher mod automatically restarts the game, so we only need to // disable it if the config option is explicitly set to false. if (config.enableIsaacScriptWatcherAutoRestart === false) { - disableIsaacScriptWatcherAutomaticRestart(watcherModPath); + await disableIsaacScriptWatcherAutomaticRestart(watcherModPath); } // If we copied a new version of the watcher mod into place, but the user currently has the game @@ -41,14 +41,16 @@ export function copyWatcherMod(config: ValidatedConfig): void { // game will crash, so there is no automated solution for this. } -function disableIsaacScriptWatcherAutomaticRestart(watcherModPath: string) { +async function disableIsaacScriptWatcherAutomaticRestart( + watcherModPath: string, +) { const mainLuaPath = path.join(watcherModPath, MAIN_LUA); - const mainLua = readFile(mainLuaPath); + const mainLua = await readFile(mainLuaPath); const modifiedMainLua = mainLua.replace( "local RESTART_GAME_ON_RECOMPILATION = true", "local RESTART_GAME_ON_RECOMPILATION = false", ); - writeFile(mainLuaPath, modifiedMainLua); + await writeFile(mainLuaPath, modifiedMainLua); } diff --git a/packages/isaacscript-cli/src/commands/monitor/modDirectorySyncer/modDirectorySyncer.ts b/packages/isaacscript-cli/src/commands/monitor/modDirectorySyncer/modDirectorySyncer.ts index 74810de2f..3006665a2 100644 --- a/packages/isaacscript-cli/src/commands/monitor/modDirectorySyncer/modDirectorySyncer.ts +++ b/packages/isaacscript-cli/src/commands/monitor/modDirectorySyncer/modDirectorySyncer.ts @@ -1,6 +1,6 @@ import syncDirectory from "@zamiell/sync-directory"; -import { getArgs } from "isaacscript-common-node"; -import { assertDefined } from "isaacscript-common-ts"; +import { assertDefined } from "complete-common"; +import { getArgs } from "complete-node"; import { FILE_SYNCED_MESSAGE } from "../../../constants.js"; const SUBPROCESS_NAME = "directory syncer"; diff --git a/packages/isaacscript-cli/src/commands/monitor/monitor.ts b/packages/isaacscript-cli/src/commands/monitor/monitor.ts index 883741f8f..467122dfa 100644 --- a/packages/isaacscript-cli/src/commands/monitor/monitor.ts +++ b/packages/isaacscript-cli/src/commands/monitor/monitor.ts @@ -7,8 +7,7 @@ import { getPackageManagerInstallCommand, isDirectory, isLink, - touch, -} from "isaacscript-common-node"; +} from "complete-node"; import path from "node:path"; import { printBanner } from "../../banner.js"; import { getConfigFromFile } from "../../configFile.js"; @@ -20,7 +19,6 @@ import { PACKAGE_MANAGER_USED_FOR_ISAACSCRIPT, getPackageManagerUsedForExistingProject, } from "../../packageManager.js"; -import { getFirstTSConfigIncludePath } from "../../tsconfig.js"; import { getModTargetDirectoryName } from "../../utils.js"; import { validateDepsInstalled, @@ -53,45 +51,48 @@ export const monitorCommand = new Command() const monitorOptions = monitorCommand.opts(); type MonitorOptions = typeof monitorOptions; -async function monitor(options: MonitorOptions): Promise { +async function monitor(options: MonitorOptions) { const { skipProjectChecks, verbose } = options; - printBanner(); + await printBanner(); - const packageManager = getPackageManagerUsedForExistingProject(); + const packageManager = await getPackageManagerUsedForExistingProject(); if (!skipProjectChecks) { - validateInIsaacScriptProject(); - validatePackageJSONDependencies(); - validateDepsInstalled(verbose); + await validateInIsaacScriptProject(); + await validatePackageJSONDependencies(); } const config = await getConfigFromFile(); + if (!skipProjectChecks) { + await validateDepsInstalled(config.isaacScriptCommonDev, verbose); + } + // Read the "tsconfig.json" file. - const tsConfigInclude = getFirstTSConfigIncludePath(); - const resolvedIncludePath = path.resolve(CWD, tsConfigInclude); const modTargetDirectoryName = getModTargetDirectoryName(config); const modTargetPath = path.join(config.modsDirectory, modTargetDirectoryName); // Prepare the IsaacScript watcher mod. - copyWatcherMod(config); - touchWatcherSaveDatFiles(config); + await copyWatcherMod(config); + await touchWatcherSaveDatFiles(config); // Perform the steps to link to a development version of "isaacscript-common", if necessary. (This // has to be before preparing custom stages.) - if (config.isaacScriptCommonDev === true) { - linkDevelopmentIsaacScriptCommon(CWD, packageManager, verbose); - } else { - warnIfIsaacScriptCommonLinkExists(CWD, packageManager); - } + await (config.isaacScriptCommonDev === true + ? linkDevelopmentIsaacScriptCommon(CWD, packageManager, verbose) + : errorIfIsaacScriptCommonLinkExists(CWD, packageManager)); // Prepare the custom stages feature, if necessary. - await prepareCustomStages(packageManager, verbose); + await prepareCustomStages( + packageManager, + config.isaacScriptCommonDev, + verbose, + ); // Delete and re-copy the mod every time IsaacScript starts. This ensures that it is always the // latest version. - deleteFileOrDirectory(modTargetPath); + await deleteFileOrDirectory(modTargetPath); // Subprocess #1 - The "save#.dat" file writer. spawnSaveDatWriter(config); @@ -105,13 +106,14 @@ async function monitor(options: MonitorOptions): Promise { // Subprocess #4 - `tstl --watch` (for the development version of `isaacscript-common`). if (config.isaacScriptCommonDev === true) { const isaacScriptMonorepoDirectory = - getAndValidateIsaacScriptMonorepoDirectory(CWD); + await getAndValidateIsaacScriptMonorepoDirectory(CWD); const isaacScriptCommonDirectory = path.join( isaacScriptMonorepoDirectory, "packages", "isaacscript-common", ); - if (!isDirectory(isaacScriptCommonDirectory)) { + const directory = await isDirectory(isaacScriptCommonDirectory); + if (!directory) { console.error( `The "isaacscript-common" directory does not exist at: ${isaacScriptCommonDirectory}`, ); @@ -128,10 +130,10 @@ async function monitor(options: MonitorOptions): Promise { notifyGamePing(); }, 1000); // Every second + const srcDir = path.join(CWD, "src"); + console.log("Automatically monitoring the following for changes:"); - console.log( - `1) your TypeScript code: ${chalk.green(resolvedIncludePath)}`, - ); + console.log(`1) your TypeScript code: ${chalk.green(srcDir)}`); console.log(`2) the source mod directory: ${chalk.green(MOD_SOURCE_PATH)}`); console.log(""); console.log(`Copying files to: ${chalk.green(modTargetPath)}`); @@ -139,7 +141,7 @@ async function monitor(options: MonitorOptions): Promise { // (The process will now continue indefinitely for as long as the subprocesses exist.) } -function linkDevelopmentIsaacScriptCommon( +async function linkDevelopmentIsaacScriptCommon( projectPath: string, packageManager: PackageManager, verbose: boolean, @@ -151,11 +153,11 @@ function linkDevelopmentIsaacScriptCommon( } const isaacScriptMonorepoDirectory = - getAndValidateIsaacScriptMonorepoDirectory(projectPath); + await getAndValidateIsaacScriptMonorepoDirectory(projectPath); console.log('Building "isaacscript-common"...'); - // Run "yarn install" at the root of the monorepo. + // Ensure that dependencies are installed in the isaacscript monorepo. const installCommand = getPackageManagerInstallCommand(packageManager); execShellString(installCommand, verbose, false, isaacScriptMonorepoDirectory); @@ -168,33 +170,42 @@ function linkDevelopmentIsaacScriptCommon( const buildCommand = "npm run build"; execShellString(buildCommand, verbose, false, iscPackagePath); - console.log( - 'Linking this repository to the development version of "isaacscript-common"...', - ); - const yarnLockPath = path.join(iscPackagePath, "yarn.lock"); - touch(yarnLockPath); - execShell( - PACKAGE_MANAGER_USED_FOR_ISAACSCRIPT, - ["link", iscPackagePath], - verbose, - false, + const localIsaacScriptCommonPath = path.join( projectPath, + "node_modules", + "isaacscript-common", ); + const link = await isLink(localIsaacScriptCommonPath); + if (link) { + console.log('The "isaacscript-common" package is already linked.'); + } else { + console.log( + 'Linking this repository to the development version of "isaacscript-common"...', + ); + execShell( + PACKAGE_MANAGER_USED_FOR_ISAACSCRIPT, + ["link", iscPackagePath], + verbose, + false, + projectPath, + ); + } } -function warnIfIsaacScriptCommonLinkExists( +async function errorIfIsaacScriptCommonLinkExists( projectPath: string, packageManager: PackageManager, ) { - const isaacScriptCommonPath = path.join( + const localIsaacScriptCommonPath = path.join( projectPath, "node_modules", "isaacscript-common", ); + const link = await isLink(localIsaacScriptCommonPath); if ( - isLink(isaacScriptCommonPath) && - packageManager !== PackageManager.pnpm // pnpm uses links, so it will cause a false positive. + link + && packageManager !== PackageManager.pnpm // pnpm uses links, so it will cause a false positive. ) { fatalError( `Your "node_modules/isaacscript-common" directory is linked, but you do not have "isaacScriptCommonDev" set to true in your "isaacscript.json" file. You must either set it to true or remove the link via the following command: ${chalk.green( diff --git a/packages/isaacscript-cli/src/commands/monitor/saveDatWriter/saveDatWriter.ts b/packages/isaacscript-cli/src/commands/monitor/saveDatWriter/saveDatWriter.ts index aa1e293a0..a660c7e89 100644 --- a/packages/isaacscript-cli/src/commands/monitor/saveDatWriter/saveDatWriter.ts +++ b/packages/isaacscript-cli/src/commands/monitor/saveDatWriter/saveDatWriter.ts @@ -1,10 +1,5 @@ -import { - getArgs, - isFile, - makeDirectory, - readFile, -} from "isaacscript-common-node"; -import { assertDefined } from "isaacscript-common-ts"; +import { assertDefined, isArray } from "complete-common"; +import { getArgs, isFile, makeDirectory, readFile } from "complete-node"; import * as JSONC from "jsonc-parser"; import fs from "node:fs"; import path from "node:path"; @@ -17,9 +12,9 @@ const MAX_MESSAGES = 100; let saveDatPath: string; let saveDatFileName: string; -init(); +await init(); -function init() { +async function init() { const args = getArgs(); const firstArg = args[0]; @@ -33,18 +28,24 @@ function init() { // Check to see if the data directory exists. const watcherModDataPath = path.dirname(saveDatPath); - if (!isFile(watcherModDataPath)) { - makeDirectory(watcherModDataPath); + const file = await isFile(watcherModDataPath); + if (!file) { + await makeDirectory(watcherModDataPath); } // Listen for messages from the parent process. process.on("message", (msg: SaveDatMessage) => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises onMessage(msg.type, msg.data); }); } -function onMessage(type: SaveDatMessageType, data: string, numRetries = 0) { - const saveDat = readSaveDatFromDisk(); +async function onMessage( + type: SaveDatMessageType, + data: string, + numRetries = 0, +) { + const saveDat = await readSaveDatFromDisk(); if (saveDat.length > MAX_MESSAGES) { // If IsaacScript is running and: // - the game is not open @@ -60,11 +61,12 @@ function onMessage(type: SaveDatMessageType, data: string, numRetries = 0) { writeSaveDatToDisk(type, data, saveDat, numRetries); } -// eslint-disable-next-line isaacscript/no-mutable-return -function readSaveDatFromDisk(): SaveDatMessage[] { +// eslint-disable-next-line complete/no-mutable-return +async function readSaveDatFromDisk(): Promise { let saveDat: SaveDatMessage[]; - if (isFile(saveDatPath)) { - const saveDatRaw = readFile(saveDatPath); + const file = await isFile(saveDatPath); + if (file) { + const saveDatRaw = await readFile(saveDatPath); try { saveDat = JSONC.parse(saveDatRaw) as SaveDatMessage[]; } catch (error) { @@ -74,7 +76,7 @@ function readSaveDatFromDisk(): SaveDatMessage[] { } else { saveDat = []; } - if (!Array.isArray(saveDat)) { + if (!isArray(saveDat)) { saveDat = []; } @@ -83,6 +85,7 @@ function readSaveDatFromDisk(): SaveDatMessage[] { function addMessageToSaveDat( type: SaveDatMessageType, + // eslint-disable-next-line complete/prefer-readonly-parameter-types saveDat: SaveDatMessage[], data: string, ) { @@ -133,6 +136,7 @@ function writeSaveDatToDisk( `Writing to "${saveDatFileName}" failed. (The number of retries so far is ${numRetries}.) Trying again in 0.1 seconds...`, ); setTimeout(() => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises onMessage(type, data, numRetries + 1); }, 100); } diff --git a/packages/isaacscript-cli/src/commands/monitor/spawnModDirectorySyncer.ts b/packages/isaacscript-cli/src/commands/monitor/spawnModDirectorySyncer.ts index 0767dcf24..45efdd643 100644 --- a/packages/isaacscript-cli/src/commands/monitor/spawnModDirectorySyncer.ts +++ b/packages/isaacscript-cli/src/commands/monitor/spawnModDirectorySyncer.ts @@ -1,4 +1,4 @@ -import { fatalError } from "isaacscript-common-node"; +import { fatalError } from "complete-node"; import { fork } from "node:child_process"; import path from "node:path"; import type { ValidatedConfig } from "../../classes/ValidatedConfig.js"; diff --git a/packages/isaacscript-cli/src/commands/monitor/spawnSaveDatWriter.ts b/packages/isaacscript-cli/src/commands/monitor/spawnSaveDatWriter.ts index 06006fda4..fbe54558d 100644 --- a/packages/isaacscript-cli/src/commands/monitor/spawnSaveDatWriter.ts +++ b/packages/isaacscript-cli/src/commands/monitor/spawnSaveDatWriter.ts @@ -1,4 +1,4 @@ -import { fatalError } from "isaacscript-common-node"; +import { fatalError } from "complete-node"; import type { ChildProcess } from "node:child_process"; import { fork } from "node:child_process"; import path from "node:path"; @@ -17,7 +17,7 @@ export function spawnSaveDatWriter(config: ValidatedConfig): void { SUBPROCESS_NAME, SUBPROCESS_NAME, ); - const modsDataPath = path.join(config.modsDirectory, "..", "data"); + const modsDataPath = path.resolve(config.modsDirectory, "..", "data"); const watcherModDataPath = path.join(modsDataPath, WATCHER_MOD_NAME); const saveDatFileName = `save${config.saveSlot}.dat`; const saveDatPath = path.join(watcherModDataPath, saveDatFileName); diff --git a/packages/isaacscript-cli/src/commands/monitor/spawnTSTLWatcher.ts b/packages/isaacscript-cli/src/commands/monitor/spawnTSTLWatcher.ts index 9f87a8e28..bfbd54778 100644 --- a/packages/isaacscript-cli/src/commands/monitor/spawnTSTLWatcher.ts +++ b/packages/isaacscript-cli/src/commands/monitor/spawnTSTLWatcher.ts @@ -1,10 +1,10 @@ -import type { PackageManager } from "isaacscript-common-node"; +import type { PackageManager } from "complete-node"; import { appendFile, fatalError, getPackageManagerExecCommand, isFile, -} from "isaacscript-common-node"; +} from "complete-node"; import { spawn } from "node:child_process"; import path from "node:path"; import type { Config } from "../../classes/Config.js"; @@ -30,45 +30,8 @@ export function spawnTSTLWatcher( }); tstl.stdout.on("data", (data: readonly Buffer[]) => { - const msg = data.toString().trim(); - const suffix = getMonitorMessageSuffix(config, cwd); - - if (msg.includes("Starting compilation in watch mode...")) { - const newMsg1 = `${PROJECT_NAME} is now watching for future changes${suffix}.`; - notifyGameMsg(newMsg1); - const target = suffix.includes("isaacscript-common") - ? '"isaacscript-common"' - : "the mod"; - const newMsg2 = `Compiling ${target} for the first time...`; - notifyGameMsg(newMsg2); - } else if ( - msg.includes("File change detected. Starting incremental compilation...") - ) { - compilationStartTime = new Date(); - const newMsg = `TypeScript change detected${suffix}. Compiling...`; - notifyGameMsg(newMsg); - } else if (msg.includes("Found 0 errors. Watching for file changes.")) { - const compilationFinishTime = new Date(); - const elapsedTimeMilliseconds = - compilationFinishTime.getTime() - compilationStartTime.getTime(); - const elapsedTimeSeconds = elapsedTimeMilliseconds / 1000; - const newMsg = `${COMPILATION_SUCCESSFUL_MESSAGE} (in ${elapsedTimeSeconds} seconds)${suffix}`; - notifyGameMsg(newMsg); - - // Successful compilation of "isaacscript-common" will not trigger a recompilation in the mod. - // Thus, we must arbitrarily change a file to trigger a mod recompilation. - if (modCWD !== undefined) { - const bundleEntryTSPath = path.join(modCWD, "src", "bundleEntry.ts"); - if (isFile(bundleEntryTSPath)) { - appendFile( - bundleEntryTSPath, - "// isaacscript-common dev forced recompilation\n", - ); - } - } - } else { - notifyGameMsg(msg); - } + // eslint-disable-next-line @typescript-eslint/no-floating-promises + onTSTLStdoutData(config, cwd, modCWD, data); }); tstl.stderr.on("data", (data: readonly Buffer[]) => { @@ -93,10 +56,58 @@ export function spawnTSTLWatcher( }); } +async function onTSTLStdoutData( + config: Config, + cwd: string, + modCWD: string | undefined, + data: readonly Buffer[], +) { + const msg = data.toString().trim(); + const suffix = getMonitorMessageSuffix(config, cwd); + + if (msg.includes("Starting compilation in watch mode...")) { + const newMsg1 = `${PROJECT_NAME} is now watching for future changes${suffix}.`; + notifyGameMsg(newMsg1); + const target = suffix.includes("isaacscript-common") + ? '"isaacscript-common"' + : "the mod"; + const newMsg2 = `Compiling ${target} for the first time...`; + notifyGameMsg(newMsg2); + } else if ( + msg.includes("File change detected. Starting incremental compilation...") + ) { + compilationStartTime = new Date(); + const newMsg = `TypeScript change detected${suffix}. Compiling...`; + notifyGameMsg(newMsg); + } else if (msg.includes("Found 0 errors. Watching for file changes.")) { + const compilationFinishTime = new Date(); + const elapsedTimeMilliseconds = + compilationFinishTime.getTime() - compilationStartTime.getTime(); + const elapsedTimeSeconds = elapsedTimeMilliseconds / 1000; + const newMsg = `${COMPILATION_SUCCESSFUL_MESSAGE} (in ${elapsedTimeSeconds} seconds)${suffix}`; + notifyGameMsg(newMsg); + + // Successful compilation of "isaacscript-common" will not trigger a recompilation in the mod. + // Thus, we must arbitrarily change a file to trigger a mod recompilation. + if (modCWD !== undefined) { + const bundleEntryTSPath = path.join(modCWD, "src", "bundleEntry.ts"); + const file = await isFile(bundleEntryTSPath); + if (file) { + await appendFile( + bundleEntryTSPath, + "// isaacscript-common dev forced recompilation\n", + ); + } + } + } else { + notifyGameMsg(msg); + } +} + function getMonitorMessageSuffix(config: Config, cwd: string): string { if ( - config.isaacScriptCommonDev === false || - config.isaacScriptCommonDev === undefined + config.isaacScriptCommonDev === false + || config.isaacScriptCommonDev === undefined ) { return ""; } diff --git a/packages/isaacscript-cli/src/commands/monitor/touchWatcherSaveDatFiles.ts b/packages/isaacscript-cli/src/commands/monitor/touchWatcherSaveDatFiles.ts index 6bc1ca850..58590b5ed 100644 --- a/packages/isaacscript-cli/src/commands/monitor/touchWatcherSaveDatFiles.ts +++ b/packages/isaacscript-cli/src/commands/monitor/touchWatcherSaveDatFiles.ts @@ -1,22 +1,21 @@ -import { - isDirectory, - isFile, - makeDirectory, - touch, -} from "isaacscript-common-node"; +import { isDirectory, isFile, makeDirectory, touch } from "complete-node"; import path from "node:path"; import type { ValidatedConfig } from "../../classes/ValidatedConfig.js"; import { WATCHER_MOD_NAME } from "../../constants.js"; -export function touchWatcherSaveDatFiles(config: ValidatedConfig): void { - const modsDataPath = path.join(config.modsDirectory, "..", "data"); +export async function touchWatcherSaveDatFiles( + config: ValidatedConfig, +): Promise { + const modsDataPath = path.resolve(config.modsDirectory, "..", "data"); const watcherModDataPath = path.join(modsDataPath, WATCHER_MOD_NAME); - if (!isDirectory(watcherModDataPath)) { - makeDirectory(watcherModDataPath); + const directory = await isDirectory(watcherModDataPath); + if (!directory) { + await makeDirectory(watcherModDataPath); } const saveDatFileName = `save${config.saveSlot}.dat`; const saveDatPath = path.join(watcherModDataPath, saveDatFileName); - if (!isFile(saveDatPath)) { - touch(saveDatPath); + const file = await isFile(saveDatPath); + if (!file) { + await touch(saveDatPath); } } diff --git a/packages/isaacscript-cli/src/commands/publish/isaacscriptMod.ts b/packages/isaacscript-cli/src/commands/publish/isaacscriptMod.ts index 721ae2c61..33c753dab 100644 --- a/packages/isaacscript-cli/src/commands/publish/isaacscriptMod.ts +++ b/packages/isaacscript-cli/src/commands/publish/isaacscriptMod.ts @@ -6,7 +6,7 @@ import { isDirectory, isFile, readFile, -} from "isaacscript-common-node"; +} from "complete-node"; import path from "node:path"; import { getConfigFromFile } from "../../configFile.js"; import { @@ -26,31 +26,38 @@ export async function publishIsaacScriptMod( dryRun: boolean, verbose: boolean, ): Promise { - const packageManager = getPackageManagerUsedForExistingProject(); + const packageManager = await getPackageManagerUsedForExistingProject(); const config = await getConfigFromFile(); const modTargetDirectoryName = getModTargetDirectoryName(config); const modTargetPath = path.join(config.modsDirectory, modTargetDirectoryName); - const version = getPackageJSONVersion(undefined); + const version = await getPackageJSONVersion(undefined); - runReleaseScriptPreCopy(verbose); - await compileAndCopy(MOD_SOURCE_PATH, modTargetPath, packageManager, verbose); - purgeRoomXMLs(modTargetPath); - runReleaseScriptPostCopy(verbose); + await runReleaseScriptPreCopy(verbose); + await compileAndCopy( + MOD_SOURCE_PATH, + modTargetPath, + packageManager, + config.isaacScriptCommonDev, + verbose, + ); + await purgeRoomXMLs(modTargetPath); + await runReleaseScriptPostCopy(verbose); if (dryRun) { execShellString("git reset --hard", verbose); // Revert the version changes. } else { const releaseGitCommitMessage = getReleaseGitCommitMessage(version); gitCommitAllAndPush(releaseGitCommitMessage, verbose); - uploadMod(modTargetPath, verbose); + await uploadMod(modTargetPath, verbose); } const dryRunSuffix = dryRun ? " (dry run)" : ""; console.log(`\nPublished version ${version} successfully${dryRunSuffix}.`); } -function runReleaseScriptPreCopy(verbose: boolean) { - if (!isFile(PUBLISH_PRE_COPY_PY_PATH)) { +async function runReleaseScriptPreCopy(verbose: boolean) { + const file = await isFile(PUBLISH_PRE_COPY_PY_PATH); + if (!file) { return; } @@ -61,8 +68,9 @@ function runReleaseScriptPreCopy(verbose: boolean) { } } -function runReleaseScriptPostCopy(verbose: boolean) { - if (!isFile(PUBLISH_POST_COPY_PY_PATH)) { +async function runReleaseScriptPostCopy(verbose: boolean) { + const file = await isFile(PUBLISH_POST_COPY_PY_PATH); + if (!file) { return; } @@ -73,24 +81,27 @@ function runReleaseScriptPostCopy(verbose: boolean) { } } -function purgeRoomXMLs(modTargetPath: string) { +async function purgeRoomXMLs(modTargetPath: string) { const roomsPath = path.join(modTargetPath, "resources", "rooms"); - if (!isDirectory(roomsPath)) { + const directory = await isDirectory(roomsPath); + if (!directory) { return; } - const fileNames = getFileNamesInDirectory(roomsPath); + const fileNames = await getFileNamesInDirectory(roomsPath); const xmlFileNames = fileNames.filter( (fileName) => path.extname(fileName) === ".xml", ); for (const xmlFileName of xmlFileNames) { const roomFilePath = path.join(roomsPath, xmlFileName); - deleteFileOrDirectory(roomFilePath); + // eslint-disable-next-line no-await-in-loop + await deleteFileOrDirectory(roomFilePath); } } -function uploadMod(modTargetPath: string, verbose: boolean) { - if (hasIsaacSteamWorkshopUploadGitHubAction()) { +async function uploadMod(modTargetPath: string, verbose: boolean) { + const hasGitHubAction = await hasIsaacSteamWorkshopUploadGitHubAction(); + if (hasGitHubAction) { // CI will automatically upload the new version to the Steam Workshop, so there is no need to // open the mod uploader program. return; @@ -104,13 +115,14 @@ function uploadMod(modTargetPath: string, verbose: boolean) { execExe(MOD_UPLOADER_PATH, [], verbose, modTargetPath); } -function hasIsaacSteamWorkshopUploadGitHubAction(): boolean { +async function hasIsaacSteamWorkshopUploadGitHubAction(): Promise { const ciYMLPath = path.join(CWD, ".github", "workflows", "ci.yml"); - if (!isFile(ciYMLPath)) { + const file = await isFile(ciYMLPath); + if (!file) { return false; } - const ciYML = readFile(ciYMLPath); + const ciYML = await readFile(ciYMLPath); const lines = ciYML.split("\n"); return lines.some( diff --git a/packages/isaacscript-cli/src/commands/publish/publish.ts b/packages/isaacscript-cli/src/commands/publish/publish.ts index 597423bdb..7516cd3dc 100644 --- a/packages/isaacscript-cli/src/commands/publish/publish.ts +++ b/packages/isaacscript-cli/src/commands/publish/publish.ts @@ -1,16 +1,15 @@ import { Command } from "@commander-js/extra-typings"; -import type { PackageManager } from "isaacscript-common-node"; +import type { PackageManager } from "complete-node"; import { - PACKAGE_JSON, fatalError, getPackageJSONField, getPackageJSONVersion, getPackageManagerInstallCommand, isFile, readFile, - updatePackageJSON, + updatePackageJSONDependencies, writeFile, -} from "isaacscript-common-node"; +} from "complete-node"; import { CONSTANTS_TS_PATH, CWD, @@ -26,7 +25,7 @@ import { validate } from "./validate.js"; export const publishCommand = new Command() .command("publish") - .description("Bump the version & release on the Steam Workshop.") + .description("Bump the version & publish a new release.") .allowExcessArguments(false) // By default, Commander.js will allow extra positional arguments. .helpOption("-h, --help", "Display the list of options for this command.") .option("--major", "Perform a major version bump.", false) @@ -53,36 +52,34 @@ export const publishCommand = new Command() const publishOptions = publishCommand.opts(); type PublishOptions = typeof publishOptions; -async function publish(options: PublishOptions): Promise { +async function publish(options: PublishOptions) { const { dryRun, setVersion, verbose } = options; - const isaacScriptModMissingFile = getIsaacScriptModMissingFile(CWD); + const isaacScriptModMissingFile = await getIsaacScriptModMissingFile(CWD); const typeScript = isaacScriptModMissingFile !== undefined; - validate(typeScript, setVersion, verbose); - prePublish(options, typeScript); + await validate(typeScript, setVersion, verbose); + await prePublish(options, typeScript); - if (typeScript) { - publishTypeScriptProject(dryRun, verbose); - } else { - await publishIsaacScriptMod(dryRun, verbose); - } + await (typeScript + ? publishTypeScriptProject(dryRun, verbose) + : publishIsaacScriptMod(dryRun, verbose)); } /** * Before uploading the project, we want to update dependencies, increment the version, and perform * some other steps. */ -function prePublish(options: PublishOptions, typeScript: boolean) { +async function prePublish(options: PublishOptions, typeScript: boolean) { const { dryRun, skipLint, skipUpdate, verbose } = options; - const packageManager = getPackageManagerUsedForExistingProject(); + const packageManager = await getPackageManagerUsedForExistingProject(); execShellString("git pull --rebase"); execShellString("git push"); - updateDependencies(skipUpdate, dryRun, packageManager, verbose); - incrementVersion(options, typeScript); - unsetDevelopmentConstants(); + await updateDependencies(skipUpdate, dryRun, packageManager, verbose); + await incrementVersion(options, typeScript); + await unsetDevelopmentConstants(); tryRunNPMScript("build", verbose); if (!skipLint) { @@ -90,7 +87,7 @@ function prePublish(options: PublishOptions, typeScript: boolean) { } } -function updateDependencies( +async function updateDependencies( skipUpdate: boolean, dryRun: boolean, packageManager: PackageManager, @@ -100,8 +97,8 @@ function updateDependencies( return; } - console.log(`Updating dependencies in the "${PACKAGE_JSON}" file...`); - const hasNewDependencies = updatePackageJSON(undefined); + console.log('Updating dependencies in the "package.json" file...'); + const hasNewDependencies = await updatePackageJSONDependencies(undefined); if (hasNewDependencies) { const command = getPackageManagerInstallCommand(packageManager); execShellString(command, verbose); @@ -111,7 +108,7 @@ function updateDependencies( } } -function incrementVersion(options: PublishOptions, typeScript: boolean) { +async function incrementVersion(options: PublishOptions, typeScript: boolean) { const { skipIncrement, verbose } = options; if (skipIncrement) { @@ -129,10 +126,10 @@ function incrementVersion(options: PublishOptions, typeScript: boolean) { ); if (!typeScript) { - const version = getPackageJSONVersion(undefined); - writeVersionToConstantsTS(version); - writeVersionToMetadataXML(version); - writeVersionToVersionTXT(version); + const version = await getPackageJSONVersion(undefined); + await writeVersionToConstantsTS(version); + await writeVersionToMetadataXML(version); + await writeVersionToVersionTXT(version); } } @@ -158,51 +155,53 @@ function getVersionCommandArgument(options: PublishOptions): string { return "patch"; } -function writeVersionToConstantsTS(version: string) { - if (!isFile(CONSTANTS_TS_PATH)) { +async function writeVersionToConstantsTS(version: string) { + const file = await isFile(CONSTANTS_TS_PATH); + if (!file) { console.log( 'Skipping writing the version to "constants.ts" since it was not found.', ); return; } - const constantsTS = readFile(CONSTANTS_TS_PATH); + const constantsTS = await readFile(CONSTANTS_TS_PATH); const newConstantsTS = constantsTS.replace( /const VERSION = ".+"/, `const VERSION = "${version}"`, ); - writeFile(CONSTANTS_TS_PATH, newConstantsTS); + await writeFile(CONSTANTS_TS_PATH, newConstantsTS); console.log(`The version of ${version} was written to: ${CONSTANTS_TS_PATH}`); } -function writeVersionToMetadataXML(version: string) { - const metadataXML = readFile(METADATA_XML_PATH); +async function writeVersionToMetadataXML(version: string) { + const metadataXML = await readFile(METADATA_XML_PATH); const newMetadataXML = metadataXML.replace( /.+<\/version>/, `${version}`, ); - writeFile(METADATA_XML_PATH, newMetadataXML); + await writeFile(METADATA_XML_PATH, newMetadataXML); console.log(`The version of ${version} was written to: ${METADATA_XML_PATH}`); } -function writeVersionToVersionTXT(version: string) { - writeFile(VERSION_TXT_PATH, version); +async function writeVersionToVersionTXT(version: string) { + await writeFile(VERSION_TXT_PATH, version); console.log(`The version of ${version} was written to: ${VERSION_TXT_PATH}`); } -function unsetDevelopmentConstants() { - if (!isFile(CONSTANTS_TS_PATH)) { +async function unsetDevelopmentConstants() { + const file = await isFile(CONSTANTS_TS_PATH); + if (!file) { return; } - const constantsTS = readFile(CONSTANTS_TS_PATH); + const constantsTS = await readFile(CONSTANTS_TS_PATH); const newConstantsTS = constantsTS .replace("const IS_DEV = true", "const IS_DEV = false") .replace("const DEBUG = true", "const DEBUG = false"); - writeFile(CONSTANTS_TS_PATH, newConstantsTS); + await writeFile(CONSTANTS_TS_PATH, newConstantsTS); } function tryRunNPMScript(scriptName: string, verbose: boolean) { @@ -220,9 +219,9 @@ function tryRunNPMScript(scriptName: string, verbose: boolean) { } } -function publishTypeScriptProject(dryRun: boolean, verbose: boolean) { - const projectName = getPackageJSONField(undefined, "name"); - const version = getPackageJSONVersion(undefined); +async function publishTypeScriptProject(dryRun: boolean, verbose: boolean) { + const projectName = await getPackageJSONField(undefined, "name"); + const version = await getPackageJSONVersion(undefined); if (dryRun) { execShellString("git reset --hard", verbose); // Revert the version changes. diff --git a/packages/isaacscript-cli/src/commands/publish/validate.ts b/packages/isaacscript-cli/src/commands/publish/validate.ts index f408f89a9..295e52138 100644 --- a/packages/isaacscript-cli/src/commands/publish/validate.ts +++ b/packages/isaacscript-cli/src/commands/publish/validate.ts @@ -1,35 +1,36 @@ import chalk from "chalk"; import { - PACKAGE_JSON, fatalError, isFile, + isGitDirectoryClean, isGitRepository, - isGitRepositoryClean, - isLoggedInToNPM, -} from "isaacscript-common-node"; +} from "complete-node"; import { CWD, PROJECT_NAME } from "../../constants.js"; import { execPowershell } from "../../exec.js"; -export function validate( +export async function validate( typeScript: boolean, setVersion: string | undefined, verbose: boolean, -): void { - if (!isGitRepository(CWD)) { +): Promise { + const isGitRepo = await isGitRepository(CWD); + if (!isGitRepo) { fatalError( "Failed to publish since the current working directory is not inside of a git repository.", ); } - if (!isGitRepositoryClean(CWD)) { + const isClean = await isGitDirectoryClean(CWD); + if (!isClean) { fatalError( "Failed to publish since the Git repository was dirty. Before publishing, you must push any current changes to git. (Version commits should not contain any code changes.)", ); } - if (!isFile(PACKAGE_JSON)) { + const packageJSONExists = await isFile("package.json"); + if (!packageJSONExists) { fatalError( - `Failed to find the "${PACKAGE_JSON}" file in the current working directory.`, + 'Failed to find the "package.json" file in the current working directory.', ); } @@ -41,21 +42,11 @@ export function validate( ); } - if (typeScript) { - validateTypeScriptProject(); - } else { + if (!typeScript) { validateIsaacScriptMod(verbose); } } -function validateTypeScriptProject() { - if (!isLoggedInToNPM()) { - fatalError( - 'Failed to publish since you are not logged in to npm. Try doing "npm login".', - ); - } -} - function validateIsaacScriptMod(verbose: boolean) { validateIsaacScriptOtherCopiesNotRunning(verbose); } @@ -73,9 +64,9 @@ function validateIsaacScriptOtherCopiesNotRunning(verbose: boolean) { const lines = stdout.split("\r\n"); const otherCopiesOfRunningIsaacScript = lines.filter( (line) => - line.includes("node.exe") && - line.includes("isaacscript") && - !line.includes("isaacscript publish"), + line.includes("node.exe") + && line.includes("isaacscript") + && !line.includes("isaacscript publish"), ); if (otherCopiesOfRunningIsaacScript.length > 0) { fatalError( diff --git a/packages/isaacscript-cli/src/common.ts b/packages/isaacscript-cli/src/common.ts index 0a2b5d208..88a1e460c 100644 --- a/packages/isaacscript-cli/src/common.ts +++ b/packages/isaacscript-cli/src/common.ts @@ -1,7 +1,7 @@ // These are functions copied from `isaacscript-common`. -import { fatalError } from "isaacscript-common-node"; -import { parseIntSafe } from "isaacscript-common-ts"; +import { parseIntSafe } from "complete-common"; +import { fatalError } from "complete-node"; import type { DoorSlot } from "./enums/copied/DoorSlot.js"; import type { DoorSlotFlag } from "./enums/copied/DoorSlotFlag.js"; import type { RoomShape } from "./enums/copied/RoomShape.js"; diff --git a/packages/isaacscript-cli/src/configFile.ts b/packages/isaacscript-cli/src/configFile.ts index 9d8808429..bbfaeac88 100644 --- a/packages/isaacscript-cli/src/configFile.ts +++ b/packages/isaacscript-cli/src/configFile.ts @@ -1,10 +1,6 @@ -import { - fatalError, - getJSONC, - isFile, - writeFile, -} from "isaacscript-common-node"; -import type { ReadonlyRecord } from "isaacscript-common-ts"; +import type { ReadonlyRecord } from "complete-common"; +import { assertObject } from "complete-common"; +import { fatalError, getJSONC, isFile, writeFile } from "complete-node"; import path from "node:path"; import { Config } from "./classes/Config.js"; import type { ValidatedConfig } from "./classes/ValidatedConfig.js"; @@ -15,7 +11,7 @@ import { CONFIG_FILE_NAME, CONFIG_FILE_PATH, CWD } from "./constants.js"; const NUM_INDENT_SPACES = 2; export async function getConfigFromFile(): Promise { - const existingConfig = getExistingConfig(); + const existingConfig = await getExistingConfig(); if (existingConfig !== undefined) { return existingConfig; } @@ -24,17 +20,19 @@ export async function getConfigFromFile(): Promise { const modsDirectory = await getModsDirectory(undefined); const saveSlot = await getSaveSlot(undefined, false); const config = new Config(modsDirectory, saveSlot, false) as ValidatedConfig; - createConfigFile(CWD, config); + await createConfigFile(CWD, config); return config; } -function getExistingConfig(): ValidatedConfig | undefined { - if (!isFile(CONFIG_FILE_PATH)) { +async function getExistingConfig(): Promise { + const file = await isFile(CONFIG_FILE_PATH); + if (!file) { return undefined; } - const config = getJSONC(CONFIG_FILE_PATH); + const config = await getJSONC(CONFIG_FILE_PATH); + assertObject(config, `The config was not an object at: ${CONFIG_FILE_PATH}`); validateMandatoryConfigFields(config); return config as unknown as ValidatedConfig; @@ -68,12 +66,15 @@ function errorMissing(field: string, description: string): never { ); } -export function createConfigFile(projectPath: string, config: Config): void { +export async function createConfigFile( + projectPath: string, + config: Config, +): Promise { const configFilePath = path.join(projectPath, CONFIG_FILE_NAME); const configContents = JSON.stringify(config, undefined, NUM_INDENT_SPACES); // Add a newline at the end to satisfy Prettier. const configContentsWithNewline = `${configContents}\n`; - writeFile(configFilePath, configContentsWithNewline); + await writeFile(configFilePath, configContentsWithNewline); } diff --git a/packages/isaacscript-cli/src/constants.ts b/packages/isaacscript-cli/src/constants.ts index 3daebde6c..f6c7bef3c 100644 --- a/packages/isaacscript-cli/src/constants.ts +++ b/packages/isaacscript-cli/src/constants.ts @@ -1,3 +1,4 @@ +import { getPackageJSONFieldsMandatory } from "complete-node"; import os from "node:os"; import path from "node:path"; @@ -8,10 +9,21 @@ export const HOME_DIR = os.homedir(); export const FILE_SYNCED_MESSAGE = "File synced:"; export const COMPILATION_SUCCESSFUL_MESSAGE = "Compilation successful."; export const MOD_UPLOADER_PATH = String.raw`C:\Program Files (x86)\Steam\steamapps\common\The Binding of Isaac Rebirth\tools\ModUploader\ModUploader.exe`; -export const PROJECT_NAME = "IsaacScript"; + +const packageRoot = path.resolve(import.meta.dirname, ".."); +const { version, description } = await getPackageJSONFieldsMandatory( + packageRoot, + "name", + "version", + "description", +); + +export const PROJECT_NAME = "IsaacScript"; // We want to capitalize the name. +export const PROJECT_VERSION = version; +export const PROJECT_DESCRIPTION = description; // `isaacscript` -export const REPO_ROOT = path.join(import.meta.dirname, ".."); +const REPO_ROOT = path.resolve(import.meta.dirname, ".."); // `isaacscript/custom-stage` const CUSTOM_STAGE_PATH = path.join(REPO_ROOT, "custom-stage"); @@ -31,7 +43,7 @@ export const WATCHER_MOD_NAME = "isaacscript-watcher"; export const WATCHER_MOD_SOURCE_PATH = path.join(REPO_ROOT, WATCHER_MOD_NAME); // `isaacscript/file-templates` -export const TEMPLATES_DIR = path.join(REPO_ROOT, "file-templates"); +const TEMPLATES_DIR = path.join(REPO_ROOT, "file-templates"); // `isaacscript/file-templates/static` export const TEMPLATES_STATIC_DIR = path.join(TEMPLATES_DIR, "static"); @@ -48,12 +60,6 @@ export const ACTION_YML_TEMPLATE_PATH = path.join( ACTION_YML, ); -export const YARNRC_YML = ".yarnrc.yml"; -export const YARNRC_TEMPLATE_PATH = path.join( - TEMPLATES_DYNAMIC_DIR, - YARNRC_YML, -); - const GITIGNORE = "_gitignore"; // Not named ".gitignore" to prevent npm from deleting it. export const GITIGNORE_TEMPLATE_PATH = path.join( TEMPLATES_DYNAMIC_DIR, diff --git a/packages/isaacscript-cli/src/customStage.ts b/packages/isaacscript-cli/src/customStage.ts index d5792557b..ce8a63cde 100644 --- a/packages/isaacscript-cli/src/customStage.ts +++ b/packages/isaacscript-cli/src/customStage.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; -import type { PackageManager } from "isaacscript-common-node"; +import { parseFloatSafe, parseIntSafe } from "complete-common"; +import type { PackageManager } from "complete-node"; import { - PACKAGE_JSON, copyFileOrDirectory, fatalError, getFileNamesInDirectory, @@ -11,8 +11,7 @@ import { makeDirectory, readFile, writeFile, -} from "isaacscript-common-node"; -import { parseFloatSafe, parseIntSafe } from "isaacscript-common-ts"; +} from "complete-node"; import path from "node:path"; import xml2js from "xml2js"; import { getJSONRoomDoorSlotFlags } from "./common.js"; @@ -39,7 +38,6 @@ const ISAACSCRIPT_COMMON_PATH = path.join( "node_modules", ISAACSCRIPT_COMMON, "dist", - "src", ); const METADATA_LUA_PATH = path.join( @@ -47,6 +45,16 @@ const METADATA_LUA_PATH = path.join( "customStageMetadata.lua", ); +const CUSTOM_STAGE_METADATA_JSON_PATH = path.resolve( + CWD, + "..", + "isaacscript", + "packages", + "isaacscript-common", + "src", + "customStageMetadata.json", +); + const ROOM_VARIANT_MULTIPLIER = 10_000; const VARIANT_REGEX = / variant="(?\d+)"/; const WEIGHT_REGEX = / weight=".+?"/; @@ -55,26 +63,31 @@ const EMPTY_SHADER_NAME = "IsaacScript-RenderAboveHUD"; export async function prepareCustomStages( packageManager: PackageManager, + isaacScriptCommonDev: boolean | undefined, verbose: boolean, ): Promise { - const customStagesTSConfig = getCustomStagesFromTSConfig(); + const customStagesTSConfig = await getCustomStagesFromTSConfig(); if (customStagesTSConfig.length === 0) { return; } - validateCustomStagePaths(customStagesTSConfig); + await validateCustomStagePaths(customStagesTSConfig); - copyCustomStageFilesToProject(); + await copyCustomStageFilesToProject(); await insertEmptyShader(); - await fillCustomStageMetadata(customStagesTSConfig, packageManager); - combineCustomStageXMLs(customStagesTSConfig, verbose); + await fillCustomStageMetadata( + customStagesTSConfig, + packageManager, + isaacScriptCommonDev, + ); + await combineCustomStageXMLs(customStagesTSConfig, verbose); } /** * Before we proceed with compiling the mod, ensure that all of the file paths that the end-user put * in their "tsconfig.json" file map to actual files on the file system. */ -function validateCustomStagePaths( +async function validateCustomStagePaths( customStagesTSConfig: readonly CustomStageTSConfig[], ) { for (const customStageTSConfig of customStagesTSConfig) { @@ -83,7 +96,8 @@ function validateCustomStagePaths( customStageTSConfig.backdropPNGPaths, )) { for (const filePath of filePaths) { - checkFile(filePath); + // eslint-disable-next-line no-await-in-loop + await checkFile(filePath); } } } @@ -96,19 +110,22 @@ function validateCustomStagePaths( customStageTSConfig.pitsPNGPath, customStageTSConfig.pitsANM2Path, ]) { - checkFile(filePath); + // eslint-disable-next-line no-await-in-loop + await checkFile(filePath); } if (customStageTSConfig.doorPNGPaths !== undefined) { for (const filePath of Object.values(customStageTSConfig.doorPNGPaths)) { - checkFile(filePath); + // eslint-disable-next-line no-await-in-loop + await checkFile(filePath); } } if (customStageTSConfig.shadows !== undefined) { for (const stageShadows of Object.values(customStageTSConfig.shadows)) { for (const stageShadow of stageShadows) { - checkFile(stageShadow.pngPath); + // eslint-disable-next-line no-await-in-loop + await checkFile(stageShadow.pngPath); } } } @@ -116,15 +133,17 @@ function validateCustomStagePaths( if (customStageTSConfig.bossPool !== undefined) { for (const bossPoolEntry of Object.values(customStageTSConfig.bossPool)) { if (bossPoolEntry.versusScreen !== undefined) { - checkFile(bossPoolEntry.versusScreen.namePNGPath); - checkFile(bossPoolEntry.versusScreen.portraitPNGPath); + // eslint-disable-next-line no-await-in-loop + await checkFile(bossPoolEntry.versusScreen.namePNGPath); + // eslint-disable-next-line no-await-in-loop + await checkFile(bossPoolEntry.versusScreen.portraitPNGPath); } } } } } -function checkFile(filePath: string | undefined) { +async function checkFile(filePath: string | undefined) { if (filePath === undefined) { return; } @@ -135,7 +154,8 @@ function checkFile(filePath: string | undefined) { ); } - if (!isFile(filePath)) { + const file = await isFile(filePath); + if (!file) { fatalError( `Failed to find the "${filePath}" file. Check your "tsconfig.json" file and then restart IsaacScript.`, ); @@ -143,7 +163,7 @@ function checkFile(filePath: string | undefined) { } /** The custom stages feature needs some anm2 files in order to work properly. */ -function copyCustomStageFilesToProject() { +async function copyCustomStageFilesToProject() { const dstDirPath = path.join( CWD, "mod", @@ -151,13 +171,14 @@ function copyCustomStageFilesToProject() { "gfx", "isaacscript-custom-stage", ); - makeDirectory(dstDirPath); + await makeDirectory(dstDirPath); - const fileNames = getFileNamesInDirectory(CUSTOM_STAGE_FILES_DIR); + const fileNames = await getFileNamesInDirectory(CUSTOM_STAGE_FILES_DIR); for (const fileName of fileNames) { const srcPath = path.join(CUSTOM_STAGE_FILES_DIR, fileName); const dstPath = path.join(dstDirPath, fileName); - copyFileOrDirectory(srcPath, dstPath); + // eslint-disable-next-line no-await-in-loop + await copyFileOrDirectory(srcPath, dstPath); } } @@ -168,14 +189,15 @@ function copyCustomStageFilesToProject() { async function insertEmptyShader() { const shadersXMLDstPath = path.join(CWD, "mod", "content", "shaders.xml"); - if (!isFile(shadersXMLDstPath)) { - copyFileOrDirectory(SHADERS_XML_PATH, shadersXMLDstPath); + const file = await isFile(shadersXMLDstPath); + if (!file) { + await copyFileOrDirectory(SHADERS_XML_PATH, shadersXMLDstPath); return; } // The end-user mod might have their own custom shaders, so we need to merge our empty shader // inside the existing "shaders.xml" file. - const shadersXMLDstContents = readFile(shadersXMLDstPath); + const shadersXMLDstContents = await readFile(shadersXMLDstPath); const shadersXMLDst = (await xml2js.parseStringPromise( shadersXMLDstContents, )) as ShadersXML; @@ -188,7 +210,7 @@ async function insertEmptyShader() { return; } - const shadersXMLSrcContents = readFile(SHADERS_XML_PATH); + const shadersXMLSrcContents = await readFile(SHADERS_XML_PATH); const shadersXMLSrc = (await xml2js.parseStringPromise( shadersXMLSrcContents, )) as ShadersXML; @@ -205,7 +227,7 @@ async function insertEmptyShader() { shadersXMLDst.shaders.shader.push(isaacScriptEmptyShader); const xmlBuilder = new xml2js.Builder(); const newXML = xmlBuilder.buildObject(shadersXMLDst); - writeFile(shadersXMLDstPath, newXML); + await writeFile(shadersXMLDstPath, newXML); } /** @@ -217,29 +239,46 @@ async function insertEmptyShader() { async function fillCustomStageMetadata( customStagesTSConfig: readonly CustomStageTSConfig[], packageManager: PackageManager, -): Promise { - validateMetadataLuaFileExists(packageManager); + isaacScriptCommonDev: boolean | undefined, +) { + await validateMetadataLuaFileExists(packageManager); const customStages = await getCustomStagesWithMetadata(customStagesTSConfig); const customStagesLua = await convertCustomStagesToLua(customStages); - writeFile(METADATA_LUA_PATH, customStagesLua); - console.log(`Wrote custom stage metadata to: ${METADATA_LUA_PATH}`); + await writeFile(METADATA_LUA_PATH, customStagesLua); + console.log( + `Wrote metadata for ${customStagesLua.length} custom stage room(s) to: ${METADATA_LUA_PATH}`, + ); + + // In development, the "isaacscript-common" directory will be recompiled. Since the + // "customStageMetadata.json" file is normally left blank, it will overwrite any changes made to + // the compiled "customStageMetadata.lua" file. Thus, we also must write the custom stage data to + // the "customStageMetadata.json" file. + if (isaacScriptCommonDev === true) { + const customStagesJSON = JSON.stringify(customStages, undefined, 2); + await writeFile(CUSTOM_STAGE_METADATA_JSON_PATH, customStagesJSON); + console.log( + `Wrote metadata for ${customStagesLua.length} custom stage rooms to: ${CUSTOM_STAGE_METADATA_JSON_PATH}`, + ); + } } -function validateMetadataLuaFileExists(packageManager: PackageManager) { - if (!isDirectory(ISAACSCRIPT_COMMON_PATH)) { +async function validateMetadataLuaFileExists(packageManager: PackageManager) { + const directory = await isDirectory(ISAACSCRIPT_COMMON_PATH); + if (!directory) { const addCommand = getPackageManagerAddCommand( packageManager, ISAACSCRIPT_COMMON, ); fatalError( - `The custom stages feature requires a dependency of "${ISAACSCRIPT_COMMON}" in the "${PACKAGE_JSON}" file. You can add it with the following command:\n${chalk.green( + `The custom stages feature requires a dependency of "${ISAACSCRIPT_COMMON}" in the "package.json" file. You can add it with the following command:\n${chalk.green( addCommand, )}`, ); } - if (!isFile(METADATA_LUA_PATH)) { + const file = await isFile(METADATA_LUA_PATH); + if (!file) { fatalError( `${chalk.red( "Failed to find the custom stage metadata file at:", @@ -254,8 +293,9 @@ function validateMetadataLuaFileExists(packageManager: PackageManager) { */ async function getCustomStagesWithMetadata( customStagesTSConfig: readonly CustomStageTSConfig[], -): Promise { - if (!isFile(METADATA_LUA_PATH)) { +): Promise { + const metadataExists = await isFile(METADATA_LUA_PATH); + if (!metadataExists) { fatalError( `${chalk.red( "Failed to find the custom stage metadata file at:", @@ -272,7 +312,9 @@ async function getCustomStagesWithMetadata( const { xmlPath } = customStageTSConfig; const resolvedXMLPath = path.resolve(CWD, xmlPath); - if (!isFile(resolvedXMLPath)) { + // eslint-disable-next-line no-await-in-loop + const xmlExists = await isFile(resolvedXMLPath); + if (!xmlExists) { fatalError( `${chalk.red( "Failed to find the custom stage XML file at:", @@ -280,7 +322,8 @@ async function getCustomStagesWithMetadata( ); } - const xmlContents = readFile(resolvedXMLPath); + // eslint-disable-next-line no-await-in-loop + const xmlContents = await readFile(resolvedXMLPath); // eslint-disable-next-line no-await-in-loop, @typescript-eslint/no-unsafe-assignment const jsonRoomsFileAny = await xml2js.parseStringPromise(xmlContents); const jsonRoomsFile = jsonRoomsFileAny as JSONRoomsFile; @@ -388,7 +431,7 @@ async function convertCustomStagesToLua( } /** We combine all of the custom stages together and add them to "00.special rooms.xml". */ -function combineCustomStageXMLs( +async function combineCustomStageXMLs( customStagesTSConfig: readonly CustomStageTSConfig[], verbose: boolean, ) { @@ -396,7 +439,9 @@ function combineCustomStageXMLs( for (const customStageTSConfig of customStagesTSConfig) { const xmlPath = path.resolve(CWD, customStageTSConfig.xmlPath); - if (!isFile(xmlPath)) { + // eslint-disable-next-line no-await-in-loop + const file = await isFile(xmlPath); + if (!file) { fatalError( `${chalk.red( "Failed to find the custom stage XML file at:", @@ -404,7 +449,8 @@ function combineCustomStageXMLs( ); } - const xmlContents = readFile(xmlPath); + // eslint-disable-next-line no-await-in-loop + const xmlContents = await readFile(xmlPath); // It is easier to work with the XML files as text rather than converting it to JSON and then // converting it back to XML. @@ -467,15 +513,16 @@ ${allRooms} `.trim(); const contentRoomsDir = path.join(MOD_SOURCE_PATH, "content", "rooms"); - if (!isFile(contentRoomsDir)) { - makeDirectory(contentRoomsDir); + const file = await isFile(contentRoomsDir); + if (!file) { + await makeDirectory(contentRoomsDir); } const specialRoomsXMLPath = path.join( contentRoomsDir, "00.special rooms.xml", ); - writeFile(specialRoomsXMLPath, combinedXMLFile); + await writeFile(specialRoomsXMLPath, combinedXMLFile); // Convert the XML file to an STB file, which is the format actually read by the game. execExe(XML_CONVERTER_PATH, [specialRoomsXMLPath], verbose, contentRoomsDir); diff --git a/packages/isaacscript-cli/src/dev.ts b/packages/isaacscript-cli/src/dev.ts index 001e22290..a4c401001 100644 --- a/packages/isaacscript-cli/src/dev.ts +++ b/packages/isaacscript-cli/src/dev.ts @@ -1,16 +1,17 @@ -import { fatalError, isDirectory } from "isaacscript-common-node"; +import { fatalError, isDirectory } from "complete-node"; import path from "node:path"; -export function getAndValidateIsaacScriptMonorepoDirectory( +export async function getAndValidateIsaacScriptMonorepoDirectory( projectPath: string, -): string { - const isaacScriptMonorepoDirectory = path.join( +): Promise { + const isaacScriptMonorepoDirectory = path.resolve( projectPath, "..", "isaacscript", ); - if (!isDirectory(isaacScriptMonorepoDirectory)) { + const directory = await isDirectory(isaacScriptMonorepoDirectory); + if (!directory) { console.error( `Failed to find the IsaacScript repository at: ${isaacScriptMonorepoDirectory}`, ); diff --git a/packages/isaacscript-cli/src/enums/copied/RoomShape.ts b/packages/isaacscript-cli/src/enums/copied/RoomShape.ts index 61bfe58f6..dc4293fc7 100644 --- a/packages/isaacscript-cli/src/enums/copied/RoomShape.ts +++ b/packages/isaacscript-cli/src/enums/copied/RoomShape.ts @@ -43,15 +43,18 @@ export enum RoomShape { */ SHAPE_2x2 = 8, + // eslint-disable-next-line complete/require-ascii /** Looks like a "⅃" with a gap in the top-left-hand corner. */ LTL = 9, /** Looks like an "L" with a gap in the top-right-hand corner. */ LTR = 10, + // eslint-disable-next-line complete/require-ascii /** Looks like a "⅂" with a gap in the bottom-left-hand corner. */ LBL = 11, + // eslint-disable-next-line complete/require-ascii /** Looks like a "Г" with a gap in the bottom-right-hand corner. */ LBR = 12, } diff --git a/packages/isaacscript-cli/src/exec.ts b/packages/isaacscript-cli/src/exec.ts index 710f7e206..a60367c9d 100644 --- a/packages/isaacscript-cli/src/exec.ts +++ b/packages/isaacscript-cli/src/exec.ts @@ -1,5 +1,5 @@ import chalk from "chalk"; -import { fatalError } from "isaacscript-common-node"; +import { fatalError } from "complete-node"; import type { SpawnSyncReturns } from "node:child_process"; import { execFileSync, execSync, spawnSync } from "node:child_process"; import { CWD } from "./constants.js"; diff --git a/packages/isaacscript-cli/src/git.ts b/packages/isaacscript-cli/src/git.ts index 92facac4e..ff9c8fe8c 100644 --- a/packages/isaacscript-cli/src/git.ts +++ b/packages/isaacscript-cli/src/git.ts @@ -1,13 +1,8 @@ import chalk from "chalk"; -import { - commandExists, - getPackageJSONVersion, - isFile, - readFile, -} from "isaacscript-common-node"; +import { commandExists, isFile, readFile } from "complete-node"; import path from "node:path"; import yaml from "yaml"; -import { HOME_DIR, PROJECT_NAME, REPO_ROOT } from "./constants.js"; +import { HOME_DIR, PROJECT_NAME, PROJECT_VERSION } from "./constants.js"; import { execShell, execShellString } from "./exec.js"; import type { GitHubCLIHostsYAML } from "./interfaces/GitHubCLIHostsYAML.js"; import { getInputString, getInputYesNo } from "./prompt.js"; @@ -29,14 +24,15 @@ export async function promptGitHubRepoOrGitRemoteURL( } // We do not need to prompt the user if they do not have Git installed. - if (!commandExists("git")) { + const gitExists = await commandExists("git"); + if (!gitExists) { console.log( 'Git does not seem to be installed. (The "git" command is not in the path.) Skipping Git-related things.', ); return undefined; } - const gitHubUsername = getGitHubUsername(); + const gitHubUsername = await getGitHubUsername(); if (gitHubUsername !== undefined) { const { exitStatus } = execShell( "gh", @@ -112,8 +108,9 @@ If you don't want to initialize a Git repository for this project, press enter t * If the GitHub CLI is installed, we can derive the user's GitHub username from their YAML * configuration. */ -export function getGitHubUsername(): string | undefined { - if (!commandExists("gh")) { +async function getGitHubUsername(): Promise { + const ghExists = await commandExists("gh"); + if (!ghExists) { return undefined; } @@ -122,11 +119,12 @@ export function getGitHubUsername(): string | undefined { return undefined; } - if (!isFile(githubCLIHostsPath)) { + const file = await isFile(githubCLIHostsPath); + if (!file) { return undefined; } - const configYAMLRaw = readFile(githubCLIHostsPath); + const configYAMLRaw = await readFile(githubCLIHostsPath); const configYAML = yaml.parse(configYAMLRaw) as GitHubCLIHostsYAML; const githubCom = configYAML["github.com"]; @@ -160,12 +158,13 @@ function getGitRemoteURL(projectName: string, gitHubUsername: string) { return `git@github.com:${gitHubUsername}/${projectName}.git`; } -export function initGitRepository( +export async function initGitRepository( projectPath: string, gitRemoteURL: string | undefined, verbose: boolean, -): void { - if (!commandExists("git")) { +): Promise { + const gitExists = await commandExists("git"); + if (!gitExists) { return; } @@ -190,8 +189,7 @@ export function initGitRepository( if (isGitNameAndEmailConfigured(verbose)) { execShellString("git add --all", verbose, false, projectPath); - const isaacScriptCLIVersion = getPackageJSONVersion(REPO_ROOT); - const commitMessage = `chore: add files from ${PROJECT_NAME} ${isaacScriptCLIVersion} template`; + const commitMessage = `chore: add files from ${PROJECT_NAME} ${PROJECT_VERSION} template`; execShell( "git", ["commit", "--message", commitMessage], @@ -209,7 +207,7 @@ export function initGitRepository( } } -function isGitNameAndEmailConfigured(verbose: boolean) { +function isGitNameAndEmailConfigured(verbose: boolean): boolean { const nameExitStatus = execShellString( "git config --global user.name", verbose, diff --git a/packages/isaacscript-cli/src/interfaces/copied/CustomStageTSConfig.ts b/packages/isaacscript-cli/src/interfaces/copied/CustomStageTSConfig.ts index eb20a988f..fd28e0678 100644 --- a/packages/isaacscript-cli/src/interfaces/copied/CustomStageTSConfig.ts +++ b/packages/isaacscript-cli/src/interfaces/copied/CustomStageTSConfig.ts @@ -2,7 +2,7 @@ /// IT IS COPIED FROM THE "isaacscript-common" package. /// DO NOT EDIT THIS FILE! -import type { Immutable } from "isaacscript-common-ts"; +import type { Immutable } from "complete-common"; /** * This is the format of a custom stage in the "isaacscript" section of the "tsconfig.json" file. diff --git a/packages/isaacscript-cli/src/main.ts b/packages/isaacscript-cli/src/main.ts index 21c8501a3..41b29a8ab 100644 --- a/packages/isaacscript-cli/src/main.ts +++ b/packages/isaacscript-cli/src/main.ts @@ -1,17 +1,15 @@ #!/usr/bin/env node import sourceMapSupport from "source-map-support"; -import { checkForWindowsTerminalBugs } from "./checkForWindowsTerminalBugs.js"; import { parseArgs } from "./parseArgs.js"; import { promptInit } from "./prompt.js"; import { validateNodeVersion } from "./validateNodeVersion.js"; await main(); -async function main(): Promise { +async function main() { sourceMapSupport.install(); promptInit(); validateNodeVersion(); - await checkForWindowsTerminalBugs(); await parseArgs(); } diff --git a/packages/isaacscript-cli/src/packageManager.ts b/packages/isaacscript-cli/src/packageManager.ts index 3a7de6faf..4d2e04a6a 100644 --- a/packages/isaacscript-cli/src/packageManager.ts +++ b/packages/isaacscript-cli/src/packageManager.ts @@ -5,10 +5,10 @@ import { fatalError, getPackageManagerLockFileName, getPackageManagersForProject, -} from "isaacscript-common-node"; +} from "complete-node"; import { CWD } from "./constants.js"; -export const PACKAGE_MANAGER_USED_FOR_ISAACSCRIPT = PackageManager.yarn; +export const PACKAGE_MANAGER_USED_FOR_ISAACSCRIPT = PackageManager.npm; interface PackageManagerOptions { npm: boolean; @@ -17,10 +17,10 @@ interface PackageManagerOptions { dev?: boolean; } -export function getPackageManagerUsedForNewProject( +export async function getPackageManagerUsedForNewProject( options: PackageManagerOptions, -): PackageManager { - const packageManagerFromOptions = getPackageManagerFromOptions(options); +): Promise { + const packageManagerFromOptions = await getPackageManagerFromOptions(options); if (packageManagerFromOptions !== undefined) { return packageManagerFromOptions; } @@ -28,20 +28,17 @@ export function getPackageManagerUsedForNewProject( return getDefaultPackageManager(); } +/** + * Previously, this function determined the package manager based on certain commands existing. + * However, this is undesirable because some projects might prefer `npm`, even if they are forced to + * use other package managers for other projects. + */ function getDefaultPackageManager(): PackageManager { - if (commandExists("yarn")) { - return PackageManager.yarn; - } - - if (commandExists("pnpm")) { - return PackageManager.pnpm; - } - return PackageManager.npm; } -export function getPackageManagerUsedForExistingProject(): PackageManager { - const packageManagers = getPackageManagersForProject(CWD); +export async function getPackageManagerUsedForExistingProject(): Promise { + const packageManagers = await getPackageManagersForProject(CWD); if (packageManagers.length > 1) { const packageManagerLockFileNames = packageManagers .map((packageManager) => getPackageManagerLockFileName(packageManager)) @@ -60,9 +57,9 @@ export function getPackageManagerUsedForExistingProject(): PackageManager { return getDefaultPackageManager(); } -function getPackageManagerFromOptions(options: PackageManagerOptions) { +async function getPackageManagerFromOptions(options: PackageManagerOptions) { if (options.dev === true) { - const packageManagerCommandExists = commandExists( + const packageManagerCommandExists = await commandExists( PACKAGE_MANAGER_USED_FOR_ISAACSCRIPT, ); if (!packageManagerCommandExists) { @@ -77,10 +74,10 @@ function getPackageManagerFromOptions(options: PackageManagerOptions) { } if (options.npm) { - const npmExists = commandExists("npm"); + const npmExists = await commandExists("npm"); if (!npmExists) { fatalError( - `You specified the "--npm" flag, but "${chalk.green( + `You specified the "--npm" option, but "${chalk.green( "npm", )}" does not seem to be a valid command.`, ); @@ -90,10 +87,10 @@ function getPackageManagerFromOptions(options: PackageManagerOptions) { } if (options.yarn) { - const yarnExists = commandExists("yarn"); + const yarnExists = await commandExists("yarn"); if (!yarnExists) { fatalError( - `You specified the "--yarn" flag, but "${chalk.green( + `You specified the "--yarn" option, but "${chalk.green( "yarn", )}" does not seem to be a valid command.`, ); @@ -103,10 +100,10 @@ function getPackageManagerFromOptions(options: PackageManagerOptions) { } if (options.pnpm) { - const pnpmExists = commandExists("pnpm"); + const pnpmExists = await commandExists("pnpm"); if (!pnpmExists) { fatalError( - `You specified the "--pnpm" flag, but "${chalk.green( + `You specified the "--pnpm" option, but "${chalk.green( "pnpm", )}" does not seem to be a valid command.`, ); diff --git a/packages/isaacscript-cli/src/parseArgs.ts b/packages/isaacscript-cli/src/parseArgs.ts index d7a5f17b0..9fb149040 100644 --- a/packages/isaacscript-cli/src/parseArgs.ts +++ b/packages/isaacscript-cli/src/parseArgs.ts @@ -9,57 +9,46 @@ // - https://github.com/yargs/yargs // - Sucks in TypeScript. // - "commander" allows for more module command building. -// - clack (4.3K stars) -// - https://github.com/natemoo-re/clack -// - ? -// - arg [X} (1.2K stars) +// - cac (2.7K stars) +// - https://github.com/cacjs/cac +// - Last release in 2022. +// - arg [X] (1.2K stars) // - https://github.com/vercel/arg // - Does not support commands (i.e. positional arguments). +// - clipanion (1.1K stars) +// - https://github.com/arcanis/clipanion +// - Written in TypeScript. +// - Used by Yarn. +// - Class-based. +// - mri [X] (638 stars) +// - https://github.com/lukeed/mri +// - Written in JavaScript, no types. // - cmd-ts (193 stars) // - https://github.com/Schniz/cmd-ts -// - ? +// - Written in TypeScript. +// - Last release in 2023. import { Command } from "@commander-js/extra-typings"; -import { - fatalError, - findPackageRoot, - getPackageJSONFieldsMandatory, - nukeDependencies, - updatePackageJSON, -} from "isaacscript-common-node"; -import { checkCommand, checkTSCommand } from "./commands/check/check.js"; +import { nukeDependencies, updatePackageJSONDependencies } from "complete-node"; +import { checkCommand } from "./commands/check/check.js"; import { copyCommand } from "./commands/copy/copy.js"; -import { initCommand, initTSCommand } from "./commands/init/init.js"; +import { initCommand } from "./commands/init/init.js"; import { monitorCommand } from "./commands/monitor/monitor.js"; import { publishCommand } from "./commands/publish/publish.js"; -import { CWD } from "./constants.js"; - -const packageRoot = findPackageRoot(); -if (packageRoot === null) { - fatalError("Failed to find the package root."); -} - -const { name, version, description } = getPackageJSONFieldsMandatory( - packageRoot, - "name", - "version", - "description", -); +import { CWD, PROJECT_DESCRIPTION, PROJECT_VERSION } from "./constants.js"; export async function parseArgs(): Promise { const program = new Command() - .name(name) - .description(`${description}.`) - .version(version, "-V, --version", "Output the version number.") + .name("isaacscript") + .description(`${PROJECT_DESCRIPTION}.`) + .version(PROJECT_VERSION, "-V, --version", "Output the version number.") .helpOption("-h, --help", "Display the list of commands and options.") .helpCommand(false) .allowExcessArguments(false) // By default, Commander.js will allow extra positional arguments. .addCommand(monitorCommand, { isDefault: true }) .addCommand(checkCommand) - .addCommand(checkTSCommand) .addCommand(copyCommand) .addCommand(initCommand) - .addCommand(initTSCommand) .addCommand(nukeCommand) .addCommand(publishCommand) .addCommand(updateCommand) @@ -80,8 +69,8 @@ const nukeCommand = new Command() .allowExcessArguments(false) // By default, Commander.js will allow extra positional arguments. .helpOption("-h, --help", "Display the list of options for this command.") .option("-v, --verbose", "Enable verbose output.", false) - .action(() => { - nukeDependencies(CWD); + .action(async () => { + await nukeDependencies(CWD); console.log("Successfully reinstalled dependencies from npm."); }); @@ -90,8 +79,8 @@ const updateCommand = new Command() .description("Update the npm dependencies in the current project.") .allowExcessArguments(false) // By default, Commander.js will allow extra positional arguments. .helpOption("-h, --help", "Display the list of options for this command.") - .action(() => { - const hasNewDependencies = updatePackageJSON(CWD); + .action(async () => { + const hasNewDependencies = await updatePackageJSONDependencies(CWD); const msg = hasNewDependencies ? "Successfully installed new Node.js dependencies." : "There were no new dependency updates from npm."; diff --git a/packages/isaacscript-cli/src/prompt.ts b/packages/isaacscript-cli/src/prompt.ts index bcf10daf6..3d0a13a83 100644 --- a/packages/isaacscript-cli/src/prompt.ts +++ b/packages/isaacscript-cli/src/prompt.ts @@ -2,12 +2,12 @@ // Bash terminal. Thus, we revert to using the simpler Prompt library. import chalk from "chalk"; -import { fatalError } from "isaacscript-common-node"; -import { ReadonlySet, parseIntSafe } from "isaacscript-common-ts"; +import { ReadonlySet, parseIntSafe } from "complete-common"; +import { fatalError } from "complete-node"; import prompt from "prompt"; -const VALID_YES_RESPONSES = new ReadonlySet(["yes", "ye", "y"]); -const VALID_NO_RESPONSES = new ReadonlySet(["no", "n"]); +const VALID_YES_RESPONSES = new ReadonlySet(["yes", "ye", "y"]); +const VALID_NO_RESPONSES = new ReadonlySet(["no", "n"]); export function promptInit(): void { // Override some of the prompt library's default values: diff --git a/packages/isaacscript-cli/src/test.ts b/packages/isaacscript-cli/src/test.ts deleted file mode 100644 index 98424271b..000000000 --- a/packages/isaacscript-cli/src/test.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default { - LOL: "asdf", -}; diff --git a/packages/isaacscript-cli/src/tsconfig.ts b/packages/isaacscript-cli/src/tsconfig.ts index 3263d2708..9d4979b90 100644 --- a/packages/isaacscript-cli/src/tsconfig.ts +++ b/packages/isaacscript-cli/src/tsconfig.ts @@ -1,7 +1,7 @@ -import ajvModule from "ajv"; +import { Ajv } from "ajv"; import chalk from "chalk"; -import { fatalError, getJSONC } from "isaacscript-common-node"; -import { isObject } from "isaacscript-common-ts"; +import { assertObject, isArray, isObject } from "complete-common"; +import { fatalError, getJSONC } from "complete-node"; import { ISAACSCRIPT_SCHEMA_PATH, PROJECT_NAME, @@ -12,19 +12,28 @@ import type { CustomStageTSConfig } from "./interfaces/copied/CustomStageTSConfi const ADVICE = `Try copying the "${TSCONFIG_JSON}" from a brand new ${PROJECT_NAME} project.`; -const isaacScriptSchema = getJSONC(ISAACSCRIPT_SCHEMA_PATH); +const isaacScriptSchema = await getJSONC(ISAACSCRIPT_SCHEMA_PATH); +assertObject( + isaacScriptSchema, + `The IsaacScript schema was not an object: ${ISAACSCRIPT_SCHEMA_PATH}`, +); -// Ajv is messed up: https://github.com/ajv-validator/ajv/issues/2132 -const Ajv = ajvModule.default; const ajv = new Ajv(); const schemaValidate = ajv.compile(isaacScriptSchema); -function getTSConfigJSON(): Record { - return getJSONC(TSCONFIG_JSON_PATH); +async function getTSConfigJSON(): Promise> { + const tsconfig = await getJSONC(TSCONFIG_JSON_PATH); + assertObject( + tsconfig, + `The TSConfig was not an object: ${TSCONFIG_JSON_PATH}`, + ); + return tsconfig; } -function getIsaacScriptSection(): Record | undefined { - const tsConfig = getTSConfigJSON(); +async function getIsaacScriptSection(): Promise< + Record | undefined +> { + const tsConfig = await getTSConfigJSON(); // We allow different kinds of casing for the field name. for (const fieldName of ["isaacscript", "isaacScript", "IsaacScript"]) { @@ -45,54 +54,16 @@ function getIsaacScriptSection(): Record | undefined { return undefined; } -export function getFirstTSConfigIncludePath(): string { - const tsConfig = getTSConfigJSON(); - - const { include } = tsConfig; - if (include === undefined) { - fatalError( - `Your "${chalk.green( - TSCONFIG_JSON_PATH, - )}" file does not have an "include" field, which is surely a mistake. ${ADVICE}`, - ); - } - - if (!Array.isArray(include)) { - fatalError( - `Your "${chalk.green( - TSCONFIG_JSON_PATH, - )}" file has an "include" field that is not an array, which is surely a mistake. ${ADVICE}`, - ); - } - - const firstInclude = include[0] as unknown; - if (firstInclude === undefined) { - fatalError( - `Your "${chalk.green( - TSCONFIG_JSON_PATH, - )}" file has an empty "include" field, which is surely a mistake. ${ADVICE}`, - ); - } - - if (typeof firstInclude !== "string") { - fatalError( - `Your "${chalk.green( - TSCONFIG_JSON_PATH, - )}" file has a non-string "include" value, which is surely a mistake. ${ADVICE}`, - ); - } - - return firstInclude; -} - /** * Parses the "tsconfig.json" file and returns the "customStages" section. If the section does not * exist, returns an empty array. * * Most of this function is simply performing input validation. */ -export function getCustomStagesFromTSConfig(): readonly CustomStageTSConfig[] { - const isaacScriptSection = getIsaacScriptSection(); +export async function getCustomStagesFromTSConfig(): Promise< + readonly CustomStageTSConfig[] +> { + const isaacScriptSection = await getIsaacScriptSection(); if (isaacScriptSection === undefined) { return []; } @@ -115,7 +86,7 @@ export function getCustomStagesFromTSConfig(): readonly CustomStageTSConfig[] { } // The type of "customStages" should be validated by Ajv, but check again just in case. - if (!Array.isArray(customStages)) { + if (!isArray(customStages)) { fatalError( `Failed to parse the "customStages" field, since it was not an array. ${ADVICE}.`, ); @@ -159,8 +130,8 @@ export function getCustomStagesFromTSConfig(): readonly CustomStageTSConfig[] { const { baseStageType } = customStageTSConfig; if ( - baseStageType !== undefined && - (baseStageType < 0 || baseStageType > 5) + baseStageType !== undefined + && (baseStageType < 0 || baseStageType > 5) ) { fatalError( `The "${name}" custom stage has an invalid value for the "baseStageType" field: ${baseStageType}`, diff --git a/packages/isaacscript-cli/src/validateMod.ts b/packages/isaacscript-cli/src/validateMod.ts index 8179f23f0..64d4449df 100644 --- a/packages/isaacscript-cli/src/validateMod.ts +++ b/packages/isaacscript-cli/src/validateMod.ts @@ -1,6 +1,5 @@ import chalk from "chalk"; import { - PACKAGE_JSON, fatalError, getFilePath, getPackageJSON, @@ -9,7 +8,7 @@ import { getPackageManagerInstallCommand, isDirectory, isFile, -} from "isaacscript-common-node"; +} from "complete-node"; import path from "node:path"; import { CWD, METADATA_XML, PROJECT_NAME } from "./constants.js"; import { execShellString } from "./exec.js"; @@ -30,10 +29,10 @@ const REQUIRED_PACKAGE_JSON_DEV_DEPENDENCIES = [ ] as const; /** Validate that we are in a directory that looks like an IsaacScript project. */ -export function validateInIsaacScriptProject(): void { - const isaacScriptModMissingFile = getIsaacScriptModMissingFile(CWD); +export async function validateInIsaacScriptProject(): Promise { + const isaacScriptModMissingFile = await getIsaacScriptModMissingFile(CWD); if (isaacScriptModMissingFile !== undefined) { - errorNotExists(isaacScriptModMissingFile); + await errorNotExists(isaacScriptModMissingFile); } } @@ -41,13 +40,15 @@ export function validateInIsaacScriptProject(): void { * Returns the file name missing. If undefined is returned, then the file path is an IsaacScript mod * directory. */ -export function getIsaacScriptModMissingFile( +export async function getIsaacScriptModMissingFile( directoryPath: string, -): string | undefined { +): Promise { // Files - for (const fileName of [PACKAGE_JSON]) { + for (const fileName of ["package.json"]) { const filePath = path.join(directoryPath, fileName); - if (!isFile(filePath)) { + // eslint-disable-next-line no-await-in-loop + const file = await isFile(filePath); + if (!file) { return filePath; } } @@ -55,7 +56,9 @@ export function getIsaacScriptModMissingFile( // Subdirectories for (const subdirectoryName of ["src", "mod"]) { const subdirectoryPath = path.join(directoryPath, subdirectoryName); - if (!isDirectory(subdirectoryPath)) { + // eslint-disable-next-line no-await-in-loop + const directory = await isDirectory(subdirectoryPath); + if (!directory) { return subdirectoryPath; } } @@ -63,7 +66,8 @@ export function getIsaacScriptModMissingFile( // Specific files in subdirectories. { const filePath = path.join(directoryPath, "mod", METADATA_XML); - if (!isFile(filePath)) { + const file = await isFile(filePath); + if (!file) { return filePath; } } @@ -71,8 +75,8 @@ export function getIsaacScriptModMissingFile( return undefined; } -function errorNotExists(filePath: string) { - const directory = isDirectory(filePath); +async function errorNotExists(filePath: string) { + const directory = await isDirectory(filePath); const noun = directory ? "subdirectory" : "file"; console.error( `It looks like the current working directory of "${chalk.green( @@ -90,20 +94,20 @@ function errorNotExists(filePath: string) { process.exit(1); } -export function validatePackageJSONDependencies(): void { - const packageJSONPath = getFilePath(PACKAGE_JSON, CWD); - const packageJSON = getPackageJSON(packageJSONPath); +export async function validatePackageJSONDependencies(): Promise { + const packageManager = await getPackageManagerUsedForExistingProject(); + const packageJSONPath = await getFilePath("package.json", CWD); + const packageJSON = await getPackageJSON(packageJSONPath); const dependencies = - getPackageJSONDependencies(packageJSON, "dependencies") ?? {}; + (await getPackageJSONDependencies(packageJSON, "dependencies")) ?? {}; const dependenciesArray = Object.keys(dependencies); const devDependencies = - getPackageJSONDependencies(packageJSON, "devDependencies") ?? {}; + (await getPackageJSONDependencies(packageJSON, "devDependencies")) ?? {}; const devDependenciesArray = Object.keys(devDependencies); for (const devDependency of REQUIRED_PACKAGE_JSON_DEV_DEPENDENCIES) { if (dependenciesArray.includes(devDependency)) { - const packageManager = getPackageManagerUsedForExistingProject(); const addDevCommand = getPackageManagerAddDevCommand( packageManager, devDependency, @@ -118,7 +122,6 @@ export function validatePackageJSONDependencies(): void { for (const devDependency of REQUIRED_PACKAGE_JSON_DEV_DEPENDENCIES) { if (!devDependenciesArray.includes(devDependency)) { - const packageManager = getPackageManagerUsedForExistingProject(); const addDevCommand = getPackageManagerAddDevCommand( packageManager, devDependency, @@ -132,8 +135,16 @@ export function validatePackageJSONDependencies(): void { } } -export function validateDepsInstalled(verbose: boolean): void { - const packageManager = getPackageManagerUsedForExistingProject(); +export async function validateDepsInstalled( + isaacScriptCommonDev: boolean | undefined, + verbose: boolean, +): Promise { + // Running "npm install" will remove the links. + if (isaacScriptCommonDev === true) { + return; + } + + const packageManager = await getPackageManagerUsedForExistingProject(); const command = getPackageManagerInstallCommand(packageManager); console.log( diff --git a/packages/isaacscript-cli/src/validateNodeVersion.ts b/packages/isaacscript-cli/src/validateNodeVersion.ts index f67bf6f44..f6363a5e9 100644 --- a/packages/isaacscript-cli/src/validateNodeVersion.ts +++ b/packages/isaacscript-cli/src/validateNodeVersion.ts @@ -1,6 +1,5 @@ import chalk from "chalk"; -import { fatalError } from "isaacscript-common-node"; -import { parseSemanticVersion } from "isaacscript-common-ts"; +import { parseSemanticVersion } from "complete-common"; import { PROJECT_NAME } from "./constants.js"; // 20.11 is the minimum version that supports `import.meta.dirname`. @@ -12,13 +11,17 @@ export function validateNodeVersion(): void { const semanticVersion = parseSemanticVersion(version); if (semanticVersion === undefined) { - fatalError(`Failed to parse the Node version: ${version}`); + throw new Error(`Failed to parse the Node version: ${version}`); } const { majorVersion, minorVersion } = semanticVersion; + if (majorVersion > REQUIRED_NODE_JS_MAJOR_VERSION) { + return; + } + if ( - majorVersion >= REQUIRED_NODE_JS_MAJOR_VERSION && - minorVersion >= REQUIRED_NODE_JS_MINOR_VERSION + majorVersion === REQUIRED_NODE_JS_MAJOR_VERSION + && minorVersion >= REQUIRED_NODE_JS_MINOR_VERSION ) { return; } diff --git a/packages/isaacscript-cli/tsconfig.json b/packages/isaacscript-cli/tsconfig.json index 0179ad529..508e0b941 100644 --- a/packages/isaacscript-cli/tsconfig.json +++ b/packages/isaacscript-cli/tsconfig.json @@ -1,18 +1,17 @@ { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../isaacscript-tsconfig/tsconfig.base.json", - "../isaacscript-tsconfig/tsconfig.node.json", - "../../tsconfig.monorepo.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], // https://www.typescriptlang.org/docs/handbook/compiler-options.html "compilerOptions": { // Needed in order to make "source-map-support" work properly. "sourceMap": true, - - // Needed to import from "package.json". - "resolveJsonModule": true, }, } diff --git a/packages/isaacscript-common-node/LICENSE b/packages/isaacscript-common-node/LICENSE deleted file mode 100644 index b2cf86336..000000000 --- a/packages/isaacscript-common-node/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2022 IsaacScript - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/isaacscript-common-node/README.md b/packages/isaacscript-common-node/README.md deleted file mode 100644 index ebe0e9582..000000000 --- a/packages/isaacscript-common-node/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# isaacscript-common-node - -[![npm version](https://img.shields.io/npm/v/isaacscript-common-node.svg)](https://www.npmjs.com/package/isaacscript-common-node) - -This package contains helper functions for a Node.js TypeScript project. - -For more information about IsaacScript, see the [official website](https://isaacscript.github.io/). diff --git a/packages/isaacscript-common-node/eslint.config.mjs b/packages/isaacscript-common-node/eslint.config.mjs deleted file mode 100644 index 1185638c9..000000000 --- a/packages/isaacscript-common-node/eslint.config.mjs +++ /dev/null @@ -1,30 +0,0 @@ -import tseslint from "typescript-eslint"; -import { base } from "../eslint-config-isaacscript/base.js"; -import { monorepo } from "../eslint-config-isaacscript/monorepo.js"; -// @ts-expect-error There are no TypeScript definitions for this plugin. -import ESLintPluginSortExports from "eslint-plugin-sort-exports"; - -export default tseslint.config( - ...base, - ...monorepo, - - { - plugins: { - /** The `sort-exports` rule is used in some specific files. */ - "sort-exports": ESLintPluginSortExports, - }, - }, - - { - files: ["src/functions/**"], - rules: { - /** Not defined in the parent configs. */ - "sort-exports/sort-exports": [ - "warn", - { - sortDir: "asc", - }, - ], - }, - }, -); diff --git a/packages/isaacscript-common-node/package.json b/packages/isaacscript-common-node/package.json deleted file mode 100644 index e58344f12..000000000 --- a/packages/isaacscript-common-node/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "isaacscript-common-node", - "version": "4.0.5", - "description": "Helper functions for TypeScript projects.", - "keywords": [], - "homepage": "https://isaacscript.github.io/", - "bugs": { - "url": "https://github.com/IsaacScript/isaacscript/issues" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/IsaacScript/isaacscript.git" - }, - "license": "MIT", - "author": "Zamiell", - "type": "module", - "exports": { - ".": { - "import": "./dist/index.mjs", - "require": "./dist/index.cjs" - } - }, - "types": "./dist/index.d.ts", - "files": [ - "dist", - "src", - "LICENSE", - "package.json", - "README.md" - ], - "scripts": { - "build": "tsx ./scripts/build.ts", - "lint": "tsx ./scripts/lint.ts" - }, - "dependencies": { - "@arktype/fs": "^0.2.1", - "chalk": "^5.3.0", - "command-exists": "^1.2.9", - "diff": "^5.2.0", - "dotenv": "^16.4.5", - "execa": "^9.3.1", - "isaacscript-common-ts": "^16.1.0", - "jsonc-parser": "^3.3.1", - "npm-check-updates": "^17.0.6", - "tsconfck": "^3.1.1", - "zod": "^3.23.8" - } -} diff --git a/packages/isaacscript-common-node/scripts/build.ts b/packages/isaacscript-common-node/scripts/build.ts deleted file mode 100644 index 16746d955..000000000 --- a/packages/isaacscript-common-node/scripts/build.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { $s, buildScript } from "isaacscript-common-node"; - -await buildScript(() => { - $s`unbuild`; // We use the `unbuild` library to output both ESM and CJS. -}); diff --git a/packages/isaacscript-common-node/scripts/lint.ts b/packages/isaacscript-common-node/scripts/lint.ts deleted file mode 100644 index 290fcfe0d..000000000 --- a/packages/isaacscript-common-node/scripts/lint.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { $, lintScript } from "isaacscript-common-node"; - -await lintScript(async () => { - const promises = [ - $`tsc --noEmit`, - $`tsc --noEmit --project ./scripts/tsconfig.json`, - $`eslint --max-warnings 0 .`, - ]; - await Promise.all(promises); -}); diff --git a/packages/isaacscript-common-node/scripts/tsconfig.json b/packages/isaacscript-common-node/scripts/tsconfig.json deleted file mode 100644 index 5afad029c..000000000 --- a/packages/isaacscript-common-node/scripts/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", - - "extends": [ - "../../isaacscript-tsconfig/tsconfig.base.json", - "../../isaacscript-tsconfig/tsconfig.node.json", - "../../../tsconfig.monorepo.json", - ], - - "include": ["*.ts"], -} diff --git a/packages/isaacscript-common-node/src/cachedEnumValues.ts b/packages/isaacscript-common-node/src/cachedEnumValues.ts deleted file mode 100644 index 329dd9f56..000000000 --- a/packages/isaacscript-common-node/src/cachedEnumValues.ts +++ /dev/null @@ -1,7 +0,0 @@ -// These cached enum value arrays are only meant to be used internally within -// `isaacscript-common-node`. - -import { getEnumValues } from "isaacscript-common-ts"; -import { PackageManager } from "./enums/PackageManager.js"; - -export const PACKAGE_MANAGER_VALUES = getEnumValues(PackageManager); diff --git a/packages/isaacscript-common-node/src/enums/PackageManager.ts b/packages/isaacscript-common-node/src/enums/PackageManager.ts deleted file mode 100644 index 02a981c44..000000000 --- a/packages/isaacscript-common-node/src/enums/PackageManager.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum PackageManager { - npm = "npm", - yarn = "yarn", - pnpm = "pnpm", -} diff --git a/packages/isaacscript-common-node/src/functions/arkType.ts b/packages/isaacscript-common-node/src/functions/arkType.ts deleted file mode 100644 index f06083825..000000000 --- a/packages/isaacscript-common-node/src/functions/arkType.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { caller, filePath } from "@arktype/fs"; -import { capitalizeFirstLetter } from "isaacscript-common-ts"; -import path from "node:path"; - -/** - * Helper function to get the directory of a calling function. - * - * This is re-implemented from the "@arktype/fs" package so that we can have an arbitrary - * `upStackBy` position. - * - * @param upStackBy Optional. How far to look up the stack. Default is 1. - * @see https://github.com/arktypeio/arktype/blob/beta/ark/fs/fs.ts - */ -export function dirOfCaller(upStackBy = 1): string { - const filePathString = fileOfCaller(upStackBy + 1); - return path.dirname(filePathString); -} - -/** - * Helper function to get the file of a calling function. - * - * This is re-implemented from the "@arktype/fs" package so that we can have an arbitrary - * `upStackBy` position. - * - * We also fix a bug on Windows with an uncapitalized drive letter. - * - * @param upStackBy Optional. How far to look up the stack. Default is 1. - * @see https://github.com/arktypeio/arktype/blob/beta/ark/fs/fs.ts - */ -export function fileOfCaller(upStackBy = 1): string { - const callerFile = caller({ methodName: "fileOfCaller", upStackBy }).file; - let filePathString = filePath(callerFile); - - // Fix the bug on Windows where the drive letter will not be capitalized. - if (filePathString.match(/^\w:\\/) !== null) { - filePathString = capitalizeFirstLetter(filePathString); - } - - return filePathString; -} - -// We re-export "findPackageRoot" from "@arktype/fs" so that end-users do not have to depend on it. -// (We cannot wrap it in a helper function since it works with the call stack.) -// See: https://github.com/arktypeio/arktype/blob/beta/ark/fs/fs.ts -export { findPackageRoot } from "@arktype/fs"; diff --git a/packages/isaacscript-common-node/src/functions/base64.ts b/packages/isaacscript-common-node/src/functions/base64.ts deleted file mode 100644 index 2f014f2eb..000000000 --- a/packages/isaacscript-common-node/src/functions/base64.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** Helper function to decode a base64-encoded string to a utf8 string. */ -export function decodeBase64(base64String: string): string { - const buffer = Buffer.from(base64String, "base64"); - return buffer.toString("utf8"); -} - -/** Helper function to encode a string into a base64-encoded string. */ -export function encodeBase64(string: string): string { - const buffer = Buffer.from(string); - return buffer.toString("base64"); -} diff --git a/packages/isaacscript-common-node/src/functions/build.ts b/packages/isaacscript-common-node/src/functions/build.ts deleted file mode 100644 index 4d1d551a6..000000000 --- a/packages/isaacscript-common-node/src/functions/build.ts +++ /dev/null @@ -1,256 +0,0 @@ -// Contains helper functions for build scripts. - -import { assertDefined } from "isaacscript-common-ts"; -import fs from "node:fs"; -import { $s } from "./execa.js"; -import { getMatchingFilePaths, renameFileExtensions, rm } from "./file.js"; - -/** - * Helper function to invoke `tsc` twice, producing both CommonJS (CJS) and ECMAScript modules (ESM) - * output. - */ -export async function buildCJSAndESM(outDir: string): Promise { - rm(outDir); - - // `tsc` will create the following files: - // - foo.d.ts - // - foo.d.ts.map - // - foo.js - // - foo.js.map - - $s`tsc`; - - await renameFileExtensions(outDir, "d.ts", "d.mts"); - await renameFileExtensions(outDir, "d.ts.map", "d.mts.map"); - await renameFileExtensions(outDir, "js", "mjs"); - await renameFileExtensions(outDir, "js.map", "mjs.map"); - - await rewriteDeclarationFiles(outDir, true); - await rewriteDeclarationMapFiles(outDir, true); - await rewriteSourceFiles(outDir, true); - await rewriteSourceMapFiles(outDir, true); - - $s`tsc --module CommonJS`; - - await renameFileExtensions(outDir, "d.ts", "d.cts"); - await renameFileExtensions(outDir, "d.ts.map", "d.cts.map"); - await renameFileExtensions(outDir, "js", "cjs"); - await renameFileExtensions(outDir, "js.map", "cjs.map"); - - await rewriteDeclarationFiles(outDir, false); - await rewriteDeclarationMapFiles(outDir, false); - await rewriteSourceFiles(outDir, false); - await rewriteSourceMapFiles(outDir, false); -} - -/** - * After renaming `foo.d.ts` to `foo.d.mts`, the declaration map path will be messed up. - * - * For example: - * - * ```ts - * //# sourceMappingURL=foo.d.ts.map - * ``` - * - * Needs to be rewritten to: - * - * ```ts - * //# sourceMappingURL=foo.d.mts.map - * ``` - */ -async function rewriteDeclarationFiles( - directoryPath: string, - esm: boolean, -): Promise { - const extensionFinalWord = esm ? "mts" : "cts"; - const extension = `.d.${extensionFinalWord}`; - const matchFunc = (filePath: string) => filePath.endsWith(extension); - const filePaths = await getMatchingFilePaths(directoryPath, matchFunc); - - const readPromises: Array> = []; - - for (const filePath of filePaths) { - const promise = fs.promises.readFile(filePath, "utf8"); - readPromises.push(promise); - } - - const filesContents = await Promise.all(readPromises); - - const writePromises: Array> = []; - - for (const [i, fileContents] of filesContents.entries()) { - const filePath = filePaths[i]; - assertDefined( - filePath, - `Failed to get the file path corresponding to index: ${i}`, - ); - - const newFileContents = fileContents.replace( - /\/\/# sourceMappingURL=(.+?)\.d\.ts.map/, - `//# sourceMappingURL=$1.d.${extensionFinalWord}.map`, - ); - const promise = fs.promises.writeFile(filePath, newFileContents); - writePromises.push(promise); - } - - await Promise.all(writePromises); -} - -/** - * After renaming `foo.d.ts.map` to `foo.d.mts.map`, the backwards reference path will be messed up. - * - * For example: - * - * ```json - * {"version":3,"file":"foo.d.ts", - * ``` - * - * Needs to be rewritten to: - * - * ```json - * {"version":3,"file":"foo.d.mts", - * ``` - */ -async function rewriteDeclarationMapFiles( - directoryPath: string, - esm: boolean, -): Promise { - const extensionFinalWord = esm ? "mts" : "cts"; - const extension = `.d.${extensionFinalWord}.map`; - const matchFunc = (filePath: string) => filePath.endsWith(extension); - const filePaths = await getMatchingFilePaths(directoryPath, matchFunc); - - const readPromises: Array> = []; - - for (const filePath of filePaths) { - const promise = fs.promises.readFile(filePath, "utf8"); - readPromises.push(promise); - } - - const filesContents = await Promise.all(readPromises); - - const writePromises: Array> = []; - - for (const [i, fileContents] of filesContents.entries()) { - const filePath = filePaths[i]; - assertDefined( - filePath, - `Failed to get the file path corresponding to index: ${i}`, - ); - - const newFileContents = fileContents.replace( - /"file":"(.+?)\.d\.ts",/, - `"file":"$1.d.${extensionFinalWord}",`, - ); - const promise = fs.promises.writeFile(filePath, newFileContents); - writePromises.push(promise); - } - - await Promise.all(writePromises); -} - -/** - * After renaming `foo.js` to `foo.mjs`, the source map path will be messed up. - * - * For example: - * - * ```ts - * //# sourceMappingURL=foo.js.map - * ``` - * - * Needs to be rewritten to: - * - * ```ts - * //# sourceMappingURL=foo.mjs.map - * ``` - */ -async function rewriteSourceFiles( - directoryPath: string, - esm: boolean, -): Promise { - const extensionFinalWord = esm ? "mjs" : "cjs"; - const extension = `.${extensionFinalWord}`; - const matchFunc = (filePath: string) => filePath.endsWith(extension); - const filePaths = await getMatchingFilePaths(directoryPath, matchFunc); - - const readPromises: Array> = []; - - for (const filePath of filePaths) { - const promise = fs.promises.readFile(filePath, "utf8"); - readPromises.push(promise); - } - - const filesContents = await Promise.all(readPromises); - - const writePromises: Array> = []; - - for (const [i, fileContents] of filesContents.entries()) { - const filePath = filePaths[i]; - assertDefined( - filePath, - `Failed to get the file path corresponding to index: ${i}`, - ); - - const newFileContents = fileContents.replace( - /\/\/# sourceMappingURL=(.+?)\.js.map/, - `//# sourceMappingURL=$1.${extensionFinalWord}.map`, - ); - const promise = fs.promises.writeFile(filePath, newFileContents); - writePromises.push(promise); - } - - await Promise.all(writePromises); -} - -/** - * After renaming `foo.js.map` to `foo.mjs.map`, the backwards reference path will be messed up. - * - * For example: - * - * ```json - * {"version":3,"file":"foo.js", - * ``` - * - * Needs to be rewritten to: - * - * ```json - * {"version":3,"file":"foo.mjs", - * ``` - */ -async function rewriteSourceMapFiles( - directoryPath: string, - esm: boolean, -): Promise { - const extensionFinalWord = esm ? "mjs" : "cjs"; - const extension = `.${extensionFinalWord}.map`; - const matchFunc = (filePath: string) => filePath.endsWith(extension); - const filePaths = await getMatchingFilePaths(directoryPath, matchFunc); - - const readPromises: Array> = []; - - for (const filePath of filePaths) { - const promise = fs.promises.readFile(filePath, "utf8"); - readPromises.push(promise); - } - - const filesContents = await Promise.all(readPromises); - - const writePromises: Array> = []; - - for (const [i, fileContents] of filesContents.entries()) { - const filePath = filePaths[i]; - assertDefined( - filePath, - `Failed to get the file path corresponding to index: ${i}`, - ); - - const newFileContents = fileContents.replace( - /"file":"(.+?)\.js",/, - `"file":"$1.${extensionFinalWord}",`, - ); - const promise = fs.promises.writeFile(filePath, newFileContents); - writePromises.push(promise); - } - - await Promise.all(writePromises); -} diff --git a/packages/isaacscript-common-node/src/functions/commandExists.ts b/packages/isaacscript-common-node/src/functions/commandExists.ts deleted file mode 100644 index 18d7e3bf7..000000000 --- a/packages/isaacscript-common-node/src/functions/commandExists.ts +++ /dev/null @@ -1,63 +0,0 @@ -import commandExistsPackage from "command-exists"; -import { $o } from "./execa.js"; -import { fatalError } from "./utils.js"; - -/** - * Helper function to check if a command exists, like "git". - * - * This is a wrapper around the `commandExists.sync` function from the `commandExists` library. - */ -export function commandExists(commandName: string): boolean { - return commandExistsPackage.sync(commandName); -} - -/** - * Helper function to get the locally installed Python command. In most cases, this will be - * "python", but on Ubuntu it will be "python3" (for legacy reasons). This is necessary to know if - * JavaScript/TypeScript is launching Python. - * - * Returns undefined if Python is not installed on the system. - * - * @param fatal Whether to exit the program if Python is not found. - */ -export function getPythonCommand(fatal: true): "python" | "python3"; -export function getPythonCommand( - fatal: false, -): "python" | "python3" | undefined; -export function getPythonCommand( - fatal: boolean, -): "python" | "python3" | undefined { - if (commandExistsPackage.sync("python3") && doesCommandWork("python3")) { - return "python3"; - } - - if (commandExistsPackage.sync("python") && doesCommandWork("python")) { - return "python"; - } - - if (fatal) { - fatalError( - "You must have Python installed and available in the PATH to run this program.", - ); - } - - return undefined; -} - -/** - * By default, "python" will exist on Windows, but it is not actually a real version of Python. - * Running it will generating the following output: - * - * ```text - * Python was not found; run without arguments to install from the Microsoft Store, or disable - * this shortcut from Settings > Manage App Execution Aliases. - * ``` - */ -function doesCommandWork(command: string): boolean { - try { - const output = $o`${command} --version`; - return !output.includes("was not found"); - } catch { - return false; - } -} diff --git a/packages/isaacscript-common-node/src/functions/env.ts b/packages/isaacscript-common-node/src/functions/env.ts deleted file mode 100644 index 7cd648cc0..000000000 --- a/packages/isaacscript-common-node/src/functions/env.ts +++ /dev/null @@ -1,65 +0,0 @@ -import dotenv from "dotenv"; -import path from "node:path"; -import type { z } from "zod"; -import { dirOfCaller, findPackageRoot } from "./arkType.js"; -import { isFile } from "./file.js"; -import { fatalError } from "./utils.js"; - -/** - * Helper function to get environment variables from a ".env" file that is located next to the - * project's "package.json" file (i.e. at the root of the project repository). - * - * You must provide the Zod schema of the ".env" file. The contents of the file will be parsed and - * validated with Zod. For example: - * - * ```ts - * const envSchema = z.object({ - * DOMAIN: z.string().min(1).default("localhost"), - * }); - * - * export const env = getEnv(envSchema); - * ``` - * - * This function contains logic to convert empty strings to `undefined` so that Zod default values - * can work correctly. - * - * Under the hood, this uses the `dotenv` library to get the environment variables from the ".env" - * file. - */ -// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types -export function getEnv< - A extends z.ZodRawShape, - B extends z.UnknownKeysParam, - C extends z.ZodTypeAny, ->(envSchema: z.ZodObject) { - const fromDir = dirOfCaller(); - const packageRoot = findPackageRoot(fromDir); - if (packageRoot === null) { - fatalError( - `Failed to find the package root starting from directory: ${fromDir}`, - ); - } - - const envPath = path.join(packageRoot, ".env"); - - if (!isFile(envPath)) { - fatalError( - `The "${envPath}" file does not exist. Copy the ".env.example" file to a ".env" file at the root of the repository and re-run this program.`, - ); - } - - dotenv.config({ - path: envPath, - }); - - // Loading values from the ".env" file will result in non-filled-in values being empty strings. - // Since we might want to Zod to populate default values, we first convert empty strings to - // `undefined`. - for (const [key, value] of Object.entries(process.env)) { - if (value === "") { - delete process.env[key]; // eslint-disable-line @typescript-eslint/no-dynamic-delete - } - } - - return envSchema.parse(process.env); -} diff --git a/packages/isaacscript-common-node/src/functions/execa.ts b/packages/isaacscript-common-node/src/functions/execa.ts deleted file mode 100644 index c0b914887..000000000 --- a/packages/isaacscript-common-node/src/functions/execa.ts +++ /dev/null @@ -1,124 +0,0 @@ -import type { - ExecaScriptMethod, - ExecaSyncError, - Options, - Result, - TemplateExpression, -} from "execa"; -import { $ as dollarSignFunc } from "execa"; - -const EXECA_DEFAULT_OPTIONS = { - // The default is "pipe". We want to pass stdout/stderr to the console, making commands work - // similar to how they would in a Bash script. - // https://nodejs.org/api/child_process.html#child_process_options_stdio - stdio: "inherit", -} as const satisfies Options; - -const dollarSignFuncWithOptions = dollarSignFunc(EXECA_DEFAULT_OPTIONS); - -/** - * A wrapper around the `$` function from `execa`. - * - * - The stdout/stderr is passed through to the console. - * - It throws nicer errors, omitting the JavaScript stack trace. - */ -export async function $( - templates: TemplateStringsArray, - ...expressions: readonly TemplateExpression[] -): Promise { - let returnBase: Result; - - try { - returnBase = await dollarSignFuncWithOptions(templates, ...expressions); - } catch (error: unknown) { - const execaSyncError = error as ExecaSyncError; - process.exit(execaSyncError.exitCode); - } - - return returnBase; -} - -/** - * Helper function to run a command and grab the output. ("o" is short for "output".) - * - * If an error occurs, the full JavaScript stack trace will be printed. Alternatively, if you expect - * this command to return a non-zero exit code, you can enclose this function in a try/catch block. - * - * This is a wrapper around the `$.sync` function from `execa`. (The `$.sync` function automatically - * trims the `stdout`.) - */ -export function $o( - templates: TemplateStringsArray, - ...expressions: readonly TemplateExpression[] -): string { - const output = $sq(templates, ...expressions).stdout; - if (output === undefined) { - return ""; - } - - return typeof output === "string" ? output : output.toString(); -} - -/** - * A wrapper around the `$` function from `execa`. ("op" is short for "options".) This allows you to - * get a custom executor function without having to consume "execa" directly. - */ - -export function $op(options: Options): ExecaScriptMethod { - return dollarSignFunc(options); -} - -/** - * A wrapper around the `$` function from `execa`. ("q" is short for "quiet".) This is the same - * thing as the `$` helper function, except the stdout/stderr is not passed through to the console. - * - * If an error occurs, the full JavaScript stack trace will be printed. Alternatively, if you expect - * this command to return a non-zero exit code, you can enclose this function in a try/catch block. - */ -export async function $q( - templates: TemplateStringsArray, - ...expressions: readonly TemplateExpression[] -): Promise { - // We want to include the JavaScript stack trace in this instance since this function is used for - // commands that should not generally fail. - return dollarSignFunc(templates, ...expressions); -} - -/** - * A wrapper around the `$.sync` function from `execa`. - * - * - The stdout/stderr is passed through to the console. - * - It throws nicer errors, omitting the JavaScript stack trace. - */ -export function $s( - templates: TemplateStringsArray, - ...expressions: readonly TemplateExpression[] -): Result { - let returnBase: Result; - - try { - returnBase = dollarSignFuncWithOptions.sync(templates, ...expressions); - } catch (error: unknown) { - const execaSyncError = error as ExecaSyncError; - process.exit(execaSyncError.exitCode); - } - - return returnBase; -} - -/** - * A wrapper around the `$.sync` function from `execa`. ("sq" is short for "sync quiet".) This is - * the same thing as the `$s` helper function, except the stdout/stderr is not passed through to the - * console. - * - * If an error occurs, the full JavaScript stack trace will be printed. Alternatively, if you expect - * this command to return a non-zero exit code, you can enclose this function in a try/catch block. - */ -export function $sq( - templates: TemplateStringsArray, - ...expressions: readonly TemplateExpression[] -): Result { - // We want to include the JavaScript stack trace in this instance since this function is used for - // commands that should not generally fail. - return dollarSignFunc.sync(templates, ...expressions); -} diff --git a/packages/isaacscript-common-node/src/functions/file.ts b/packages/isaacscript-common-node/src/functions/file.ts deleted file mode 100644 index 040af1622..000000000 --- a/packages/isaacscript-common-node/src/functions/file.ts +++ /dev/null @@ -1,380 +0,0 @@ -import { trimSuffix } from "isaacscript-common-ts"; -import fs from "node:fs"; -import path from "node:path"; - -/** - * Helper function to synchronously append data to a file. - * - * This will throw an error if the file cannot be appended to. - */ -export function appendFile(filePath: string, data: string): void { - try { - fs.appendFileSync(filePath, data); - } catch (error) { - throw new Error(`Failed to append to the "${filePath}" file: ${error}`); - } -} - -/** - * Helper function to synchronously copy a file or directory. If a path to a directory is specified, - * the directory will be recursively copied. - * - * This will throw an error if the file cannot be copied. - */ -export function copyFileOrDirectory(srcPath: string, dstPath: string): void { - try { - fs.cpSync(srcPath, dstPath, { - recursive: true, - }); - } catch (error) { - throw new Error( - `Failed to copy file or directory "${srcPath}" to "${dstPath}": ${error}`, - ); - } -} - -/** Alias for the `copyFileOrDirectory` function. Intended to be used in scripts. */ -export function cp(srcPath: string, dstPath: string): void { - copyFileOrDirectory(srcPath, dstPath); -} - -/** - * Helper function to synchronously delete a file or directory. If a path to a directory is - * specified, the directory will be recursively deleted. If the path does not exist, this function - * will be a no-op. - * - * This will throw an error if the file cannot be deleted. - * - * This function is variadic, meaning that you can pass as many file paths as you want to delete. - */ -export function deleteFileOrDirectory(...filePaths: readonly string[]): void { - for (const filePath of filePaths) { - try { - if (fs.existsSync(filePath)) { - fs.rmSync(filePath, { - recursive: true, - }); - } - } catch (error) { - throw new Error( - `Failed to delete file or directory "${filePath}": ${error}`, - ); - } - } -} - -/** - * Helper function to synchronously check if a file exists. - * - * This will throw an error if there is an error when checking the file path. - */ -export function fileOrDirectoryExists(filePath: string): boolean { - let exists: boolean; - - try { - exists = fs.existsSync(filePath); - } catch (error) { - throw new Error( - `Failed to check if file or directory "${filePath}" exists: ${error}`, - ); - } - - return exists; -} - -/** - * Helper function to synchronously get the file names inside of a directory. (If the full path is - * required, you must manually join the file name with the path to the directory.) - * - * This will throw an error if there is an error when checking the directory. - */ -export function getFileNamesInDirectory( - directoryPath: string, -): readonly string[] { - let fileList: string[]; - try { - fileList = fs.readdirSync(directoryPath); - } catch (error) { - throw new Error( - `Failed to get the files in the "${directoryPath}" directory: ${error}`, - ); - } - - return fileList; -} - -/** - * Helper function to get the path to file, given either a file path, a directory path, or - * `undefined`. - * - * This will throw an error if the file cannot be found. - * - * @param fileName The name of the file to find. - * @param filePathOrDirPath Either the path to a file or the path to a directory which contains the - * file. If undefined is passed, the current working directory will be - * used. - */ -export function getFilePath( - fileName: string, - filePathOrDirPath: string | undefined, -): string { - if (filePathOrDirPath === undefined) { - filePathOrDirPath = process.cwd(); // eslint-disable-line no-param-reassign - } - - let filePath: string; - if (isFile(filePathOrDirPath)) { - filePath = filePathOrDirPath; - } else if (isDirectory(filePathOrDirPath)) { - filePath = path.join(filePathOrDirPath, fileName); - if (!fs.existsSync(filePath)) { - throw new Error( - `Failed to find a "${fileName}" file at the following directory: ${filePathOrDirPath}`, - ); - } - } else { - throw new Error( - `Failed to find a "${fileName}" file at the following path: ${filePathOrDirPath}`, - ); - } - - return filePath; -} - -/** - * Helper function to recursively traverse a directory and get the file names that match the - * provided logic. - * - * @param directoryPath The path to the directory to crawl. - * @param matchFunc The function that contains the matching logic. - */ -export async function getMatchingFilePaths( - directoryPath: string, - matchFunc: (filePath: string) => boolean, -): Promise { - const files = await fs.promises.readdir(directoryPath, { - withFileTypes: true, - }); - - const promises: Array> = []; - const filePaths: string[] = []; - - for (const file of files) { - const filePath = path.join(directoryPath, file.name); - - if (file.isDirectory()) { - const promise = getMatchingFilePaths(filePath, matchFunc); - promises.push(promise); - } else { - const match = matchFunc(filePath); - if (match) { - filePaths.push(filePath); - } - } - } - - const filePathsInSubdirectories = await Promise.all(promises); - - return [...filePaths, ...filePathsInSubdirectories.flat()]; -} - -/** Helper function to synchronously check if the provided path exists and is a directory. */ -export function isDirectory(filePath: string): boolean { - return fs.existsSync(filePath) && fs.statSync(filePath).isDirectory(); -} - -/** Helper function to synchronously check if the provided path exists and is a file. */ -export function isFile(filePath: string): boolean { - return fs.existsSync(filePath) && fs.statSync(filePath).isFile(); -} - -/** Helper function to synchronously check if the provided path exists and is a symbolic link. */ -export function isLink(filePath: string): boolean { - return fs.existsSync(filePath) && fs.lstatSync(filePath).isSymbolicLink(); -} - -/** Helper function to see if a directory is a subdirectory of another one. */ -export function isSubdirectoryOf(dir: string, parent: string): boolean { - const relative = path.relative(parent, dir); - return ( - relative !== "" && !relative.startsWith("..") && !path.isAbsolute(relative) - ); -} - -/** - * Helper function to synchronously make a new directory. Will recursively make as many - * subdirectories as needed. - * - * If the recursive behavior is not desired, then use `fs.mkdirSync` directly. - * - * This will throw an error if the directory cannot be created. - */ -export function makeDirectory(dirPath: string): void { - try { - fs.mkdirSync(dirPath, { - recursive: true, - }); - } catch (error) { - throw new Error( - `Failed to delete file or directory "${dirPath}": ${error}`, - ); - } -} - -/** Alias for the `makeDirectory` function. Intended to be used in scripts. */ -export function mkdir(dirPath: string): void { - makeDirectory(dirPath); -} - -/** - * Helper function to synchronously move a file. - * - * This will throw an error if the file cannot be moved. - * - * (This is simply an alias for the `renameFile` function, since the Node.js API uses the same thing - * for both operations.) - */ -export function moveFile(srcPath: string, dstPath: string): void { - renameFile(srcPath, dstPath); -} - -/** Alias for the `moveFile` function. Intended to be used in scripts. */ -export function mv(srcPath: string, dstPath: string): void { - moveFile(srcPath, dstPath); -} - -/** - * Helper function to synchronously prepend data to a file. - * - * This will throw an error if the file cannot be prepended to. - */ -export function prependFile(filePath: string, data: string): void { - const fileContents = readFile(filePath); - const newFileContents = data + fileContents; - writeFile(filePath, newFileContents); -} - -/** - * Helper function to synchronously read a file. - * - * This assumes that the file is a text file and uses an encoding of "utf8". - * - * This will throw an error if the file cannot be read. - */ -export function readFile(filePath: string): string { - let fileContents: string; - - try { - fileContents = fs.readFileSync(filePath, "utf8"); - } catch (error) { - throw new Error(`Failed to read file "${filePath}": ${error}`); - } - - return fileContents; -} - -/** - * Helper function to synchronously rename a file. - * - * This will throw an error if the file cannot be renamed. - */ -export function renameFile(srcPath: string, dstPath: string): void { - try { - fs.renameSync(srcPath, dstPath); - } catch (error) { - throw new Error(`Failed to rename "${srcPath}" to "${dstPath}": ${error}`); - } -} - -/** - * Helper function to recursively rename all of the files in a directory from one file extension to - * another. - * - * @param directoryPath The path to the directory to crawl. - * @param srcFileExtension The file extension to change from. Do not include a period in the string. - * @param dstFileExtension The file extension to change to. Do not include a period in the string. - */ -export async function renameFileExtensions( - directoryPath: string, - srcFileExtension: string, - dstFileExtension: string, -): Promise { - const srcFileExtensionWithPeriod = `.${srcFileExtension}`; - const dstFileExtensionWithPeriod = `.${dstFileExtension}`; - - const matchFunc = (filePath: string) => - filePath.endsWith(srcFileExtensionWithPeriod); - const filePaths = await getMatchingFilePaths(directoryPath, matchFunc); - - const promises: Array> = []; - - for (const filePath of filePaths) { - const filePathWithoutExtension = trimSuffix( - filePath, - srcFileExtensionWithPeriod, - ); - const newFilePath = filePathWithoutExtension + dstFileExtensionWithPeriod; - const promise = fs.promises.rename(filePath, newFilePath); - promises.push(promise); - } - - await Promise.all(promises); -} - -/** - * Helper function to synchronously replace text in a file. - * - * This assumes that the file is a text file and uses an encoding of "utf8". - * - * This will print an error message and exit the program if the file cannot be read. - */ -export function replaceTextInFile( - filePath: string, - searchValue: string | RegExp, - replaceValue: string, -): void { - const fileContents = readFile(filePath); - const newFileContents = fileContents.replaceAll(searchValue, replaceValue); - writeFile(filePath, newFileContents); -} - -/** Alias for the `deleteFileOrDirectory` function. Intended to be used in scripts. */ -export function rm(...filePaths: readonly string[]): void { - deleteFileOrDirectory(...filePaths); -} - -/** - * Helper function to synchronously write 0 bytes to a file, similar to the `touch` command. - * - * This will throw an error if the file cannot be written to. - */ -export function touch(filePath: string): void { - if (isDirectory(filePath)) { - throw new Error( - `Failed to touch the "${filePath}" file since it was a directory.`, - ); - } else if (isFile(filePath)) { - try { - fs.accessSync(filePath); - const now = new Date(); - fs.utimesSync(filePath, now, now); - } catch (error) { - throw new Error(`Failed to touch the "${filePath}" file: ${error}`); - } - } else { - writeFile(filePath, ""); - } -} - -/** - * Helper function to synchronously write data to a file. - * - * This will throw an error if the file cannot be written to. - */ -export function writeFile(filePath: string, data: string): void { - try { - fs.writeFileSync(filePath, data); - } catch (error) { - throw new Error(`Failed to write to the "${filePath}" file: ${error}`); - } -} diff --git a/packages/isaacscript-common-node/src/functions/git.ts b/packages/isaacscript-common-node/src/functions/git.ts deleted file mode 100644 index 649d489ad..000000000 --- a/packages/isaacscript-common-node/src/functions/git.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { $op } from "./execa.js"; - -export function isGitRepository(gitRepositoryDirectoryPath: string): boolean { - const $$ = $op({ cwd: gitRepositoryDirectoryPath }); - const returnBase = $$.sync`git rev-parse --is-inside-work-tree`; - return returnBase.exitCode === 0; -} - -export function isGitRepositoryClean( - gitRepositoryDirectoryPath: string, -): boolean { - const $$ = $op({ cwd: gitRepositoryDirectoryPath }); - const gitStatus = $$.sync`git status --porcelain`.stdout; - return gitStatus === ""; -} - -export function isGitRepositoryLatestCommit( - gitRepositoryDirectoryPath: string, -): boolean { - const $$ = $op({ cwd: gitRepositoryDirectoryPath }); - $$.sync`git fetch`; - - const output1 = $$.sync`git rev-parse HEAD`.stdout; - const output2 = $$.sync`git rev-parse @{u}`.stdout; - - return output1 === output2; -} diff --git a/packages/isaacscript-common-node/src/functions/jsonc.ts b/packages/isaacscript-common-node/src/functions/jsonc.ts deleted file mode 100644 index bb30aaf19..000000000 --- a/packages/isaacscript-common-node/src/functions/jsonc.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { isObject } from "isaacscript-common-ts"; -import JSONC from "jsonc-parser"; -import { readFile } from "./file.js"; - -/** - * Helper function to parse a file as JSONC. - * - * This expects the file to contain an object (i.e. `{}`). This will print an error message and exit - * the program if any errors occur. - */ -export function getJSONC(filePath: string): Record { - const fileContents = readFile(filePath); - - let json: unknown; - try { - json = JSONC.parse(fileContents); - } catch (error) { - throw new Error(`Failed to parse "${filePath}" as JSONC: ${error}`); - } - - if (!isObject(json)) { - throw new Error( - `Failed to parse "${filePath}" as JSONC, since the contents were not an object.`, - ); - } - - return json; -} diff --git a/packages/isaacscript-common-node/src/functions/npm.ts b/packages/isaacscript-common-node/src/functions/npm.ts deleted file mode 100644 index a56cf2edf..000000000 --- a/packages/isaacscript-common-node/src/functions/npm.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { $sq } from "./execa.js"; - -/** - * Helper function to check if the npm CLI tool is logged in. This is useful to throw an error - * before publishing. - */ -export function isLoggedInToNPM(): boolean { - try { - $sq`npm whoami`; - } catch { - return false; - } - - return true; -} diff --git a/packages/isaacscript-common-node/src/functions/nukeDependencies.ts b/packages/isaacscript-common-node/src/functions/nukeDependencies.ts deleted file mode 100644 index b6f8c2cd4..000000000 --- a/packages/isaacscript-common-node/src/functions/nukeDependencies.ts +++ /dev/null @@ -1,58 +0,0 @@ -import chalk from "chalk"; -import path from "node:path"; -import { $s } from "./execa.js"; -import { isFile, rm } from "./file.js"; -import { PACKAGE_JSON } from "./packageJSON.js"; -import { - getPackageManagerForProject, - getPackageManagerLockFileName, -} from "./packageManager.js"; -import { fatalError } from "./utils.js"; - -/** - * Helper function to: - * - * - delete the "node_modules" folder - * - delete any package manager lock files that exist - * - reinstall the dependencies using the detected package manager - * - * This will attempt to validate that the directory is correct by looking for a "package.json" file. - * If not found, this function will print an error message and exit. - * - * @param packageRoot The path to the directory that contains the "package.json" file and the - * "node_modules" folder. If undefined is passed, the current working directory - * will be used. - * @returns Whether any dependencies were updated. - */ -export function nukeDependencies(packageRoot: string | undefined): void { - if (packageRoot === undefined) { - packageRoot = process.cwd(); // eslint-disable-line no-param-reassign - } - - const packageJSONPath = path.join(packageRoot, PACKAGE_JSON); - if (!isFile(packageJSONPath)) { - fatalError( - `Failed to find the "${chalk.green( - PACKAGE_JSON, - )}" file at the package root: ${chalk.green(packageRoot)}`, - ); - } - - const nodeModulesPath = path.join(packageRoot, "node_modules"); - console.log(`Removing: ${nodeModulesPath}`); - rm(nodeModulesPath); - console.log(`Removed: ${nodeModulesPath}`); - - const packageManager = getPackageManagerForProject(packageRoot); - const packageManagerLockFileName = - getPackageManagerLockFileName(packageManager); - const packageManagerLockFilePath = path.join( - packageRoot, - packageManagerLockFileName, - ); - console.log(`Removing: ${packageManagerLockFilePath}`); - rm(packageManagerLockFilePath); - console.log(`Removed: ${packageManagerLockFilePath}`); - - $s`${packageManager} install`; -} diff --git a/packages/isaacscript-common-node/src/functions/packageJSON.ts b/packages/isaacscript-common-node/src/functions/packageJSON.ts deleted file mode 100644 index d8773dc51..000000000 --- a/packages/isaacscript-common-node/src/functions/packageJSON.ts +++ /dev/null @@ -1,395 +0,0 @@ -import type { ReadonlyRecord } from "isaacscript-common-ts"; -import { isObject, setAdd } from "isaacscript-common-ts"; -import { getFilePath, readFile, writeFile } from "./file.js"; - -type PackageJSONDependencyFieldName = - | "dependencies" - | "devDependencies" - | "peerDependencies"; - -export const PACKAGE_JSON = "package.json"; - -/** - * Helper function to get a "package.json" file as an object. This will print an error message and - * exit the program if the "package.json" file cannot be found or is otherwise invalid. - * - * @param filePathOrDirPath Either the path to a "package.json" file or the path to a directory - * which contains a "package.json" file. If undefined is passed, the - * current working directory will be used. - */ -export function getPackageJSON( - filePathOrDirPath: string | undefined, -): Record { - const filePath = getFilePath(PACKAGE_JSON, filePathOrDirPath); - const packageJSONContents = readFile(filePath); - const packageJSON = JSON.parse(packageJSONContents) as unknown; - if (!isObject(packageJSON)) { - throw new Error( - `Failed to parse a "${PACKAGE_JSON}" file at the following path: ${filePath}`, - ); - } - - return packageJSON; -} - -/** - * Helper function to get the "dependencies" or "devDependencies" or "peerDependencies" field from a - * "package.json" file. If the corresponding field does not exist, `undefined` will be returned. - * - * This will print an error message and exit the program if the "package.json" file cannot be found - * or is otherwise invalid. - * - * @param filePathOrDirPathOrRecord Either the path to a "package.json" file, the path to a - * directory which contains a "package.json" file, or a parsed - * JavaScript object from a JSON file. If undefined is passed, the - * current working directory will be used. - * @param dependencyFieldName Optional. The specific dependencies field to get. Defaults to - * "dependencies". - */ -export function getPackageJSONDependencies( - filePathOrDirPathOrRecord: - | string - | ReadonlyRecord - | undefined, - dependencyFieldName: PackageJSONDependencyFieldName = "dependencies", -): Record | undefined { - const packageJSON = - typeof filePathOrDirPathOrRecord === "object" - ? filePathOrDirPathOrRecord - : getPackageJSON(filePathOrDirPathOrRecord); - - const field = packageJSON[dependencyFieldName]; - if (field === undefined) { - return undefined; - } - - if (!isObject(field)) { - if (typeof filePathOrDirPathOrRecord === "string") { - // eslint-disable-next-line unicorn/prefer-type-error - throw new Error( - `Failed to parse the "${dependencyFieldName}" field in a "${PACKAGE_JSON}" file from: ${filePathOrDirPathOrRecord}`, - ); - } - - throw new Error( - `Failed to parse the "${dependencyFieldName}" field in a "${PACKAGE_JSON}" file.`, - ); - } - - for (const [key, value] of Object.entries(field)) { - if (typeof value !== "string") { - // eslint-disable-next-line unicorn/prefer-type-error - throw new Error( - `Failed to parse the "${dependencyFieldName}" field in a "${PACKAGE_JSON}" file since the "${key}" entry was not a string.`, - ); - } - } - - return field as Record; -} - -/** - * Helper function to get an arbitrary string field from a "package.json" file. If the field does - * not exist, `undefined` will be returned. This will print an error message and exit the program if - * the "package.json" file cannot be found or is otherwise invalid. - * - * @param filePathOrDirPathOrRecord Either the path to a "package.json" file, the path to a - * directory which contains a "package.json" file, or a parsed - * JavaScript object from a JSON file. If undefined is passed, the - * current working directory will be used. - * @param fieldName The name of the field to retrieve. - */ -export function getPackageJSONField( - filePathOrDirPathOrRecord: - | string - | ReadonlyRecord - | undefined, - fieldName: string, -): string | undefined { - const packageJSON = - typeof filePathOrDirPathOrRecord === "object" - ? filePathOrDirPathOrRecord - : getPackageJSON(filePathOrDirPathOrRecord); - - const field = packageJSON[fieldName]; - if (field === undefined) { - return undefined; - } - - // Assume that all fields are strings. For objects (like e.g. "dependencies"), other helper - // functions should be used. - if (typeof field !== "string") { - if (typeof filePathOrDirPathOrRecord === "string") { - // eslint-disable-next-line unicorn/prefer-type-error - throw new Error( - `Failed to parse the "${fieldName}" field in a "${PACKAGE_JSON}" file from: ${filePathOrDirPathOrRecord}`, - ); - } - - throw new Error( - `Failed to parse the "${fieldName}" field in a "${PACKAGE_JSON}" file.`, - ); - } - - return field; -} - -/** - * Helper function to get an arbitrary string field from a "package.json" file. This will print an - * error message and exit the program if the field does not exist or if the "package.json" file - * cannot be found. - * - * Also see the `getPackageJSONField` function. - * - * @param filePathOrDirPathOrRecord Either the path to a "package.json" file, the path to a - * directory which contains a "package.json" file, or a parsed - * JavaScript object from a JSON file. If undefined is passed, the - * current working directory will be used. - * @param fieldName The name of the field to retrieve. - */ -export function getPackageJSONFieldMandatory( - filePathOrDirPathOrRecord: - | string - | ReadonlyRecord - | undefined, - fieldName: string, -): string { - const field = getPackageJSONField(filePathOrDirPathOrRecord, fieldName); - if (field === undefined) { - throw new Error( - `Failed to find the "${fieldName}" field in a "${PACKAGE_JSON}" file.`, - ); - } - - return field; -} - -/** - * Helper function to get N arbitrary string fields from a "package.json" file. This will print an - * error message and exit the program if any of the fields do not exist or if the "package.json" - * file cannot be found. - * - * Also see the `getPackageJSONFieldMandatory` function. - * - * @param filePathOrDirPath Either the path to a "package.json" file or the path to a directory - * which contains a "package.json" file. If undefined is passed, the - * current working directory will be used. - * @param fieldNames The names of the fields to retrieve. - */ -export function getPackageJSONFieldsMandatory( - filePathOrDirPath: string | undefined, - ...fieldNames: readonly T[] -): Record { - const packageJSON = getPackageJSON(filePathOrDirPath); - - const fields: Partial> = {}; - - for (const fieldName of fieldNames) { - const field = getPackageJSONField(packageJSON, fieldName); - if (field === undefined) { - throw new Error( - `Failed to find the "${fieldName}" field in a "${PACKAGE_JSON}" file.`, - ); - } - - fields[fieldName] = field; - } - - return fields as Record; -} - -/** - * Helper function to get the "scripts" field from a "package.json" file. If the field does not - * exist, `undefined` will be returned. This will print an error message and exit the program if the - * "package.json" file cannot be found or is otherwise invalid. - * - * @param filePathOrDirPathOrRecord Either the path to a "package.json" file, the path to a - * directory which contains a "package.json" file, or a parsed - * JavaScript object from a JSON file. If undefined is passed, the - * current working directory will be used. - */ -export function getPackageJSONScripts( - filePathOrDirPathOrRecord: - | string - | ReadonlyRecord - | undefined, -): Record | undefined { - const packageJSON = - typeof filePathOrDirPathOrRecord === "object" - ? filePathOrDirPathOrRecord - : getPackageJSON(filePathOrDirPathOrRecord); - - const { scripts } = packageJSON; - if (scripts === undefined) { - return undefined; - } - - if (!isObject(scripts)) { - if (typeof filePathOrDirPathOrRecord === "string") { - // eslint-disable-next-line unicorn/prefer-type-error - throw new Error( - `Failed to parse the "scripts" field in a "${PACKAGE_JSON}" file from: ${filePathOrDirPathOrRecord}`, - ); - } - - throw new Error( - `Failed to parse the "scripts" field in a "${PACKAGE_JSON}" file.`, - ); - } - - for (const [key, value] of Object.entries(scripts)) { - if (typeof value !== "string") { - // eslint-disable-next-line unicorn/prefer-type-error - throw new Error( - `Failed to parse the "${key}" script in the "${PACKAGE_JSON}" file.`, - ); - } - } - - return scripts as Record; -} - -/** - * Helper function to get the "version" field from a "package.json" file. This will print an error - * message and exit the program if the "package.json" file cannot be found or is otherwise invalid. - * It will also exit the program if the "version" field does not exist. - * - * If you want to allow for the "version" field not existing, use the `getPackageJSONField` helper - * function instead. - * - * @param filePathOrDirPathOrRecord Either the path to a "package.json" file, the path to a - * directory which contains a "package.json" file, or a parsed - * JavaScript object from a JSON file. If undefined is passed, the - * current working directory will be used. - */ -export function getPackageJSONVersion( - filePathOrDirPathOrRecord: - | string - | ReadonlyRecord - | undefined, -): string { - const version = getPackageJSONField(filePathOrDirPathOrRecord, "version"); - - if (version === undefined) { - if (typeof filePathOrDirPathOrRecord === "string") { - // eslint-disable-next-line unicorn/prefer-type-error - throw new Error( - `Failed to parse the "version" field in a "${PACKAGE_JSON}" file from: ${filePathOrDirPathOrRecord}`, - ); - } - - throw new Error( - `Failed to parse the "version" field in a "${PACKAGE_JSON}" file.`, - ); - } - - return version; -} - -/** - * Helper function to check if a "package.json" file has a particular dependency. Both the - * "dependencies" and the "devDependencies" fields will be checked. This will print an error message - * and exit the program if the "package.json" file cannot be found or is otherwise invalid. - * - * This function is variadic, meaning that you can pass as many dependency names as you want to - * check for. This function will return true if one or more dependencies were found. - * - * @param filePathOrDirPathOrRecord Either the path to a "package.json" file, the path to a - * directory which contains a "package.json" file, or a parsed - * JavaScript object from a JSON file. If undefined is passed, the - * current working directory will be used. - * @param dependencyNames The name of the dependency to check for. - */ -export function isPackageJSONDependency( - filePathOrDirPathOrRecord: - | string - | ReadonlyRecord - | undefined, - ...dependencyNames: readonly string[] -): boolean { - const dependencySet = new Set(); - - const packageJSON = - typeof filePathOrDirPathOrRecord === "object" - ? filePathOrDirPathOrRecord - : getPackageJSON(filePathOrDirPathOrRecord); - - const dependencies = getPackageJSONDependencies(packageJSON, "dependencies"); - if (dependencies !== undefined) { - setAdd(dependencySet, ...Object.keys(dependencies)); - } - - const devDependencies = getPackageJSONDependencies( - packageJSON, - "devDependencies", - ); - if (devDependencies !== undefined) { - setAdd(dependencySet, ...Object.keys(devDependencies)); - } - - return dependencyNames.some((dependencyName) => - dependencySet.has(dependencyName), - ); -} - -/** - * Helper function to check if a "package.json" file has a particular script. This will print an - * error message and exit the program if the "package.json" file cannot be found or is otherwise - * invalid. - * - * @param filePathOrDirPathOrRecord Either the path to a "package.json" file, the path to a - * directory which contains a "package.json" file, or a parsed - * JavaScript object from a JSON file. If undefined is passed, the - * current working directory will be used. - * @param scriptName The name of the script to check for. - */ -export function packageJSONHasScript( - filePathOrDirPathOrRecord: - | string - | ReadonlyRecord - | undefined, - scriptName: string, -): boolean { - const packageJSON = - typeof filePathOrDirPathOrRecord === "object" - ? filePathOrDirPathOrRecord - : getPackageJSON(filePathOrDirPathOrRecord); - - const scripts = getPackageJSONScripts(packageJSON); - if (scripts === undefined) { - return false; - } - - const script = scripts[scriptName]; - return script !== undefined; -} - -/** - * Helper function to set a dependency in a "package.json" file to a new value. This will print an - * error message and exit the program if the "package.json" file cannot be found or is otherwise - * invalid. - * - * @param filePathOrDirPath Either the path to a "package.json" file or the path to a directory - * which contains a "package.json" file. If undefined is passed, the - * current working directory will be used. - * @param dependencyName The name of the dependency to update. - * @param version The new value for the dependency field. Note that most of the time, the version - * should have a "^" character prefix to indicate that patch updates should - * automatically be downloaded by the package manager. - */ -export function setPackageJSONDependency( - filePathOrDirPath: string | undefined, - dependencyName: string, - version: string, -): void { - const filePath = getFilePath(PACKAGE_JSON, filePathOrDirPath); - const packageJSON = getPackageJSON(filePath); - - const dependencies = - getPackageJSONDependencies(packageJSON, "dependencies") ?? {}; - dependencies[dependencyName] = version; - packageJSON["dependencies"] = dependencies; - - const newFileContents = `${JSON.stringify(packageJSON, undefined, 2)}\n`; // Prettify it. - writeFile(filePath, newFileContents); -} diff --git a/packages/isaacscript-common-node/src/functions/packageManager.ts b/packages/isaacscript-common-node/src/functions/packageManager.ts deleted file mode 100644 index 6064a1a25..000000000 --- a/packages/isaacscript-common-node/src/functions/packageManager.ts +++ /dev/null @@ -1,166 +0,0 @@ -import path from "node:path"; -import { PACKAGE_MANAGER_VALUES } from "../cachedEnumValues.js"; -import { PackageManager } from "../enums/PackageManager.js"; -import { isFile } from "./file.js"; - -const PACKAGE_MANAGER_TO_LOCK_FILE_NAME = { - [PackageManager.npm]: "package-lock.json", - [PackageManager.yarn]: "yarn.lock", - [PackageManager.pnpm]: "pnpm-lock.yaml", -} as const satisfies Record; - -export const PACKAGE_MANAGER_LOCK_FILE_NAMES: readonly string[] = Object.values( - PACKAGE_MANAGER_TO_LOCK_FILE_NAME, -); - -const PACKAGE_MANAGER_EXEC_COMMANDS = { - [PackageManager.npm]: "npx", - [PackageManager.yarn]: "npx", - [PackageManager.pnpm]: "pnpm exec", -} as const satisfies Record; - -/** - * Helper function to get the add command for a package manager. For example, the command for npm - * is: `npm install foo --save` - */ -export function getPackageManagerAddCommand( - packageManager: PackageManager, - dependency: string, -): string { - switch (packageManager) { - case PackageManager.npm: { - return `npm install ${dependency} --save`; - } - - case PackageManager.yarn: { - return `yarn add ${dependency}`; - } - - case PackageManager.pnpm: { - return `pnpm add ${dependency}`; - } - } -} - -/** - * Helper function to get the add development command for a package manager. For example, the - * command for npm is: `npm install foo --save-dev` - */ -export function getPackageManagerAddDevCommand( - packageManager: PackageManager, - dependency: string, -): string { - switch (packageManager) { - case PackageManager.npm: { - return `npm install ${dependency} --save-dev`; - } - - case PackageManager.yarn: { - return `yarn add ${dependency} --dev`; - } - - case PackageManager.pnpm: { - return `pnpm add ${dependency} --save-dev`; - } - } -} - -/** - * Helper function to get the exec command for a package manager. For example, the command for npm - * is: `npx` - */ -export function getPackageManagerExecCommand( - packageManager: PackageManager, -): string { - return PACKAGE_MANAGER_EXEC_COMMANDS[packageManager]; -} - -/** - * Helper function to look at the lock files in a given directory in order to detect the package - * manager being used for the project. - * - * Since 2 or more different kinds of lock files can exist, this will print an error message and - * exit the program if 0 lock files are found or if 2 or more lock files are found. - */ -export function getPackageManagerForProject( - packageRoot: string, -): PackageManager { - const packageManagers = getPackageManagersForProject(packageRoot); - if (packageManagers.length > 1) { - throw new Error( - `${ - packageManagers.length - } different package manager lock files exist at "${packageRoot}". You should delete the ones that you are not using so that this program can correctly detect your package manager.`, - ); - } - - const packageManager = packageManagers[0]; - if (packageManager === undefined) { - throw new Error( - `No package manager lock files exist at "${packageRoot}". You should install dependencies using the package manager of your choice so that this program can correctly detect your package manager.`, - ); - } - - return packageManager; -} - -/** - * Helper function to get the continuous integration install command for a package manager. For - * example, the command for npm is: `npm ci` - */ -export function getPackageManagerInstallCICommand( - packageManager: PackageManager, -): string { - switch (packageManager) { - case PackageManager.npm: { - return "npm ci"; - } - - case PackageManager.yarn: { - return "yarn install --immutable"; - } - - case PackageManager.pnpm: { - return "pnpm install --frozen-lockfile"; - } - } -} - -/** - * Helper function to get the install command for a package manager. For example, the command for - * npm is: `npm install` - */ -export function getPackageManagerInstallCommand( - packageManager: PackageManager, -): string { - return `${packageManager} install`; -} - -export function getPackageManagerLockFileName( - packageManager: PackageManager, -): string { - return PACKAGE_MANAGER_TO_LOCK_FILE_NAME[packageManager]; -} - -/** - * Helper function to look at the lock files in a given directory in order to detect the package - * manager being used for the project. - * - * Since 2 or more different kinds of lock files can exist, this will return an array containing all - * of the package managers found. If no lock files were found, this will return an empty array. - */ -export function getPackageManagersForProject( - packageDir: string, -): readonly PackageManager[] { - const packageManagersFound: PackageManager[] = []; - - for (const packageManager of PACKAGE_MANAGER_VALUES) { - const lockFileName = getPackageManagerLockFileName(packageManager); - const lockFilePath = path.join(packageDir, lockFileName); - if (isFile(lockFilePath)) { - packageManagersFound.push(packageManager); - } - } - - return packageManagersFound; -} diff --git a/packages/isaacscript-common-node/src/functions/scriptHelpers.ts b/packages/isaacscript-common-node/src/functions/scriptHelpers.ts deleted file mode 100644 index b51e80a49..000000000 --- a/packages/isaacscript-common-node/src/functions/scriptHelpers.ts +++ /dev/null @@ -1,203 +0,0 @@ -/* eslint-disable sort-exports/sort-exports */ - -import { isObject } from "isaacscript-common-ts"; -import path from "node:path"; -import * as tsconfck from "tsconfck"; -import { dirOfCaller, findPackageRoot } from "./arkType.js"; -import { isFile, mv, rm } from "./file.js"; -import { getElapsedSeconds } from "./time.js"; -import { fatalError, getArgs } from "./utils.js"; - -type ScriptCallback = ( - scriptCallbackData: ScriptCallbackData, -) => Promise | void; - -interface ScriptCallbackData { - /** The full path to the directory where the closest "package.json" is located. */ - readonly packageRoot: string; - - /** - * The full path to the directory where the compiled output directory, according to the project's - * "tsconfig.json" file. This will be undefined if there is no "outDir" specified. - */ - readonly outDir?: string; -} - -/** - * Removes the "outDir" directory specified in the "tsconfig.json" file (if it exists), then runs - * the provided logic. - * - * For more information, see the documentation for the `script` helper function. - */ -export async function buildScript(func: ScriptCallback): Promise { - const buildFunc: ScriptCallback = async (data) => { - const { outDir } = data; - if (outDir !== undefined) { - rm(outDir); - } - - await func(data); - }; - - await script(buildFunc, "built", 2); -} - -/** See the documentation for the `script` helper function. */ -export async function lintScript(func: ScriptCallback): Promise { - await script(func, "linted", 2); -} - -/** See the documentation for the `script` helper function. */ -export async function testScript(func: ScriptCallback): Promise { - await script(func, "tested", 2); -} - -/** - * Helper function to create a script for a TypeScript project. You can pass any arbitrary logic you - * want. - * - * This is intended to be used with the `$` and `$s` helper functions so that you can make a - * TypeScript script in the style of a Bash script. - * - * Specifically, this helper function will: - * - * 1. Change the working directory to the package root (i.e. the place where the nearest - * "package.json" file is). - * 2. Run the provided logic. - * 3. Print a success message with the total amount of seconds taken (if a verb was provided and - * there is not a quiet/silent flag). - * - * @param func The function that contains the build logic for the particular script. This is passed - * the path to the package root and other metadata about the project. (See the - * `ScriptCallbackData` interface.) - * @param verb Optional. The verb for when the script completes. For example, "built". - * @param upStackBy Optional. The number of functions to rewind in the calling stack before - * attempting to file the closest "package.json" file. Default is 1. - */ -export async function script( - func: ScriptCallback, - verb?: string, - upStackBy = 1, -): Promise { - const args = getArgs(); - const quiet = - args.includes("quiet") || - args.includes("--quiet") || - args.includes("-q") || - args.includes("silent") || - args.includes("--silent") || - args.includes("-s"); - - const fromDir = dirOfCaller(upStackBy); - const packageRoot = findPackageRoot(fromDir); - if (packageRoot === null) { - fatalError( - `Failed to find the package root starting from directory: ${fromDir}`, - ); - } - - process.chdir(packageRoot); - - const outDir = await getTSConfigJSONOutDir(packageRoot); - - const startTime = Date.now(); - const data = { packageRoot, outDir }; - await func(data); - - if (!quiet && verb !== undefined) { - const packageName = path.basename(packageRoot); - printSuccess(startTime, verb, packageName); - } -} - -async function getTSConfigJSONOutDir( - packageRoot: string, -): Promise { - const tsConfigJSONPath = path.join(packageRoot, "tsconfig.json"); - if (!isFile(tsConfigJSONPath)) { - return undefined; - } - - const parseResult = await tsconfck.parseNative(tsConfigJSONPath); - - const tsconfig = parseResult.tsconfig as unknown; - if (!isObject(tsconfig)) { - return undefined; - } - - const { compilerOptions } = tsconfig; - if (!isObject(compilerOptions)) { - return undefined; - } - - const { outDir } = compilerOptions; - if (typeof outDir !== "string") { - return undefined; - } - - // eslint-disable-next-line isaacscript/no-template-curly-in-string-fix - if (outDir.includes("${configDir}")) { - fatalError( - `The parsed file at "${tsConfigJSONPath}" has an "outDir" that includes a "\${configDir}" literal, which means that the parser did not properly instantiate the variable.`, - ); - } - - return outDir; -} - -/** - * Helper function to print a success message with the number of elapsed seconds. - * - * @param startTime The start time in milliseconds (as recorded by the `Date.now` method). - * @param verb The verb to print. For example, "built". - * @param noun The noun to print. For example, "foo". - */ -export function printSuccess( - startTime: number, - verb: string, - noun: string, -): void { - const elapsedSeconds = getElapsedSeconds(startTime); - const secondsText = elapsedSeconds === 1 ? "second" : "seconds"; - console.log( - `Successfully ${verb} ${noun} in ${elapsedSeconds} ${secondsText}.`, - ); -} - -/** - * An alias for "console.log". - * - * @allowEmptyVariadic - */ -export function echo(...args: readonly unknown[]): void { - console.log(...args); -} - -/** An alias for "process.exit". */ -export function exit(code = 0): never { - return process.exit(code); -} - -/** - * In a monorepo without project references, `tsc` will compile parent projects and include it in - * the build output, making a weird directory structure. Since build output for a single package - * should not be include other monorepo dependencies inside of it, all of the output needs to be - * deleted except for the actual package output. - */ -export function fixMonorepoPackageDistDirectory( - packageRoot: string, - outDir: string, -): void { - const projectName = path.basename(packageRoot); - const realOutDir = path.join(outDir, projectName, "src"); - const tempPath = path.join(packageRoot, projectName); - rm(tempPath); - mv(realOutDir, tempPath); - rm(outDir); - mv(tempPath, outDir); -} - -export async function sleep(seconds: number): Promise { - // eslint-disable-next-line no-promise-executor-return - return new Promise((resolve) => setTimeout(resolve, seconds * 1000)); -} diff --git a/packages/isaacscript-common-node/src/functions/time.ts b/packages/isaacscript-common-node/src/functions/time.ts deleted file mode 100644 index 1106403a4..000000000 --- a/packages/isaacscript-common-node/src/functions/time.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Helper function to get the number of elapsed seconds since a starting time. - * - * This function always returns a whole number (using `Math.floor` on the result). - * - * For example: - * - * ```ts - * const startTime = Date.now(); - * doSomething(); - * const elapsedSeconds = getElapsedSeconds(startTime); - * ``` - */ -export function getElapsedSeconds(startTime: number): number { - const endTime = Date.now(); - const elapsedMilliseconds = endTime - startTime; - const elapsedSeconds = elapsedMilliseconds / 1000; - - return Math.floor(elapsedSeconds); -} diff --git a/packages/isaacscript-common-node/src/functions/updatePackageJSON.ts b/packages/isaacscript-common-node/src/functions/updatePackageJSON.ts deleted file mode 100644 index f3ce9f40f..000000000 --- a/packages/isaacscript-common-node/src/functions/updatePackageJSON.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { parseSemanticVersion } from "isaacscript-common-ts"; -import path from "node:path"; -import { PackageManager } from "../enums/PackageManager.js"; -import { $op } from "./execa.js"; -import { getFilePath, readFile } from "./file.js"; -import { PACKAGE_JSON } from "./packageJSON.js"; -import { - getPackageManagerForProject, - getPackageManagersForProject, -} from "./packageManager.js"; -import { diff, fatalError } from "./utils.js"; - -/** @returns Whether the dependencies were updated. */ -export function updateDependencies( - packageJSONPath: string, - packageRoot: string, - quiet: boolean, -): boolean { - const $$ = $op({ - cwd: packageRoot, - stdio: quiet ? "pipe" : "inherit", - }); - - const oldPackageJSONString = readFile(packageJSONPath); - - // - "--upgrade" is necessary because `npm-check-updates` will be a no-op by default (i.e. it only - // displays what is upgradeable). - // - "--packageFile" is necessary because the current working directory may not contain the - // "package.json" file, so we must explicitly specify it. - // - "--filterVersion" is necessary because if a dependency does not have a "^" prefix, we assume - // that it should be a "locked" dependency and not upgraded. - $$.sync`npx npm-check-updates --upgrade --packageFile ${packageJSONPath} --filterVersion ^*`; - - const newPackageJSONString = readFile(packageJSONPath); - return oldPackageJSONString !== newPackageJSONString; -} - -/** - * Helper function to: - * - * - Upgrade Yarn (if it is the package manager used in the project). - * - Run `npm-check-updates` to update the dependencies in the "package.json" file. - * - Install the new dependencies with the package manager used in the project. - * - * @param filePathOrDirPath Either the path to a "package.json" file or the path to a directory - * which contains a "package.json" file. If undefined is passed, the - * current working directory will be used. - * @param installAfterUpdate Optional. Whether to install the new dependencies afterward, if any. - * Default is true. - * @param quiet Optional. Whether to suppress console output. Default is false. - * @returns Whether the "package.json" file was updated. - */ -export function updatePackageJSON( - filePathOrDirPath: string | undefined, - installAfterUpdate = true, - quiet = false, -): boolean { - const packageJSONPath = getFilePath(PACKAGE_JSON, filePathOrDirPath); - const packageRoot = path.dirname(packageJSONPath); - - const yarnUpdated = updateYarn(packageJSONPath, packageRoot, quiet); - const dependenciesUpdated = updateDependencies( - packageJSONPath, - packageRoot, - quiet, - ); - - const packageJSONChanged = yarnUpdated || dependenciesUpdated; - if (packageJSONChanged && installAfterUpdate) { - const packageManager = getPackageManagerForProject(packageRoot); - const $$ = $op({ - cwd: packageRoot, - - // We need to prevent Corepack from prompting the end user with a "y/n" dialog for downloading - // a new version of Yarn. - env: { - COREPACK_ENABLE_DOWNLOAD_PROMPT: "0", - }, - }); - $$.sync`${packageManager} install`; - } - - return packageJSONChanged; -} - -/** @returns Whether Yarn was updated. */ -export function updateYarn( - packageJSONPath: string, - packageRoot: string, - quiet: boolean, -): boolean { - const packageManagers = getPackageManagersForProject(packageRoot); - - if (!packageManagers.includes(PackageManager.yarn)) { - return false; - } - - const $$ = $op({ cwd: packageRoot }); - - // If Yarn version 1 is being used, assume that we don't need to update it. - const { stdout } = $$.sync`yarn --version`; - if (typeof stdout !== "string") { - fatalError('Failed to get the output of the "yarn --version" command.'); - } - - const yarnVersion = parseSemanticVersion(stdout); - if (yarnVersion === undefined) { - fatalError( - `Failed to parse the Yarn version when running the "yarn --version" command: ${stdout}`, - ); - } - if (yarnVersion.majorVersion === 1) { - return false; - } - - const oldPackageJSONString = readFile(packageJSONPath); - - $$.sync`yarn set version latest`; - - const newPackageJSONString = readFile(packageJSONPath); - if (oldPackageJSONString === newPackageJSONString) { - return false; - } - - if (!quiet) { - console.log("New version of Yarn:"); - diff(oldPackageJSONString, newPackageJSONString); - console.log(); - } - - return true; -} diff --git a/packages/isaacscript-common-node/src/functions/utils.ts b/packages/isaacscript-common-node/src/functions/utils.ts deleted file mode 100644 index 824563501..000000000 --- a/packages/isaacscript-common-node/src/functions/utils.ts +++ /dev/null @@ -1,46 +0,0 @@ -import chalk from "chalk"; -import { diffLines } from "diff"; -import { fileOfCaller } from "./arkType.js"; - -/** - * Helper function to print the differences between two strings. Similar to the `diff` Unix program. - */ -export function diff(string1: string, string2: string): void { - const differences = diffLines(string1, string2); - for (const difference of differences) { - if (difference.added === true) { - console.log(`${chalk.green("+")} ${difference.value.trim()}`); - } else if (difference.removed === true) { - console.log(`${chalk.red("-")} ${difference.value.trim()}`); - } - } -} - -/** - * Helper function to print out an error message and then exit the program. - * - * All of the arguments will be passed to the `console.error` function. - */ -export function fatalError(...args: readonly unknown[]): never { - console.error(...args); - process.exit(1); -} - -/** - * Helper function to get the command-line arguments passed to the program/script. - * - * This is an alias for: `process.argv.slice(2)` - */ -export function getArgs(): readonly string[] { - return process.argv.slice(2); -} - -/** - * Helper function to see if the current file is is the JavaScript/TypeScript entry point. Returns - * false if the current file was imported from somewhere else. - * - * This is similar to the `__name__ == "__main__"` pattern from the Python programming language. - */ -export function isMain(): boolean { - return process.argv[1] === fileOfCaller(); -} diff --git a/packages/isaacscript-common-node/src/index.ts b/packages/isaacscript-common-node/src/index.ts deleted file mode 100644 index b65588e95..000000000 --- a/packages/isaacscript-common-node/src/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -export * from "./enums/PackageManager.js"; -export * from "./functions/arkType.js"; -export * from "./functions/base64.js"; -export * from "./functions/build.js"; -export * from "./functions/commandExists.js"; -export * from "./functions/env.js"; -export * from "./functions/execa.js"; -export * from "./functions/file.js"; -export * from "./functions/git.js"; -export * from "./functions/jsonc.js"; -export * from "./functions/npm.js"; -export * from "./functions/nukeDependencies.js"; -export * from "./functions/packageJSON.js"; -export * from "./functions/packageManager.js"; -export * from "./functions/scriptHelpers.js"; -export * from "./functions/time.js"; -export * from "./functions/updatePackageJSON.js"; -export * from "./functions/utils.js"; diff --git a/packages/isaacscript-common-node/tsconfig.json b/packages/isaacscript-common-node/tsconfig.json deleted file mode 100644 index ecefe8736..000000000 --- a/packages/isaacscript-common-node/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", - - "extends": [ - "../isaacscript-tsconfig/tsconfig.base.json", - "../isaacscript-tsconfig/tsconfig.node.json", - "../../tsconfig.monorepo.json", - ], - - // https://www.typescriptlang.org/docs/handbook/compiler-options.html - "compilerOptions": { - // Needed since this is a library. - "declaration": true, - "declarationMap": true, - }, -} diff --git a/packages/isaacscript-common-ts/LICENSE b/packages/isaacscript-common-ts/LICENSE deleted file mode 100644 index b2cf86336..000000000 --- a/packages/isaacscript-common-ts/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2022 IsaacScript - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/isaacscript-common-ts/README.md b/packages/isaacscript-common-ts/README.md deleted file mode 100644 index 03e14e400..000000000 --- a/packages/isaacscript-common-ts/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# isaacscript-common-ts - -[![npm version](https://img.shields.io/npm/v/isaacscript-common-ts.svg)](https://www.npmjs.com/package/isaacscript-common-ts) - -This package contains helper functions for a typical TypeScript project, such as [`iRange`](https://isaacscript.github.io/isaacscript-common/functions/utils/#irange). - -Some of the functions here are copied from [`isaacscript-common`](../isaacscript-common). However, `isaacscript-common` is compiled to Lua, so it cannot be used in a typical JavaScript/TypeScript project. This project is compiled to JavaScript, so it can be consumed as a normal JavaScript/TypeScript library. - -For more information about IsaacScript, see the [official website](https://isaacscript.github.io/). diff --git a/packages/isaacscript-common-ts/eslint.config.mjs b/packages/isaacscript-common-ts/eslint.config.mjs deleted file mode 100644 index 53226b83e..000000000 --- a/packages/isaacscript-common-ts/eslint.config.mjs +++ /dev/null @@ -1,30 +0,0 @@ -import tseslint from "typescript-eslint"; -import { base } from "../eslint-config-isaacscript/base.js"; -import { monorepo } from "../eslint-config-isaacscript/monorepo.js"; -// @ts-expect-error https://github.com/jrdrg/eslint-plugin-sort-exports/issues/44 -import ESLintPluginSortExports from "eslint-plugin-sort-exports"; - -export default tseslint.config( - ...base, - ...monorepo, - - { - plugins: { - /** The `sort-exports` rule is used in some specific files. */ - "sort-exports": ESLintPluginSortExports, - }, - }, - - { - files: ["src/functions/**"], - rules: { - /** Not defined in the parent configs. */ - "sort-exports/sort-exports": [ - "warn", - { - sortDir: "asc", - }, - ], - }, - }, -); diff --git a/packages/isaacscript-common-ts/package.json b/packages/isaacscript-common-ts/package.json deleted file mode 100644 index d8539d1f3..000000000 --- a/packages/isaacscript-common-ts/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "isaacscript-common-ts", - "version": "16.1.0", - "description": "Helper functions for TypeScript projects.", - "keywords": [], - "homepage": "https://isaacscript.github.io/", - "bugs": { - "url": "https://github.com/IsaacScript/isaacscript/issues" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/IsaacScript/isaacscript.git" - }, - "license": "MIT", - "author": "Zamiell", - "type": "module", - "exports": { - ".": { - "import": "./dist/index.mjs", - "require": "./dist/index.cjs" - } - }, - "types": "./dist/index.d.ts", - "files": [ - "dist", - "src", - "LICENSE", - "package.json", - "README.md" - ], - "scripts": { - "build": "tsx ./scripts/build.ts", - "lint": "tsx ./scripts/lint.ts", - "test": "glob \"./src/**/*.test.ts\" --cmd=\"node --import tsx --test --test-reporter spec\"" - }, - "dependencies": { - "unidecode": "^1.1.0" - } -} diff --git a/packages/isaacscript-common-ts/scripts/build.ts b/packages/isaacscript-common-ts/scripts/build.ts deleted file mode 100644 index d8a68b204..000000000 --- a/packages/isaacscript-common-ts/scripts/build.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { $s, buildScript, replaceTextInFile } from "isaacscript-common-node"; -import { assertDefined } from "isaacscript-common-ts"; -import path from "node:path"; - -await buildScript(({ outDir }) => { - assertDefined( - outDir, - 'Failed to get the "outDir" from the "tsconfig.json" file.', - ); - - $s`unbuild`; // We use the `unbuild` library to output both ESM and CJS. - fixBuggedReadonlyConstructors(outDir); -}); - -/** - * For some reason `unbuild` (and `tsup`) will append a "$1" to the `ReadonlyMap` and `ReadonlySet` - * constructors. Thus, we must manually fix this. - */ -function fixBuggedReadonlyConstructors(outDir: string) { - removeBuggedTypeSuffix(outDir, "Map"); - removeBuggedTypeSuffix(outDir, "Set"); -} - -function removeBuggedTypeSuffix(outDir: string, typeName: string) { - const searchValue = `Readonly${typeName}$1`; - const replaceValue = `Readonly${typeName}`; - - for (const extension of ["ts", "mts", "cts"]) { - const filePath1 = path.join(outDir, `index.d.${extension}`); - replaceTextInFile(filePath1, searchValue, replaceValue); - } -} diff --git a/packages/isaacscript-common-ts/scripts/lint.ts b/packages/isaacscript-common-ts/scripts/lint.ts deleted file mode 100644 index 290fcfe0d..000000000 --- a/packages/isaacscript-common-ts/scripts/lint.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { $, lintScript } from "isaacscript-common-node"; - -await lintScript(async () => { - const promises = [ - $`tsc --noEmit`, - $`tsc --noEmit --project ./scripts/tsconfig.json`, - $`eslint --max-warnings 0 .`, - ]; - await Promise.all(promises); -}); diff --git a/packages/isaacscript-common-ts/scripts/tsconfig.json b/packages/isaacscript-common-ts/scripts/tsconfig.json deleted file mode 100644 index 5afad029c..000000000 --- a/packages/isaacscript-common-ts/scripts/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", - - "extends": [ - "../../isaacscript-tsconfig/tsconfig.base.json", - "../../isaacscript-tsconfig/tsconfig.node.json", - "../../../tsconfig.monorepo.json", - ], - - "include": ["*.ts"], -} diff --git a/packages/isaacscript-common-ts/src/constants.ts b/packages/isaacscript-common-ts/src/constants.ts deleted file mode 100644 index 4ae564c33..000000000 --- a/packages/isaacscript-common-ts/src/constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const SECOND_IN_MILLISECONDS = 1000; -export const MINUTE_IN_MILLISECONDS = 60 * SECOND_IN_MILLISECONDS; -export const HOUR_IN_MILLISECONDS = 60 * MINUTE_IN_MILLISECONDS; diff --git a/packages/isaacscript-common-ts/src/functions/array.ts b/packages/isaacscript-common-ts/src/functions/array.ts deleted file mode 100644 index b0ce80e69..000000000 --- a/packages/isaacscript-common-ts/src/functions/array.ts +++ /dev/null @@ -1,209 +0,0 @@ -import type { WidenLiteral } from "../index.js"; -import { ReadonlySet } from "../types/ReadonlySet.js"; -import { getRandomInt } from "./random.js"; -import { assertDefined } from "./utils.js"; - -/** - * Helper function to copy a two-dimensional array. Note that the sub-arrays will only be shallow - * copied (using the spread operator). - */ -// eslint-disable-next-line isaacscript/no-mutable-return -export function arrayCopyTwoDimensional( - array: ReadonlyArray, -): T[][] { - const copiedArray: T[][] = []; - - for (const subArray of array) { - copiedArray.push([...subArray]); - } - - return copiedArray; -} - -/** - * Helper function for determining if two arrays contain the exact same elements. Note that this - * only performs a shallow comparison. - */ -export function arrayEquals( - array1: readonly T[], - array2: readonly T[], -): boolean { - if (array1.length !== array2.length) { - return false; - } - - return array1.every((array1Element, i) => { - const array2Element = array2[i]; - return array1Element === array2Element; - }); -} - -/** - * Builds a new array based on the original array without the specified element(s). Returns the new - * array. If the specified element(s) are not found in the array, it will simply return a shallow - * copy of the array. - * - * This function is variadic, meaning that you can specify N arguments to remove N elements. - */ -// eslint-disable-next-line isaacscript/no-mutable-return -export function arrayRemove( - originalArray: readonly T[], - ...elementsToRemove: readonly T[] -): T[] { - const elementsToRemoveSet = new ReadonlySet(elementsToRemove); - - const array: T[] = []; - for (const element of originalArray) { - if (!elementsToRemoveSet.has(element)) { - array.push(element); - } - } - - return array; -} - -/** - * Removes the specified element(s) from the array. If the specified element(s) are not found in the - * array, this function will do nothing. - * - * This function is variadic, meaning that you can specify N arguments to remove N elements. - * - * If there is more than one matching element in the array, this function will only remove the first - * matching element. If you want to remove all of the elements, use the `arrayRemoveAllInPlace` - * function instead. - * - * @returns The removed elements. This will be an empty array if no elements were removed. - */ -// eslint-disable-next-line isaacscript/no-mutable-return -export function arrayRemoveInPlace( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types - array: T[], - ...elementsToRemove: readonly T[] -): T[] { - const removedElements: T[] = []; - - for (const element of elementsToRemove) { - const index = array.indexOf(element); - if (index > -1) { - const removedElement = array.splice(index, 1); - removedElements.push(...removedElement); - } - } - - return removedElements; -} - -/** Helper function to remove all of the elements in an array in-place. */ -// eslint-disable-next-line isaacscript/prefer-readonly-parameter-types -export function emptyArray(array: T[]): void { - array.splice(0, array.length); -} - -/** - * Helper function to perform a filter and a map at the same time. Similar to `Array.map`, provide a - * function that transforms a value, but return `undefined` if the value should be skipped. (Thus, - * this function cannot be used in situations where `undefined` can be a valid array element.) - * - * This function is useful because the `Array.map` method will always produce an array with the same - * amount of elements as the original array. - * - * This is named `filterMap` after the Rust function: - * https://doc.rust-lang.org/std/iter/struct.FilterMap.html - */ -// eslint-disable-next-line isaacscript/no-mutable-return -export function filterMap( - array: readonly OldT[], - func: (element: OldT) => NewT | undefined, -): NewT[] { - const filteredArray: NewT[] = []; - - for (const element of array) { - const newElement = func(element); - if (newElement !== undefined) { - filteredArray.push(newElement); - } - } - - return filteredArray; -} - -/** - * Helper function to get a random element from the provided array. - * - * Note that this will only work with arrays that do not contain values of `undefined`, since the - * function uses `undefined` as an indication that the corresponding element does not exist. - * - * @param array The array to get an element from. - * @param exceptions Optional. An array of elements to skip over if selected. - */ -export function getRandomArrayElement( - array: readonly T[], - exceptions: readonly T[] = [], -): T { - if (array.length === 0) { - throw new Error( - "Failed to get a random array element since the provided array is empty.", - ); - } - - const arrayToUse = - exceptions.length > 0 ? arrayRemove(array, ...exceptions) : array; - const randomIndex = getRandomArrayIndex(arrayToUse); - const randomElement = arrayToUse[randomIndex]; - assertDefined( - randomElement, - `Failed to get a random array element since the random index of ${randomIndex} was not valid.`, - ); - - return randomElement; -} - -/** - * Helper function to get a random index from the provided array. - * - * @param array The array to get the index from. - * @param exceptions Optional. An array of indexes that will be skipped over when getting the random - * index. Default is an empty array. - */ -export function getRandomArrayIndex( - array: readonly T[], - exceptions: readonly number[] = [], -): number { - if (array.length === 0) { - throw new Error( - "Failed to get a random array index since the provided array is empty.", - ); - } - - return getRandomInt(0, array.length - 1, exceptions); -} - -/** - * Similar to the `Array.includes` method, but works on a widened version of the array. - * - * This is useful when the normal `Array.includes` produces a type error from an array that uses an - * `as const` assertion. - */ -export function includes>( - array: readonly TupleElement[], - searchElement: WidenLiteral, -): searchElement is TupleElement { - const widenedArray: ReadonlyArray> = array; - return widenedArray.includes(searchElement); -} - -/** A wrapper around `Array.isArray` that narrows to `unknown[]` instead of `any[]`. */ -export function isArray(arg: unknown): arg is unknown[] { - return Array.isArray(arg); -} - -/** Initializes an array with all elements containing the specified default value. */ -// eslint-disable-next-line isaacscript/no-mutable-return -export function newArray(length: number, value: T): T[] { - return Array.from({ length }, () => value); -} - -/** Helper function to sum every value in an array together. */ -export function sumArray(array: readonly number[]): number { - return array.reduce((accumulator, element) => accumulator + element, 0); -} diff --git a/packages/isaacscript-common-ts/src/functions/enums.ts b/packages/isaacscript-common-ts/src/functions/enums.ts deleted file mode 100644 index 020a864db..000000000 --- a/packages/isaacscript-common-ts/src/functions/enums.ts +++ /dev/null @@ -1,105 +0,0 @@ -type TranspiledEnum = Record; - -/** - * Helper function to get the entries of an enum. - * - * (By default, TypeScript will put the keys inside of the values of a number-based enum, so those - * have to be filtered out.) - * - * This function will work properly for both number and string enums. - */ -export function getEnumEntries( - transpiledEnum: T, -): ReadonlyArray<[key: string, value: T[keyof T]]> { - const entries = Object.entries(transpiledEnum); - const numberEntries = entries.filter( - ([_key, value]) => typeof value === "number", - ); - - // If there are no number values, then this must be a string enum, and no filtration is required. - const entriesToReturn = numberEntries.length > 0 ? numberEntries : entries; - return entriesToReturn as never; -} - -/** - * Helper function to get the keys of an enum. - * - * (By default, TypeScript will put the keys inside of the values of a number-based enum, so those - * have to be filtered out.) - * - * This function will work properly for both number and string enums. - */ -export function getEnumKeys(transpiledEnum: TranspiledEnum): readonly string[] { - const enumEntries = getEnumEntries(transpiledEnum); - return enumEntries.map(([key, _value]) => key); -} - -/** - * Helper function to get the only the values of an enum. - * - * (By default, TypeScript will put the keys inside of the values of a number-based enum, so those - * have to be filtered out.) - * - * This function will work properly for both number and string enums. - */ -export function getEnumValues( - transpiledEnum: T, -): ReadonlyArray { - const enumEntries = getEnumEntries(transpiledEnum); - return enumEntries.map(([_key, value]) => value); -} - -/** - * Helper function to validate that an interface contains all of the keys of an enum. You must - * specify both generic parameters in order for this to work properly (i.e. the interface and then - * the enum). - * - * For example: - * - * ```ts - * enum MyEnum { - * Value1, - * Value2, - * Value3, - * } - * - * interface MyEnumToType { - * [MyEnum.Value1]: boolean; - * [MyEnum.Value2]: number; - * [MyEnum.Value3]: string; - * } - * - * interfaceSatisfiesEnum(); - * ``` - * - * This function is only meant to be used with interfaces (i.e. types that will not exist at - * run-time). If you are generating an object that will contain all of the keys of an enum, use the - * `satisfies` operator with the `Record` type instead. - */ -export function interfaceSatisfiesEnum< - // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters - T extends Record, - Enum extends string | number, ->(): void {} // eslint-disable-line @typescript-eslint/no-empty-function - -/** - * Helper function to validate that a particular value exists inside of an enum. - * - * @param value The value to check. - * @param transpiledEnum The enum to check against. - * @param set Optional. A set that contains all of the values of an enum. If provided, this function - * will for existence using the set (instead of the enum itself). Using a set should be - * more performant for enums with around 52 or more elements. - */ -export function isEnumValue( - value: number | string, - transpiledEnum: T, - set?: ReadonlySet, -): value is T[keyof T] { - if (set !== undefined) { - return set.has(value); - } - - const enumValues = getEnumValues(transpiledEnum); - return enumValues.includes(value as T[keyof T]); -} diff --git a/packages/isaacscript-common-ts/src/functions/map.ts b/packages/isaacscript-common-ts/src/functions/map.ts deleted file mode 100644 index 37ff7738f..000000000 --- a/packages/isaacscript-common-ts/src/functions/map.ts +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Helper function to get the values in a `Map` that match an arbitrary condition. Similar to the - * `Array.map` method, but works for maps. - * - * This is efficient such that it avoids converting the map values into an array. - * - * If you want to perform a filter and a map at the same time on an array, use the `filterMap` - * helper function instead. - */ -// eslint-disable-next-line isaacscript/no-mutable-return -export function mapFilter( - map: ReadonlyMap, - predicate: (value: V) => boolean, -): V[] { - const array: V[] = []; - - for (const value of map.values()) { - const match = predicate(value); - if (match) { - array.push(value); - } - } - - return array; -} - -/** - * Helper function to find a value in a `Map`. Similar to the `Array.find` method, but works for - * maps. - * - * This is efficient such that it avoids converting the map values into an array. - */ -export function mapFind( - map: ReadonlyMap, - predicate: (value: V) => boolean, -): V | undefined { - for (const value of map.values()) { - const match = predicate(value); - if (match) { - return value; - } - } - - return undefined; -} - -/** - * Helper function to convert an object to a map. - * - * This is useful when you need to construct a type safe object with the `satisfies` operator, but - * then later on you need to query it in a way where you expect the return value to be T or - * undefined. In this situation, by converting the object to a map, you can avoid unsafe type - * assertions. - * - * Note that the map values will be inserted in a random order, due to how `pairs` works under the - * hood. - * - * Also see the `objectToReadonlyMap` function. - */ -// eslint-disable-next-line isaacscript/no-mutable-return -export function objectToMap( - object: Record, -): Map { - const map = new Map(); - - for (const [key, value] of Object.entries(object)) { - map.set(key as K, value as V); - } - - return map; -} - -/** - * Helper function to convert an object to a read-only map. - * - * This is useful when you need to construct a type safe object with the `satisfies` operator, but - * then later on you need to query it in a way where you expect the return value to be T or - * undefined. In this situation, by converting the object to a map, you can avoid unsafe type - * assertions. - * - * Note that the map values will be inserted in a random order, due to how `pairs` works under the - * hood. - * - * Also see the `objectToMap` function. - */ -export function objectToReadonlyMap( - object: Record, -): ReadonlyMap { - return objectToMap(object); -} diff --git a/packages/isaacscript-common-ts/src/functions/math.ts b/packages/isaacscript-common-ts/src/functions/math.ts deleted file mode 100644 index 27730435b..000000000 --- a/packages/isaacscript-common-ts/src/functions/math.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Helper function to normalize a number, ensuring that it is within a certain range. - * - * - If `num` is less than `min`, then it will be clamped to `min`. - * - If `num` is greater than `max`, then it will be clamped to `max`. - */ -export function clamp(num: number, min: number, max: number): number { - return Math.max(min, Math.min(num, max)); -} diff --git a/packages/isaacscript-common-ts/src/functions/object.ts b/packages/isaacscript-common-ts/src/functions/object.ts deleted file mode 100644 index 23bd1755b..000000000 --- a/packages/isaacscript-common-ts/src/functions/object.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Helper function to get the values in an object that match an arbitrary condition. Similar to the - * `Array.map` method, but works for objects. - * - * This is efficient such that it avoids converting the object values into an array. - */ - -import type { ReadonlyRecord } from "../types/ReadonlyRecord.js"; - -// eslint-disable-next-line isaacscript/no-mutable-return -export function objectFilter( - object: ReadonlyRecord, - predicate: (value: V) => boolean, -): V[] { - const array: V[] = []; - - // eslint-disable-next-line isaacscript/no-for-in - for (const key in object) { - const value = object[key]; - const match = predicate(value); - if (match) { - array.push(value); - } - } - - return array; -} diff --git a/packages/isaacscript-common-ts/src/functions/random.ts b/packages/isaacscript-common-ts/src/functions/random.ts deleted file mode 100644 index dabe2616b..000000000 --- a/packages/isaacscript-common-ts/src/functions/random.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { ReadonlySet } from "../types/ReadonlySet.js"; - -/** - * This returns a random integer between min and max. It is inclusive on both ends. - * - * For example: - * - * ```ts - * const oneTwoOrThree = getRandomInt(1, 3); - * ``` - * - * @param min The lower bound for the random number (inclusive). - * @param max The upper bound for the random number (inclusive). - * @param exceptions Optional. An array of elements that will be skipped over when getting the - * random integer. For example, a min of 1, a max of 4, and an exceptions array of - * `[2]` would cause the function to return either 1, 3, or 4. Default is an empty - * array. - */ -export function getRandomInt( - min: number, - max: number, - exceptions: readonly number[] = [], -): number { - min = Math.ceil(min); // eslint-disable-line no-param-reassign - max = Math.floor(max); // eslint-disable-line no-param-reassign - - if (min > max) { - const oldMin = min; - const oldMax = max; - - min = oldMax; // eslint-disable-line no-param-reassign - max = oldMin; // eslint-disable-line no-param-reassign - } - - const exceptionsSet = new ReadonlySet(exceptions); - - let randomInt: number; - do { - randomInt = Math.floor(Math.random() * (max - min + 1)) + min; - } while (exceptionsSet.has(randomInt)); - - return randomInt; -} diff --git a/packages/isaacscript-common-ts/src/functions/set.ts b/packages/isaacscript-common-ts/src/functions/set.ts deleted file mode 100644 index 8d1e9219b..000000000 --- a/packages/isaacscript-common-ts/src/functions/set.ts +++ /dev/null @@ -1,131 +0,0 @@ -/** - * Helper function to add all of the values in one set to another set. The first set passed will be - * modified in place. - * - * This function is variadic, meaning that you can specify N sets to add to the first set. - */ -export function addSetsToSet( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types - mainSet: Set, - ...setsToAdd: ReadonlyArray> -): void { - for (const set of setsToAdd) { - for (const value of set) { - mainSet.add(value); - } - } -} - -/** - * Helper function to create a new set that is the composition of two or more sets. - * - * This function is variadic, meaning that you can specify N sets. - */ -// eslint-disable-next-line isaacscript/no-mutable-return -export function combineSets(...sets: ReadonlyArray>): Set { - const newSet = new Set(); - for (const set of sets) { - for (const value of set) { - newSet.add(value); - } - } - - return newSet; -} - -/** Helper function to copy a set. (You can also use a Set constructor to accomplish this task.) */ -// eslint-disable-next-line isaacscript/no-mutable-return -export function copySet(oldSet: ReadonlySet): Set { - const newSet = new Set(); - for (const value of oldSet) { - newSet.add(value); - } - - return newSet; -} - -/** - * Helper function to convert the keys of an object to a read-only set. - * - * Also see the `objectKeysToSet` function. - */ -export function objectKeysToReadonlySet( - object: Record, -): ReadonlySet { - return objectKeysToSet(object); -} - -/** - * Helper function to convert the keys of an object to a set. - * - * Also see the `objectKeysToReadonlySet` function. - */ -// eslint-disable-next-line isaacscript/no-mutable-return -export function objectKeysToSet( - object: Record, -): Set { - const set = new Set(); - - for (const key of Object.keys(object)) { - set.add(key as K); - } - - return set; -} - -/** - * Helper function to convert the values of an object to a read-only set. - * - * Also see the `objectValuesToSet` function. - */ -export function objectValuesToReadonlySet< - K extends string | number | symbol, - V, ->(object: Record): ReadonlySet { - return objectValuesToSet(object); -} - -/** - * Helper function to convert the values of an object to a set. - * - * Also see the `objectValuesToReadonlySet` function. - */ -// eslint-disable-next-line isaacscript/no-mutable-return -export function objectValuesToSet( - object: Record, -): Set { - const set = new Set(); - - for (const key of Object.values(object)) { - set.add(key as V); - } - - return set; -} - -/** - * Helper function to add one or more elements to a set at once without having to repeatedly call - * the `Set.add` method. - * - * This function is variadic, meaning that you can pass as many things as you want to add. - */ -// eslint-disable-next-line isaacscript/prefer-readonly-parameter-types -export function setAdd(set: Set, ...elements: readonly T[]): void { - for (const element of elements) { - set.add(element); - } -} - -/** - * Helper function to check for one or more elements in a set at once without having to repeatedly - * call the `Set.has` method. - * - * This function is variadic, meaning that you can pass as many things as you want to check for. It - * will return true if one or more elements are found. - */ -export function setHas( - set: ReadonlySet, - ...elements: readonly T[] -): boolean { - return elements.some((element) => set.has(element)); -} diff --git a/packages/isaacscript-common-ts/src/functions/sort.ts b/packages/isaacscript-common-ts/src/functions/sort.ts deleted file mode 100644 index 87d480401..000000000 --- a/packages/isaacscript-common-ts/src/functions/sort.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Helper function to perform a case insensitive sort. This will copy the provided array and return - * the sorted copy. - * - * From: - * https://stackoverflow.com/questions/8996963/how-to-perform-case-insensitive-sorting-array-of-string-in-javascript - */ -// eslint-disable-next-line isaacscript/no-mutable-return -export function sortCaseInsensitive(array: readonly string[]): string[] { - const newArray = [...array]; - newArray.sort((a, b) => - a.localeCompare(b, undefined, { - sensitivity: "base", - }), - ); - - return newArray; -} diff --git a/packages/isaacscript-common-ts/src/functions/string.test.ts b/packages/isaacscript-common-ts/src/functions/string.test.ts deleted file mode 100644 index fd110d0eb..000000000 --- a/packages/isaacscript-common-ts/src/functions/string.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { equal } from "node:assert"; -import test, { describe } from "node:test"; -import { hasDiacritic, hasEmoji, normalizeUsername } from "./string.js"; - -describe("hasEmoji", () => { - test("should return true for string with emoji", () => { - equal(hasEmoji("Hello 😃 World"), true); - equal(hasEmoji("This is a 🌟 test"), true); - }); - - test("should return false for string without emoji", () => { - equal(hasEmoji("Hello World"), false); - equal(hasEmoji("No emoji here!"), false); - }); - - test("should handle empty string", () => { - equal(hasEmoji(""), false); - }); - - test("should handle strings with only emoji", () => { - equal(hasEmoji("😊"), true); - equal(hasEmoji("🚀"), true); - }); -}); - -describe("hasDiacritic", () => { - test("should return true for diacritic character", () => { - equal(hasDiacritic("á"), true); - equal(hasDiacritic("è"), true); - equal(hasDiacritic("ô"), true); - }); - - test("should return false for non-diacritic character", () => { - equal(hasDiacritic("A"), false); - equal(hasDiacritic("1"), false); - equal(hasDiacritic("!"), false); - }); - - test("should handle empty string", () => { - equal(hasDiacritic(""), false); - }); -}); - -describe("normalizeUsername function", () => { - test("it should transliterate and lowercase a string with ASCII characters", () => { - const result = normalizeUsername("Hello World"); - equal(result, "hello world"); - }); - - test("it should handle special characters and non-ASCII characters", () => { - const result = normalizeUsername("Thérè àrè spéciål çhàràctèrs"); // cspell:disable-line - equal(result, "there are special characters"); - }); - - test("it should handle an empty string", () => { - const result = normalizeUsername(""); - equal(result, ""); - }); - - test("it should handle a string with only non-ASCII characters", () => { - const result = normalizeUsername("こんにちは,世界!"); - console.log(result); - equal(result, "konnitiha,shi jie !"); // cspell:disable-line - }); -}); diff --git a/packages/isaacscript-common-ts/src/functions/string.ts b/packages/isaacscript-common-ts/src/functions/string.ts deleted file mode 100644 index b4c2f4f8f..000000000 --- a/packages/isaacscript-common-ts/src/functions/string.ts +++ /dev/null @@ -1,317 +0,0 @@ -import unidecode from "unidecode"; -import { parseIntSafe } from "./utils.js"; - -// When regexes are located at the root instead of inside the function, the functions are tested to -// perform 11% faster. - -const DIACRITIC_REGEX = /\p{Diacritic}/u; - -/** This is what the Zod validator library uses. */ -const EMOJI_REGEX = /(\p{Extended_Pictographic}|\p{Emoji_Component})/u; - -const FIRST_LETTER_CAPITALIZED_REGEX = /^\p{Lu}/u; - -/** From: https://github.com/expandjs/expandjs/blob/master/lib/kebabCaseRegex.js */ -const KEBAB_CASE_REGEX = - /^([a-z](?!\d)|\d(?![a-z]))+(-?([a-z](?!\d)|\d(?![a-z])))*$|^$/; - -const SEMANTIC_VERSION_REGEX = /^v*(?\d+)\.(?\d+)\.(?\d+)/; -const WHITESPACE_REGEX = /\s/g; - -export function capitalizeFirstLetter(string: string): string { - if (string === "") { - return string; - } - - const firstCharacter = string.charAt(0); - const capitalizedFirstLetter = firstCharacter.toUpperCase(); - const restOfString = string.slice(1); - - return `${capitalizedFirstLetter}${restOfString}`; -} - -/** - * Helper function to replace all of the ampersands, less than signs, greater than signs, double - * quotes, and single quotes in a string with the escaped counterparts. For example, "<" will be - * replaced with "<". - */ -export function escapeHTMLCharacters(string: string): string { - return string - .replaceAll("&", "&") - .replaceAll("<", "<") - .replaceAll(">", ">") - .replaceAll('"', """) - .replaceAll("'", "'"); -} - -export function getNumConsecutiveDiacritics(string: string): number { - // First, normalize with Normalization Form Canonical Decomposition (NFD) so that diacritics are - // separated from other characters: - // https://en.wikipedia.org/wiki/Unicode_equivalence - const normalizedString = string.normalize("NFD"); - - let numConsecutiveDiacritic = 0; - let maxConsecutiveDiacritic = 0; - - for (const character of normalizedString) { - if (hasDiacritic(character)) { - numConsecutiveDiacritic++; - if (numConsecutiveDiacritic > maxConsecutiveDiacritic) { - maxConsecutiveDiacritic = numConsecutiveDiacritic; - } - } else { - numConsecutiveDiacritic = 0; - } - } - - return maxConsecutiveDiacritic; -} - -export function hasDiacritic(string: string): boolean { - // First, normalize with Normalization Form Canonical Decomposition (NFD) so that diacritics are - // separated from other characters: - // https://en.wikipedia.org/wiki/Unicode_equivalence - const normalizedString = string.normalize("NFD"); - - return DIACRITIC_REGEX.test(normalizedString); -} - -export function hasEmoji(string: string): boolean { - return EMOJI_REGEX.test(string); -} - -/** From: https://stackoverflow.com/questions/1731190/check-if-a-string-has-white-space */ -export function hasWhitespace(string: string): boolean { - return WHITESPACE_REGEX.test(string); -} - -/** - * From: - * https://stackoverflow.com/questions/8334606/check-if-first-letter-of-word-is-a-capital-letter - */ -export function isFirstLetterCapitalized(string: string): boolean { - return FIRST_LETTER_CAPITALIZED_REGEX.test(string); -} - -/** Kebab case is the naming style of using all lowercase and hyphens, like "foo-bar". */ -export function isKebabCase(string: string): boolean { - return KEBAB_CASE_REGEX.test(string); -} - -/** - * Helper function to check if a given string is a valid Semantic Version. - * - * @see https://semver.org/ - */ -export function isSemanticVersion(versionString: string): boolean { - const match = versionString.match(SEMANTIC_VERSION_REGEX); - return match !== null; -} - -export function kebabCaseToCamelCase(string: string): string { - return string.replaceAll(/-./g, (match) => { - const firstLetterOfWord = match[1]; - return firstLetterOfWord === undefined - ? "" - : firstLetterOfWord.toUpperCase(); - }); -} - -/** - * Helper function to normalize a string. Specifically, this performs the following steps: - * - * - Removes any non-printable characters, if any. - * - Normalizes all newlines to "\n". - * - Normalizes all spaces to " ". - * - Removes leading/trailing whitespace. - * - * @see - * https://stackoverflow.com/questions/11598786/how-to-replace-non-printable-unicode-characters-javascript - */ -export function normalizeString(string: string): string { - let sanitizedString = string; - - sanitizedString = removeNonPrintableCharacters(sanitizedString); - - // Normalize newlines. - sanitizedString = sanitizedString.replaceAll("\n\r", "\n"); - sanitizedString = sanitizedString.replaceAll(/\p{Zl}/gu, "\n"); - sanitizedString = sanitizedString.replaceAll(/\p{Zp}/gu, "\n"); - - // Normalize spaces. - sanitizedString = sanitizedString.replaceAll(/\p{Zs}/gu, " "); - - // Remove leading/trailing whitespace. - sanitizedString = sanitizedString.trim(); - - return sanitizedString; -} - -/** - * Helper function to transliterate the string to ASCII, lowercase it, and remove leading/trailing - * whitespace. - * - * This is useful to ensure that similar usernames cannot be created to impersonate other users - * (like e.g. Alice and Alicè). - */ -export function normalizeUsername(string: string): string { - const ascii = unidecode(string); - return ascii.toLowerCase().trim(); -} - -/** - * Helper function to parse a Semantic Versioning string into its individual constituents. Returns - * undefined if the submitted string was not a proper Semantic Version. - * - * @see https://semver.org/ - */ -export function parseSemanticVersion(versionString: string): - | { - majorVersion: number; - minorVersion: number; - patchVersion: number; - } - | undefined { - const match = versionString.match(SEMANTIC_VERSION_REGEX); - if (match === null || match.groups === undefined) { - return undefined; - } - - const { major, minor, patch } = match.groups; - if (major === undefined || minor === undefined || patch === undefined) { - return undefined; - } - - const majorVersion = parseIntSafe(major); - const minorVersion = parseIntSafe(minor); - const patchVersion = parseIntSafe(patch); - - if ( - majorVersion === undefined || - minorVersion === undefined || - patchVersion === undefined - ) { - return undefined; - } - - return { majorVersion, minorVersion, patchVersion }; -} - -/** - * Helper function to remove lines from a multi-line string. This function looks for a "-start" and - * a "-end" suffix after the marker. Lines with markets will be completely removed from the output. - * - * For example, by using a marker of "@foo": - * - * ```text - * line1 - * # @foo-start - * line2 - * line3 - * # @foo-end - * line4 - * ``` - * - * Would return: - * - * ```text - * line1 - * line4 - * ``` - */ -export function removeLinesBetweenMarkers( - string: string, - marker: string, -): string { - const lines = string.split("\n"); - const newLines: string[] = []; - - let skippingLines = false; - - for (const line of lines) { - if (line.includes(`${marker}-start`)) { - skippingLines = true; - continue; - } - - if (line.includes(`${marker}-end`)) { - skippingLines = false; - continue; - } - - if (!skippingLines) { - newLines.push(line); - } - } - - return newLines.join("\n"); -} - -/** Helper function to remove lines from a multi-line string matching a certain other string. */ -export function removeLinesMatching(string: string, match: string): string { - const lines = string.split("\n"); - const newLines = lines.filter((line) => !line.includes(match)); - return newLines.join("\n"); -} - -/** - * Helper function to remove all non-printable characters from a string. - * - * @see - * https://stackoverflow.com/questions/11598786/how-to-replace-non-printable-unicode-characters-javascript - */ -export function removeNonPrintableCharacters(string: string): string { - return string.replaceAll(/\p{C}/gu, ""); -} - -/** Helper function to remove all whitespace characters from a string. */ -export function removeWhitespace(string: string): string { - return string.replaceAll(WHITESPACE_REGEX, ""); -} - -/** - * Helper function to trim a prefix from a string, if it exists. Returns the trimmed string. - * - * @param string The string to trim. - * @param prefix The prefix to trim. - * @param trimAll Whether to remove multiple instances of the prefix, if they exist. If this is set - * to true, the prefix must only be a single character. - */ -export function trimPrefix( - string: string, - prefix: string, - trimAll = false, -): string { - if (trimAll) { - const regExp = new RegExp(`^${prefix}+`, "g"); - return string.replaceAll(regExp, ""); - } - - if (!string.startsWith(prefix)) { - return string; - } - - return string.slice(prefix.length); -} - -/** Helper function to trim a suffix from a string, if it exists. Returns the trimmed string. */ -export function trimSuffix(string: string, prefix: string): string { - if (!string.endsWith(prefix)) { - return string; - } - - const endCharacter = string.length - prefix.length; - return string.slice(0, endCharacter); -} - -/** - * Helper function to truncate a string to a maximum length. If the length of the string is less - * than or equal to the provided maximum length, the string will be returned unmodified. - */ -export function truncateString(string: string, maxLength: number): string { - if (string.length <= maxLength) { - return string; - } - - return string.slice(0, maxLength); -} diff --git a/packages/isaacscript-common-ts/src/functions/tuple.ts b/packages/isaacscript-common-ts/src/functions/tuple.ts deleted file mode 100644 index 061323f6c..000000000 --- a/packages/isaacscript-common-ts/src/functions/tuple.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { Tuple } from "../types/Tuple.js"; - -type TupleKey = { - [L in T["length"]]: Exclude>["length"], L>; -}[T["length"]]; -type TupleValue = T[0]; -type TupleEntry = [TupleKey, TupleValue]; - -/** - * Helper function to get the entries (i.e. indexes and values) of a tuple in a type-safe way. - * - * This is useful because the vanilla `Array.entries` method will always have the keys be of type - * `number`. - */ -export function* tupleEntries( - tuple: T, -): Generator> { - yield* tuple.entries() as Generator>; -} - -/** - * Helper function to get the keys (i.e. indexes) of a tuple in a type-safe way. - * - * This is useful because the vanilla `Array.keys` method will always have the keys be of type - * `number`. - */ -export function* tupleKeys( - tuple: T, -): Generator> { - yield* tuple.keys() as Generator>; -} diff --git a/packages/isaacscript-common-ts/src/functions/types.ts b/packages/isaacscript-common-ts/src/functions/types.ts deleted file mode 100644 index 37d9837ae..000000000 --- a/packages/isaacscript-common-ts/src/functions/types.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Helper function to narrow an unknown value to an object (i.e. a TypeScript record). - * - * Under the hood, this checks for `typeof variable === "object"`, `variable !== null`, and - * `!Array.isArray(variable)`. - */ -export function isObject( - variable: unknown, -): variable is Record { - return ( - typeof variable === "object" && - variable !== null && - !Array.isArray(variable) - ); -} diff --git a/packages/isaacscript-common-ts/src/functions/utils.test.ts b/packages/isaacscript-common-ts/src/functions/utils.test.ts deleted file mode 100644 index c3e26d9cc..000000000 --- a/packages/isaacscript-common-ts/src/functions/utils.test.ts +++ /dev/null @@ -1,910 +0,0 @@ -import { deepStrictEqual, strictEqual } from "node:assert"; -import test, { describe } from "node:test"; -import { - assertDefined, - assertNotNull, - eRange, - iRange, - parseFloatSafe, - parseIntSafe, -} from "./utils.js"; - -describe("assertsDefined", () => { - /** We use a value of null since it is the least arbitrary non-undefined value. */ - const value = null as unknown; // eslint-disable-line unicorn/no-null - - // @ts-expect-error Should fail since we are not in a union with undefined. - assertDefined(value as boolean, ""); - // @ts-expect-error Should fail since we are not in a union with undefined. - assertDefined(value as number, ""); - // @ts-expect-error Should fail since we are not in a union with undefined. - assertDefined(value as string, ""); - // @ts-expect-error Should fail since we are not in a union with undefined. - assertDefined(value as Function, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type - - assertDefined(value as boolean | undefined, ""); - assertDefined(value as number | undefined, ""); - assertDefined(value as string | undefined, ""); - assertDefined(value as Function | undefined, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type - - // @ts-expect-error Should fail because we are in a union with null instead of undefined. - assertDefined(value as boolean | null, ""); - // @ts-expect-error Should fail because we are in a union with null instead of undefined. - assertDefined(value as number | null, ""); - // @ts-expect-error Should fail because we are in a union with null instead of undefined. - assertDefined(value as string | null, ""); - // @ts-expect-error Should fail because we are in a union with null instead of undefined. - assertDefined(value as Function | null, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type - - assertDefined(value as boolean | undefined | null, ""); - assertDefined(value as number | undefined | null, ""); - assertDefined(value as string | undefined | null, ""); - assertDefined(value as Function | undefined | null, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type - - // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters - function _genericFunction(_arg: T) { - const t = undefined as T | undefined; - assertDefined(t, ""); - } -}); - -describe("assertsNull", () => { - const value = undefined as unknown; - - // @ts-expect-error Should fail since we are not in a union with null. - assertNotNull(value as boolean, ""); - // @ts-expect-error Should fail since we are not in a union with null. - assertNotNull(value as number, ""); - // @ts-expect-error Should fail since we are not in a union with null. - assertNotNull(value as string, ""); - // @ts-expect-error Should fail since we are not in a union with null. - assertNotNull(value as Function, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type - - assertNotNull(value as boolean | null, ""); - assertNotNull(value as number | null, ""); - assertNotNull(value as string | null, ""); - assertNotNull(value as Function | null, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type - - // @ts-expect-error Should fail because we are in a union with undefined instead of null. - assertNotNull(value as boolean | undefined, ""); - // @ts-expect-error Should fail because we are in a union with undefined instead of null. - assertNotNull(value as number | undefined, ""); - // @ts-expect-error Should fail because we are in a union with undefined instead of null. - assertNotNull(value as string | undefined, ""); - // @ts-expect-error Should fail because we are in a union with undefined instead of null. - assertNotNull(value as Function | undefined, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type - - assertNotNull(value as boolean | null | undefined, ""); - assertNotNull(value as number | null | undefined, ""); - assertNotNull(value as string | null | undefined, ""); - assertNotNull(value as Function | null | undefined, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type - - // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters - function _genericFunction(_arg: T) { - const t = null as T | null; // eslint-disable-line unicorn/no-null - assertNotNull(t, ""); - } -}); - -describe("eRange", () => { - describe("1 arg 0", () => { - test("0", () => { - const result = [...eRange(0)]; - deepStrictEqual(result, []); - }); - }); - - describe("1 arg positive", () => { - test("1", () => { - const result = [...eRange(1)]; - deepStrictEqual(result, [0]); - }); - - test("2", () => { - const result = [...eRange(2)]; - deepStrictEqual(result, [0, 1]); - }); - - test("3", () => { - const result = [...eRange(3)]; - deepStrictEqual(result, [0, 1, 2]); - }); - }); - - describe("1 arg negative", () => { - test("-1", () => { - const result = [...eRange(-1)]; - deepStrictEqual(result, []); - }); - }); - - describe("2 args same", () => { - test("0, 0", () => { - const result = [...eRange(0, 0)]; - deepStrictEqual(result, []); - }); - - test("1, 1", () => { - const result = [...eRange(1, 1)]; - deepStrictEqual(result, []); - }); - - test("2, 2", () => { - const result = [...eRange(2, 2)]; - deepStrictEqual(result, []); - }); - - test("3, 3", () => { - const result = [...eRange(3, 3)]; - deepStrictEqual(result, []); - }); - - test("-1, -1", () => { - const result = [...eRange(-1, -1)]; - deepStrictEqual(result, []); - }); - - test("-2, -2", () => { - const result = [...eRange(-2, -2)]; - deepStrictEqual(result, []); - }); - - test("-3, -3", () => { - const result = [...eRange(-3, -3)]; - deepStrictEqual(result, []); - }); - }); - - describe("2 args increasing", () => { - test("0, 1", () => { - const result = [...eRange(0, 1)]; - deepStrictEqual(result, [0]); - }); - - test("0, 2", () => { - const result = [...eRange(0, 2)]; - deepStrictEqual(result, [0, 1]); - }); - - test("0, 3", () => { - const result = [...eRange(0, 3)]; - deepStrictEqual(result, [0, 1, 2]); - }); - - test("1, 2", () => { - const result = [...eRange(1, 2)]; - deepStrictEqual(result, [1]); - }); - - test("1, 3", () => { - const result = [...eRange(1, 3)]; - deepStrictEqual(result, [1, 2]); - }); - - test("1, 4", () => { - const result = [...eRange(1, 4)]; - deepStrictEqual(result, [1, 2, 3]); - }); - - test("2, 3", () => { - const result = [...eRange(2, 3)]; - deepStrictEqual(result, [2]); - }); - - test("2, 4", () => { - const result = [...eRange(2, 4)]; - deepStrictEqual(result, [2, 3]); - }); - - test("2, 5", () => { - const result = [...eRange(2, 5)]; - deepStrictEqual(result, [2, 3, 4]); - }); - - test("-3, -1", () => { - const result = [...eRange(-3, -1)]; - deepStrictEqual(result, [-3, -2]); - }); - - test("-3, 3", () => { - const result = [...eRange(-3, 3)]; - deepStrictEqual(result, [-3, -2, -1, 0, 1, 2]); - }); - }); - - describe("2 args decreasing", () => { - test("1, 0", () => { - const result = [...eRange(1, 0)]; - deepStrictEqual(result, []); - }); - - test("-1, -2", () => { - const result = [...eRange(-1, -3)]; - deepStrictEqual(result, []); - }); - }); -}); - -describe("iRange", () => { - describe("1 arg 0", () => { - test("0", () => { - const result = [...iRange(0)]; - deepStrictEqual(result, [0]); - }); - }); - - describe("1 arg positive", () => { - test("1", () => { - const result = [...iRange(1)]; - deepStrictEqual(result, [0, 1]); - }); - - test("2", () => { - const result = [...iRange(2)]; - deepStrictEqual(result, [0, 1, 2]); - }); - - test("3", () => { - const result = [...iRange(3)]; - deepStrictEqual(result, [0, 1, 2, 3]); - }); - }); - - describe("1 arg negative", () => { - test("-1", () => { - const result = [...iRange(-1)]; - deepStrictEqual(result, []); - }); - }); - - describe("2 args same", () => { - test("0, 0", () => { - const result = [...iRange(0, 0)]; - deepStrictEqual(result, [0]); - }); - - test("1, 1", () => { - const result = [...iRange(1, 1)]; - deepStrictEqual(result, [1]); - }); - - test("2, 2", () => { - const result = [...iRange(2, 2)]; - deepStrictEqual(result, [2]); - }); - - test("3, 3", () => { - const result = [...iRange(3, 3)]; - deepStrictEqual(result, [3]); - }); - - test("-1, -1", () => { - const result = [...iRange(-1, -1)]; - deepStrictEqual(result, [-1]); - }); - - test("-2, -2", () => { - const result = [...iRange(-2, -2)]; - deepStrictEqual(result, [-2]); - }); - - test("-3, -3", () => { - const result = [...iRange(-3, -3)]; - deepStrictEqual(result, [-3]); - }); - }); - - describe("2 args increasing", () => { - test("0, 1", () => { - const result = [...iRange(0, 1)]; - deepStrictEqual(result, [0, 1]); - }); - - test("0, 2", () => { - const result = [...iRange(0, 2)]; - deepStrictEqual(result, [0, 1, 2]); - }); - - test("0, 3", () => { - const result = [...iRange(0, 3)]; - deepStrictEqual(result, [0, 1, 2, 3]); - }); - - test("1, 2", () => { - const result = [...iRange(1, 2)]; - deepStrictEqual(result, [1, 2]); - }); - - test("1, 3", () => { - const result = [...iRange(1, 3)]; - deepStrictEqual(result, [1, 2, 3]); - }); - - test("1, 4", () => { - const result = [...iRange(1, 4)]; - deepStrictEqual(result, [1, 2, 3, 4]); - }); - - test("2, 3", () => { - const result = [...iRange(2, 3)]; - deepStrictEqual(result, [2, 3]); - }); - - test("2, 4", () => { - const result = [...iRange(2, 4)]; - deepStrictEqual(result, [2, 3, 4]); - }); - - test("2, 5", () => { - const result = [...iRange(2, 5)]; - deepStrictEqual(result, [2, 3, 4, 5]); - }); - - test("-3, -1", () => { - const result = [...iRange(-3, -1)]; - deepStrictEqual(result, [-3, -2, -1]); - }); - - test("-3, 3", () => { - const result = [...iRange(-3, 3)]; - deepStrictEqual(result, [-3, -2, -1, 0, 1, 2, 3]); - }); - }); - - describe("2 args decreasing", () => { - test("1, 0", () => { - const result = [...iRange(1, 0)]; - deepStrictEqual(result, []); - }); - - test("-1, -2", () => { - const result = [...iRange(-1, -3)]; - deepStrictEqual(result, []); - }); - }); -}); - -describe("parseFloatSafe", () => { - describe("non valid types", () => { - test("undefined", () => { - const result = parseFloatSafe(undefined as unknown as string); - strictEqual(result, undefined); - }); - - test("null", () => { - // eslint-disable-next-line unicorn/no-null - const result = parseFloatSafe(null as unknown as string); - strictEqual(result, undefined); - }); - - test("bigint", () => { - const result = parseFloatSafe(BigInt(1) as unknown as string); - strictEqual(result, undefined); - }); - - test("false", () => { - const result = parseFloatSafe(false as unknown as string); - strictEqual(result, undefined); - }); - - test("true", () => { - const result = parseFloatSafe(true as unknown as string); - strictEqual(result, undefined); - }); - - test("function", () => { - // eslint-disable-next-line @typescript-eslint/no-empty-function - const result = parseFloatSafe((() => {}) as unknown as string); - strictEqual(result, undefined); - }); - - test("number", () => { - const result = parseFloatSafe(1 as unknown as string); - strictEqual(result, undefined); - }); - - test("object", () => { - const result = parseFloatSafe({} as string); - strictEqual(result, undefined); - }); - - test("symbol", () => { - const result = parseFloatSafe(Symbol("1") as unknown as string); - strictEqual(result, undefined); - }); - }); - - describe("spaces", () => { - test("space", () => { - const result = parseFloatSafe(" "); - strictEqual(result, undefined); - }); - - test("space + 1", () => { - const result = parseFloatSafe(" 1"); - strictEqual(result, 1); - }); - - test("1 + space", () => { - const result = parseFloatSafe("1 "); - strictEqual(result, 1); - }); - - test("space + 1 + space", () => { - const result = parseFloatSafe(" 1 "); - strictEqual(result, 1); - }); - - test("space + -1", () => { - const result = parseFloatSafe(" -1"); - strictEqual(result, -1); - }); - - test("-1 + space", () => { - const result = parseFloatSafe("-1 "); - strictEqual(result, -1); - }); - - test("space + -1 + space", () => { - const result = parseFloatSafe(" -1 "); - strictEqual(result, -1); - }); - - test("space + 1.0", () => { - const result = parseFloatSafe(" 1.0"); - strictEqual(result, 1); - }); - - test("1.0 + space", () => { - const result = parseFloatSafe("1.0 "); - strictEqual(result, 1); - }); - - test("space + 1.0 + space", () => { - const result = parseFloatSafe(" 1.0 "); - strictEqual(result, 1); - }); - - test("space + -1.0", () => { - const result = parseFloatSafe(" -1.0"); - strictEqual(result, -1); - }); - - test("-1.0 + space", () => { - const result = parseFloatSafe("-1.0 "); - strictEqual(result, -1); - }); - - test("space + -1.0 + space", () => { - const result = parseFloatSafe(" -1.0 "); - strictEqual(result, -1); - }); - }); - - describe("tabs", () => { - test("tab", () => { - const result = parseFloatSafe(" "); - strictEqual(result, undefined); - }); - - test("tab + 1", () => { - const result = parseFloatSafe(" 1"); - strictEqual(result, 1); - }); - - test("1 + tab", () => { - const result = parseFloatSafe("1 "); - strictEqual(result, 1); - }); - - test("tab + 1 + tab", () => { - const result = parseFloatSafe(" 1 "); - strictEqual(result, 1); - }); - - test("tab + -1", () => { - const result = parseFloatSafe(" -1"); - strictEqual(result, -1); - }); - - test("-1 + tab", () => { - const result = parseFloatSafe("-1 "); - strictEqual(result, -1); - }); - - test("tab + -1 + tab", () => { - const result = parseFloatSafe(" -1 "); - strictEqual(result, -1); - }); - - test("tab + 1.0", () => { - const result = parseFloatSafe(" 1.0"); - strictEqual(result, 1); - }); - - test("1.0 + tab", () => { - const result = parseFloatSafe("1.0 "); - strictEqual(result, 1); - }); - - test("tab + 1.0 + tab", () => { - const result = parseFloatSafe(" 1.0 "); - strictEqual(result, 1); - }); - - test("tab + -1.0", () => { - const result = parseFloatSafe(" -1.0"); - strictEqual(result, -1); - }); - - test("-1.0 + tab", () => { - const result = parseFloatSafe("-1.0 "); - strictEqual(result, -1); - }); - - test("tab + -1.0 + tab", () => { - const result = parseFloatSafe(" -1.0 "); - strictEqual(result, -1); - }); - }); - - describe("invalid input", () => { - test("empty string", () => { - const result = parseFloatSafe(""); - strictEqual(result, undefined); - }); - - test(".", () => { - const result = parseFloatSafe("."); - strictEqual(result, undefined); - }); - - test("1.", () => { - const result = parseFloatSafe("1."); - strictEqual(result, undefined); - }); - - test("-", () => { - const result = parseFloatSafe("-"); - strictEqual(result, undefined); - }); - - test("1-", () => { - const result = parseFloatSafe("1-"); - strictEqual(result, undefined); - }); - - test("- 1", () => { - const result = parseFloatSafe("- 1"); - strictEqual(result, undefined); - }); - - test("--", () => { - const result = parseFloatSafe("--"); - strictEqual(result, undefined); - }); - - test("--1", () => { - const result = parseFloatSafe("--1"); - strictEqual(result, undefined); - }); - - test("1--", () => { - const result = parseFloatSafe("--1"); - strictEqual(result, undefined); - }); - - test("-- 1", () => { - const result = parseFloatSafe("-- 1"); - strictEqual(result, undefined); - }); - }); - - describe("normal integers", () => { - test("1", () => { - const result = parseFloatSafe("1"); - strictEqual(result, 1); - }); - - test("-1", () => { - const result = parseFloatSafe("-1"); - strictEqual(result, -1); - }); - - test("10", () => { - const result = parseFloatSafe("10"); - strictEqual(result, 10); - }); - - test("-10", () => { - const result = parseFloatSafe("-10"); - strictEqual(result, -10); - }); - - test("01", () => { - const result = parseFloatSafe("01"); - strictEqual(result, 1); - }); - - test("-01", () => { - const result = parseFloatSafe("-01"); - strictEqual(result, -1); - }); - }); - - describe("normal floats", () => { - test(".1", () => { - const result = parseFloatSafe(".1"); - strictEqual(result, 0.1); - }); - - test("1.0", () => { - const result = parseFloatSafe("1.0"); - strictEqual(result, 1); - }); - - test("1.1", () => { - const result = parseFloatSafe("1.1"); - strictEqual(result, 1.1); - }); - - test("0.1", () => { - const result = parseFloatSafe("0.1"); - strictEqual(result, 0.1); - }); - - test("10.0", () => { - const result = parseFloatSafe("10.0"); - strictEqual(result, 10); - }); - - test("10.1", () => { - const result = parseFloatSafe("10.1"); - strictEqual(result, 10.1); - }); - - test("-10.0", () => { - const result = parseFloatSafe("-10.0"); - strictEqual(result, -10); - }); - - test("-10.1", () => { - const result = parseFloatSafe("-10.1"); - strictEqual(result, -10.1); - }); - - test("01.0", () => { - const result = parseFloatSafe("01.0"); - strictEqual(result, 1); - }); - - test("-01.0", () => { - const result = parseFloatSafe("-01.0"); - strictEqual(result, -1); - }); - }); -}); - -describe("parseIntSafe", () => { - describe("non valid types", () => { - test("undefined", () => { - const result = parseIntSafe(undefined as unknown as string); - strictEqual(result, undefined); - }); - - test("null", () => { - // eslint-disable-next-line unicorn/no-null - const result = parseIntSafe(null as unknown as string); - strictEqual(result, undefined); - }); - - test("bigint", () => { - const result = parseIntSafe(BigInt(1) as unknown as string); - strictEqual(result, undefined); - }); - - test("false", () => { - const result = parseIntSafe(false as unknown as string); - strictEqual(result, undefined); - }); - - test("true", () => { - const result = parseIntSafe(true as unknown as string); - strictEqual(result, undefined); - }); - - test("function", () => { - // eslint-disable-next-line @typescript-eslint/no-empty-function - const result = parseIntSafe((() => {}) as unknown as string); - strictEqual(result, undefined); - }); - - test("number", () => { - const result = parseIntSafe(1 as unknown as string); - strictEqual(result, undefined); - }); - - test("object", () => { - const result = parseIntSafe({} as string); - strictEqual(result, undefined); - }); - - test("symbol", () => { - const result = parseIntSafe(Symbol("1") as unknown as string); - strictEqual(result, undefined); - }); - }); - - describe("spaces", () => { - test("space", () => { - const result = parseIntSafe(" "); - strictEqual(result, undefined); - }); - - test("space + 1", () => { - const result = parseIntSafe(" 1"); - strictEqual(result, 1); - }); - - test("1 + space", () => { - const result = parseIntSafe("1 "); - strictEqual(result, 1); - }); - - test("space + 1 + space", () => { - const result = parseIntSafe(" 1 "); - strictEqual(result, 1); - }); - - test("space + -1", () => { - const result = parseIntSafe(" -1"); - strictEqual(result, -1); - }); - - test("-1 + space", () => { - const result = parseIntSafe("-1 "); - strictEqual(result, -1); - }); - - test("space + -1 + space", () => { - const result = parseIntSafe(" -1 "); - strictEqual(result, -1); - }); - }); - - describe("tabs", () => { - test("tab", () => { - const result = parseIntSafe(" "); - strictEqual(result, undefined); - }); - - test("tab + 1", () => { - const result = parseIntSafe(" 1"); - strictEqual(result, 1); - }); - - test("1 + tab", () => { - const result = parseIntSafe("1 "); - strictEqual(result, 1); - }); - - test("tab + 1 + tab", () => { - const result = parseIntSafe(" 1 "); - strictEqual(result, 1); - }); - - test("tab + -1", () => { - const result = parseIntSafe(" -1"); - strictEqual(result, -1); - }); - - test("-1 + tab", () => { - const result = parseIntSafe("-1 "); - strictEqual(result, -1); - }); - - test("tab + -1 + tab", () => { - const result = parseIntSafe(" -1 "); - strictEqual(result, -1); - }); - }); - - describe("invalid input", () => { - test("empty string", () => { - const result = parseIntSafe(""); - strictEqual(result, undefined); - }); - - test(".", () => { - const result = parseIntSafe("."); - strictEqual(result, undefined); - }); - - test(".1", () => { - const result = parseIntSafe(".1"); - strictEqual(result, undefined); - }); - - test("1.", () => { - const result = parseIntSafe("1."); - strictEqual(result, undefined); - }); - - test("1.0", () => { - const result = parseIntSafe("1.0"); - strictEqual(result, undefined); - }); - - test("0.1", () => { - const result = parseIntSafe("0.1"); - strictEqual(result, undefined); - }); - - test("-", () => { - const result = parseIntSafe("-"); - strictEqual(result, undefined); - }); - - test("1-", () => { - const result = parseIntSafe("1-"); - strictEqual(result, undefined); - }); - - test("- 1", () => { - const result = parseIntSafe("- 1"); - strictEqual(result, undefined); - }); - - test("--", () => { - const result = parseIntSafe("--"); - strictEqual(result, undefined); - }); - - test("--1", () => { - const result = parseIntSafe("--1"); - strictEqual(result, undefined); - }); - - test("1--", () => { - const result = parseIntSafe("--1"); - strictEqual(result, undefined); - }); - - test("-- 1", () => { - const result = parseIntSafe("-- 1"); - strictEqual(result, undefined); - }); - }); - - describe("normal", () => { - test("1", () => { - const result = parseIntSafe("1"); - strictEqual(result, 1); - }); - - test("-1", () => { - const result = parseIntSafe("-1"); - strictEqual(result, -1); - }); - - test("10", () => { - const result = parseIntSafe("10"); - strictEqual(result, 10); - }); - - test("-10", () => { - const result = parseIntSafe("-10"); - strictEqual(result, -10); - }); - - test("01", () => { - const result = parseIntSafe("01"); - strictEqual(result, 1); - }); - - test("-01", () => { - const result = parseIntSafe("-01"); - strictEqual(result, -1); - }); - }); -}); diff --git a/packages/isaacscript-common-ts/src/functions/utils.ts b/packages/isaacscript-common-ts/src/functions/utils.ts deleted file mode 100644 index 59fb3be9a..000000000 --- a/packages/isaacscript-common-ts/src/functions/utils.ts +++ /dev/null @@ -1,238 +0,0 @@ -// When regexes are located at the root instead of inside the function, the functions are tested to -// perform 11% faster. - -const FLOAT_REGEX = /^-?\d*\.?\d+$/; -const INTEGER_REGEX = /^-?\d+$/; - -/** - * Helper function to throw an error if the provided value is equal to `undefined`. - * - * This is useful to have TypeScript narrow a `T | undefined` value to `T` in a concise way. - */ -export function assertDefined( - value: T, - ...[msg]: [undefined] extends [T] - ? [string] - : [ - "The assertion is useless because the provided value does not contain undefined.", - ] -): asserts value is Exclude { - if (value === undefined) { - throw new TypeError(msg); - } -} - -/** - * Helper function to throw an error if the provided value is equal to `null`. - * - * This is useful to have TypeScript narrow a `T | null` value to `T` in a concise way. - */ -export function assertNotNull( - value: T, - ...[msg]: [null] extends [T] - ? [string] - : [ - "The assertion is useless because the provided value does not contain null.", - ] -): asserts value is Exclude { - if (value === null) { - throw new TypeError(msg); - } -} - -/** - * Helper function to get an iterator of integers with the specified range, inclusive on the lower - * end and exclusive on the high end. (The "e" in the function name stands for exclusive.) Thus, - * this function works in the same way as the built-in `range` function from Python. - * - * If the end is lower than the start, then an empty range will be returned. - * - * For example: - * - * - `eRange(2)` returns `[0, 1]`. - * - `eRange(3)` returns `[0, 1, 2]`. - * - `eRange(-3)` returns `[0, -1, -2]`. - * - `eRange(1, 3)` returns `[1, 2]`. - * - `eRange(2, 5)` returns `[2, 3, 4]`. - * - `eRange(5, 2)` returns `[]`. - * - `eRange(3, 3)` returns `[]`. - * - * If you want an array instead of an iterator, use the spread operator like this: - * - * ```ts - * const myArray = [...eRange(1, 3)]; - * ``` - * - * @param start The integer to start at. - * @param end Optional. The integer to end at. If not specified, then the start will be 0 and the - * first argument will be the end. - * @param increment Optional. The increment to use. Default is 1. - */ -export function* eRange( - start: number, - end?: number, - increment = 1, -): Generator { - if (end === undefined) { - yield* eRange(0, start, increment); - return; - } - - for (let i = start; i < end; i += increment) { - yield i; - } -} - -/** - * Helper function to get an array of integers with the specified range, inclusive on both ends. - * (The "i" in the function name stands for inclusive.) - * - * If the end is lower than the start, then an empty range will be returned. - * - * For example: - * - * - `iRange(2)` returns `[0, 1, 2]`. - * - `iRange(3)` returns `[0, 1, 2, 3]`. - * - `iRange(-3)` returns `[0, -1, -2, -3]`. - * - `iRange(1, 3)` returns `[1, 2, 3]`. - * - `iRange(2, 5)` returns `[2, 3, 4, 5]`. - * - `iRange(5, 2)` returns `[]`. - * - `iRange(3, 3)` returns `[3]`. - * - * If you want an array instead of an iterator, use the spread operator like this: - * - * ```ts - * const myArray = [...eRange(1, 3)]; - * ``` - * - * @param start The integer to start at. - * @param end Optional. The integer to end at. If not specified, then the start will be 0 and the - * first argument will be the end. - * @param increment Optional. The increment to use. Default is 1. - */ -export function* iRange( - start: number, - end?: number, - increment = 1, -): Generator { - if (end === undefined) { - yield* iRange(0, start, increment); - return; - } - - const exclusiveEnd = end + 1; - yield* eRange(start, exclusiveEnd, increment); -} - -/** From: https://stackoverflow.com/questions/61526746 */ -export function isKeyOf( - key: PropertyKey, - target: T, -): key is keyof T { - return key in target; -} - -/** - * Helper function to perform a no-op. This can be useful in order to make a trailing return valid - * in functions that use the early return pattern. - */ -// eslint-disable-next-line @typescript-eslint/no-empty-function -export function noop(): void {} - -/** - * This is a more reliable version of `Number.parseFloat`: - * - * - `undefined` is returned instead of `Number.NaN`, which is helpful in conjunction with - * TypeScript type narrowing patterns. - * - Strings that are a mixture of numbers and letters will result in undefined instead of the part - * of the string that is the number. (e.g. "1a" --> undefined instead of "1a" --> 1) - * - Non-strings will result in undefined instead of being coerced to a number. - * - * @param string A string to convert to an integer. - */ -export function parseFloatSafe(string: string): number | undefined { - if (typeof string !== "string") { - return undefined; - } - - const trimmedString = string.trim(); - - // If the string does not entirely consist of numbers, return undefined. - if (FLOAT_REGEX.exec(trimmedString) === null) { - return undefined; - } - - const number = Number.parseFloat(trimmedString); - return Number.isNaN(number) ? undefined : number; -} - -/** - * This is a more reliable version of `Number.parseInt`: - * - * - `undefined` is returned instead of `Number.NaN`, which is helpful in conjunction with - * TypeScript type narrowing patterns. - * - Strings that are a mixture of numbers and letters will result in undefined instead of the part - * of the string that is the number. (e.g. "1a" --> undefined instead of "1a" --> 1) - * - Non-strings will result in undefined instead of being coerced to a number. - * - * If you have to use a radix other than 10, use the vanilla `Number.parseInt` function instead, - * because this function ensures that the string contains no letters. - */ -export function parseIntSafe(string: string): number | undefined { - if (typeof string !== "string") { - return undefined; - } - - const trimmedString = string.trim(); - - // If the string does not entirely consist of numbers, return undefined. - if (INTEGER_REGEX.exec(trimmedString) === null) { - return undefined; - } - - const number = Number.parseInt(trimmedString, 10); - return Number.isNaN(number) ? undefined : number; -} - -/** - * Helper function to repeat code N times. This is faster to type and cleaner than using a for loop. - * - * For example: - * - * ```ts - * repeat(10, () => { - * foo(); - * }); - * ``` - * - * The repeated function is passed the index of the iteration, if needed: - * - * ```ts - * repeat(3, (i) => { - * console.log(i); // Prints "0", "1", "2" - * }); - * ``` - */ -export function repeat(num: number, func: (i: number) => void): void { - for (let i = 0; i < num; i++) { - func(i); - } -} - -/** - * Helper function to signify that the enclosing code block is not yet complete. Using this function - * is similar to writing a "TODO" comment, but it has the benefit of preventing ESLint errors due to - * unused variables or early returns. - * - * When you see this function, it simply means that the programmer intends to add in more code to - * this spot later. - * - * This function is variadic, meaning that you can pass as many arguments as you want. (This is - * useful as a means to prevent unused variables.) - * - * This function does not actually do anything. (It is an "empty" function.) - * - * @allowEmptyVariadic - */ -// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function -export function todo(...args: readonly unknown[]): void {} diff --git a/packages/isaacscript-common-ts/src/index.ts b/packages/isaacscript-common-ts/src/index.ts deleted file mode 100644 index 13274a47f..000000000 --- a/packages/isaacscript-common-ts/src/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -export * from "./constants.js"; -export * from "./functions/array.js"; -export * from "./functions/enums.js"; -export * from "./functions/map.js"; -export * from "./functions/math.js"; -export * from "./functions/object.js"; -export * from "./functions/random.js"; -export * from "./functions/set.js"; -export * from "./functions/sort.js"; -export * from "./functions/string.js"; -export * from "./functions/tuple.js"; -export * from "./functions/types.js"; -export * from "./functions/utils.js"; -export * from "./types/AddSubtract.js"; -export * from "./types/CompositionTypeSatisfiesEnum.js"; -export * from "./types/ERange.js"; -export * from "./types/Immutable.js"; -export * from "./types/IRange.js"; -export * from "./types/NaturalNumbersLessThan.js"; -export * from "./types/NaturalNumbersLessThanOrEqualTo.js"; -export * from "./types/ObjectValues.js"; -export * from "./types/ReadonlyMap.js"; -export * from "./types/ReadonlyRecord.js"; -export * from "./types/ReadonlySet.js"; -export * from "./types/Tuple.js"; -export * from "./types/WidenLiteral.js"; -export * from "./types/Writeable.js"; diff --git a/packages/isaacscript-common-ts/src/types/AddSubtract.ts b/packages/isaacscript-common-ts/src/types/AddSubtract.ts deleted file mode 100644 index 5e435b57c..000000000 --- a/packages/isaacscript-common-ts/src/types/AddSubtract.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** From: https://gist.github.com/ryandabler/8b4ff4f36aed47bc09acc03174638468 */ -export type Add = Length< - [...BuildTuple, ...BuildTuple] ->; - -/** From: https://gist.github.com/ryandabler/8b4ff4f36aed47bc09acc03174638468 */ -export type Subtract = A extends A - ? BuildTuple extends [...infer U, ...BuildTuple] - ? Length - : never - : never; - -type BuildTuple = T extends { - length: L; -} - ? T - : BuildTuple; - -type Length = T extends { length: infer L } ? L : never; diff --git a/packages/isaacscript-common-ts/src/types/CompositionTypeSatisfiesEnum.ts b/packages/isaacscript-common-ts/src/types/CompositionTypeSatisfiesEnum.ts deleted file mode 100644 index 126625c66..000000000 --- a/packages/isaacscript-common-ts/src/types/CompositionTypeSatisfiesEnum.ts +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Helper type to validate that a union of interfaces with a field of `type` that is based on an - * enum is complete. - * - * For example: - * - * ```ts - * enum ObjectiveType { - * Foo, - * Bar, - * Baz, - * } - * - * interface FooObjective { - * type: ObjectiveType.Foo; - * fooThing: number; - * } - * - * interface BarObjective { - * type: ObjectiveType.Bar; - * barThing: string; - * } - * - * type Objective = FooObjective | BarObjective; - * type _Test = CompositionTypeSatisfiesEnum; - * ``` - * - * In this example, `Test` would be flagged by TypeScript because `Objective` does not contain an - * entry for `BazObjective`. - */ -export type CompositionTypeSatisfiesEnum< - T extends { type: unknown }, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - Enum extends T["type"], -> = unknown; - -// ----- -// Tests -// ----- - -enum ObjectiveType { - Foo = "Foo", - Bar = "Bar", - Baz = "Baz", -} - -interface FooObjective { - type: ObjectiveType.Foo; - fooThing: number; -} - -interface BarObjective { - type: ObjectiveType.Bar; - barThing: string; -} - -interface BazObjective { - type: ObjectiveType.Baz; - bazThing: string; -} - -type Objective1 = FooObjective | BarObjective | BazObjective; -type _Test1 = CompositionTypeSatisfiesEnum; - -type Objective2 = FooObjective | BarObjective; -// @ts-expect-error Missing "Baz". -type _Test2 = CompositionTypeSatisfiesEnum; diff --git a/packages/isaacscript-common-ts/src/types/ERange.ts b/packages/isaacscript-common-ts/src/types/ERange.ts deleted file mode 100644 index c276ecb52..000000000 --- a/packages/isaacscript-common-ts/src/types/ERange.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { NaturalNumbersLessThan } from "./NaturalNumbersLessThan.js"; - -/** - * Helper type to get a range of integers. It is inclusive on the lower end and exclusive on the - * high end. (The "E" in the type name stands for exclusive.) - * - * For example, `ERange<3, 5>` will return `3 | 4`. - * - * From: - * https://stackoverflow.com/questions/39494689/is-it-possible-to-restrict-number-to-a-certain-range - */ -export type ERange = Exclude< - NaturalNumbersLessThan, - NaturalNumbersLessThan ->; diff --git a/packages/isaacscript-common-ts/src/types/IRange.ts b/packages/isaacscript-common-ts/src/types/IRange.ts deleted file mode 100644 index b1537e9f6..000000000 --- a/packages/isaacscript-common-ts/src/types/IRange.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { NaturalNumbersLessThan } from "./NaturalNumbersLessThan.js"; -import type { NaturalNumbersLessThanOrEqualTo } from "./NaturalNumbersLessThanOrEqualTo.js"; - -/** - * Helper type to get a range of integers. It is inclusive on both ends. (The "I" in the type name - * stands for inclusive.) - * - * For example, `IRange<3, 5>` will return `3 | 4 | 5`. - * - * From: - * https://stackoverflow.com/questions/39494689/is-it-possible-to-restrict-number-to-a-certain-range - */ -export type IRange = Exclude< - NaturalNumbersLessThanOrEqualTo, - NaturalNumbersLessThan ->; diff --git a/packages/isaacscript-common-ts/src/types/Immutable.ts b/packages/isaacscript-common-ts/src/types/Immutable.ts deleted file mode 100644 index 66adb3ab4..000000000 --- a/packages/isaacscript-common-ts/src/types/Immutable.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Immutable is a utility type that will make the given array/map/set/object recursively read-only. - * - * You can use this type to easily build safe data structures. - * - * From: https://stackoverflow.com/questions/41879327/deepreadonly-object-typescript - */ -export type Immutable = T extends ImmutablePrimitive - ? T - : T extends Array - ? ImmutableArray - : T extends Map - ? ImmutableMap - : T extends Set - ? ImmutableSet - : ImmutableObject; - -type ImmutablePrimitive = - | undefined - | null - | boolean - | string - | number - | Function; // eslint-disable-line @typescript-eslint/no-unsafe-function-type -type ImmutableArray = ReadonlyArray>; -type ImmutableMap = ReadonlyMap, Immutable>; -type ImmutableSet = ReadonlySet>; -type ImmutableObject = { readonly [K in keyof T]: Immutable }; diff --git a/packages/isaacscript-common-ts/src/types/NaturalNumbersLessThan.ts b/packages/isaacscript-common-ts/src/types/NaturalNumbersLessThan.ts deleted file mode 100644 index 70b1ec630..000000000 --- a/packages/isaacscript-common-ts/src/types/NaturalNumbersLessThan.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Helper type to get a range of integers between 0 and N - 1. - * - * From: - * https://stackoverflow.com/questions/39494689/is-it-possible-to-restrict-number-to-a-certain-range - */ -export type NaturalNumbersLessThan< - N extends number, - Acc extends number[] = [], -> = Acc["length"] extends N - ? Acc[number] - : NaturalNumbersLessThan; diff --git a/packages/isaacscript-common-ts/src/types/NaturalNumbersLessThanOrEqualTo.ts b/packages/isaacscript-common-ts/src/types/NaturalNumbersLessThanOrEqualTo.ts deleted file mode 100644 index a0055f447..000000000 --- a/packages/isaacscript-common-ts/src/types/NaturalNumbersLessThanOrEqualTo.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Helper type to get a range of integers between 0 and N. - * - * From: - * https://stackoverflow.com/questions/39494689/is-it-possible-to-restrict-number-to-a-certain-range - */ -export type NaturalNumbersLessThanOrEqualTo< - N extends number, - T extends number[] = [], -> = T extends [unknown, ...infer Tail] - ? Tail["length"] extends N - ? T[number] - : NaturalNumbersLessThanOrEqualTo - : NaturalNumbersLessThanOrEqualTo; diff --git a/packages/isaacscript-common-ts/src/types/ObjectValues.ts b/packages/isaacscript-common-ts/src/types/ObjectValues.ts deleted file mode 100644 index e21529c98..000000000 --- a/packages/isaacscript-common-ts/src/types/ObjectValues.ts +++ /dev/null @@ -1 +0,0 @@ -export type ObjectValues = T[keyof T]; diff --git a/packages/isaacscript-common-ts/src/types/ReadonlyMap.ts b/packages/isaacscript-common-ts/src/types/ReadonlyMap.ts deleted file mode 100644 index 88591b33e..000000000 --- a/packages/isaacscript-common-ts/src/types/ReadonlyMap.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -interface ReadonlyMapConstructor { - new (): ReadonlyMap; - new ( - entries?: ReadonlyArray | Iterable | null, - ): ReadonlyMap; - readonly prototype: ReadonlyMap; -} - -/** An alias for the `Map` constructor that returns a read-only map. */ -export const ReadonlyMap = Map as ReadonlyMapConstructor; diff --git a/packages/isaacscript-common-ts/src/types/ReadonlyRecord.ts b/packages/isaacscript-common-ts/src/types/ReadonlyRecord.ts deleted file mode 100644 index f8700e793..000000000 --- a/packages/isaacscript-common-ts/src/types/ReadonlyRecord.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type ReadonlyRecord = Readonly< - Record ->; diff --git a/packages/isaacscript-common-ts/src/types/ReadonlySet.ts b/packages/isaacscript-common-ts/src/types/ReadonlySet.ts deleted file mode 100644 index 8155bad75..000000000 --- a/packages/isaacscript-common-ts/src/types/ReadonlySet.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -interface ReadonlySetConstructor { - new (values?: readonly T[] | Iterable | null): ReadonlySet; - readonly prototype: ReadonlySet; -} - -/** An alias for the `Set` constructor that returns a read-only set. */ -export const ReadonlySet = Set as ReadonlySetConstructor; diff --git a/packages/isaacscript-common-ts/src/types/Tuple.ts b/packages/isaacscript-common-ts/src/types/Tuple.ts deleted file mode 100644 index ff4b23a24..000000000 --- a/packages/isaacscript-common-ts/src/types/Tuple.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Helper type to represent a tuple of length N. - * - * From: - * https://stackoverflow.com/questions/52489261/typescript-can-i-define-an-n-length-tuple-type/52490977#52490977 - */ -export type Tuple = N extends N - ? number extends N - ? T[] - : _TupleOf - : never; -type _TupleOf = R["length"] extends N - ? R - : _TupleOf; diff --git a/packages/isaacscript-common-ts/src/types/WidenLiteral.ts b/packages/isaacscript-common-ts/src/types/WidenLiteral.ts deleted file mode 100644 index 9443f57a1..000000000 --- a/packages/isaacscript-common-ts/src/types/WidenLiteral.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type WidenLiteral = T extends string - ? string - : T extends number - ? number - : T extends boolean - ? boolean - : T extends bigint - ? bigint - : T extends symbol - ? symbol - : T; diff --git a/packages/isaacscript-common-ts/src/types/Writeable.ts b/packages/isaacscript-common-ts/src/types/Writeable.ts deleted file mode 100644 index 9354d1789..000000000 --- a/packages/isaacscript-common-ts/src/types/Writeable.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Helper type to convert a read-only object into a writable object. - * - * This is the opposite of the built-in `Readonly` utility type. - */ -export type Writeable = { -readonly [P in keyof T]: T[P] }; diff --git a/packages/isaacscript-common-ts/tsconfig.json b/packages/isaacscript-common-ts/tsconfig.json deleted file mode 100644 index 4ffd2a8e9..000000000 --- a/packages/isaacscript-common-ts/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", - - "extends": [ - "../isaacscript-tsconfig/tsconfig.base.json", - "../../tsconfig.monorepo.json", - ], - - // https://www.typescriptlang.org/docs/handbook/compiler-options.html - "compilerOptions": { - // Needed since this is a library. - "sourceMap": true, - "declaration": true, - "declarationMap": true, - - // Needed since this library uses the `String.replaceAll` method. - "target": "ES2021", - }, -} diff --git a/packages/isaacscript-common/README.md b/packages/isaacscript-common/README.md index fbdc92b26..ce2d5161e 100644 --- a/packages/isaacscript-common/README.md +++ b/packages/isaacscript-common/README.md @@ -1,4 +1,4 @@ -# isaacscript-common +# `isaacscript-common` [![npm version](https://img.shields.io/npm/v/isaacscript-common.svg)](https://www.npmjs.com/package/isaacscript-common) diff --git a/packages/isaacscript-common/eslint.config.mjs b/packages/isaacscript-common/eslint.config.mjs index 462875782..ee180e185 100644 --- a/packages/isaacscript-common/eslint.config.mjs +++ b/packages/isaacscript-common/eslint.config.mjs @@ -1,18 +1,18 @@ -import tseslint from "typescript-eslint"; -import { base } from "../eslint-config-isaacscript/base.js"; -import { mod } from "../eslint-config-isaacscript/mod.js"; -import { monorepo } from "../eslint-config-isaacscript/monorepo.js"; -// @ts-expect-error There are no TypeScript definitions for this plugin. +// @ts-check + +import { completeConfigBase } from "eslint-config-complete"; import ESLintPluginSortExports from "eslint-plugin-sort-exports"; +import { defineConfig } from "eslint/config"; +import { isaacScriptModConfigBase } from "../eslint-config-isaacscript/src/mod.js"; -export default tseslint.config( - ...base, - ...mod, - ...monorepo, +export default defineConfig( + ...completeConfigBase, + ...isaacScriptModConfigBase, { plugins: { /** The `sort-exports` rule is used in some specific files. */ + // @ts-expect-error https://github.com/jrdrg/eslint-plugin-sort-exports/issues/44 "sort-exports": ESLintPluginSortExports, }, @@ -34,6 +34,9 @@ export default tseslint.config( * rule. */ "@typescript-eslint/require-array-sort-compare": "warn", + + // TODO: https://github.com/eslint/eslint/issues/20272 + "@typescript-eslint/unified-signatures": "off", }, }, diff --git a/packages/isaacscript-common/package.json b/packages/isaacscript-common/package.json index 41b474c40..497aa7906 100644 --- a/packages/isaacscript-common/package.json +++ b/packages/isaacscript-common/package.json @@ -1,6 +1,6 @@ { "name": "isaacscript-common", - "version": "87.5.0", + "version": "87.9.6", "description": "Helper functions and features for IsaacScript mods.", "keywords": [ "isaac", @@ -26,10 +26,7 @@ "types": "./dist/index.rollup.d.ts", "files": [ "dist", - "src", - "LICENSE", - "package.json", - "README.md" + "src" ], "scripts": { "build": "tsx --tsconfig ./scripts/tsconfig.json ./scripts/build.mts", @@ -37,6 +34,13 @@ "lint": "tsx --tsconfig ./scripts/tsconfig.json ./scripts/lint.mts" }, "dependencies": { - "isaac-typescript-definitions": "^42.2.0" + "isaac-typescript-definitions": "43.0.6" + }, + "devDependencies": { + "@microsoft/api-extractor": "7.57.7", + "complete-node": "16.4.0", + "eslint-plugin-sort-exports": "0.9.1", + "typescript-eslint": "8.57.1", + "typescript-to-lua": "1.34.0" } } diff --git a/packages/isaacscript-common/scripts/build.mts b/packages/isaacscript-common/scripts/build.mts index a3e3b2e8a..d01f7d198 100644 --- a/packages/isaacscript-common/scripts/build.mts +++ b/packages/isaacscript-common/scripts/build.mts @@ -1,29 +1,26 @@ import { $, - $sq, + $q, appendFile, buildScript, - cp, - rm, -} from "isaacscript-common-node"; -import { assertDefined } from "isaacscript-common-ts"; + copyFileOrDirectory, + deleteFileOrDirectory, +} from "complete-node"; import path from "node:path"; -await buildScript(async ({ packageRoot, outDir }) => { - assertDefined( - outDir, - 'Failed to get the "outDir" from the "tsconfig.json" file.', - ); - +await buildScript(import.meta.dirname, async (packageRoot) => { // In addition to the normal compilation, we want to bundle the entire library into one file // specifically for Lua consumers. We also include `isaac-typescript-definitions` in the bundled // exports so that Lua users do not have to consume two separate libraries. const indexTSPath = path.join(packageRoot, "src", "index.ts"); const indexLuaTSPath = path.join(packageRoot, "src", "indexLua.ts"); - cp(indexTSPath, indexLuaTSPath); - appendFile(indexLuaTSPath, 'export * from "isaac-typescript-definitions";'); + await copyFileOrDirectory(indexTSPath, indexLuaTSPath); + await appendFile( + indexLuaTSPath, + 'export * from "isaac-typescript-definitions";', + ); - const promises = [ + await Promise.all([ $`tstl`, $`tstl --project tsconfig.bundle.json --declaration false --declarationMap false`, @@ -31,19 +28,17 @@ await buildScript(async ({ packageRoot, outDir }) => { // be usable in Jest tests. We disable declarations because running `tstl` will create // declarations and we don't want the two processes to stomp on each other. $`tsc --declaration false --declarationMap false`, - ]; - - await Promise.all(promises); + ]); - rm(indexLuaTSPath); + await deleteFileOrDirectory(indexLuaTSPath); // Make sure that the transpiled "jsonLua.js" file gets copied over. (TSTL will automatically // transfer "jsonLua.lua", but not "jsonLua.js".) const srcLibPath = path.join(packageRoot, "src", "lib"); const dstLibPath = path.join(packageRoot, "dist", "lib"); - cp(srcLibPath, dstLibPath); + await copyFileOrDirectory(srcLibPath, dstLibPath); - scrubInternalExports(); + await scrubInternalExports(); }); /** @@ -66,6 +61,6 @@ await buildScript(async ({ packageRoot, outDir }) => { * https://github.com/microsoft/rushstack/issues/1886 * https://github.com/timocov/dts-bundle-generator/issues/218 */ -function scrubInternalExports() { - $sq`npx api-extractor run`; // `api-extractor` is noisy and we only care if it fails. +async function scrubInternalExports() { + await $q`npx api-extractor run`; // `api-extractor` is noisy and we only care if it fails. } diff --git a/packages/isaacscript-common/scripts/lint.mts b/packages/isaacscript-common/scripts/lint.mts index 290fcfe0d..d828f8792 100644 --- a/packages/isaacscript-common/scripts/lint.mts +++ b/packages/isaacscript-common/scripts/lint.mts @@ -1,10 +1,7 @@ -import { $, lintScript } from "isaacscript-common-node"; +import { lintCommands } from "complete-node"; -await lintScript(async () => { - const promises = [ - $`tsc --noEmit`, - $`tsc --noEmit --project ./scripts/tsconfig.json`, - $`eslint --max-warnings 0 .`, - ]; - await Promise.all(promises); -}); +await lintCommands(import.meta.dirname, [ + "tsc --noEmit", + "tsc --noEmit --project ./scripts/tsconfig.json", + "eslint --max-warnings 0 .", +]); diff --git a/packages/isaacscript-common/scripts/tsconfig.json b/packages/isaacscript-common/scripts/tsconfig.json index 0327cd449..0055fe1b2 100644 --- a/packages/isaacscript-common/scripts/tsconfig.json +++ b/packages/isaacscript-common/scripts/tsconfig.json @@ -1,10 +1,12 @@ { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../../isaacscript-tsconfig/tsconfig.base.json", - "../../isaacscript-tsconfig/tsconfig.node.json", - "../../../tsconfig.monorepo.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], "include": ["*.mts"], diff --git a/packages/isaacscript-common/src/callbackClasses.ts b/packages/isaacscript-common/src/callbackClasses.ts index 594c91d60..0230c5f8d 100644 --- a/packages/isaacscript-common/src/callbackClasses.ts +++ b/packages/isaacscript-common/src/callbackClasses.ts @@ -25,6 +25,7 @@ export { PostEffectRenderFilter } from "./classes/callbacks/PostEffectRenderFilt export { PostEffectStateChanged } from "./classes/callbacks/PostEffectStateChanged"; export { PostEffectUpdateFilter } from "./classes/callbacks/PostEffectUpdateFilter"; export { PostEntityKillFilter } from "./classes/callbacks/PostEntityKillFilter"; +export { PostEntityRemoveFilter } from "./classes/callbacks/PostEntityRemoveFilter"; export { PostEsauJr } from "./classes/callbacks/PostEsauJr"; export { PostFamiliarInitFilter } from "./classes/callbacks/PostFamiliarInitFilter"; export { PostFamiliarInitLate } from "./classes/callbacks/PostFamiliarInitLate"; diff --git a/packages/isaacscript-common/src/callbacks.ts b/packages/isaacscript-common/src/callbacks.ts index 7a507836b..755ca4226 100644 --- a/packages/isaacscript-common/src/callbacks.ts +++ b/packages/isaacscript-common/src/callbacks.ts @@ -28,6 +28,7 @@ const MOD_CALLBACK_CUSTOM_TO_CLASS = { [ModCallbackCustom.POST_EFFECT_STATE_CHANGED]: cc.PostEffectStateChanged, [ModCallbackCustom.POST_EFFECT_UPDATE_FILTER]: cc.PostEffectUpdateFilter, [ModCallbackCustom.POST_ENTITY_KILL_FILTER]: cc.PostEntityKillFilter, + [ModCallbackCustom.POST_ENTITY_REMOVE_FILTER]: cc.PostEntityRemoveFilter, [ModCallbackCustom.POST_ESAU_JR]: cc.PostEsauJr, [ModCallbackCustom.POST_FAMILIAR_INIT_FILTER]: cc.PostFamiliarInitFilter, [ModCallbackCustom.POST_FAMILIAR_INIT_LATE]: cc.PostFamiliarInitLate, diff --git a/packages/isaacscript-common/src/classes/DefaultMap.ts b/packages/isaacscript-common/src/classes/DefaultMap.ts index c4dee2a20..fdb6a55bc 100644 --- a/packages/isaacscript-common/src/classes/DefaultMap.ts +++ b/packages/isaacscript-common/src/classes/DefaultMap.ts @@ -165,10 +165,13 @@ export class DefaultMap extends Map< } } -// eslint-disable-next-line isaacscript/complete-sentences-jsdoc /** * A function that creates the default value for your `DefaultMap`. For example, if it was a - * `DefaultMap` containing maps, the factory function would be: `() => new Map()` + * `DefaultMap` containing maps, the factory function would be: + * + * ```ts + * () => new Map() + * ``` */ export type FactoryFunction = (...args: Args) => V; diff --git a/packages/isaacscript-common/src/classes/ModFeature.ts b/packages/isaacscript-common/src/classes/ModFeature.ts index ddf163078..d8b205cad 100644 --- a/packages/isaacscript-common/src/classes/ModFeature.ts +++ b/packages/isaacscript-common/src/classes/ModFeature.ts @@ -63,6 +63,8 @@ type ModFeatureConstructor = TSTLClassMetatable["constructor"] & { * upon first construction.) */ export class ModFeature { + // Other features will extend from this feature and they might need access to the underlying mod. + // eslint-disable-next-line @typescript-eslint/no-unused-private-class-members private readonly mod: ModUpgraded; /** @@ -225,7 +227,7 @@ function initDecoratedCallbacks( modFeature, modFeatureConstructor, mod, - modCallback, // eslint-disable-line isaacscript/strict-enums + modCallback, // eslint-disable-line complete/strict-enums priority, callback, parameters, @@ -235,7 +237,7 @@ function initDecoratedCallbacks( removeCallback( modFeatureConstructor, mod, - modCallback, // eslint-disable-line isaacscript/strict-enums + modCallback, // eslint-disable-line complete/strict-enums vanilla, ); } diff --git a/packages/isaacscript-common/src/classes/ModUpgraded.ts b/packages/isaacscript-common/src/classes/ModUpgraded.ts index 4a58c3850..cc972f668 100644 --- a/packages/isaacscript-common/src/classes/ModUpgraded.ts +++ b/packages/isaacscript-common/src/classes/ModUpgraded.ts @@ -119,8 +119,8 @@ export class ModUpgraded implements Mod { const elapsedTime = getElapsedTimeSince(startTime); if ( - this.timeThreshold === undefined || - this.timeThreshold <= elapsedTime + this.timeThreshold === undefined + || this.timeThreshold <= elapsedTime ) { Isaac.DebugString(`${signature} - END - time: ${elapsedTime}`); } else { @@ -197,7 +197,7 @@ export class ModUpgraded implements Mod { ): void { const callbackClass = this.callbacks[modCallbackCustom]; // @ts-expect-error The compiler is not smart enough to figure out that the parameters match. - // eslint-disable-next-line isaacscript/require-variadic-function-argument + // eslint-disable-next-line complete/require-variadic-function-argument callbackClass.addSubscriber(priority, ...args); this.initFeature(callbackClass); } @@ -295,9 +295,7 @@ export class ModUpgraded implements Mod { feature.initialized = true; if (feature.v !== undefined) { - if (feature.featuresUsed === undefined) { - feature.featuresUsed = []; - } + feature.featuresUsed ??= []; if (!feature.featuresUsed.includes(ISCFeature.SAVE_DATA_MANAGER)) { feature.featuresUsed.unshift(ISCFeature.SAVE_DATA_MANAGER); } @@ -412,6 +410,7 @@ export class ModUpgraded implements Mod { * called from the "upgradeMod" function, but we want to mark it as private so that end-users * don't have access to it. */ + // eslint-disable-next-line @typescript-eslint/no-unused-private-class-members private initOptionalFeature(feature: ISCFeature): readonly FunctionTuple[] { const featureClass = this.features[feature]; this.initFeature(featureClass); diff --git a/packages/isaacscript-common/src/classes/callbacks/InputActionFilter.ts b/packages/isaacscript-common/src/classes/callbacks/InputActionFilter.ts index 2ec89ffca..90b188fd4 100644 --- a/packages/isaacscript-common/src/classes/callbacks/InputActionFilter.ts +++ b/packages/isaacscript-common/src/classes/callbacks/InputActionFilter.ts @@ -24,9 +24,9 @@ export class InputActionFilter extends CustomCallback { const [callbackInputHook, callbackButtonAction] = optionalArgs; return ( - (callbackInputHook === undefined || callbackInputHook === inputHook) && - (callbackButtonAction === undefined || - callbackButtonAction === buttonAction) + (callbackInputHook === undefined || callbackInputHook === inputHook) + && (callbackButtonAction === undefined + || callbackButtonAction === buttonAction) ); }; diff --git a/packages/isaacscript-common/src/classes/callbacks/InputActionPlayer.ts b/packages/isaacscript-common/src/classes/callbacks/InputActionPlayer.ts index 25af49bb7..4bcfc5dcf 100644 --- a/packages/isaacscript-common/src/classes/callbacks/InputActionPlayer.ts +++ b/packages/isaacscript-common/src/classes/callbacks/InputActionPlayer.ts @@ -31,12 +31,12 @@ export class InputActionPlayer extends CustomCallback { const character = player.GetPlayerType(); return ( - (callbackPlayerVariant === undefined || - callbackPlayerVariant === player.Variant) && - (callbackCharacter === undefined || callbackCharacter === character) && - (callbackInputHook === undefined || callbackInputHook === inputHook) && - (callbackButtonAction === undefined || - callbackButtonAction === buttonAction) + (callbackPlayerVariant === undefined + || callbackPlayerVariant === player.Variant) + && (callbackCharacter === undefined || callbackCharacter === character) + && (callbackInputHook === undefined || callbackInputHook === inputHook) + && (callbackButtonAction === undefined + || callbackButtonAction === buttonAction) ); }; diff --git a/packages/isaacscript-common/src/classes/callbacks/PostBoneSwing.ts b/packages/isaacscript-common/src/classes/callbacks/PostBoneSwing.ts index 8ce29e64d..e306a8d9b 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PostBoneSwing.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PostBoneSwing.ts @@ -47,8 +47,8 @@ export class PostBoneSwing extends CustomCallback { const [callbackCollectibleType] = optionalArgs; return ( - callbackCollectibleType === undefined || - callbackCollectibleType === oldCollectibleType + callbackCollectibleType === undefined + || callbackCollectibleType === oldCollectibleType ); }; @@ -53,9 +53,7 @@ export class PostCollectibleEmpty extends CustomCallback { const ptrHash = GetPtrHash(collectible); let oldCollectibleType = v.room.collectibleTypeMap.get(ptrHash); - if (oldCollectibleType === undefined) { - oldCollectibleType = collectible.SubType; - } + oldCollectibleType ??= collectible.SubType; v.room.collectibleTypeMap.set(ptrHash, collectible.SubType); if (oldCollectibleType !== collectible.SubType) { diff --git a/packages/isaacscript-common/src/classes/callbacks/PostCursedTeleport.ts b/packages/isaacscript-common/src/classes/callbacks/PostCursedTeleport.ts index 9a11a32c0..0ac0a7079 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PostCursedTeleport.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PostCursedTeleport.ts @@ -107,9 +107,9 @@ export class PostCursedTeleport extends CustomCallback= 12) + roomType === RoomType.SACRIFICE + && isSpikeDamage + && (v.level.numSacrifices === 6 || v.level.numSacrifices >= 12) ); } @@ -154,8 +154,8 @@ export class PostCursedTeleport extends CustomCallback { const [callbackDiceFloorSubType] = optionalArgs; return ( - callbackDiceFloorSubType === undefined || - diceFloorSubType === callbackDiceFloorSubType + callbackDiceFloorSubType === undefined + || diceFloorSubType === callbackDiceFloorSubType ); }; diff --git a/packages/isaacscript-common/src/classes/callbacks/PostEntityRemoveFilter.ts b/packages/isaacscript-common/src/classes/callbacks/PostEntityRemoveFilter.ts new file mode 100644 index 000000000..6ed66832c --- /dev/null +++ b/packages/isaacscript-common/src/classes/callbacks/PostEntityRemoveFilter.ts @@ -0,0 +1,22 @@ +import { ModCallback } from "isaac-typescript-definitions"; +import type { ModCallbackCustom } from "../../enums/ModCallbackCustom"; +import { shouldFireEntity } from "../../shouldFire"; +import { CustomCallback } from "../private/CustomCallback"; + +export class PostEntityRemoveFilter extends CustomCallback { + constructor() { + super(); + + this.callbacksUsed = [ + // 67 + [ModCallback.POST_ENTITY_REMOVE, this.postEntityRemove], + ]; + } + + protected override shouldFire = shouldFireEntity; + + // ModCallback.POST_ENTITY_REMOVE (67) + private readonly postEntityRemove = (entity: Entity) => { + this.fire(entity); + }; +} diff --git a/packages/isaacscript-common/src/classes/callbacks/PostGridEntityCollision.ts b/packages/isaacscript-common/src/classes/callbacks/PostGridEntityCollision.ts index 23355e3a4..74be88d0e 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PostGridEntityCollision.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PostGridEntityCollision.ts @@ -29,16 +29,16 @@ export class PostGridEntityCollision extends CustomCallback { const gridEntityVariant = gridEntity.GetVariant(); return ( - (callbackGridEntityType === undefined || - callbackGridEntityType === gridEntityType) && - (callbackGridEntityVariant === undefined || - callbackGridEntityVariant === gridEntityVariant) && - (callbackEntityType === undefined || - callbackEntityType === entity.Type) && - (callbackEntityVariant === undefined || - callbackEntityVariant === entity.Variant) && - (callbackEntitySubType === undefined || - callbackEntitySubType === entity.SubType) + (callbackGridEntityType === undefined + || callbackGridEntityType === gridEntityType) + && (callbackGridEntityVariant === undefined + || callbackGridEntityVariant === gridEntityVariant) + && (callbackEntityType === undefined + || callbackEntityType === entity.Type) + && (callbackEntityVariant === undefined + || callbackEntityVariant === entity.Variant) + && (callbackEntitySubType === undefined + || callbackEntitySubType === entity.SubType) ); }; } diff --git a/packages/isaacscript-common/src/classes/callbacks/PostGridEntityCustomCollision.ts b/packages/isaacscript-common/src/classes/callbacks/PostGridEntityCustomCollision.ts index 76d550884..cadb03be5 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PostGridEntityCustomCollision.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PostGridEntityCustomCollision.ts @@ -25,14 +25,14 @@ export class PostGridEntityCustomCollision extends CustomCallback { ] = optionalArgs; return ( - (callbackGridEntityTypeCustom === undefined || - callbackGridEntityTypeCustom === gridEntityTypeCustom) && - (callbackEntityType === undefined || - callbackEntityType === entity.Type) && - (callbackEntityVariant === undefined || - callbackEntityVariant === entity.Variant) && - (callbackEntitySubType === undefined || - callbackEntitySubType === entity.SubType) + (callbackGridEntityTypeCustom === undefined + || callbackGridEntityTypeCustom === gridEntityTypeCustom) + && (callbackEntityType === undefined + || callbackEntityType === entity.Type) + && (callbackEntityVariant === undefined + || callbackEntityVariant === entity.Variant) + && (callbackEntitySubType === undefined + || callbackEntitySubType === entity.SubType) ); }; } diff --git a/packages/isaacscript-common/src/classes/callbacks/PostGridEntityCustomRemove.ts b/packages/isaacscript-common/src/classes/callbacks/PostGridEntityCustomRemove.ts index 79bef6d47..01ef0f32d 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PostGridEntityCustomRemove.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PostGridEntityCustomRemove.ts @@ -20,8 +20,8 @@ export class PostGridEntityCustomRemove extends CustomCallback { const [callbackGridEntityTypeCustom] = optionalArgs; return ( - callbackGridEntityTypeCustom === undefined || - callbackGridEntityTypeCustom === gridEntityTypeCustom + callbackGridEntityTypeCustom === undefined + || callbackGridEntityTypeCustom === gridEntityTypeCustom ); }; } diff --git a/packages/isaacscript-common/src/classes/callbacks/PostGridEntityRemove.ts b/packages/isaacscript-common/src/classes/callbacks/PostGridEntityRemove.ts index d0875e7b2..b25596487 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PostGridEntityRemove.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PostGridEntityRemove.ts @@ -20,9 +20,9 @@ export class PostGridEntityRemove extends CustomCallback { const [callbackGridEntityType, callbackVariant] = optionalArgs; return ( - (callbackGridEntityType === undefined || - callbackGridEntityType === gridEntityType) && - (callbackVariant === undefined || callbackVariant === variant) + (callbackGridEntityType === undefined + || callbackGridEntityType === gridEntityType) + && (callbackVariant === undefined || callbackVariant === variant) ); }; } diff --git a/packages/isaacscript-common/src/classes/callbacks/PostItemDischarge.ts b/packages/isaacscript-common/src/classes/callbacks/PostItemDischarge.ts index 80cdb4d88..0e263f354 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PostItemDischarge.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PostItemDischarge.ts @@ -72,8 +72,8 @@ export class PostItemDischarge extends CustomCallback { const [callbackCollectibleType] = optionalArgs; return ( - callbackCollectibleType === undefined || - callbackCollectibleType === collectibleType + callbackCollectibleType === undefined + || callbackCollectibleType === collectibleType ); }; @@ -83,6 +83,7 @@ export class PostItemDischarge extends CustomCallback { npc: EntityNPC, collider: Entity, ): boolean | undefined => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison if (npc.Variant === SuckerVariant.BULB) { return this.preNPCCollisionBulb(npc, collider); } @@ -132,9 +133,7 @@ export class PostItemDischarge extends CustomCallback { for (const activeSlot of ACTIVE_SLOT_VALUES) { const currentActiveItem = player.GetActiveItem(); let previousActiveItem = activeItemMap.get(activeSlot); - if (previousActiveItem === undefined) { - previousActiveItem = currentActiveItem; - } + previousActiveItem ??= currentActiveItem; activeItemMap.set(activeSlot, currentActiveItem); if (currentActiveItem !== previousActiveItem) { @@ -145,9 +144,7 @@ export class PostItemDischarge extends CustomCallback { const currentCharge = getTotalCharge(player, activeSlot); let previousCharge = chargeMap.get(activeSlot); - if (previousCharge === undefined) { - previousCharge = currentCharge; - } + previousCharge ??= currentCharge; chargeMap.set(activeSlot, currentCharge); if (this.playerRecentlyCollidedWithBulb(player)) { diff --git a/packages/isaacscript-common/src/classes/callbacks/PostKeyboardChanged.ts b/packages/isaacscript-common/src/classes/callbacks/PostKeyboardChanged.ts index f85f14602..62135d8fb 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PostKeyboardChanged.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PostKeyboardChanged.ts @@ -34,8 +34,8 @@ export class PostKeyboardChanged extends CustomCallback { const [callbackKeyboard, callbackPressed] = optionalArgs; return ( - (callbackKeyboard === undefined || callbackKeyboard === keyboard) && - (callbackPressed === undefined || callbackPressed === pressed) + (callbackKeyboard === undefined || callbackKeyboard === keyboard) + && (callbackPressed === undefined || callbackPressed === pressed) ); }; diff --git a/packages/isaacscript-common/src/classes/callbacks/PostNPCStateChanged.ts b/packages/isaacscript-common/src/classes/callbacks/PostNPCStateChanged.ts index e2ed9dac4..58166d9ee 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PostNPCStateChanged.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PostNPCStateChanged.ts @@ -8,7 +8,7 @@ import { CustomCallback } from "../private/CustomCallback"; const v = { run: { stateMap: new DefaultMap( - (state) => state, // eslint-disable-line isaacscript/strict-enums + (state) => state, // eslint-disable-line complete/strict-enums ), }, }; diff --git a/packages/isaacscript-common/src/classes/callbacks/PostNewRoomEarly.ts b/packages/isaacscript-common/src/classes/callbacks/PostNewRoomEarly.ts index 9544e7ffd..6a4f9eeba 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PostNewRoomEarly.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PostNewRoomEarly.ts @@ -21,7 +21,7 @@ export class PostNewRoomEarly extends CustomCallback { const [callbackPickupVariant, callbackPickupSubType] = optionalArgs; return ( - (callbackPickupVariant === undefined || - callbackPickupVariant === pickupVariant) && - (callbackPickupSubType === undefined || callbackPickupSubType === subType) + (callbackPickupVariant === undefined + || callbackPickupVariant === pickupVariant) + && (callbackPickupSubType === undefined + || callbackPickupSubType === subType) ); }; diff --git a/packages/isaacscript-common/src/classes/callbacks/PostPlayerChangeHealth.ts b/packages/isaacscript-common/src/classes/callbacks/PostPlayerChangeHealth.ts index d126f8e5e..438e722d5 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PostPlayerChangeHealth.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PostPlayerChangeHealth.ts @@ -47,8 +47,8 @@ export class PostPlayerChangeHealth extends CustomCallback((character: PlayerType) => character), // eslint-disable-line isaacscript/strict-enums + >((character: PlayerType) => character), // eslint-disable-line complete/strict-enums }, }; diff --git a/packages/isaacscript-common/src/classes/callbacks/PostPurchase.ts b/packages/isaacscript-common/src/classes/callbacks/PostPurchase.ts index 9b17597ba..b37335c7f 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PostPurchase.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PostPurchase.ts @@ -60,10 +60,10 @@ export class PostPurchase extends CustomCallback { const [callbackPickupVariant, callbackPickupSubType] = optionalArgs; return ( - (callbackPickupVariant === undefined || - callbackPickupVariant === pickup.Variant) && - (callbackPickupSubType === undefined || - callbackPickupSubType === pickup.SubType) + (callbackPickupVariant === undefined + || callbackPickupVariant === pickup.Variant) + && (callbackPickupSubType === undefined + || callbackPickupSubType === pickup.SubType) ); }; @@ -111,9 +111,9 @@ export class PostPurchase extends CustomCallback { // Assume that if the player did not use an active item, card, or pill recently, then they // purchased an item. if ( - !wasHoldingItemOnLastFrame && - isHoldingItem && - !this.playerUsedItemRecently(player) + !wasHoldingItemOnLastFrame + && isHoldingItem + && !this.playerUsedItemRecently(player) ) { this.playerPickedUpNewItem(player); } @@ -126,8 +126,8 @@ export class PostPurchase extends CustomCallback { player, ); return ( - gameFrameCount === usedCollectibleOnFrame || - gameFrameCount === usedCollectibleOnFrame + 1 + gameFrameCount === usedCollectibleOnFrame + || gameFrameCount === usedCollectibleOnFrame + 1 ); } diff --git a/packages/isaacscript-common/src/classes/callbacks/PostTransformation.ts b/packages/isaacscript-common/src/classes/callbacks/PostTransformation.ts index e1540bd3d..e5c26cc95 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PostTransformation.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PostTransformation.ts @@ -55,9 +55,7 @@ export class PostTransformation extends CustomCallback { for (const playerForm of PLAYER_FORM_VALUES) { const hasForm = player.HasPlayerForm(playerForm); let storedForm = playerTransformationsMap.get(playerForm); - if (storedForm === undefined) { - storedForm = false; - } + storedForm ??= false; if (hasForm !== storedForm) { playerTransformationsMap.set(playerForm, hasForm); diff --git a/packages/isaacscript-common/src/classes/callbacks/PostTrinketBreak.ts b/packages/isaacscript-common/src/classes/callbacks/PostTrinketBreak.ts index 183d6e5c1..9fc744f32 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PostTrinketBreak.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PostTrinketBreak.ts @@ -55,9 +55,7 @@ export class PostTrinketBreak extends CustomCallback= oldNumTrinketsHeld) { continue; diff --git a/packages/isaacscript-common/src/classes/callbacks/PostUsePillFilter.ts b/packages/isaacscript-common/src/classes/callbacks/PostUsePillFilter.ts index 3244a2fe2..a8f618a3b 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PostUsePillFilter.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PostUsePillFilter.ts @@ -76,8 +76,8 @@ export class PostUsePillFilter extends CustomCallback pocketItem.slot === PocketItemSlot.SLOT_1, ); if ( - oldPocketItemSlot1 !== undefined && - oldPocketItemSlot1.type === PocketItemType.PILL + oldPocketItemSlot1 !== undefined + && oldPocketItemSlot1.type === PocketItemType.PILL ) { return oldPocketItemSlot1.subType; } diff --git a/packages/isaacscript-common/src/classes/callbacks/PreBerserkDeath.ts b/packages/isaacscript-common/src/classes/callbacks/PreBerserkDeath.ts index 9e416c2d1..af7a2f3ec 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PreBerserkDeath.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PreBerserkDeath.ts @@ -36,10 +36,10 @@ export class PreBerserkDeath extends CustomCallback { const [callbackEntityType, callbackVariant, callbackSubType] = optionalArgs; return ( - (callbackEntityType === undefined || callbackEntityType === entityType) && - (callbackVariant === undefined || callbackVariant === variant) && - (callbackSubType === undefined || callbackSubType === subType) + (callbackEntityType === undefined || callbackEntityType === entityType) + && (callbackVariant === undefined || callbackVariant === variant) + && (callbackSubType === undefined || callbackSubType === subType) ); }; diff --git a/packages/isaacscript-common/src/classes/callbacks/PreRoomEntitySpawnFilter.ts b/packages/isaacscript-common/src/classes/callbacks/PreRoomEntitySpawnFilter.ts index eb9167e92..aebecd6bc 100644 --- a/packages/isaacscript-common/src/classes/callbacks/PreRoomEntitySpawnFilter.ts +++ b/packages/isaacscript-common/src/classes/callbacks/PreRoomEntitySpawnFilter.ts @@ -31,11 +31,11 @@ export class PreRoomEntitySpawnFilter extends CustomCallback { ] = optionalArgs; return ( - (callbackEntityTypeOrGridEntityXMLType === undefined || - callbackEntityTypeOrGridEntityXMLType === - entityTypeOrGridEntityXMLType) && - (callbackVariant === undefined || callbackVariant === variant) && - (callbackSubType === undefined || callbackSubType === subType) + (callbackEntityTypeOrGridEntityXMLType === undefined + || callbackEntityTypeOrGridEntityXMLType + === entityTypeOrGridEntityXMLType) + && (callbackVariant === undefined || callbackVariant === variant) + && (callbackSubType === undefined || callbackSubType === subType) ); }; diff --git a/packages/isaacscript-common/src/classes/features/callbackLogic/CustomGridEntities.ts b/packages/isaacscript-common/src/classes/features/callbackLogic/CustomGridEntities.ts index 93d9395d7..6b2fb9648 100644 --- a/packages/isaacscript-common/src/classes/features/callbackLogic/CustomGridEntities.ts +++ b/packages/isaacscript-common/src/classes/features/callbackLogic/CustomGridEntities.ts @@ -348,7 +348,7 @@ export class CustomGridEntities extends Feature { * @public */ @Exported - public getCustomGridEntities(): Array<{ + public getCustomGridEntities(): ReadonlyArray<{ gridEntity: GridEntity; data: GridEntityCustomData; }> { diff --git a/packages/isaacscript-common/src/classes/features/callbackLogic/EsauJrDetection.ts b/packages/isaacscript-common/src/classes/features/callbackLogic/EsauJrDetection.ts index c0e9fcaf8..60d5cf63a 100644 --- a/packages/isaacscript-common/src/classes/features/callbackLogic/EsauJrDetection.ts +++ b/packages/isaacscript-common/src/classes/features/callbackLogic/EsauJrDetection.ts @@ -45,8 +45,8 @@ export class EsauJrDetection extends Feature { // Check to see if it is the frame after the player has used Esau Jr. if ( - v.run.usedEsauJrFrame === null || - gameFrameCount < v.run.usedEsauJrFrame + 1 + v.run.usedEsauJrFrame === null + || gameFrameCount < v.run.usedEsauJrFrame + 1 ) { return; } diff --git a/packages/isaacscript-common/src/classes/features/callbackLogic/GameReorderedCallbacks.ts b/packages/isaacscript-common/src/classes/features/callbackLogic/GameReorderedCallbacks.ts index 45df2166a..dadb0facd 100644 --- a/packages/isaacscript-common/src/classes/features/callbackLogic/GameReorderedCallbacks.ts +++ b/packages/isaacscript-common/src/classes/features/callbackLogic/GameReorderedCallbacks.ts @@ -60,18 +60,18 @@ export class GameReorderedCallbacks extends Feature { [ModCallback.POST_PLAYER_INIT, this.postPlayerInit], // 15 - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated [ModCallback.POST_GAME_STARTED, this.postGameStarted], // 17 [ModCallback.PRE_GAME_EXIT, this.preGameExit], // 18 - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated [ModCallback.POST_NEW_LEVEL, this.postNewLevel], // 19 - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated [ModCallback.POST_NEW_ROOM, this.postNewRoom], ]; @@ -93,9 +93,7 @@ export class GameReorderedCallbacks extends Feature { // ModCallback.POST_PLAYER_INIT (9) private readonly postPlayerInit = (_player: EntityPlayer): void => { - if (this.renderFrameRunStarted === null) { - this.renderFrameRunStarted = Isaac.GetFrameCount(); - } + this.renderFrameRunStarted ??= Isaac.GetFrameCount(); }; // ModCallback.POST_GAME_STARTED (15) @@ -164,11 +162,11 @@ export class GameReorderedCallbacks extends Feature { } if ( - (onGameFrame(0) || - onRenderFrame(this.renderFrameRunStarted) || - this.currentStage !== stage || - this.currentStageType !== stageType) && - !this.forceNewRoom + (onGameFrame(0) + || onRenderFrame(this.renderFrameRunStarted) + || this.currentStage !== stage + || this.currentStageType !== stageType) + && !this.forceNewRoom ) { return; } diff --git a/packages/isaacscript-common/src/classes/features/callbackLogic/GridEntityUpdateDetection.ts b/packages/isaacscript-common/src/classes/features/callbackLogic/GridEntityUpdateDetection.ts index 8b912979c..e20e9fd8c 100644 --- a/packages/isaacscript-common/src/classes/features/callbackLogic/GridEntityUpdateDetection.ts +++ b/packages/isaacscript-common/src/classes/features/callbackLogic/GridEntityUpdateDetection.ts @@ -115,8 +115,8 @@ export class GridEntityUpdateDetection extends Feature { const [storedGridEntityType, storedGridEntityVariant] = gridEntityTuple; const gridEntity = gridEntitiesMap.get(gridIndex); if ( - gridEntity === undefined || - gridEntity.GetType() !== storedGridEntityType + gridEntity === undefined + || gridEntity.GetType() !== storedGridEntityType ) { v.room.initializedGridEntities.delete(gridIndex); @@ -182,8 +182,8 @@ export class GridEntityUpdateDetection extends Feature { const gridEntityTuple = v.room.initializedGridEntities.get(gridIndex); if ( - gridEntityTuple === undefined || - gridEntityTuple[0] !== gridEntityType + gridEntityTuple === undefined + || gridEntityTuple[0] !== gridEntityType ) { this.updateTupleInMap(gridEntity); diff --git a/packages/isaacscript-common/src/classes/features/callbackLogic/ItemPickupDetection.ts b/packages/isaacscript-common/src/classes/features/callbackLogic/ItemPickupDetection.ts index c0abab991..b3b9182bc 100644 --- a/packages/isaacscript-common/src/classes/features/callbackLogic/ItemPickupDetection.ts +++ b/packages/isaacscript-common/src/classes/features/callbackLogic/ItemPickupDetection.ts @@ -66,8 +66,8 @@ export class ItemPickupDetection extends Feature { private queueEmpty(player: EntityPlayer, pickingUpItem: PickingUpItem) { if ( - pickingUpItem.itemType === ItemType.NULL || - asNumber(pickingUpItem.subType) === 0 + pickingUpItem.itemType === ItemType.NULL + || asNumber(pickingUpItem.subType) === 0 ) { return; } @@ -84,8 +84,8 @@ export class ItemPickupDetection extends Feature { } if ( - queuedItem.Type !== pickingUpItem.itemType || - queuedItem.ID !== pickingUpItem.subType + queuedItem.Type !== pickingUpItem.itemType + || queuedItem.ID !== pickingUpItem.subType ) { // Record which item we are picking up. pickingUpItem.itemType = queuedItem.Type; diff --git a/packages/isaacscript-common/src/classes/features/callbackLogic/PlayerCollectibleDetection.ts b/packages/isaacscript-common/src/classes/features/callbackLogic/PlayerCollectibleDetection.ts index 02013f0e2..d2480ab7f 100644 --- a/packages/isaacscript-common/src/classes/features/callbackLogic/PlayerCollectibleDetection.ts +++ b/packages/isaacscript-common/src/classes/features/callbackLogic/PlayerCollectibleDetection.ts @@ -200,8 +200,8 @@ export class PlayerCollectibleDetection extends Feature { pickingUpItem: PickingUpItem, ) => { if ( - pickingUpItem.itemType === ItemType.TRINKET || - pickingUpItem.itemType === ItemType.NULL + pickingUpItem.itemType === ItemType.TRINKET + || pickingUpItem.itemType === ItemType.NULL ) { return; } diff --git a/packages/isaacscript-common/src/classes/features/callbackLogic/PlayerReorderedCallbacks.ts b/packages/isaacscript-common/src/classes/features/callbackLogic/PlayerReorderedCallbacks.ts index 327bff4d7..f80a0efed 100644 --- a/packages/isaacscript-common/src/classes/features/callbackLogic/PlayerReorderedCallbacks.ts +++ b/packages/isaacscript-common/src/classes/features/callbackLogic/PlayerReorderedCallbacks.ts @@ -48,15 +48,15 @@ export class PlayerReorderedCallbacks extends Feature { this.callbacksUsed = [ // 4 - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated [ModCallback.POST_PEFFECT_UPDATE, this.postPEffectUpdate], // 31 - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated [ModCallback.POST_PLAYER_UPDATE, this.postPlayerUpdate], // 32 - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated [ModCallback.POST_PLAYER_RENDER, this.postPlayerRender], ]; @@ -125,7 +125,7 @@ export class PlayerReorderedCallbacks extends Feature { } function dequeue( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types queue: QueueElement[], fireFunc: (player: EntityPlayer, renderOffset: Vector) => void, ) { diff --git a/packages/isaacscript-common/src/classes/features/other/CustomPickups.ts b/packages/isaacscript-common/src/classes/features/other/CustomPickups.ts index c23753962..99408cab4 100644 --- a/packages/isaacscript-common/src/classes/features/other/CustomPickups.ts +++ b/packages/isaacscript-common/src/classes/features/other/CustomPickups.ts @@ -14,8 +14,12 @@ import { spawnEffect } from "../../../functions/entitiesSpecific"; import { Feature } from "../../private/Feature"; interface CustomPickupFunctions { - collectFunc: (this: void, player: EntityPlayer) => void; - collisionFunc: (this: void, player: EntityPlayer) => boolean; + collectFunc: (this: void, pickup: EntityPickup, player: EntityPlayer) => void; + collisionFunc: ( + this: void, + pickup: EntityPickup, + player: EntityPlayer, + ) => boolean | undefined; } /** @@ -69,11 +73,13 @@ export class CustomPickups extends Feature { return undefined; } - const shouldPickup = customPickupFunctions.collisionFunc(player); - if (!shouldPickup) { - return undefined; + const shouldPickup = customPickupFunctions.collisionFunc(pickup, player); + if (shouldPickup !== undefined) { + return shouldPickup; } + customPickupFunctions.collectFunc(pickup, player); + pickup.Remove(); const pickupSprite = pickup.GetSprite(); @@ -88,14 +94,13 @@ export class CustomPickups extends Feature { effectSprite.Load(fileName, true); effectSprite.Play("Collect", true); - customPickupFunctions.collectFunc(player); - return undefined; }; // ModCallback.POST_EFFECT_RENDER (56) // PICKUP_EFFECT_VARIANT private readonly postEffectRenderPickupEffect = (effect: EntityEffect) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison if (effect.SubType !== PICKUP_EFFECT_SUB_TYPE) { return; } @@ -127,18 +132,27 @@ export class CustomPickups extends Feature { * @param subType The sub-type for the corresponding custom pickup. * @param collectFunc The function to run when the player collects this pickup. * @param collisionFunc Optional. The function to run when a player collides with the pickup. - * Default is a function that always returns true, meaning that the player - * will always immediately collect the pickup when they collide with it. - * Specify this function if your pickup should only be able to be collected - * under certain conditions. + * Default is a function that always returns undefined, meaning that the + * player will always immediately collect the pickup when they collide with + * it. Specify this function if your pickup should only be able to be + * collected under certain conditions. Return value acts similar to + * `ModCallback.PRE_PICKUP_COLLISION`. * @public */ @Exported public registerCustomPickup( pickupVariantCustom: PickupVariant, subType: int, - collectFunc: (this: void, player: EntityPlayer) => void, - collisionFunc: (this: void, player: EntityPlayer) => boolean = () => true, + collectFunc: ( + this: void, + pickup: EntityPickup, + player: EntityPlayer, + ) => void, + collisionFunc: ( + this: void, + pickup: EntityPickup, + player: EntityPlayer, + ) => boolean | undefined = () => undefined, ): void { const entityID = getEntityIDFromConstituents( EntityType.PICKUP, diff --git a/packages/isaacscript-common/src/classes/features/other/CustomStages.ts b/packages/isaacscript-common/src/classes/features/other/CustomStages.ts index 932889be8..08a378104 100644 --- a/packages/isaacscript-common/src/classes/features/other/CustomStages.ts +++ b/packages/isaacscript-common/src/classes/features/other/CustomStages.ts @@ -300,7 +300,7 @@ export class CustomStages extends Feature { const level = game.GetLevel(); const stage = customStage.baseStage ?? DEFAULT_BASE_STAGE; const stageType = customStage.baseStageType ?? DEFAULT_BASE_STAGE_TYPE; - level.SetStage(stage, stageType); // eslint-disable-line isaacscript/strict-enums + level.SetStage(stage, stageType); // eslint-disable-line complete/strict-enums return undefined; }; @@ -523,7 +523,7 @@ export class CustomStages extends Feature { ? DEFAULT_BASE_STAGE : (customStage.baseStage as LevelStage); if (!firstFloor) { - baseStage++; // eslint-disable-line isaacscript/strict-enums + baseStage++; // eslint-disable-line complete/strict-enums } const baseStageType: StageType = diff --git a/packages/isaacscript-common/src/classes/features/other/CustomTrapdoors.ts b/packages/isaacscript-common/src/classes/features/other/CustomTrapdoors.ts index 38f7067c4..2edbb9926 100644 --- a/packages/isaacscript-common/src/classes/features/other/CustomTrapdoors.ts +++ b/packages/isaacscript-common/src/classes/features/other/CustomTrapdoors.ts @@ -42,7 +42,7 @@ import { import { teleport } from "../../../functions/roomTransition"; import { setStage } from "../../../functions/stage"; import { getTSTLClassName } from "../../../functions/tstlClass"; -import { assertDefined } from "../../../functions/utils"; +import { assertDefined, isRepentancePlus } from "../../../functions/utils"; import { isVector } from "../../../functions/vector"; import type { CustomTrapdoorDescription } from "../../../interfaces/private/CustomTrapdoorDescription"; import { ReadonlySet } from "../../../types/ReadonlySet"; @@ -59,7 +59,10 @@ import { CUSTOM_FLOOR_STAGE } from "./customStages/constants"; const DEBUG = false as boolean; -/** This also applies to crawl spaces. The value was determined through trial and error. */ +/** + * This also applies to crawl spaces. The value was determined through trial and error to match + * vanilla behavior. + */ const TRAPDOOR_OPEN_DISTANCE = 60; const TRAPDOOR_OPEN_DISTANCE_AFTER_BOSS = TRAPDOOR_OPEN_DISTANCE * 2.5; @@ -217,8 +220,8 @@ export class CustomTrapdoors extends Feature { private checkPixelationToBlackComplete() { if ( - v.run.state !== StageTravelState.PIXELATION_TO_BLACK || - v.run.stateRenderFrame === null + v.run.state !== StageTravelState.PIXELATION_TO_BLACK + || v.run.stateRenderFrame === null ) { return; } @@ -265,16 +268,14 @@ export class CustomTrapdoors extends Feature { } private goToCustomTrapdoorDestination() { - if (v.run.customTrapdoorActivated === null) { - // This should never happen; provide some sane default values. - v.run.customTrapdoorActivated = { - destinationName: undefined, - destinationStage: LevelStage.BASEMENT_1, - destinationStageType: StageType.ORIGINAL, - open: true, - firstSpawn: true, - }; - } + // This should never be null. Regardless, we provide some sane default values. + v.run.customTrapdoorActivated ??= { + destinationName: undefined, + destinationStage: LevelStage.BASEMENT_1, + destinationStageType: StageType.ORIGINAL, + open: true, + firstSpawn: true, + }; const destinationFunc = this.getDestinationFunc( v.run.customTrapdoorActivated, @@ -309,9 +310,9 @@ export class CustomTrapdoors extends Feature { private checkSecondPixelationHalfWay() { if ( - v.run.state !== - StageTravelState.WAITING_FOR_SECOND_PIXELATION_TO_GET_HALF_WAY || - v.run.stateRenderFrame === null + v.run.state + !== StageTravelState.WAITING_FOR_SECOND_PIXELATION_TO_GET_HALF_WAY + || v.run.stateRenderFrame === null ) { return; } @@ -377,9 +378,9 @@ export class CustomTrapdoors extends Feature { private drawBlackSprite(): void { if ( - v.run.state !== StageTravelState.WAITING_FOR_FIRST_PIXELATION_TO_END && - v.run.state !== - StageTravelState.WAITING_FOR_SECOND_PIXELATION_TO_GET_HALF_WAY + v.run.state !== StageTravelState.WAITING_FOR_FIRST_PIXELATION_TO_END + && v.run.state + !== StageTravelState.WAITING_FOR_SECOND_PIXELATION_TO_GET_HALF_WAY ) { return; } @@ -417,6 +418,15 @@ export class CustomTrapdoors extends Feature { ): void { /** By default, trapdoors will never close if they are already open. */ if (trapdoorDescription.open) { + // Sometimes, the `sprite.Play(TrapdoorAnimation.OPEN_ANIMATION, true)` function does not take + // effect. Check for this case. + const sprite = gridEntity.GetSprite(); + const animation = sprite.GetAnimation(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + if (animation === TrapdoorAnimation.CLOSED) { + // Try it again. + sprite.Play(TrapdoorAnimation.OPEN_ANIMATION, true); + } return; } @@ -433,9 +443,9 @@ export class CustomTrapdoors extends Feature { const roomClear = room.IsClear(); return ( - !anyPlayerCloserThan(gridEntity.Position, TRAPDOOR_OPEN_DISTANCE) && - !this.isPlayerCloseAfterBoss(gridEntity.Position) && - !shouldBeClosedFromStartingInRoomWithEnemies(firstSpawn, roomClear) + !anyPlayerCloserThan(gridEntity.Position, TRAPDOOR_OPEN_DISTANCE) + && !this.isPlayerCloseAfterBoss(gridEntity.Position) + && !shouldBeClosedFromStartingInRoomWithEnemies(firstSpawn, roomClear) ); } @@ -447,9 +457,11 @@ export class CustomTrapdoors extends Feature { // In order to prevent a player from accidentally entering a freshly-spawned trapdoor after // killing the boss of the floor, we use a wider open distance for a short amount of frames. if ( - roomType !== RoomType.BOSS || - roomClearGameFrame === undefined || - onOrAfterRenderFrame(roomClearGameFrame + TRAPDOOR_BOSS_REACTION_FRAMES) + roomType !== RoomType.BOSS + || roomClearGameFrame === undefined + || onOrAfterRenderFrame( + roomClearGameFrame + TRAPDOOR_BOSS_REACTION_FRAMES, + ) ) { return false; } @@ -482,9 +494,9 @@ export class CustomTrapdoors extends Feature { if ( // We don't want a Pony dash to transition to a new floor or a crawl space. - !this.ponyDetection.isPlayerUsingPony(player) && - !isChildPlayer(player) && - canPlayerInteractWithTrapdoor(player) + !this.ponyDetection.isPlayerUsingPony(player) + && !isChildPlayer(player) + && canPlayerInteractWithTrapdoor(player) ) { this.playerTouchedCustomTrapdoor( gridEntity, @@ -514,7 +526,10 @@ export class CustomTrapdoors extends Feature { // We don't want to allow pausing, since that will allow render frames to pass without advancing // the stage traveling logic. (We track how many render frames have passed to know when to move // to the next step.) - const whitelist = new ReadonlySet([ButtonAction.CONSOLE]); + const buttonActionConsole = isRepentancePlus() + ? ButtonAction.CONSOLE_REPENTANCE_PLUS + : ButtonAction.CONSOLE_REPENTANCE; + const whitelist = new ReadonlySet([buttonActionConsole]); this.disableInputs.disableAllInputsExceptFor(tstlClassName, whitelist); setPlayerAttributes(player, gridEntity.Position); dropTaintedForgotten(player); @@ -744,21 +759,16 @@ export class CustomTrapdoors extends Feature { spawnOpen?: boolean, ): GridEntity { if ( - destinationName !== undefined && - !this.destinationFuncMap.has(destinationName) + destinationName !== undefined + && !this.destinationFuncMap.has(destinationName) ) { error( `Failed to spawn a custom trapdoor with a destination of "${destinationName}" since a destination with that name has not been registered with the "registerCustomTrapdoorDestination" function. (If you are trying to go to a custom stage, the custom stage library should automatically do this for you when your mod first boots.)`, ); } - if (destinationStage === undefined) { - destinationStage = this.stageHistory.getNextStageWithHistory(); - } - - if (destinationStageType === undefined) { - destinationStageType = this.stageHistory.getNextStageTypeWithHistory(); - } + destinationStage ??= this.stageHistory.getNextStageWithHistory(); + destinationStageType ??= this.stageHistory.getNextStageTypeWithHistory(); const room = game.GetRoom(); const roomListIndex = getRoomListIndex(); @@ -826,8 +836,8 @@ function canPlayerInteractWithTrapdoor(player: EntityPlayer) { const sprite = player.GetSprite(); const animation = sprite.GetAnimation(); return ( - !player.IsHoldingItem() && - !ANIMATIONS_THAT_PREVENT_STAGE_TRAVEL.has(animation) + !player.IsHoldingItem() + && !ANIMATIONS_THAT_PREVENT_STAGE_TRAVEL.has(animation) ); } diff --git a/packages/isaacscript-common/src/classes/features/other/DeployJSONRoom.ts b/packages/isaacscript-common/src/classes/features/other/DeployJSONRoom.ts index 4421e78f4..1aa91805d 100644 --- a/packages/isaacscript-common/src/classes/features/other/DeployJSONRoom.ts +++ b/packages/isaacscript-common/src/classes/features/other/DeployJSONRoom.ts @@ -161,8 +161,9 @@ export class DeployJSONRoom extends Feature { let entity: Entity; if ( - entityType === EntityType.PICKUP && - variant === PickupVariant.COLLECTIBLE + entityType === EntityType.PICKUP + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && variant === PickupVariant.COLLECTIBLE ) { const collectibleType = asCollectibleType(subType); const options = roomType === RoomType.ANGEL; @@ -173,8 +174,9 @@ export class DeployJSONRoom extends Feature { // For some reason, Pitfalls do not spawn with the correct collision classes. if ( - entityType === EntityType.PITFALL && - variant === PitfallVariant.PITFALL + entityType === EntityType.PITFALL + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && variant === PitfallVariant.PITFALL ) { entity.EntityCollisionClass = EntityCollisionClass.ENEMIES; entity.GridCollisionClass = EntityGridCollisionClass.WALLS; diff --git a/packages/isaacscript-common/src/classes/features/other/DisableInputs.ts b/packages/isaacscript-common/src/classes/features/other/DisableInputs.ts index a396c4b47..f7e543a44 100644 --- a/packages/isaacscript-common/src/classes/features/other/DisableInputs.ts +++ b/packages/isaacscript-common/src/classes/features/other/DisableInputs.ts @@ -122,9 +122,9 @@ export class DisableInputs extends Feature { @Exported public areInputsEnabled(): boolean { return ( - v.run.disableInputs.size === 0 && - v.run.enableAllInputsWithBlacklistMap.size === 0 && - v.run.disableAllInputsWithWhitelistMap.size === 0 + v.run.disableInputs.size === 0 + && v.run.enableAllInputsWithBlacklistMap.size === 0 + && v.run.disableAllInputsWithWhitelistMap.size === 0 ); } diff --git a/packages/isaacscript-common/src/classes/features/other/EdenStartingStatsHealth.ts b/packages/isaacscript-common/src/classes/features/other/EdenStartingStatsHealth.ts index d7b9be823..34aaabb47 100644 --- a/packages/isaacscript-common/src/classes/features/other/EdenStartingStatsHealth.ts +++ b/packages/isaacscript-common/src/classes/features/other/EdenStartingStatsHealth.ts @@ -130,7 +130,9 @@ export class EdenStartingStatsHealth extends Feature { * @public */ @Exported - public getEdenStartingCollectibles(player: EntityPlayer): CollectibleType[] { + public getEdenStartingCollectibles( + player: EntityPlayer, + ): readonly CollectibleType[] { const collectibleTypes: CollectibleType[] = []; const activeCollectibleType = mapGetPlayer( diff --git a/packages/isaacscript-common/src/classes/features/other/FastReset.ts b/packages/isaacscript-common/src/classes/features/other/FastReset.ts index 2879ef0bb..2e0b90f52 100644 --- a/packages/isaacscript-common/src/classes/features/other/FastReset.ts +++ b/packages/isaacscript-common/src/classes/features/other/FastReset.ts @@ -6,6 +6,7 @@ import { isModifierKeyPressed, } from "../../../functions/input"; import { restart } from "../../../functions/run"; +import { isRepentancePlus } from "../../../functions/utils"; import { Feature } from "../../private/Feature"; /** A global variable set by custom consoles. */ @@ -86,7 +87,10 @@ function checkResetInput() { // Check to see if the player has pressed the restart input. (We check all inputs instead of // `player.ControllerIndex` because a controller player might be using the keyboard to reset.) - if (isActionTriggeredOnAnyInput(ButtonAction.RESTART)) { + const buttonActionRestart = isRepentancePlus() + ? ButtonAction.RESTART_REPENTANCE_PLUS + : ButtonAction.RESTART_REPENTANCE; + if (isActionTriggeredOnAnyInput(buttonActionRestart)) { restart(); } } diff --git a/packages/isaacscript-common/src/classes/features/other/ModdedElementDetection.ts b/packages/isaacscript-common/src/classes/features/other/ModdedElementDetection.ts index e750d603c..38465ff5a 100644 --- a/packages/isaacscript-common/src/classes/features/other/ModdedElementDetection.ts +++ b/packages/isaacscript-common/src/classes/features/other/ModdedElementDetection.ts @@ -19,17 +19,17 @@ import { import { Exported } from "../../../decorators"; import { Feature } from "../../private/Feature"; -// eslint-disable-next-line isaacscript/strict-enums +// eslint-disable-next-line complete/strict-enums const FIRST_MODDED_COLLECTIBLE_TYPE: CollectibleType = LAST_VANILLA_COLLECTIBLE_TYPE + 1; -// eslint-disable-next-line isaacscript/strict-enums +// eslint-disable-next-line complete/strict-enums const FIRST_MODDED_TRINKET_TYPE: TrinketType = LAST_VANILLA_TRINKET_TYPE + 1; -// eslint-disable-next-line isaacscript/strict-enums +// eslint-disable-next-line complete/strict-enums const FIRST_MODDED_CARD_TYPE: CardType = LAST_VANILLA_CARD_TYPE + 1; -// eslint-disable-next-line isaacscript/strict-enums +// eslint-disable-next-line complete/strict-enums const FIRST_MODDED_PILL_EFFECT: PillEffect = LAST_VANILLA_PILL_EFFECT + 1; /** diff --git a/packages/isaacscript-common/src/classes/features/other/ModdedElementSets.ts b/packages/isaacscript-common/src/classes/features/other/ModdedElementSets.ts index 8fd8bbe26..b08335c20 100644 --- a/packages/isaacscript-common/src/classes/features/other/ModdedElementSets.ts +++ b/packages/isaacscript-common/src/classes/features/other/ModdedElementSets.ts @@ -411,8 +411,8 @@ export class ModdedElementSets extends Feature { private lazyInitEdenCollectibleTypesSet() { for (const collectibleType of this.getCollectibleTypes()) { if ( - isHiddenCollectible(collectibleType) || - collectibleHasTag(collectibleType, ItemConfigTag.NO_EDEN) + isHiddenCollectible(collectibleType) + || collectibleHasTag(collectibleType, ItemConfigTag.NO_EDEN) ) { continue; } @@ -574,7 +574,7 @@ export class ModdedElementSets extends Feature { @Exported public getPlayerCollectibleMap( player: EntityPlayer, - ): Map { + ): ReadonlyMap { const collectibleArray = this.getCollectibleTypes(); const collectibleMap = new Map(); @@ -603,7 +603,7 @@ export class ModdedElementSets extends Feature { } } - collectibleType--; // eslint-disable-line isaacscript/strict-enums + collectibleType--; // eslint-disable-line complete/strict-enums } while (itemConfigItem !== undefined); } @@ -976,7 +976,7 @@ export class ModdedElementSets extends Feature { public getPlayerTrinketsWithCacheFlag( player: EntityPlayer, cacheFlag: CacheFlag, - ): Map { + ): ReadonlyMap { const trinketTypesWithCacheFlag = this.getTrinketsTypesWithCacheFlag(cacheFlag); diff --git a/packages/isaacscript-common/src/classes/features/other/NoSirenSteal.ts b/packages/isaacscript-common/src/classes/features/other/NoSirenSteal.ts index 7cfed4523..ba1af6424 100644 --- a/packages/isaacscript-common/src/classes/features/other/NoSirenSteal.ts +++ b/packages/isaacscript-common/src/classes/features/other/NoSirenSteal.ts @@ -59,16 +59,16 @@ export class NoSirenSteal extends Feature { const [familiarVariant, familiarSubType] = familiarTuple; if ( - familiarVariant === incomingFamiliarVariant && - familiarSubType === incomingFamiliarSubType + familiarVariant === incomingFamiliarVariant + && familiarSubType === incomingFamiliarSubType ) { // There is an entry that matches the variant and sub-type exactly. return true; } if ( - familiarVariant === incomingFamiliarVariant && - familiarSubType === undefined + familiarVariant === incomingFamiliarVariant + && familiarSubType === undefined ) { // There is an entry that matches all sub-types for this variant. return true; diff --git a/packages/isaacscript-common/src/classes/features/other/Pause.ts b/packages/isaacscript-common/src/classes/features/other/Pause.ts index 81142a6cf..707fff42f 100644 --- a/packages/isaacscript-common/src/classes/features/other/Pause.ts +++ b/packages/isaacscript-common/src/classes/features/other/Pause.ts @@ -3,7 +3,9 @@ import { CollectibleType, InputHook, ModCallback, + SoundEffect, } from "isaac-typescript-definitions"; +import { sfxManager } from "../../../core/cachedClasses"; import { VectorZero } from "../../../core/constants"; import { Exported } from "../../../decorators"; import { @@ -17,7 +19,7 @@ import { logError } from "../../../functions/log"; import { useActiveItemTemp } from "../../../functions/playerCollectibles"; import { getAllPlayers } from "../../../functions/playerIndex"; import { getTSTLClassName } from "../../../functions/tstlClass"; -import { assertDefined } from "../../../functions/utils"; +import { assertDefined, isRepentancePlus } from "../../../functions/utils"; import { ReadonlySet } from "../../../types/ReadonlySet"; import { Feature } from "../../private/Feature"; import type { DisableInputs } from "./DisableInputs"; @@ -73,6 +75,10 @@ export class Pause extends Feature { const firstPlayer = Isaac.GetPlayer(); useActiveItemTemp(firstPlayer, CollectibleType.PAUSE); + if (isRepentancePlus()) { + sfxManager.Stop(SoundEffect.PAUSE_FREEZE); + } + this.stopTearsAndProjectilesFromMoving(); }; @@ -178,15 +184,22 @@ export class Pause extends Feature { const firstPlayer = Isaac.GetPlayer(); useActiveItemTemp(firstPlayer, CollectibleType.PAUSE); + if (isRepentancePlus()) { + sfxManager.Stop(SoundEffect.PAUSE_FREEZE); + } + const tstlClassName = getTSTLClassName(this); assertDefined( tstlClassName, "Failed to get the class name for the pause feature.", ); + const buttonActionConsole = isRepentancePlus() + ? ButtonAction.CONSOLE_REPENTANCE_PLUS + : ButtonAction.CONSOLE_REPENTANCE; const whitelist = new ReadonlySet([ ButtonAction.MENU_CONFIRM, - ButtonAction.CONSOLE, + buttonActionConsole, ]); this.disableInputs.disableAllInputsExceptFor(tstlClassName, whitelist); diff --git a/packages/isaacscript-common/src/classes/features/other/PickupIndexCreation.ts b/packages/isaacscript-common/src/classes/features/other/PickupIndexCreation.ts index aa4a57dd9..308100514 100644 --- a/packages/isaacscript-common/src/classes/features/other/PickupIndexCreation.ts +++ b/packages/isaacscript-common/src/classes/features/other/PickupIndexCreation.ts @@ -95,9 +95,9 @@ export class PickupIndexCreation extends Feature { const room = game.GetRoom(); const isFirstVisit = room.IsFirstVisit(); if ( - pickupIndexFromLevelData !== undefined && - !isFirstVisit && - onOrBeforeRoomFrame(0) + pickupIndexFromLevelData !== undefined + && !isFirstVisit + && onOrBeforeRoomFrame(0) ) { v.room.pickupIndexes.set(ptrHash, pickupIndexFromLevelData); return; @@ -116,9 +116,7 @@ export class PickupIndexCreation extends Feature { v.level.pickupData.getAndSetDefault(roomListIndex); let pickupIndex = getStoredPickupIndex(pickup, pickupDescriptions); - if (pickupIndex === undefined) { - pickupIndex = this.getPostAscentPickupIndex(pickup); - } + pickupIndex ??= this.getPostAscentPickupIndex(pickup); return pickupIndex; } @@ -186,6 +184,7 @@ export class PickupIndexCreation extends Feature { * pickup could re-appear during The Ascent. If this is the case, we store the metadata on a * separate map to reference later. */ + // eslint-disable-next-line complete/no-mutable-return private getPickupDataMapForCurrentRoom(): | Map | undefined { @@ -283,8 +282,8 @@ function getStoredPickupIndex( ): PickupIndex | undefined { for (const [pickupIndex, pickupDescription] of pickupDescriptions) { if ( - vectorEquals(pickupDescription.position, pickup.Position) && - pickupDescription.initSeed === pickup.InitSeed + vectorEquals(pickupDescription.position, pickup.Position) + && pickupDescription.initSeed === pickup.InitSeed ) { return pickupIndex; } diff --git a/packages/isaacscript-common/src/classes/features/other/PonyDetection.ts b/packages/isaacscript-common/src/classes/features/other/PonyDetection.ts index ff13b9429..caefb6775 100644 --- a/packages/isaacscript-common/src/classes/features/other/PonyDetection.ts +++ b/packages/isaacscript-common/src/classes/features/other/PonyDetection.ts @@ -44,8 +44,8 @@ export class PonyDetection extends Feature { const effects = player.GetEffects(); const entityFlags = player.GetEntityFlags(); const hasPonyCollectibleEffect = - effects.HasCollectibleEffect(CollectibleType.PONY) || - effects.HasCollectibleEffect(CollectibleType.WHITE_PONY); + effects.HasCollectibleEffect(CollectibleType.PONY) + || effects.HasCollectibleEffect(CollectibleType.WHITE_PONY); const isPonyActiveOnPreviousFrame = setHasPlayer( v.run.playersIsPonyActive, player, diff --git a/packages/isaacscript-common/src/classes/features/other/PressInput.ts b/packages/isaacscript-common/src/classes/features/other/PressInput.ts index ab89b8d64..96835e0f7 100644 --- a/packages/isaacscript-common/src/classes/features/other/PressInput.ts +++ b/packages/isaacscript-common/src/classes/features/other/PressInput.ts @@ -55,8 +55,8 @@ export class PressInput extends Feature { const pair = v.run.buttonActionPairs[i]!; if ( - pair.playerIndex === playerIndex && - pair.buttonAction === buttonAction + pair.playerIndex === playerIndex + && pair.buttonAction === buttonAction ) { v.run.buttonActionPairs.splice(i); return true; diff --git a/packages/isaacscript-common/src/classes/features/other/PreventChildEntities.ts b/packages/isaacscript-common/src/classes/features/other/PreventChildEntities.ts index b53a43ea3..b863997d1 100644 --- a/packages/isaacscript-common/src/classes/features/other/PreventChildEntities.ts +++ b/packages/isaacscript-common/src/classes/features/other/PreventChildEntities.ts @@ -25,12 +25,12 @@ export class PreventChildEntities extends Feature { // ModCallback.POST_NPC_INIT (27) private readonly postNPCInit = (npc: EntityNPC) => { const spawnerEntityMatch = - npc.SpawnerEntity !== undefined && - v.room.preventingEntities.has(GetPtrHash(npc.SpawnerEntity)); + npc.SpawnerEntity !== undefined + && v.room.preventingEntities.has(GetPtrHash(npc.SpawnerEntity)); const parentMatch = - npc.Parent !== undefined && - v.room.preventingEntities.has(GetPtrHash(npc.Parent)); + npc.Parent !== undefined + && v.room.preventingEntities.has(GetPtrHash(npc.Parent)); if (spawnerEntityMatch || parentMatch) { npc.Remove(); diff --git a/packages/isaacscript-common/src/classes/features/other/RoomHistory.ts b/packages/isaacscript-common/src/classes/features/other/RoomHistory.ts index 84a766907..bf45f7da0 100644 --- a/packages/isaacscript-common/src/classes/features/other/RoomHistory.ts +++ b/packages/isaacscript-common/src/classes/features/other/RoomHistory.ts @@ -192,11 +192,11 @@ export class RoomHistory extends Feature { } return ( - startSeedString !== latestRoomDescription.startSeedString || - stage !== latestRoomDescription.stage || - stageType !== latestRoomDescription.stageType || - roomListIndex !== latestRoomDescription.roomListIndex || - roomVisitedCount !== latestRoomDescription.roomVisitedCount + startSeedString !== latestRoomDescription.startSeedString + || stage !== latestRoomDescription.stage + || stageType !== latestRoomDescription.stageType + || roomListIndex !== latestRoomDescription.roomListIndex + || roomVisitedCount !== latestRoomDescription.roomVisitedCount ); } } diff --git a/packages/isaacscript-common/src/classes/features/other/RunInNFrames.ts b/packages/isaacscript-common/src/classes/features/other/RunInNFrames.ts index 92a859e2b..d7a34184f 100644 --- a/packages/isaacscript-common/src/classes/features/other/RunInNFrames.ts +++ b/packages/isaacscript-common/src/classes/features/other/RunInNFrames.ts @@ -347,7 +347,7 @@ export class RunInNFrames extends Feature { } function checkExecuteQueuedFunctions( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types queuedFunctions: QueuedFunction[], frameCount: int, newNumRoomsEntered: int, @@ -368,7 +368,7 @@ function checkExecuteQueuedFunctions( } function checkExecuteIntervalFunctions( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types intervalFunctions: IntervalFunction[], frameCount: int, newNumRoomsEntered: int, diff --git a/packages/isaacscript-common/src/classes/features/other/SaveDataManager.ts b/packages/isaacscript-common/src/classes/features/other/SaveDataManager.ts index d3e890714..b09d8c464 100644 --- a/packages/isaacscript-common/src/classes/features/other/SaveDataManager.ts +++ b/packages/isaacscript-common/src/classes/features/other/SaveDataManager.ts @@ -104,7 +104,7 @@ export class SaveDataManager extends Feature { // 18 // We want to avoid a needless dependency on the `GameReorderedCallbacks` feature. - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated [ModCallback.POST_NEW_LEVEL, this.postNewLevel], ]; @@ -393,8 +393,8 @@ export class SaveDataManager extends Feature { private storeClassConstructorsFromObject(luaMap: LuaMap) { const tstlClassName = getTSTLClassName(luaMap); if ( - tstlClassName !== undefined && - !NON_USER_DEFINED_CLASS_NAMES.has(tstlClassName) + tstlClassName !== undefined + && !NON_USER_DEFINED_CLASS_NAMES.has(tstlClassName) ) { this.classConstructors.set(tstlClassName, luaMap as unknown as AnyClass); } diff --git a/packages/isaacscript-common/src/classes/features/other/StageHistory.ts b/packages/isaacscript-common/src/classes/features/other/StageHistory.ts index 52e687f8b..3b5829bb9 100644 --- a/packages/isaacscript-common/src/classes/features/other/StageHistory.ts +++ b/packages/isaacscript-common/src/classes/features/other/StageHistory.ts @@ -323,8 +323,8 @@ export class StageHistory extends Feature { return v.run.stageHistory.some( (stageHistoryEntry) => - stageHistoryEntry.stage === stage && - stageHistoryEntry.stageType === stageType, + stageHistoryEntry.stage === stage + && stageHistoryEntry.stageType === stageType, ); } } diff --git a/packages/isaacscript-common/src/classes/features/other/StartAmbush.ts b/packages/isaacscript-common/src/classes/features/other/StartAmbush.ts index a59c86cf0..94019b5cc 100644 --- a/packages/isaacscript-common/src/classes/features/other/StartAmbush.ts +++ b/packages/isaacscript-common/src/classes/features/other/StartAmbush.ts @@ -60,8 +60,8 @@ export class StartAmbush extends Feature { const coins = getCoins(); const coinsFromSack = coins.filter( (pickup) => - pickup.SpawnerEntity !== undefined && - GetPtrHash(pickup.SpawnerEntity) === sackPtrHash, + pickup.SpawnerEntity !== undefined + && GetPtrHash(pickup.SpawnerEntity) === sackPtrHash, ); removeEntities(coinsFromSack); }); diff --git a/packages/isaacscript-common/src/classes/features/other/TaintedLazarusPlayers.ts b/packages/isaacscript-common/src/classes/features/other/TaintedLazarusPlayers.ts index 52ef23f0e..517e14d0e 100644 --- a/packages/isaacscript-common/src/classes/features/other/TaintedLazarusPlayers.ts +++ b/packages/isaacscript-common/src/classes/features/other/TaintedLazarusPlayers.ts @@ -70,8 +70,8 @@ export class TaintedLazarusPlayers extends Feature { */ private checkDequeue() { if ( - v.run.queuedTaintedLazarus.length === 0 || - v.run.queuedDeadTaintedLazarus.length === 0 + v.run.queuedTaintedLazarus.length === 0 + || v.run.queuedDeadTaintedLazarus.length === 0 ) { return; } diff --git a/packages/isaacscript-common/src/classes/features/other/customStages/backdrop.ts b/packages/isaacscript-common/src/classes/features/other/customStages/backdrop.ts index 525aeb2b8..6e2bb89e8 100644 --- a/packages/isaacscript-common/src/classes/features/other/customStages/backdrop.ts +++ b/packages/isaacscript-common/src/classes/features/other/customStages/backdrop.ts @@ -57,7 +57,7 @@ const ROOM_SHAPE_WALL_ANM2_LAYERS = { } as const satisfies Record; // We don't use `as const` since we need the object to be indexable by all `RoomShape`. -// eslint-disable-next-line isaacscript/require-capital-const-assertions +// eslint-disable-next-line complete/require-capital-const-assertions const ROOM_SHAPE_WALL_EXTRA_ANM2_LAYERS: Readonly< Partial> > = { diff --git a/packages/isaacscript-common/src/classes/features/other/customStages/gridEntities.ts b/packages/isaacscript-common/src/classes/features/other/customStages/gridEntities.ts index 8d2e4c0db..b22f5eafb 100644 --- a/packages/isaacscript-common/src/classes/features/other/customStages/gridEntities.ts +++ b/packages/isaacscript-common/src/classes/features/other/customStages/gridEntities.ts @@ -14,8 +14,8 @@ export function setCustomDecorationGraphics( // If the end-user did not specify custom decoration graphics, default to Basement graphics. (We // don't have to adjust anything for this case.) if ( - customStage.decorationsPNGPath === undefined && - customStage.decorationsANM2Path === undefined + customStage.decorationsPNGPath === undefined + && customStage.decorationsANM2Path === undefined ) { return; } @@ -56,8 +56,8 @@ export function setCustomRockGraphics( // If the end-user did not specify custom rock graphics, default to Basement graphics. (We don't // have to adjust anything for this case.) if ( - customStage.rocksPNGPath === undefined && - customStage.rocksANM2Path === undefined + customStage.rocksPNGPath === undefined + && customStage.rocksANM2Path === undefined ) { return; } diff --git a/packages/isaacscript-common/src/classes/features/other/customStages/streakText.ts b/packages/isaacscript-common/src/classes/features/other/customStages/streakText.ts index 5c04de4d8..86c8c63ca 100644 --- a/packages/isaacscript-common/src/classes/features/other/customStages/streakText.ts +++ b/packages/isaacscript-common/src/classes/features/other/customStages/streakText.ts @@ -100,8 +100,8 @@ export function streakTextPostRender(): void { function checkEndTopStreakText() { if ( - v.run.topStreakTextStartedRenderFrame === null || - v.run.topStreakText.animation !== UIStreakAnimation.TEXT_STAY + v.run.topStreakTextStartedRenderFrame === null + || v.run.topStreakText.animation !== UIStreakAnimation.TEXT_STAY ) { return; } @@ -229,8 +229,8 @@ function renderStreakText( } if ( - streakText.animation === UIStreakAnimation.TEXT && - streakText.frame === TEXT_STAY_FRAME + streakText.animation === UIStreakAnimation.TEXT + && streakText.frame === TEXT_STAY_FRAME ) { streakText.animation = UIStreakAnimation.TEXT_STAY; streakText.frame = 0; diff --git a/packages/isaacscript-common/src/classes/features/other/extraConsoleCommands/commands.ts b/packages/isaacscript-common/src/classes/features/other/extraConsoleCommands/commands.ts index e6195c82a..010aa4873 100644 --- a/packages/isaacscript-common/src/classes/features/other/extraConsoleCommands/commands.ts +++ b/packages/isaacscript-common/src/classes/features/other/extraConsoleCommands/commands.ts @@ -414,7 +414,7 @@ export function cards(): void { const worldPosition = gridCoordinatesToWorldPosition(x, y); spawnCard(cardType, worldPosition); - cardType++; // eslint-disable-line isaacscript/strict-enums + cardType++; // eslint-disable-line complete/strict-enums } } } @@ -1115,7 +1115,7 @@ export function pills(): void { const worldPosition = gridCoordinatesToWorldPosition(x, y); spawnPill(pillColor, worldPosition); - pillColor++; // eslint-disable-line isaacscript/strict-enums + pillColor++; // eslint-disable-line complete/strict-enums } y = 2; @@ -1127,7 +1127,7 @@ export function pills(): void { const worldPosition = gridCoordinatesToWorldPosition(x, y); spawnPill(pillColor, worldPosition); - pillColor++; // eslint-disable-line isaacscript/strict-enums + pillColor++; // eslint-disable-line complete/strict-enums } y = 3; @@ -1156,8 +1156,8 @@ export function pocket(params: string): void { const collectibleType = parseIntSafe(params); if ( - collectibleType === undefined || - !isValidCollectibleType(collectibleType) + collectibleType === undefined + || !isValidCollectibleType(collectibleType) ) { print(`Invalid collectible type: ${collectibleType}`); return; @@ -1259,10 +1259,10 @@ export function s(params: string): void { let stageString: string; let stageTypeLetter: string; if ( - finalCharacter === "a" || - finalCharacter === "b" || - finalCharacter === "c" || - finalCharacter === "d" + finalCharacter === "a" + || finalCharacter === "b" + || finalCharacter === "c" + || finalCharacter === "d" ) { // e.g. "s 11a" for going to The Chest stageString = params.slice(0, -1); @@ -1553,8 +1553,8 @@ export function spawnCollectibleAt(params: string): void { const collectibleType = parseIntSafe(collectibleTypeString); if ( - collectibleType === undefined || - !isValidCollectibleType(collectibleType) + collectibleType === undefined + || !isValidCollectibleType(collectibleType) ) { print(`Invalid collectible type: ${args[0]}`); return; diff --git a/packages/isaacscript-common/src/classes/features/other/saveDataManager/glowingHourGlass.ts b/packages/isaacscript-common/src/classes/features/other/saveDataManager/glowingHourGlass.ts index 78d01265f..d361b3bfa 100644 --- a/packages/isaacscript-common/src/classes/features/other/saveDataManager/glowingHourGlass.ts +++ b/packages/isaacscript-common/src/classes/features/other/saveDataManager/glowingHourGlass.ts @@ -140,8 +140,10 @@ export function restoreGlowingHourGlassBackup( function getKeysToBackup(saveData: SaveData) { const shouldBackupPersistentObject = - saveData.persistent !== undefined && - (saveData.persistent as LuaTable).has(REWIND_WITH_GLOWING_HOUR_GLASS_KEY); + saveData.persistent !== undefined + && (saveData.persistent as LuaTable).has( + REWIND_WITH_GLOWING_HOUR_GLASS_KEY, + ); return shouldBackupPersistentObject ? ([...GLOWING_HOUR_GLASS_BACKUP_KEYS, SaveDataKey.PERSISTENT] as const) diff --git a/packages/isaacscript-common/src/classes/features/other/saveDataManager/loadFromDisk.ts b/packages/isaacscript-common/src/classes/features/other/saveDataManager/loadFromDisk.ts index 8b2afc1c2..6fabfabd4 100644 --- a/packages/isaacscript-common/src/classes/features/other/saveDataManager/loadFromDisk.ts +++ b/packages/isaacscript-common/src/classes/features/other/saveDataManager/loadFromDisk.ts @@ -23,6 +23,11 @@ export function loadFromDisk( const jsonString = readSaveDatFile(mod); const newSaveData = jsonDecode(jsonString); + if (newSaveData === undefined) { + // Reading the save data failed. + return; + } + if (SAVE_DATA_MANAGER_DEBUG) { log('Converted data from the "save#.dat" to a Lua table.'); } diff --git a/packages/isaacscript-common/src/classes/features/other/saveDataManager/restoreDefaults.ts b/packages/isaacscript-common/src/classes/features/other/saveDataManager/restoreDefaults.ts index 6c0f1152b..a1ae6fb58 100644 --- a/packages/isaacscript-common/src/classes/features/other/saveDataManager/restoreDefaults.ts +++ b/packages/isaacscript-common/src/classes/features/other/saveDataManager/restoreDefaults.ts @@ -80,7 +80,7 @@ export function restoreDefaultForFeatureKey( const childTableDefaults = saveDataDefaults[saveDataKey]; if (childTableDefaults === undefined) { logError( - `Failed to find the default copy of the child table "${saveDataKey}" for subscriber "${subscriberName}". This error usually means that your mod-specific save data is out of date. You can try purging all of your mod-specific save data by deleting the following directory: C:\\Program Files (x86)\\Steam\\steamapps\\common\\The Binding of Isaac Rebirth\\data`, + String.raw`Failed to find the default copy of the child table "${saveDataKey}" for subscriber "${subscriberName}". This error usually means that your mod-specific save data is out of date. You can try purging all of your mod-specific save data by deleting the following directory: C:\Program Files (x86)\Steam\steamapps\common\The Binding of Isaac Rebirth\data`, ); return; } diff --git a/packages/isaacscript-common/src/core/constants.ts b/packages/isaacscript-common/src/core/constants.ts index 093003f96..c3befe41f 100644 --- a/packages/isaacscript-common/src/core/constants.ts +++ b/packages/isaacscript-common/src/core/constants.ts @@ -276,6 +276,8 @@ export const NUM_DIMENSIONS = getEnumLength(Dimension) - 1; /** * An array containing every valid `Dimension`, not including `Dimension.CURRENT`. (This is derived * from the `NUM_DIMENSIONS` constant.) + * + * We cannot use the values of the `Dimension` enum because it includes -1. */ export const DIMENSIONS: readonly Dimension[] = eRange( NUM_DIMENSIONS, @@ -295,7 +297,7 @@ export const ONE_BY_ONE_ROOM_GRID_SIZE = 135; * An array representing every valid collectible type quality. Specifically, this is: `[0, 1, 2, 3, * 4]` */ -// eslint-disable-next-line isaacscript/require-capital-const-assertions +// eslint-disable-next-line complete/require-capital-const-assertions export const QUALITIES: readonly Quality[] = [0, 1, 2, 3, 4]; export const MAX_QUALITY: Quality = 4; diff --git a/packages/isaacscript-common/src/core/constantsVanilla.ts b/packages/isaacscript-common/src/core/constantsVanilla.ts index 8981586ca..0135ad887 100644 --- a/packages/isaacscript-common/src/core/constantsVanilla.ts +++ b/packages/isaacscript-common/src/core/constantsVanilla.ts @@ -53,7 +53,7 @@ export const VANILLA_COLLECTIBLE_TYPE_RANGE: readonly int[] = iRange( * * If you need to do O(1) lookups, use the `VANILLA_COLLECTIBLE_TYPES_SET` constant instead. */ -// eslint-disable-next-line isaacscript/strict-enums +// eslint-disable-next-line complete/strict-enums export const VANILLA_COLLECTIBLE_TYPES: readonly CollectibleType[] = VANILLA_COLLECTIBLE_TYPE_RANGE.filter((potentialCollectibleType) => { const collectibleType = asCollectibleType(potentialCollectibleType); @@ -93,7 +93,7 @@ export const VANILLA_TRINKET_TYPE_RANGE: readonly int[] = iRange( * * If you need to do O(1) lookups, use the `VANILLA_TRINKET_TYPES_SET` constant instead. */ -// eslint-disable-next-line isaacscript/strict-enums +// eslint-disable-next-line complete/strict-enums export const VANILLA_TRINKET_TYPES: readonly TrinketType[] = VANILLA_TRINKET_TYPE_RANGE.filter((potentialTrinketType) => { const trinketType = asTrinketType(potentialTrinketType); @@ -130,7 +130,7 @@ export const VANILLA_CARD_TYPE_RANGE: readonly int[] = iRange( * * If you need to do O(1) lookups, use the `VANILLA_CARD_TYPES_SET` constant instead. */ -// eslint-disable-next-line isaacscript/strict-enums +// eslint-disable-next-line complete/strict-enums export const VANILLA_CARD_TYPES: readonly CardType[] = VANILLA_CARD_TYPE_RANGE.filter((potentialCardType) => { const cardType = asCardType(potentialCardType); @@ -167,7 +167,7 @@ export const VANILLA_PILL_EFFECT_RANGE: readonly int[] = iRange( * * If you need to do O(1) lookups, use the `VANILLA_PILL_EFFECT_SET` constant instead. */ -// eslint-disable-next-line isaacscript/strict-enums +// eslint-disable-next-line complete/strict-enums export const VANILLA_PILL_EFFECTS: readonly PillEffect[] = VANILLA_PILL_EFFECT_RANGE.filter((potentialPillEffect) => { const pillEffect = asPillEffect(potentialPillEffect); diff --git a/packages/isaacscript-common/src/enums/ModCallbackCustom.ts b/packages/isaacscript-common/src/enums/ModCallbackCustom.ts index bdfbd9f18..5786e30a8 100644 --- a/packages/isaacscript-common/src/enums/ModCallbackCustom.ts +++ b/packages/isaacscript-common/src/enums/ModCallbackCustom.ts @@ -415,6 +415,24 @@ export enum ModCallbackCustom { */ POST_ENTITY_KILL_FILTER, + /** + * The exact same thing as the vanilla `POST_ENTITY_REMOVE` callback, except this callback allows + * you to specify extra arguments for additional filtration. + * + * When registering the callback with the `ModUpgraded.AddCallbackCustom` method: + * - You can provide an optional third argument that will make the callback only fire if it + * matches the `EntityType` provided. + * - You can provide an optional fourth argument that will make the callback only fire if it + * matches the variant provided. + * - You can provide an optional fifth argument that will make the callback only fire if it + * matches the sub-type provided. + * + * ```ts + * function postEntityRemoveFilter(entity: Entity): void {} + * ``` + */ + POST_ENTITY_REMOVE_FILTER, + /** * Fires one `POST_UPDATE` frame after the player has used the Esau Jr. item. (The player is not * updated to the new character until a game frame has passed.) @@ -573,10 +591,11 @@ export enum ModCallbackCustom { * * `POST_GAME_STARTED_REORDERED` --> `POST_NEW_LEVEL_REORDERED` --> `POST_NEW_ROOM_REORDERED` * - * - You must provide a third argument: - * - Pass true if you want the callback to only fire if the run is continued. - * - Pass false if you want the callback to only fire when the run is not continued. - * - Pass undefined if you want the callback to fire in both situations. + * You must provide a third argument: + * + * - Pass true if you want the callback to only fire if the run is continued. + * - Pass false if you want the callback to only fire when the run is not continued. + * - Pass undefined if you want the callback to fire in both situations. * * (The third argument for this callback is mandatory in order to prevent users from shooting * themselves in the foot with respect to logic unexpectedly being executed on continued runs.) @@ -593,10 +612,11 @@ export enum ModCallbackCustom { * new run has started (or continued), but you can be sure that all new-run-related initialization * has been completed. * - * - You must provide a third argument: - * - Pass true if you want the callback to only fire if the run is continued. - * - Pass false if you want the callback to only fire when the run is not continued. - * - Pass undefined if you want the callback to fire in both situations. + * You must provide a third argument: + * + * - Pass true if you want the callback to only fire if the run is continued. + * - Pass false if you want the callback to only fire when the run is not continued. + * - Pass undefined if you want the callback to fire in both situations. * * (The third argument for this callback is mandatory in order to prevent users from shooting * themselves in the foot with respect to logic unexpectedly being executed on continued runs.) diff --git a/packages/isaacscript-common/src/functions/array.ts b/packages/isaacscript-common/src/functions/array.ts index 24448c12d..b9023cf13 100644 --- a/packages/isaacscript-common/src/functions/array.ts +++ b/packages/isaacscript-common/src/functions/array.ts @@ -29,16 +29,14 @@ export function arrayEquals( * array. If the specified element(s) are not found in the array, it will simply return a shallow * copy of the array. * - * This function is variadic, meaning that you can specify N arguments to remove N elements. + * If there is more than one matching element in the array, this function will remove all of them. * - * If there is more than one matching element in the array, this function will only remove the first - * matching element. If you want to remove all of the elements, use the `arrayRemoveAll` function - * instead. + * This function is variadic, meaning that you can specify N arguments to remove N elements. */ -// eslint-disable-next-line isaacscript/no-mutable-return export function arrayRemove( originalArray: readonly T[], ...elementsToRemove: readonly T[] + // eslint-disable-next-line complete/no-mutable-return ): T[] { const elementsToRemoveSet = new ReadonlySet(elementsToRemove); @@ -52,27 +50,6 @@ export function arrayRemove( return array; } -/** - * Shallow copies and removes the specified element(s) from the array. Returns the copied array. If - * the specified element(s) are not found in the array, it will simply return a shallow copy of the - * array. - * - * This function is variadic, meaning that you can specify N arguments to remove N elements. - * - * If there is more than one matching element in the array, this function will remove every matching - * element. If you want to only remove the first matching element, use the `arrayRemove` function - * instead. - */ -// eslint-disable-next-line isaacscript/no-mutable-return -export function arrayRemoveAll( - originalArray: readonly T[], - ...elementsToRemove: readonly T[] -): T[] { - const array = copyArray(originalArray); - arrayRemoveAllInPlace(array, ...elementsToRemove); - return array; -} - /** * Removes all of the specified element(s) from the array. If the specified element(s) are not found * in the array, this function will do nothing. @@ -86,11 +63,12 @@ export function arrayRemoveAll( * @returns True if one or more elements were removed, false otherwise. */ export function arrayRemoveAllInPlace( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types array: T[], ...elementsToRemove: readonly T[] ): boolean { let removedOneOrMoreElements = false; + for (const element of elementsToRemove) { let index: number; do { @@ -117,17 +95,17 @@ export function arrayRemoveAllInPlace( * * @returns The removed elements. This will be an empty array if no elements were removed. */ -// eslint-disable-next-line isaacscript/no-mutable-return export function arrayRemoveInPlace( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types array: T[], ...elementsToRemove: readonly T[] + // eslint-disable-next-line complete/no-mutable-return ): T[] { const removedElements: T[] = []; for (const element of elementsToRemove) { const index = array.indexOf(element); - if (index > -1) { + if (index !== -1) { const removedElement = array.splice(index, 1); removedElements.push(...removedElement); } @@ -143,10 +121,10 @@ export function arrayRemoveInPlace( * * This function is variadic, meaning that you can specify N arguments to remove N elements. */ -// eslint-disable-next-line isaacscript/no-mutable-return export function arrayRemoveIndex( originalArray: readonly T[], ...indexesToRemove: readonly int[] + // eslint-disable-next-line complete/no-mutable-return ): T[] { const indexesToRemoveSet = new ReadonlySet(indexesToRemove); @@ -168,11 +146,11 @@ export function arrayRemoveIndex( * * @returns The removed elements. This will be an empty array if no elements were removed. */ -// eslint-disable-next-line isaacscript/no-mutable-return export function arrayRemoveIndexInPlace( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types array: T[], ...indexesToRemove: readonly int[] + // eslint-disable-next-line complete/no-mutable-return ): T[] { const legalIndexes = indexesToRemove.filter( (i) => i >= 0 && i < array.length, @@ -212,7 +190,7 @@ export function arrayToString(array: readonly unknown[]): string { * This function is variadic, meaning that you can specify N arguments to combine N arrays. Note * that this will only perform a shallow copy of the array elements. */ -// eslint-disable-next-line isaacscript/no-mutable-return +// eslint-disable-next-line complete/no-mutable-return export function combineArrays(...arrays: ReadonlyArray): T[] { const elements: T[] = []; for (const array of arrays) { @@ -231,7 +209,7 @@ export function combineArrays(...arrays: ReadonlyArray): T[] { * @param numElements Optional. If specified, will only copy the first N elements. By default, the * entire array will be copied. */ -// eslint-disable-next-line isaacscript/no-mutable-return +// eslint-disable-next-line complete/no-mutable-return export function copyArray(oldArray: readonly T[], numElements?: int): T[] { // Using the spread operator was benchmarked to be faster than manually creating an array using // the below algorithm. @@ -249,9 +227,9 @@ export function copyArray(oldArray: readonly T[], numElements?: int): T[] { } /** Helper function to remove all of the elements in an array in-place. */ -// eslint-disable-next-line isaacscript/prefer-readonly-parameter-types -export function emptyArray(array: T[]): void { - array.splice(0, array.length); +// eslint-disable-next-line complete/prefer-readonly-parameter-types +export function emptyArray(array: unknown[]): void { + array.splice(0); } /** @@ -265,11 +243,10 @@ export function emptyArray(array: T[]): void { * This is named `filterMap` after the Rust function: * https://doc.rust-lang.org/std/iter/struct.FilterMap.html */ -// eslint-disable-next-line isaacscript/no-mutable-return export function filterMap( array: readonly OldT[], func: (element: OldT) => NewT | undefined, -): NewT[] { +): readonly NewT[] { const filteredArray: NewT[] = []; for (const element of array) { @@ -340,6 +317,7 @@ function addCombinations( n: number, src: readonly T[], got: readonly T[], + // eslint-disable-next-line complete/prefer-readonly-parameter-types all: Array, ) { if (n === 0) { @@ -373,7 +351,7 @@ export function getArrayDuplicateElements( } const values = [...duplicateElements]; - return values.sort(sortNormal); + return values.toSorted(sortNormal); } /** @@ -385,7 +363,7 @@ export function getArrayDuplicateElements( * due to implementation details of TypeScriptToLua, this results in an array of 1 through N * (instead of an array of 0 through N -1). */ -export function getArrayIndexes(array: readonly T[]): readonly int[] { +export function getArrayIndexes(array: readonly unknown[]): readonly int[] { return eRange(array.length); } @@ -482,7 +460,7 @@ export function getRandomArrayElement( * @param exceptions Optional. An array of elements to skip over if selected. */ export function getRandomArrayElementAndRemove( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types array: T[], seedOrRNG: Seed | RNG | undefined, exceptions: readonly T[] = [], @@ -509,8 +487,8 @@ export function getRandomArrayElementAndRemove( * @param exceptions Optional. An array of indexes that will be skipped over when getting the random * index. Default is an empty array. */ -export function getRandomArrayIndex( - array: readonly T[], +export function getRandomArrayIndex( + array: readonly unknown[], seedOrRNG: Seed | RNG | undefined, exceptions: readonly int[] = [], ): int { @@ -596,9 +574,7 @@ export function isArray( export function isArrayContiguous(array: readonly int[]): boolean { let lastValue: int | undefined; for (const element of array) { - if (lastValue === undefined) { - lastValue = element - 1; - } + lastValue ??= element - 1; if (element !== lastValue - 1) { return false; @@ -627,7 +603,7 @@ export function isArrayInArray( } /** Helper function to set every element in an array to a specific value. */ -// eslint-disable-next-line isaacscript/prefer-readonly-parameter-types +// eslint-disable-next-line complete/prefer-readonly-parameter-types export function setAllArrayElements(array: T[], value: T): void { for (let i = 0; i < array.length; i++) { array[i] = value; @@ -647,10 +623,10 @@ export function setAllArrayElements(array: T[], value: T): void { * `RNG.Next` method will be called. If `undefined` is provided, it will default to * a random seed. */ -// eslint-disable-next-line isaacscript/no-mutable-return export function shuffleArray( originalArray: readonly T[], seedOrRNG: Seed | RNG | undefined, + // eslint-disable-next-line complete/no-mutable-return ): T[] { const array = copyArray(originalArray); shuffleArrayInPlace(array, seedOrRNG); @@ -671,9 +647,9 @@ export function shuffleArray( * `RNG.Next` method will be called. If `undefined` is provided, it will default to * a random seed. */ -export function shuffleArrayInPlace( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types - array: T[], +export function shuffleArrayInPlace( + // eslint-disable-next-line complete/prefer-readonly-parameter-types + array: unknown[], seedOrRNG: Seed | RNG | undefined, ): void { let currentIndex = array.length; @@ -696,8 +672,12 @@ export function sumArray(array: readonly number[]): number { /** * Helper function to swap two different array elements. (The elements will be swapped in-place.) */ -// eslint-disable-next-line isaacscript/prefer-readonly-parameter-types -export function swapArrayElements(array: T[], i: number, j: number): void { +export function swapArrayElements( + // eslint-disable-next-line complete/prefer-readonly-parameter-types + array: unknown[], + i: number, + j: number, +): void { const value1 = array[i]!; // eslint-disable-line @typescript-eslint/no-non-null-assertion const value2 = array[j]!; // eslint-disable-line @typescript-eslint/no-non-null-assertion diff --git a/packages/isaacscript-common/src/functions/arrayLua.ts b/packages/isaacscript-common/src/functions/arrayLua.ts index c52c15a90..074aa70ba 100644 --- a/packages/isaacscript-common/src/functions/arrayLua.ts +++ b/packages/isaacscript-common/src/functions/arrayLua.ts @@ -66,7 +66,7 @@ export function forEach( * * Internally, this just calls `Array.join`. */ -export function join(array: readonly T[], separator: string): string { +export function join(array: readonly unknown[], separator: string): string { return array.join(separator); } diff --git a/packages/isaacscript-common/src/functions/bosses.ts b/packages/isaacscript-common/src/functions/bosses.ts index 7d567fb16..181397559 100644 --- a/packages/isaacscript-common/src/functions/bosses.ts +++ b/packages/isaacscript-common/src/functions/bosses.ts @@ -109,7 +109,7 @@ export function getBossID(): BossID | undefined { const room = game.GetRoom(); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const bossID = room.GetBossID(); if (bossID === 0) { return undefined; @@ -117,8 +117,8 @@ export function getBossID(): BossID | undefined { // The Ultra Greed room holds both Ultra Greed and Ultra Greedier. if ( - bossID === BossID.ULTRA_GREED && - doesEntityExist(EntityType.ULTRA_GREED, UltraGreedVariant.ULTRA_GREEDIER) + bossID === BossID.ULTRA_GREED + && doesEntityExist(EntityType.ULTRA_GREED, UltraGreedVariant.ULTRA_GREEDIER) ) { return BossID.ULTRA_GREEDIER; } @@ -130,6 +130,11 @@ export function getBossIDFromEntityTypeVariant( entityType: EntityType, variant: int, ): BossID | undefined { + // First, handle some special cases. + if (entityType === EntityType.HORSEMAN_HEAD) { + return BossID.HEADLESS_HORSEMAN; + } + const entityTypeVariant = `${entityType}.${variant}`; return ENTITY_TYPE_VARIANT_TO_BOSS_ID_MAP.get(entityTypeVariant); } @@ -235,6 +240,7 @@ function getNumBossSegments( // 69 case EntityType.LOKI: { + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison return variant === LokiVariant.LOKII ? 2 : 1; } @@ -266,8 +272,8 @@ export function spawnBoss( subType: int, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, numSegments?: int, ): EntityNPC { const seed = isRNG(seedOrRNG) ? seedOrRNG.Next() : seedOrRNG; @@ -316,7 +322,7 @@ export function spawnBossWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, numSegments?: int, ): EntityNPC { const seed = isRNG(seedOrRNG) ? seedOrRNG.Next() : seedOrRNG; diff --git a/packages/isaacscript-common/src/functions/charge.ts b/packages/isaacscript-common/src/functions/charge.ts index 571056c3b..0af36efe2 100644 --- a/packages/isaacscript-common/src/functions/charge.ts +++ b/packages/isaacscript-common/src/functions/charge.ts @@ -45,8 +45,7 @@ export function addCharge( // add too many charges, it will grant orange "battery" charges, even if the player does not have // The Battery.) const chargesAwayFromMax = getChargesAwayFromMax(player, activeSlot); - const chargesToAdd = - numCharges > chargesAwayFromMax ? chargesAwayFromMax : numCharges; + const chargesToAdd = Math.min(numCharges, chargesAwayFromMax); // The AAA Battery trinket might grant an additional charge. const modifiedChargesToAdd = getChargesToAddWithAAAModifier( @@ -319,7 +318,7 @@ function shouldPlayFullRechargeSound( // If we do have The Battery, play the full recharge sound if we are exactly double charged or // exactly single charged. return ( - batteryCharge === maxCharges || - (activeCharge === maxCharges && batteryCharge === 0) + batteryCharge === maxCharges + || (activeCharge === maxCharges && batteryCharge === 0) ); } diff --git a/packages/isaacscript-common/src/functions/collectibles.ts b/packages/isaacscript-common/src/functions/collectibles.ts index c565e52cf..560630748 100644 --- a/packages/isaacscript-common/src/functions/collectibles.ts +++ b/packages/isaacscript-common/src/functions/collectibles.ts @@ -509,8 +509,8 @@ export function isFamiliarCollectible( */ export function isGlitchedCollectible(collectible: EntityPickup): boolean { return ( - collectible.Variant === PickupVariant.COLLECTIBLE && - collectible.SubType > GLITCHED_ITEM_THRESHOLD + collectible.Variant === PickupVariant.COLLECTIBLE + && collectible.SubType > GLITCHED_ITEM_THRESHOLD ); } diff --git a/packages/isaacscript-common/src/functions/debugFunctions.ts b/packages/isaacscript-common/src/functions/debugFunctions.ts index d9cfe1b4f..fa86cffe3 100644 --- a/packages/isaacscript-common/src/functions/debugFunctions.ts +++ b/packages/isaacscript-common/src/functions/debugFunctions.ts @@ -42,7 +42,6 @@ export function getTime(useSocketIfAvailable = true): int | float { } if (isLuaDebugEnabled()) { - // eslint-disable-next-line unicorn/prefer-module const [ok, requiredSocket] = pcall(require, "socket"); if (ok) { const socket = requiredSocket as Socket; diff --git a/packages/isaacscript-common/src/functions/decorators.ts b/packages/isaacscript-common/src/functions/decorators.ts index 1605dbd75..861b59ee1 100644 --- a/packages/isaacscript-common/src/functions/decorators.ts +++ b/packages/isaacscript-common/src/functions/decorators.ts @@ -1,3 +1,5 @@ +/* eslint-disable jsdoc/escape-inline-tags */ + /** * If you decide to structure your mod as a set of feature classes, you can use decorators to * automatically register callbacks. diff --git a/packages/isaacscript-common/src/functions/deepCopy.ts b/packages/isaacscript-common/src/functions/deepCopy.ts index d8f73adef..3ab4d9ab5 100644 --- a/packages/isaacscript-common/src/functions/deepCopy.ts +++ b/packages/isaacscript-common/src/functions/deepCopy.ts @@ -212,8 +212,8 @@ function deepCopyTable( // Handle the special case of serialized Isaac API classes. if ( - isSerializedIsaacAPIClass(luaMap) && - serializationType === SerializationType.DESERIALIZE + isSerializedIsaacAPIClass(luaMap) + && serializationType === SerializationType.DESERIALIZE ) { return deserializeIsaacAPIClass(luaMap); } @@ -258,8 +258,8 @@ function deepCopyDefaultMap( // function. If this is the case, then we cannot serialize it (because there is no way to // serialize a function). if ( - serializationType === SerializationType.SERIALIZE && - !isPrimitive(constructorArg) + serializationType === SerializationType.SERIALIZE + && !isPrimitive(constructorArg) ) { if (insideMap) { // The case of a DefaultMap within another map is complicated. Unlike a DefaultMap attached to @@ -644,8 +644,8 @@ function getCopiedEntries( // During serialization, we brand some Lua tables with a special identifier to signify that it has // keys that should be deserialized to numbers. const convertStringKeysToNumbers = - serializationType === SerializationType.DESERIALIZE && - entries.some( + serializationType === SerializationType.DESERIALIZE + && entries.some( ([key]) => key === asString(SerializationBrand.OBJECT_WITH_NUMBER_KEYS), ); diff --git a/packages/isaacscript-common/src/functions/deepCopyTests.ts b/packages/isaacscript-common/src/functions/deepCopyTests.ts index ec8f934d8..7cf6823c2 100644 --- a/packages/isaacscript-common/src/functions/deepCopyTests.ts +++ b/packages/isaacscript-common/src/functions/deepCopyTests.ts @@ -262,8 +262,7 @@ function copiedObjectHasChildObject() { function copiedMapIsMap() { const keyToLookFor = "abc"; const valueToLookFor = "def"; - const oldMap = new Map(); - oldMap.set(keyToLookFor, valueToLookFor); + const oldMap = new Map([[keyToLookFor, valueToLookFor]]); const newMap = deepCopy(oldMap, SerializationType.NONE, "copiedMapIsMap"); @@ -275,8 +274,7 @@ function copiedMapIsMap() { function copiedMapHasValue() { const keyToLookFor = "abc"; const valueToLookFor = "def"; - const oldMap = new Map(); - oldMap.set(keyToLookFor, valueToLookFor); + const oldMap = new Map([[keyToLookFor, valueToLookFor]]); const newMap = deepCopy(oldMap, SerializationType.NONE, "copiedMapHasValue"); @@ -295,8 +293,7 @@ function copiedMapHasValue() { function copiedSetIsSet() { const valueToLookFor = "abc"; - const oldSet = new Set(); - oldSet.add(valueToLookFor); + const oldSet = new Set([valueToLookFor]); const newSet = deepCopy(oldSet, SerializationType.NONE, "copiedSetIsSet"); @@ -307,8 +304,7 @@ function copiedSetIsSet() { function copiedSetHasValue() { const valueToLookFor = "abc"; - const oldSet = new Set(); - oldSet.add(valueToLookFor); + const oldSet = new Set([valueToLookFor]); const newSet = deepCopy(oldSet, SerializationType.NONE, "copiedSetHasValue"); @@ -325,12 +321,12 @@ function copiedSetHasValue() { function copiedMapHasChildMap() { const childMapKey = 123; const childMapValue = 456; - const oldChildMap = new Map(); - oldChildMap.set(childMapKey, childMapValue); + const oldChildMap = new Map([[childMapKey, childMapValue]]); const keyToLookFor = "childMap"; - const oldMap = new Map>(); - oldMap.set(keyToLookFor, oldChildMap); + const oldMap = new Map>([ + [keyToLookFor, oldChildMap], + ]); const newMap = deepCopy( oldMap, @@ -446,8 +442,7 @@ function copiedDefaultMapHasBrand() { function copiedSerializedMapHasStringKey() { const mapKey = "123"; const mapValue = 456; - const oldMap = new Map(); - oldMap.set(mapKey, mapValue); + const oldMap = new Map([[mapKey, mapValue]]); const serializedOldMap = deepCopy( oldMap, @@ -473,8 +468,7 @@ function copiedSerializedMapHasStringKey() { function copiedSerializedMapHasNumberKey() { const mapKey = 123; const mapValue = 456; - const oldMap = new Map(); - oldMap.set(mapKey, mapValue); + const oldMap = new Map([[mapKey, mapValue]]); const serializedOldMap = deepCopy( oldMap, diff --git a/packages/isaacscript-common/src/functions/doors.ts b/packages/isaacscript-common/src/functions/doors.ts index 4e2a5d45f..d7df274da 100644 --- a/packages/isaacscript-common/src/functions/doors.ts +++ b/packages/isaacscript-common/src/functions/doors.ts @@ -326,9 +326,9 @@ export function getUnusedDoorSlots(): readonly DoorSlot[] { return DOOR_SLOT_VALUES.filter( (doorSlot) => // We need to filter out the -1 value to prevent crashes. - doorSlot !== DoorSlot.NO_DOOR_SLOT && - room.IsDoorSlotAllowed(doorSlot) && - room.GetDoor(doorSlot) === undefined, + doorSlot !== DoorSlot.NO_DOOR_SLOT + && room.IsDoorSlotAllowed(doorSlot) + && room.GetDoor(doorSlot) === undefined, ); } @@ -377,6 +377,7 @@ export function isAngelRoomDoor(door: GridEntityDoor): boolean { * Room.) */ export function isBlueWombDoor(door: GridEntityDoor): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison return door.TargetRoomIndex === GridRoom.BLUE_WOMB; } @@ -385,6 +386,7 @@ export function isBlueWombDoor(door: GridEntityDoor): boolean { * vanilla, the door will only appear in the Boss Room of the sixth floor.) */ export function isBossRushDoor(door: GridEntityDoor): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison return door.TargetRoomIndex === GridRoom.BOSS_RUSH; } @@ -493,6 +495,7 @@ export function isHiddenSecretRoomDoor(door: GridEntityDoor): boolean { * (In vanilla, the door will only appear in the starting room of The Chest / Dark Room.) */ export function isMegaSatanDoor(door: GridEntityDoor): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison return door.TargetRoomIndex === GridRoom.MEGA_SATAN; } @@ -501,6 +504,7 @@ export function isMegaSatanDoor(door: GridEntityDoor): boolean { * you to the Repentance floor. */ export function isRepentanceDoor(door: GridEntityDoor): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison return door.TargetRoomIndex === GridRoom.SECRET_EXIT; } @@ -525,6 +529,7 @@ export function isSecretRoomDoor(door: GridEntityDoor): boolean { * contains the portal to The Void. (In vanilla, the door will only appear in the Hush Boss Room.) */ export function isVoidDoor(door: GridEntityDoor): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison return door.TargetRoomIndex === GridRoom.VOID; } diff --git a/packages/isaacscript-common/src/functions/easing.ts b/packages/isaacscript-common/src/functions/easing.ts index 104228d8f..3068040b8 100644 --- a/packages/isaacscript-common/src/functions/easing.ts +++ b/packages/isaacscript-common/src/functions/easing.ts @@ -158,8 +158,8 @@ export function easeInOutElastic(time: number): number { ? 1 : time < 0.5 ? -(2 ** (20 * time - 10) * Math.sin((20 * time - 11.125) * c5)) / 2 - : (2 ** (-20 * time + 10) * Math.sin((20 * time - 11.125) * c5)) / 2 + - 1; + : (2 ** (-20 * time + 10) * Math.sin((20 * time - 11.125) * c5)) / 2 + + 1; } /** diff --git a/packages/isaacscript-common/src/functions/emptyRoom.ts b/packages/isaacscript-common/src/functions/emptyRoom.ts index 905e717c6..b9552cf01 100644 --- a/packages/isaacscript-common/src/functions/emptyRoom.ts +++ b/packages/isaacscript-common/src/functions/emptyRoom.ts @@ -44,9 +44,9 @@ function emptyRoomEntities() { } if ( - entity.HasEntityFlags(EntityFlag.CHARM) || - entity.HasEntityFlags(EntityFlag.FRIENDLY) || - entity.HasEntityFlags(EntityFlag.PERSISTENT) + entity.HasEntityFlags(EntityFlag.CHARM) + || entity.HasEntityFlags(EntityFlag.FRIENDLY) + || entity.HasEntityFlags(EntityFlag.PERSISTENT) ) { continue; } @@ -74,8 +74,8 @@ export function emptyRoomGridEntities(): void { // We cannot simply check if the grid entity type is equal to a wall because other mods use // walls as a base for custom grid entities. if ( - gridEntityType === GridEntityType.WALL && - isVanillaWallGridIndex(gridIndex) + gridEntityType === GridEntityType.WALL + && isVanillaWallGridIndex(gridIndex) ) { continue; } diff --git a/packages/isaacscript-common/src/functions/entities.ts b/packages/isaacscript-common/src/functions/entities.ts index d504b3200..509d6d882 100644 --- a/packages/isaacscript-common/src/functions/entities.ts +++ b/packages/isaacscript-common/src/functions/entities.ts @@ -149,8 +149,8 @@ export function getClosestEntityTo( const distance = referenceEntity.Position.Distance(entity.Position); if ( - distance < closestDistance && - (filterFunc === undefined || filterFunc(entity)) + distance < closestDistance + && (filterFunc === undefined || filterFunc(entity)) ) { closestEntity = entity; closestDistance = distance; @@ -425,6 +425,7 @@ export function isActiveEnemy(entity: Entity): boolean { // 912 case EntityType.MOTHER: { + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison if (entity.Variant === MotherVariant.MOTHER_1) { const npc = entity.ToNPC(); if (npc !== undefined && npc.State === NPCState.SPECIAL) { @@ -441,7 +442,7 @@ export function isActiveEnemy(entity: Entity): boolean { } } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return entity.IsActiveEnemy(false); } @@ -478,9 +479,9 @@ export function parseEntityID( const [entityTypeString, variantString, subTypeString] = entityIDArray; if ( - entityTypeString === undefined || - variantString === undefined || - subTypeString === undefined + entityTypeString === undefined + || variantString === undefined + || subTypeString === undefined ) { return undefined; } @@ -490,9 +491,9 @@ export function parseEntityID( const subType = parseIntSafe(subTypeString); if ( - entityType === undefined || - variant === undefined || - subType === undefined + entityType === undefined + || variant === undefined + || subType === undefined ) { return undefined; } @@ -546,7 +547,7 @@ export function removeAllMatchingEntities( entityType: EntityType, entityVariant = -1, entitySubType = -1, - cap: int | undefined = undefined, + cap?: int, ): readonly Entity[] { const entities = getEntities(entityType, entityVariant, entitySubType); return removeEntities(entities, cap); @@ -661,8 +662,8 @@ export function spawn( subType: int, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): Entity { const room = game.GetRoom(); @@ -679,9 +680,7 @@ export function spawn( ? positionOrGridIndex : room.GetGridPosition(positionOrGridIndex); - if (seedOrRNG === undefined) { - seedOrRNG = newRNG(); - } + seedOrRNG ??= newRNG(); const seed = isRNG(seedOrRNG) ? seedOrRNG.Next() : seedOrRNG; return game.Spawn( @@ -710,8 +709,8 @@ export function spawnEntityID( entityID: EntityID, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): Entity { const [entityType, variant, subType] = getConstituentsFromEntityID(entityID); return spawn( @@ -736,7 +735,7 @@ export function spawnWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): Entity { return spawn( entityType, diff --git a/packages/isaacscript-common/src/functions/entitiesSpecific.ts b/packages/isaacscript-common/src/functions/entitiesSpecific.ts index 6126f2cee..b85d84138 100644 --- a/packages/isaacscript-common/src/functions/entitiesSpecific.ts +++ b/packages/isaacscript-common/src/functions/entitiesSpecific.ts @@ -549,8 +549,8 @@ export function spawnBomb( subType: int, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityBomb { const entity = spawn( EntityType.BOMB, @@ -575,7 +575,7 @@ export function spawnBombWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityBomb { return spawnBomb( bombVariant, @@ -593,8 +593,8 @@ export function spawnEffect( subType: int, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityEffect { const entity = spawn( EntityType.EFFECT, @@ -619,7 +619,7 @@ export function spawnEffectWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityEffect { return spawnEffect( effectVariant, @@ -642,8 +642,8 @@ export function spawnFamiliar( subType: int, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityFamiliar { const entity = spawn( EntityType.FAMILIAR, @@ -668,7 +668,7 @@ export function spawnFamiliarWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityFamiliar { return spawnFamiliar( familiarVariant, @@ -686,8 +686,8 @@ export function spawnKnife( subType: int, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityKnife { const entity = spawn( EntityType.KNIFE, @@ -712,7 +712,7 @@ export function spawnKnifeWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityKnife { return spawnKnife( knifeVariant, @@ -730,8 +730,8 @@ export function spawnLaser( subType: int, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityLaser { const entity = spawn( EntityType.LASER, @@ -756,7 +756,7 @@ export function spawnLaserWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityLaser { return spawnLaser( laserVariant, @@ -780,8 +780,8 @@ export function spawnNPC( subType: int, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityNPC { const entity = spawn( entityType, @@ -812,7 +812,7 @@ export function spawnNPCWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityNPC { return spawnNPC( entityType, @@ -831,8 +831,8 @@ export function spawnPickup( subType: int, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityPickup { const entity = spawn( EntityType.PICKUP, @@ -857,7 +857,7 @@ export function spawnPickupWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityPickup { return spawnPickup( pickupVariant, @@ -875,8 +875,8 @@ export function spawnProjectile( subType: int, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityProjectile { const entity = spawn( EntityType.PROJECTILE, @@ -901,7 +901,7 @@ export function spawnProjectileWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityProjectile { return spawnProjectile( projectileVariant, @@ -919,8 +919,8 @@ export function spawnSlot( subType: int, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntitySlot { return spawn( EntityType.SLOT, @@ -940,7 +940,7 @@ export function spawnSlotWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntitySlot { return spawnSlot( slotVariant, @@ -958,8 +958,8 @@ export function spawnTear( subType: int, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityTear { const entity = spawn( EntityType.TEAR, @@ -984,7 +984,7 @@ export function spawnTearWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityTear { return spawnTear( tearVariant, diff --git a/packages/isaacscript-common/src/functions/familiars.ts b/packages/isaacscript-common/src/functions/familiars.ts index 09d197892..e0449cbae 100644 --- a/packages/isaacscript-common/src/functions/familiars.ts +++ b/packages/isaacscript-common/src/functions/familiars.ts @@ -146,8 +146,8 @@ export function getSirenHelper(familiar: EntityFamiliar): Entity | undefined { const sirenHelpers = getEntities(EntityType.SIREN_HELPER); return sirenHelpers.find( (sirenHelper) => - sirenHelper.Target !== undefined && - GetPtrHash(sirenHelper.Target) === familiarPtrHash, + sirenHelper.Target !== undefined + && GetPtrHash(sirenHelper.Target) === familiarPtrHash, ); } diff --git a/packages/isaacscript-common/src/functions/flag.ts b/packages/isaacscript-common/src/functions/flag.ts index 5733aea15..78976796d 100644 --- a/packages/isaacscript-common/src/functions/flag.ts +++ b/packages/isaacscript-common/src/functions/flag.ts @@ -129,9 +129,9 @@ export function isSelfDamage( ): boolean { return ( // Exclude self-damage from e.g. Curse Room door spikes. - hasFlag(damageFlags, DamageFlag.NO_PENALTIES) || + hasFlag(damageFlags, DamageFlag.NO_PENALTIES) // Exclude self-damage from e.g. Razor. - hasFlag(damageFlags, DamageFlag.RED_HEARTS) + || hasFlag(damageFlags, DamageFlag.RED_HEARTS) ); } diff --git a/packages/isaacscript-common/src/functions/globals.ts b/packages/isaacscript-common/src/functions/globals.ts index d74254ac2..21b4a3c9c 100644 --- a/packages/isaacscript-common/src/functions/globals.ts +++ b/packages/isaacscript-common/src/functions/globals.ts @@ -255,7 +255,7 @@ export function setLogFunctionsGlobal(): void { const globals = _G as Record; for (const exports of [logExports, logMiscExports, logEntitiesExports]) { - // eslint-disable-next-line isaacscript/no-object-any + // eslint-disable-next-line complete/no-object-any for (const [logFuncName, logFunc] of Object.entries(exports)) { globals[logFuncName] = logFunc; } diff --git a/packages/isaacscript-common/src/functions/gridEntities.ts b/packages/isaacscript-common/src/functions/gridEntities.ts index f84af235b..201e22987 100644 --- a/packages/isaacscript-common/src/functions/gridEntities.ts +++ b/packages/isaacscript-common/src/functions/gridEntities.ts @@ -110,8 +110,8 @@ export function doesGridEntityExist( const thisGridEntityType = gridEntity.GetType(); const thisVariant = gridEntity.GetVariant(); return ( - gridEntityType === thisGridEntityType && - (variant === -1 || variant === thisVariant) + gridEntityType === thisGridEntityType + && (variant === -1 || variant === thisVariant) ); }); } @@ -150,8 +150,8 @@ export function getCollidingEntitiesWithGridEntity( return closeEntities.filter( (entity) => - entity.CollidesWithGrid() && - isCircleIntersectingRectangle( + entity.CollidesWithGrid() + && isCircleIntersectingRectangle( entity.Position, // We arbitrarily add 0.1 to account for entities that are already pushed back by the time // the `POST_UPDATE` callback fires. @@ -791,8 +791,8 @@ export function isGridEntityBreakableByExplosion( const gridEntityTypeVariant = `${gridEntityType}.${variant}`; return ( - BREAKABLE_GRID_ENTITY_TYPES_BY_EXPLOSIONS.has(gridEntityType) || - BREAKABLE_GRID_ENTITY_TYPES_VARIANTS_BY_EXPLOSIONS.has( + BREAKABLE_GRID_ENTITY_TYPES_BY_EXPLOSIONS.has(gridEntityType) + || BREAKABLE_GRID_ENTITY_TYPES_VARIANTS_BY_EXPLOSIONS.has( gridEntityTypeVariant, ) ); @@ -816,7 +816,7 @@ export function isGridEntityBroken(gridEntity: GridEntity): boolean { * the `PRE_ROOM_ENTITY_SPAWN` callback for narrowing the type of the first argument. */ export function isGridEntityXMLType(num: number): num is GridEntityXMLType { - return GRID_ENTITY_XML_TYPES_SET.has(num); // eslint-disable-line isaacscript/strict-enums + return GRID_ENTITY_XML_TYPES_SET.has(num); // eslint-disable-line complete/strict-enums } /** @@ -860,9 +860,10 @@ export function isPostBossVoidPortal(gridEntity: GridEntity): boolean { const saveState = gridEntity.GetSaveState(); return ( - saveState.Type === GridEntityType.TRAPDOOR && - saveState.Variant === TrapdoorVariant.VOID_PORTAL && - saveState.VarData === 1 + saveState.Type === GridEntityType.TRAPDOOR + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && saveState.Variant === TrapdoorVariant.VOID_PORTAL + && saveState.VarData === 1 ); } @@ -953,8 +954,8 @@ export function removeEntitiesSpawnedFromGridEntity( ): void { const entitiesFromGridEntity = entities.filter( (entity) => - entity.FrameCount === 0 && - vectorEquals(entity.Position, gridEntity.Position), + entity.FrameCount === 0 + && vectorEquals(entity.Position, gridEntity.Position), ); removeEntities(entitiesFromGridEntity); } @@ -1042,6 +1043,7 @@ export function removeGridEntity( // corresponding effect. if (gridEntityType === GridEntityType.STATUE) { const effectVariant = + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison variant === StatueVariant.DEVIL ? EffectVariant.DEVIL : EffectVariant.ANGEL; @@ -1145,18 +1147,22 @@ export function spawnGiantPoop(topLeftGridIndex: int): boolean { ); return ( - topLeft !== undefined && - topLeft.GetType() === GridEntityType.POOP && - topLeft.GetVariant() === PoopGridEntityVariant.GIANT_TOP_LEFT && - topRight !== undefined && - topRight.GetType() === GridEntityType.POOP && - topRight.GetVariant() === PoopGridEntityVariant.GIANT_TOP_RIGHT && - bottomLeft !== undefined && - bottomLeft.GetType() === GridEntityType.POOP && - bottomLeft.GetVariant() === PoopGridEntityVariant.GIANT_BOTTOM_LEFT && - bottomRight !== undefined && - bottomRight.GetType() === GridEntityType.POOP && - bottomRight.GetVariant() === PoopGridEntityVariant.GIANT_BOTTOM_RIGHT + topLeft !== undefined + && topLeft.GetType() === GridEntityType.POOP + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && topLeft.GetVariant() === PoopGridEntityVariant.GIANT_TOP_LEFT + && topRight !== undefined + && topRight.GetType() === GridEntityType.POOP + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && topRight.GetVariant() === PoopGridEntityVariant.GIANT_TOP_RIGHT + && bottomLeft !== undefined + && bottomLeft.GetType() === GridEntityType.POOP + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && bottomLeft.GetVariant() === PoopGridEntityVariant.GIANT_BOTTOM_LEFT + && bottomRight !== undefined + && bottomRight.GetType() === GridEntityType.POOP + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && bottomRight.GetVariant() === PoopGridEntityVariant.GIANT_BOTTOM_RIGHT ); } diff --git a/packages/isaacscript-common/src/functions/gridEntitiesSpecific.ts b/packages/isaacscript-common/src/functions/gridEntitiesSpecific.ts index 6a1d619bd..809d2bb73 100644 --- a/packages/isaacscript-common/src/functions/gridEntitiesSpecific.ts +++ b/packages/isaacscript-common/src/functions/gridEntitiesSpecific.ts @@ -97,8 +97,8 @@ export function getPressurePlates( if (pressurePlate !== undefined) { const thisPressurePlateVariant = pressurePlate.GetVariant(); if ( - pressurePlateVariant === -1 || - pressurePlateVariant === thisPressurePlateVariant + pressurePlateVariant === -1 + || pressurePlateVariant === thisPressurePlateVariant ) { pressurePlates.push(pressurePlate); } diff --git a/packages/isaacscript-common/src/functions/isaacAPIClass.ts b/packages/isaacscript-common/src/functions/isaacAPIClass.ts index 1d01c4301..2e96cae89 100644 --- a/packages/isaacscript-common/src/functions/isaacAPIClass.ts +++ b/packages/isaacscript-common/src/functions/isaacAPIClass.ts @@ -83,8 +83,8 @@ export function isIsaacAPIClassOfType( ): boolean { const isaacAPIClassType = getIsaacAPIClassName(object); return ( - isaacAPIClassType === classType || - isaacAPIClassType === `const ${classType}` + isaacAPIClassType === classType + || isaacAPIClassType === `const ${classType}` ); } diff --git a/packages/isaacscript-common/src/functions/jsonHelpers.ts b/packages/isaacscript-common/src/functions/jsonHelpers.ts index 30e5825b2..9cd481a8f 100644 --- a/packages/isaacscript-common/src/functions/jsonHelpers.ts +++ b/packages/isaacscript-common/src/functions/jsonHelpers.ts @@ -13,19 +13,21 @@ function tryEncode(this: void, luaTable: unknown) { * Converts a JSON string to a Lua table. * * In most cases, this function will be used for reading data from a "save#.dat" file. If decoding - * fails, it will return a blank Lua table instead of throwing an error. (This allows execution to - * continue in cases where users have no current save data or have manually removed their existing - * save data.) + * fails, it will return undefined instead of throwing an error. (This allows execution to continue + * in cases where users have no current save data or have manually removed their existing save + * data.) * * Under the hood, this uses a custom JSON parser that was measured to be 11.8 times faster than the * vanilla JSON parser. */ -export function jsonDecode(jsonString: string): LuaMap { +export function jsonDecode( + jsonString: string, +): LuaMap | undefined { const [ok, luaTableOrErrMsg] = pcall(tryDecode, jsonString); if (!ok) { // Instead of throwing an error, continue execution of the callback. logError(`Failed to convert the JSON string to a Lua table: ${jsonString}`); - return new LuaMap(); + return undefined; } return luaTableOrErrMsg; diff --git a/packages/isaacscript-common/src/functions/level.ts b/packages/isaacscript-common/src/functions/level.ts index 642202c4b..79fcb32db 100644 --- a/packages/isaacscript-common/src/functions/level.ts +++ b/packages/isaacscript-common/src/functions/level.ts @@ -44,9 +44,9 @@ export function getLevelBossIDs(): readonly BossID[] { const roomsInsideGrid = getRoomsInsideGrid(); return filterMap(roomsInsideGrid, (roomDescriptor) => - roomDescriptor.Data !== undefined && - roomDescriptor.Data.Type === RoomType.BOSS && - roomDescriptor.Data.StageID === StageID.SPECIAL_ROOMS + roomDescriptor.Data !== undefined + && roomDescriptor.Data.Type === RoomType.BOSS + && roomDescriptor.Data.StageID === StageID.SPECIAL_ROOMS ? roomDescriptor.Data.Subtype : undefined, ); diff --git a/packages/isaacscript-common/src/functions/levelGrid.ts b/packages/isaacscript-common/src/functions/levelGrid.ts index f6eac114e..445b71dcf 100644 --- a/packages/isaacscript-common/src/functions/levelGrid.ts +++ b/packages/isaacscript-common/src/functions/levelGrid.ts @@ -247,10 +247,10 @@ export function getNewRoomCandidatesForLevel( // However, we want to filter out special rooms because they are supposed to be dead ends. const normalRooms = roomsInsideGrid.filter( (room) => - room.Data !== undefined && - room.Data.Type === RoomType.DEFAULT && - !isMirrorRoom(room.Data) && // Mirror rooms do not count as special rooms. - !isMineShaft(room.Data), // Mineshaft rooms do not count as special rooms. + room.Data !== undefined + && room.Data.Type === RoomType.DEFAULT + && !isMirrorRoom(room.Data) // Mirror rooms do not count as special rooms. + && !isMineShaft(room.Data), // Mineshaft rooms do not count as special rooms. ); const roomsToLookThrough = ensureDeadEnd ? normalRooms : roomsInsideGrid; @@ -325,8 +325,8 @@ export function getRoomDescriptorsForType( const roomsInsideGrid = getRoomsInsideGrid(); return roomsInsideGrid.filter( (roomDescriptor) => - roomDescriptor.Data !== undefined && - roomTypesSet.has(roomDescriptor.Data.Type), + roomDescriptor.Data !== undefined + && roomTypesSet.has(roomDescriptor.Data.Type), ); } @@ -531,9 +531,7 @@ export function isRedKeyRoom(roomGridIndex: int): boolean { * @param roomGridIndex Optional. Default is the current room index. */ export function isRoomInsideGrid(roomGridIndex?: int): boolean { - if (roomGridIndex === undefined) { - roomGridIndex = getRoomGridIndex(); - } + roomGridIndex ??= getRoomGridIndex(); return roomGridIndex >= 0 && roomGridIndex <= MAX_LEVEL_GRID_INDEX; } @@ -567,9 +565,8 @@ export function newRoom( ): int | undefined { const level = game.GetLevel(); - if (seedOrRNG === undefined) { - seedOrRNG = level.GetDungeonPlacementSeed(); - } + seedOrRNG ??= level.GetDungeonPlacementSeed(); + const rng = isRNG(seedOrRNG) ? seedOrRNG : newRNG(seedOrRNG); const newRoomCandidate = getNewRoomCandidate(rng, ensureDeadEnd); diff --git a/packages/isaacscript-common/src/functions/logEntities.ts b/packages/isaacscript-common/src/functions/logEntities.ts index f2df1ba88..0e0dd6f56 100644 --- a/packages/isaacscript-common/src/functions/logEntities.ts +++ b/packages/isaacscript-common/src/functions/logEntities.ts @@ -56,9 +56,9 @@ export function logAllEntities( const effect = entity.ToEffect(); if ( - !includeBackgroundEffects && - effect !== undefined && - IGNORE_EFFECT_VARIANTS.has(effect.Variant) + !includeBackgroundEffects + && effect !== undefined + && IGNORE_EFFECT_VARIANTS.has(effect.Variant) ) { continue; } @@ -109,16 +109,16 @@ export function logAllGridEntities( // If a filter was specified, exclude all entities outside of the filter. if ( - gridEntityTypeFilter !== undefined && - gridEntityType !== gridEntityTypeFilter + gridEntityTypeFilter !== undefined + && gridEntityType !== gridEntityTypeFilter ) { continue; } if ( - !includeWalls && - gridEntityType === GridEntityType.WALL && - gridEntityTypeFilter !== GridEntityType.WALL + !includeWalls + && gridEntityType === GridEntityType.WALL + && gridEntityTypeFilter !== GridEntityType.WALL ) { continue; } @@ -222,8 +222,11 @@ function getEntityLogLine(this: void, entity: Entity, num?: int): string { msg += ` - Position: (${entity.Position.X}, ${entity.Position.Y})\n`; msg += ` - Velocity: (${entity.Velocity.X}, ${entity.Velocity.Y})\n`; msg += ` - HP: ${entity.HitPoints} / ${entity.MaxHitPoints}\n`; + // eslint-disable-next-line @typescript-eslint/no-base-to-string msg += ` - Parent: ${entity.Parent}\n`; + // eslint-disable-next-line @typescript-eslint/no-base-to-string msg += ` - Child: ${entity.Child}\n`; + // eslint-disable-next-line @typescript-eslint/no-base-to-string msg += ` - SpawnerEntity: ${entity.SpawnerEntity}\n`; msg += ` - SpawnerType / SpawnerVariant: ${entity.SpawnerType}.${entity.SpawnerVariant}\n`; msg += ` - FrameCount: ${entity.FrameCount}\n`; diff --git a/packages/isaacscript-common/src/functions/logMisc.ts b/packages/isaacscript-common/src/functions/logMisc.ts index a38ab4e93..65736c9d4 100644 --- a/packages/isaacscript-common/src/functions/logMisc.ts +++ b/packages/isaacscript-common/src/functions/logMisc.ts @@ -12,6 +12,7 @@ import { HeartSubType, LevelStateFlag, Music, + NullItemID, ProjectileFlag, RoomType, SeedEffect, @@ -51,11 +52,13 @@ import { vectorToString } from "./vector"; * @param array The array to log. * @param name Optional. The name of the array, which will be logged before the elements. */ -export function logArray( +export function logArray( this: void, - array: readonly T[], + array: readonly unknown[], name?: string, ): void { + name ??= "array"; + // We do not assume the given array has contiguous values in order to be more permissive about the // kinds of arrays that will successfully log without a run-time error. if (!isArray(array, false)) { @@ -64,9 +67,6 @@ export function logArray( } const arrayString = arrayToString(array); - if (name === undefined) { - name = "array"; - } log(`Logging ${name}: ${arrayString}`); } @@ -81,9 +81,7 @@ export function logCollectibleTypes( collectibleTypes: readonly CollectibleType[], name?: string, ): void { - if (name === undefined) { - name = "collectibles"; - } + name ??= "collectibles"; log(`Logging ${name}:`); @@ -102,9 +100,7 @@ export function logCollectibleTypes( * @param name Optional. The name of the object, which will be logged before the properties. */ export function logColor(this: void, color: Color, name?: string): void { - if (name === undefined) { - name = "color"; - } + name ??= "color"; log( `Logging ${name}: R${color.R}, G${color.G}, B${color.B}, A${color.A}, RO${color.RO}, BO${color.BO}, GO${color.GO}`, @@ -199,9 +195,7 @@ export function logItemPoolTypes( itemPoolTypes: readonly ItemPoolType[], name?: string, ): void { - if (name === undefined) { - name = "item pool types"; - } + name ??= "item pool types"; log(`Logging ${name}:`); @@ -220,9 +214,7 @@ export function logItemPoolTypes( * @param name Optional. The name of the object, which will be logged before the properties. */ export function logKColor(this: void, kColor: KColor, name?: string): void { - if (name === undefined) { - name = "KColor"; - } + name ??= "KColor"; log( `Logging ${name}: R${kColor.Red}, G${kColor.Green}, B${kColor.Blue}, A${kColor.Alpha}`, @@ -306,12 +298,15 @@ export function logPlayerEffects(this: void, player: EntityPlayer): void { const trinketName = getTrinketName(effect.Item.ID); effectDescription = `Trinket: ${trinketName}`; } else if (effect.Item.IsNull()) { - effectDescription = `Null item: ${effect.Item.ID}`; + const nullItemName = NullItemID[effect.Item.ID]; + effectDescription = `Null item: ${nullItemName}`; } else { effectDescription = `Unknown type of effect: ${effect.Item.ID}`; } - log(` ${i + 1}) ${effectDescription} (x${effect.Count})`); + log( + ` ${i + 1}) ${effectDescription} (${effect.Item.ID}) x${effect.Count}`, + ); } } @@ -647,9 +642,7 @@ export function logVector( name?: string, round = false, ): void { - if (name === undefined) { - name = "vector"; - } + name ??= "vector"; const vectorString = vectorToString(vector, round); log(`Logging ${name}: ${vectorString}`); diff --git a/packages/isaacscript-common/src/functions/map.ts b/packages/isaacscript-common/src/functions/map.ts index 8f03d5cc5..33b5728ec 100644 --- a/packages/isaacscript-common/src/functions/map.ts +++ b/packages/isaacscript-common/src/functions/map.ts @@ -2,7 +2,7 @@ import type { DefaultMap } from "../classes/DefaultMap"; import { sumArray } from "./array"; /** Helper function to copy a map. (You can also use a Map constructor to accomplish this task.) */ -// eslint-disable-next-line isaacscript/no-mutable-return +// eslint-disable-next-line complete/no-mutable-return export function copyMap(oldMap: ReadonlyMap): Map { const newMap = new Map(); for (const [key, value] of oldMap) { @@ -33,7 +33,7 @@ export function defaultMapGetHash( * `mapSetHash` helper function. */ export function defaultMapSetHash( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types map: Map, entity: Entity, value: V, @@ -79,7 +79,7 @@ export function getReversedMap( * the map uses `PtrHash` as an index. */ export function mapSetHash( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types map: Map, entity: Entity, value: V, @@ -101,10 +101,9 @@ export function mapSetHash( * * Also see the `objectToReadonlyMap` function. */ -// eslint-disable-next-line isaacscript/no-mutable-return export function objectToMap( object: Record, -): Map { +): ReadonlyMap { const map = new Map(); for (const [key, value] of Object.entries(object)) { diff --git a/packages/isaacscript-common/src/functions/math.ts b/packages/isaacscript-common/src/functions/math.ts index 0f03ce7b5..2d8d44818 100644 --- a/packages/isaacscript-common/src/functions/math.ts +++ b/packages/isaacscript-common/src/functions/math.ts @@ -62,10 +62,10 @@ export function inRectangle( bottomRight: Vector, ): boolean { return ( - position.X >= topLeft.X && - position.X <= bottomRight.X && - position.Y >= topLeft.Y && - position.Y <= bottomRight.Y + position.X >= topLeft.X + && position.X <= bottomRight.X + && position.Y >= topLeft.Y + && position.Y <= bottomRight.Y ); } diff --git a/packages/isaacscript-common/src/functions/merge.ts b/packages/isaacscript-common/src/functions/merge.ts index eed8b9fe9..dbff183fe 100644 --- a/packages/isaacscript-common/src/functions/merge.ts +++ b/packages/isaacscript-common/src/functions/merge.ts @@ -131,7 +131,7 @@ function mergeSerializedArray( } function mergeSerializedTSTLObject( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types oldObject: Map | Set, newTable: LuaMap, traversalDescription: string, diff --git a/packages/isaacscript-common/src/functions/minimap.ts b/packages/isaacscript-common/src/functions/minimap.ts index 2ecbc769a..968b84b93 100644 --- a/packages/isaacscript-common/src/functions/minimap.ts +++ b/packages/isaacscript-common/src/functions/minimap.ts @@ -91,9 +91,7 @@ export function getRoomDisplayFlags( roomGridIndex?: int, minimapAPI = true, ): BitFlags { - if (roomGridIndex === undefined) { - roomGridIndex = getRoomGridIndex(); - } + roomGridIndex ??= getRoomGridIndex(); if (MinimapAPI === undefined || !minimapAPI) { const roomDescriptor = getRoomDescriptor(roomGridIndex); @@ -217,9 +215,7 @@ export function setRoomDisplayFlags( displayFlags: BitFlags, updateVisibility = true, ): void { - if (roomGridIndex === undefined) { - roomGridIndex = getRoomGridIndex(); - } + roomGridIndex ??= getRoomGridIndex(); if (MinimapAPI === undefined) { const roomDescriptor = getRoomDescriptor(roomGridIndex); diff --git a/packages/isaacscript-common/src/functions/newArray.ts b/packages/isaacscript-common/src/functions/newArray.ts index f20544121..6010f7665 100644 --- a/packages/isaacscript-common/src/functions/newArray.ts +++ b/packages/isaacscript-common/src/functions/newArray.ts @@ -16,7 +16,7 @@ import { repeat } from "./utils"; * const arrayWithArrays = newArray([0], 20); // Has 20 elements of an array with a 0 in it. * ``` */ -// eslint-disable-next-line isaacscript/no-mutable-return +// eslint-disable-next-line complete/no-mutable-return export function newArray(defaultValue: T, size: int): T[] { const array: T[] = []; repeat(size, () => { diff --git a/packages/isaacscript-common/src/functions/nextStage.ts b/packages/isaacscript-common/src/functions/nextStage.ts index c00ec1530..2b2f15de8 100644 --- a/packages/isaacscript-common/src/functions/nextStage.ts +++ b/packages/isaacscript-common/src/functions/nextStage.ts @@ -41,16 +41,19 @@ export function getNextStage(): LevelStage { // Second, handle the special case of being in a specific off-grid room. switch (roomGridIndex) { // -8 + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison case GridRoom.BLUE_WOMB: { return LevelStage.BLUE_WOMB; } // -9 + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison case GridRoom.VOID: { return LevelStage.VOID; } // -10 + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison case GridRoom.SECRET_EXIT: { if (repentanceStage) { // e.g. From Downpour 2 to Mines 1, etc. @@ -58,8 +61,8 @@ export function getNextStage(): LevelStage { } if ( - stage === LevelStage.DEPTHS_2 || - (stage === LevelStage.DEPTHS_1 && hasCurse(LevelCurse.LABYRINTH)) + stage === LevelStage.DEPTHS_2 + || (stage === LevelStage.DEPTHS_1 && hasCurse(LevelCurse.LABYRINTH)) ) { // From Depths 2 to Mausoleum 2 through the strange door. return LevelStage.DEPTHS_2; @@ -149,24 +152,25 @@ export function getNextStageType(upwards = false): StageType { } // Second, handle the special case of being in a specific off-grid room. + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison if (roomGridIndex === GridRoom.SECRET_EXIT) { return calculateStageTypeRepentance(nextStage); } if ( - repentanceStage && - (stage === LevelStage.BASEMENT_1 || // 1 - stage === LevelStage.CAVES_1 || // 3 - stage === LevelStage.DEPTHS_1 || // 5 - stage === LevelStage.WOMB_1) // 7 + repentanceStage + && (stage === LevelStage.BASEMENT_1 // 1 + || stage === LevelStage.CAVES_1 // 3 + || stage === LevelStage.DEPTHS_1 // 5 + || stage === LevelStage.WOMB_1) // 7 ) { return calculateStageTypeRepentance(nextStage); } if ( - repentanceStage && - stage === LevelStage.DEPTHS_2 && - mausoleumHeartKilled + repentanceStage + && stage === LevelStage.DEPTHS_2 + && mausoleumHeartKilled ) { return calculateStageTypeRepentance(nextStage); } diff --git a/packages/isaacscript-common/src/functions/npcDataStructures.ts b/packages/isaacscript-common/src/functions/npcDataStructures.ts index 697490230..cc2b7f30b 100644 --- a/packages/isaacscript-common/src/functions/npcDataStructures.ts +++ b/packages/isaacscript-common/src/functions/npcDataStructures.ts @@ -41,7 +41,7 @@ export function defaultMapGetNPC( * `mapSetNPC` helper function. */ export function defaultMapSetNPC( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types map: Map, npc: EntityNPC, value: V, @@ -54,7 +54,7 @@ export function defaultMapSetNPC( * `Map.delete` method if you have a set of this type. */ export function mapDeleteNPC( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types map: Map, npc: EntityNPC, ): boolean { @@ -123,7 +123,7 @@ export function mapHasNPC( * ``` */ export function mapSetNPC( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types map: Map, npc: EntityNPC, value: V, @@ -136,7 +136,7 @@ export function mapSetNPC( * Helper function to make using sets with an type of `PtrHash` easier. Use this instead of the * `Set.add` method if you have a set of this type. */ -// eslint-disable-next-line isaacscript/prefer-readonly-parameter-types +// eslint-disable-next-line complete/prefer-readonly-parameter-types export function setAddNPC(set: Set, npc: EntityNPC): void { const ptrHash = GetPtrHash(npc); set.add(ptrHash); @@ -146,7 +146,7 @@ export function setAddNPC(set: Set, npc: EntityNPC): void { * Helper function to make using sets with an type of `PtrHash` easier. Use this instead of the * `Set.delete` method if you have a set of this type. */ -// eslint-disable-next-line isaacscript/prefer-readonly-parameter-types +// eslint-disable-next-line complete/prefer-readonly-parameter-types export function setDeleteNPC(set: Set, npc: EntityNPC): boolean { const ptrHash = GetPtrHash(npc); return set.delete(ptrHash); diff --git a/packages/isaacscript-common/src/functions/npcs.ts b/packages/isaacscript-common/src/functions/npcs.ts index 68e3c070a..e8ec1723d 100644 --- a/packages/isaacscript-common/src/functions/npcs.ts +++ b/packages/isaacscript-common/src/functions/npcs.ts @@ -131,9 +131,10 @@ export function isDaddyLongLegsChildStompEntity(npc: EntityNPC): boolean { */ export function isDyingDump(npc: EntityNPC): boolean { return ( - npc.Type === EntityType.DUMP && - npc.Variant === DumpVariant.DUMP && - npc.State === NPCState.SPECIAL + npc.Type === EntityType.DUMP + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && npc.Variant === DumpVariant.DUMP + && npc.State === NPCState.SPECIAL ); } @@ -144,10 +145,11 @@ export function isDyingDump(npc: EntityNPC): boolean { */ export function isDyingEggyWithNoSpidersLeft(npc: EntityNPC): boolean { return ( - npc.Type === EntityType.HOPPER && - npc.Variant === HopperVariant.EGGY && - npc.State === NPCState.SUICIDE && - npc.StateFrame >= EGGY_STATE_FRAME_OF_FINAL_SPIDER + npc.Type === EntityType.HOPPER + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && npc.Variant === HopperVariant.EGGY + && npc.State === NPCState.SUICIDE + && npc.StateFrame >= EGGY_STATE_FRAME_OF_FINAL_SPIDER ); } @@ -159,9 +161,10 @@ export function isDyingEggyWithNoSpidersLeft(npc: EntityNPC): boolean { */ export function isRaglingDeathPatch(npc: EntityNPC): boolean { return ( - npc.Type === EntityType.RAGLING && - npc.Variant === RaglingVariant.RAG_MANS_RAGLING && + npc.Type === EntityType.RAGLING + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && npc.Variant === RaglingVariant.RAG_MANS_RAGLING // They go to `STATE_SPECIAL` when they are patches on the ground. - npc.State === NPCState.SPECIAL + && npc.State === NPCState.SPECIAL ); } diff --git a/packages/isaacscript-common/src/functions/pickupVariants.ts b/packages/isaacscript-common/src/functions/pickupVariants.ts index c3a23bc17..f964a7785 100644 --- a/packages/isaacscript-common/src/functions/pickupVariants.ts +++ b/packages/isaacscript-common/src/functions/pickupVariants.ts @@ -54,8 +54,8 @@ export function isPill(pickup: EntityPickup): pickup is EntityPickupPill { /** For `PickupVariant.LIL_BATTERY` (90). */ export function isBattery(pickup: EntityPickup): pickup is EntityPickupBattery { return ( - pickup.Type === EntityType.PICKUP && - pickup.Variant === PickupVariant.LIL_BATTERY + pickup.Type === EntityType.PICKUP + && pickup.Variant === PickupVariant.LIL_BATTERY ); } @@ -64,8 +64,8 @@ export function isCollectible( pickup: EntityPickup, ): pickup is EntityPickupCollectible { return ( - pickup.Type === EntityType.PICKUP && - pickup.Variant === PickupVariant.COLLECTIBLE + pickup.Type === EntityType.PICKUP + && pickup.Variant === PickupVariant.COLLECTIBLE ); } @@ -79,7 +79,7 @@ export function isCardPickup(pickup: EntityPickup): pickup is EntityPickupCard { /** For `PickupVariant.TRINKET` (350). */ export function isTrinket(pickup: EntityPickup): pickup is EntityPickupTrinket { return ( - pickup.Type === EntityType.PICKUP && - pickup.Variant === PickupVariant.TRINKET + pickup.Type === EntityType.PICKUP + && pickup.Variant === PickupVariant.TRINKET ); } diff --git a/packages/isaacscript-common/src/functions/pickupsSpecific.ts b/packages/isaacscript-common/src/functions/pickupsSpecific.ts index 2a4142ee5..adc3cb316 100644 --- a/packages/isaacscript-common/src/functions/pickupsSpecific.ts +++ b/packages/isaacscript-common/src/functions/pickupsSpecific.ts @@ -378,8 +378,8 @@ export function spawnBattery( batterySubType: BatterySubType, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityPickupBattery { return spawnPickup( PickupVariant.LIL_BATTERY, @@ -400,7 +400,7 @@ export function spawnBatteryWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityPickupBattery { return spawnBattery( batterySubType, @@ -416,8 +416,8 @@ export function spawnBombPickup( bombSubType: BombSubType, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityPickupBomb { return spawnPickup( PickupVariant.BOMB, @@ -438,7 +438,7 @@ export function spawnBombPickupWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityPickupBomb { return spawnBombPickup( bombSubType, @@ -454,8 +454,8 @@ export function spawnCard( cardType: CardType, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityPickupCard { return spawnPickup( PickupVariant.CARD, @@ -476,7 +476,7 @@ export function spawnCardWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityPickupCard { return spawnCard(cardType, positionOrGridIndex, velocity, spawner, seedOrRNG); } @@ -486,8 +486,8 @@ export function spawnCoin( coinSubType: CoinSubType, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityPickupCoin { return spawnPickup( PickupVariant.COIN, @@ -508,7 +508,7 @@ export function spawnCoinWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityPickupCoin { return spawnCoin( coinSubType, @@ -524,8 +524,8 @@ export function spawnHeart( heartSubType: HeartSubType, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityPickupHeart { return spawnPickup( PickupVariant.HEART, @@ -542,7 +542,7 @@ export function spawnHeartWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityPickupHeart { return spawnHeart( heartSubType, @@ -558,8 +558,8 @@ export function spawnKey( keySubType: KeySubType, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityPickupKey { return spawnPickup( PickupVariant.KEY, @@ -580,7 +580,7 @@ export function spawnKeyWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityPickupKey { return spawnKey( keySubType, @@ -596,8 +596,8 @@ export function spawnPill( pillColor: PillColor, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityPickupPill { return spawnPickup( PickupVariant.PILL, @@ -618,7 +618,7 @@ export function spawnPillWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityPickupPill { return spawnPill( pillColor, @@ -634,8 +634,8 @@ export function spawnSack( sackSubType: SackSubType, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityPickupSack { return spawnPickup( PickupVariant.SACK, @@ -656,7 +656,7 @@ export function spawnSackWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityPickupSack { return spawnSack( sackSubType, @@ -674,8 +674,8 @@ export function spawnTrinket( trinketType: TrinketType, positionOrGridIndex: Vector | int, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, - seedOrRNG: Seed | RNG | undefined = undefined, + spawner?: Entity, + seedOrRNG?: Seed | RNG, ): EntityPickupTrinket { return spawnPickup( PickupVariant.TRINKET, @@ -696,7 +696,7 @@ export function spawnTrinketWithSeed( positionOrGridIndex: Vector | int, seedOrRNG: Seed | RNG, velocity: Vector = VectorZero, - spawner: Entity | undefined = undefined, + spawner?: Entity, ): EntityPickupTrinket { return spawnTrinket( trinketType, diff --git a/packages/isaacscript-common/src/functions/playerCollectibles.ts b/packages/isaacscript-common/src/functions/playerCollectibles.ts index eec5607aa..e6ecd9877 100644 --- a/packages/isaacscript-common/src/functions/playerCollectibles.ts +++ b/packages/isaacscript-common/src/functions/playerCollectibles.ts @@ -78,9 +78,7 @@ export function getActiveItemSlots( */ export function getAdjustedPrice(basePrice: int): int { const numSteamSales = getTotalPlayerCollectibles(CollectibleType.STEAM_SALE); - return numSteamSales > 0 - ? Math.floor(basePrice / (numSteamSales + 1)) - : basePrice; + return Math.ceil(basePrice / (numSteamSales + 1)); } /** @@ -196,8 +194,8 @@ export function hasOpenActiveItemSlot(player: EntityPlayer): boolean { if (hasSchoolbag) { return ( - activeItemPrimary === CollectibleType.NULL || - activeItemSecondary === CollectibleType.NULL + activeItemPrimary === CollectibleType.NULL + || activeItemSecondary === CollectibleType.NULL ); } @@ -315,9 +313,7 @@ export function setActiveItem( const primaryCharge = player.GetActiveCharge(ActiveSlot.PRIMARY); const secondaryCollectibleType = player.GetActiveItem(ActiveSlot.SECONDARY); - if (charge === undefined) { - charge = getCollectibleMaxCharges(collectibleType); - } + charge ??= getCollectibleMaxCharges(collectibleType); if (!keepInPools) { itemPool.RemoveCollectible(collectibleType); diff --git a/packages/isaacscript-common/src/functions/playerDataStructures.ts b/packages/isaacscript-common/src/functions/playerDataStructures.ts index 89681e952..cbc2acf19 100644 --- a/packages/isaacscript-common/src/functions/playerDataStructures.ts +++ b/packages/isaacscript-common/src/functions/playerDataStructures.ts @@ -39,7 +39,7 @@ export function defaultMapGetPlayer( * `mapSetPlayer` helper function. */ export function defaultMapSetPlayer( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types map: Map, player: EntityPlayer, value: V, @@ -52,7 +52,7 @@ export function defaultMapSetPlayer( * `Map.delete` method if you have a set of this type. */ export function mapDeletePlayer( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types map: Map, player: EntityPlayer, ): boolean { @@ -121,7 +121,7 @@ export function mapHasPlayer( * ``` */ export function mapSetPlayer( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types map: Map, player: EntityPlayer, value: V, @@ -135,7 +135,7 @@ export function mapSetPlayer( * `Set.add` method if you have a set of this type. */ export function setAddPlayer( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types set: Set, player: EntityPlayer, ): void { @@ -148,7 +148,7 @@ export function setAddPlayer( * `Set.delete` method if you have a set of this type. */ export function setDeletePlayer( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types set: Set, player: EntityPlayer, ): boolean { diff --git a/packages/isaacscript-common/src/functions/playerHealth.ts b/packages/isaacscript-common/src/functions/playerHealth.ts index f21a3cd11..485ce702c 100644 --- a/packages/isaacscript-common/src/functions/playerHealth.ts +++ b/packages/isaacscript-common/src/functions/playerHealth.ts @@ -381,8 +381,8 @@ export function getPlayerMaxHeartContainers(player: EntityPlayer): int { // 1 // Magdalene can increase her maximum heart containers with Birthright. if ( - character === PlayerType.MAGDALENE && - player.HasCollectible(CollectibleType.BIRTHRIGHT) + character === PlayerType.MAGDALENE + && player.HasCollectible(CollectibleType.BIRTHRIGHT) ) { const extraMaxHeartContainersFromBirthright = 6; return characterMaxHeartContainers + extraMaxHeartContainersFromBirthright; @@ -404,9 +404,9 @@ export function getPlayerMaxHeartContainers(player: EntityPlayer): int { : 0; return ( - characterMaxHeartContainers + - numMothersKisses + - greedsGulletCoinContainers + characterMaxHeartContainers + + numMothersKisses + + greedsGulletCoinContainers ); } @@ -599,9 +599,9 @@ export function setPlayerHealth( playerHealth.soulHearts + playerHealth.boneHearts * 2 < (i + 1) * 2; let addAmount = 2; if ( - isHalf || - soulHeartType === HeartSubType.BONE || - soulHeartsRemaining < 2 + isHalf + || soulHeartType === HeartSubType.BONE + || soulHeartsRemaining < 2 ) { // Fix the bug where a half soul heart to the left of a bone heart will be treated as a full // soul heart. diff --git a/packages/isaacscript-common/src/functions/playerIndex.ts b/packages/isaacscript-common/src/functions/playerIndex.ts index 293713fbc..023813f65 100644 --- a/packages/isaacscript-common/src/functions/playerIndex.ts +++ b/packages/isaacscript-common/src/functions/playerIndex.ts @@ -219,8 +219,8 @@ export function isChildPlayer(player: EntityPlayer): boolean { */ export function isFoundSoul(player: EntityPlayer): boolean { return ( - isChildPlayer(player) && - player.Variant === PlayerVariant.COOP_BABY && - player.SubType === (BabySubType.FOUND_SOUL as int) + isChildPlayer(player) + && player.Variant === PlayerVariant.COOP_BABY + && player.SubType === (BabySubType.FOUND_SOUL as int) ); } diff --git a/packages/isaacscript-common/src/functions/players.ts b/packages/isaacscript-common/src/functions/players.ts index 33b682f2c..de382b307 100644 --- a/packages/isaacscript-common/src/functions/players.ts +++ b/packages/isaacscript-common/src/functions/players.ts @@ -56,10 +56,10 @@ export function canPlayerCrushRocks(player: EntityPlayer): boolean { const effects = player.GetEffects(); return ( - player.HasCollectible(CollectibleType.LEO) || - player.HasCollectible(CollectibleType.THUNDER_THIGHS) || - effects.HasCollectibleEffect(CollectibleType.MEGA_MUSH) || - player.HasPlayerForm(PlayerForm.STOMPY) + player.HasCollectible(CollectibleType.LEO) + || player.HasCollectible(CollectibleType.THUNDER_THIGHS) + || effects.HasCollectibleEffect(CollectibleType.MEGA_MUSH) + || player.HasPlayerForm(PlayerForm.STOMPY) ); } diff --git a/packages/isaacscript-common/src/functions/pocketItems.ts b/packages/isaacscript-common/src/functions/pocketItems.ts index a83bbea0b..87a92f752 100644 --- a/packages/isaacscript-common/src/functions/pocketItems.ts +++ b/packages/isaacscript-common/src/functions/pocketItems.ts @@ -47,8 +47,8 @@ export function getFirstCardOrPill( const pocketItems = getPocketItems(player); return pocketItems.find( (pocketItem) => - pocketItem.type === PocketItemType.CARD || - pocketItem.type === PocketItemType.PILL, + pocketItem.type === PocketItemType.CARD + || pocketItem.type === PocketItemType.PILL, ); } diff --git a/packages/isaacscript-common/src/functions/positionVelocity.ts b/packages/isaacscript-common/src/functions/positionVelocity.ts index 0c8c4f8e1..906818e54 100644 --- a/packages/isaacscript-common/src/functions/positionVelocity.ts +++ b/packages/isaacscript-common/src/functions/positionVelocity.ts @@ -112,9 +112,7 @@ export function findFreePosition( export function getEntityPositions( entities?: readonly Entity[], ): ReadonlyMap { - if (entities === undefined) { - entities = getEntities(); - } + entities ??= getEntities(); const entityPositions = new Map(); for (const entity of entities) { @@ -137,9 +135,7 @@ export function getEntityPositions( export function getEntityVelocities( entities?: readonly Entity[], ): ReadonlyMap { - if (entities === undefined) { - entities = getEntities(); - } + entities ??= getEntities(); const entityVelocities = new Map(); for (const entity of entities) { @@ -167,9 +163,7 @@ export function setEntityPositions( entityPositions: ReadonlyMap, entities?: readonly Entity[], ): void { - if (entities === undefined) { - entities = getEntities(); - } + entities ??= getEntities(); for (const entity of entities) { const ptrHash = GetPtrHash(entity); @@ -197,9 +191,7 @@ export function setEntityVelocities( entityVelocities: ReadonlyMap, entities?: readonly Entity[], ): void { - if (entities === undefined) { - entities = getEntities(); - } + entities ??= getEntities(); for (const entity of entities) { const ptrHash = GetPtrHash(entity); diff --git a/packages/isaacscript-common/src/functions/revive.ts b/packages/isaacscript-common/src/functions/revive.ts index 0d03e9334..647043bda 100644 --- a/packages/isaacscript-common/src/functions/revive.ts +++ b/packages/isaacscript-common/src/functions/revive.ts @@ -35,8 +35,8 @@ export function isDamageToPlayerFatal( // If we are Tainted Jacob and the damage source is Dark Esau, this will not be fatal damage // (because we will transform into Tainted Jacob's lost form). if ( - character === PlayerType.JACOB_B && - source.Type === EntityType.DARK_ESAU + character === PlayerType.JACOB_B + && source.Type === EntityType.DARK_ESAU ) { return false; } @@ -50,11 +50,11 @@ export function isDamageToPlayerFatal( // If we are playing Tainted Samson and the incoming hit will cause us to become Berserk, then // this will not be fatal damage. const berserkChargeAfterHit = - player.SamsonBerserkCharge + - TAINTED_SAMSON_BERSERK_CHARGE_FROM_TAKING_DAMAGE; + player.SamsonBerserkCharge + + TAINTED_SAMSON_BERSERK_CHARGE_FROM_TAKING_DAMAGE; if ( - character === PlayerType.SAMSON_B && - berserkChargeAfterHit >= MAX_TAINTED_SAMSON_BERSERK_CHARGE + character === PlayerType.SAMSON_B + && berserkChargeAfterHit >= MAX_TAINTED_SAMSON_BERSERK_CHARGE ) { return false; } @@ -89,8 +89,8 @@ export function isDamageToPlayerFatal( // This will not be fatal damage if we have Glass Cannon and this is the second time we are taking // damage on the same frame. if ( - player.HasCollectible(CollectibleType.BROKEN_GLASS_CANNON) && - onGameFrame(lastDamageGameFrame) + player.HasCollectible(CollectibleType.BROKEN_GLASS_CANNON) + && onGameFrame(lastDamageGameFrame) ) { return false; } @@ -103,11 +103,11 @@ export function isDamageToPlayerFatal( const soulHearts = player.GetSoulHearts(); const boneHearts = player.GetBoneHearts(); if ( - (hearts > 0 && soulHearts > 0) || - (hearts > 0 && boneHearts > 0) || - (soulHearts > 0 && boneHearts > 0) || - (soulHearts > 0 && eternalHearts > 0) || - boneHearts >= 2 // Two bone hearts and nothing else should not result in a death + (hearts > 0 && soulHearts > 0) + || (hearts > 0 && boneHearts > 0) + || (soulHearts > 0 && boneHearts > 0) + || (soulHearts > 0 && eternalHearts > 0) + || boneHearts >= 2 // Two bone hearts and nothing else should not result in a death ) { return false; } @@ -155,8 +155,8 @@ export function willPlayerRevive(player: EntityPlayer): boolean { ); const willRevive = - player.WillPlayerRevive() || - (trinketSituation !== undefined && willMysteriousPaperRevive(player)); + player.WillPlayerRevive() + || (trinketSituation !== undefined && willMysteriousPaperRevive(player)); giveTrinketsBack(player, trinketSituation); diff --git a/packages/isaacscript-common/src/functions/rng.ts b/packages/isaacscript-common/src/functions/rng.ts index 4d73c85c6..075ac64d7 100644 --- a/packages/isaacscript-common/src/functions/rng.ts +++ b/packages/isaacscript-common/src/functions/rng.ts @@ -17,7 +17,8 @@ export type SerializedRNG = LuaMap & { /** * This is the ShiftIdx that Blade recommended after having reviewing the game's internal functions. * Any value between 0 and 80 should work equally well. - * https://www.jstatsoft.org/article/view/v008i14/xorshift.pdf + * + * @see https://www.jstatsoft.org/article/view/v008i14/xorshift.pdf */ const RECOMMENDED_SHIFT_IDX = 35; @@ -63,7 +64,7 @@ export function deserializeRNG(rng: SerializedRNG): RNG { * the game. */ export function getRandomSeed(): Seed { - const randomNumber = Random(); // eslint-disable-line deprecation/deprecation + const randomNumber = Random(); // eslint-disable-line @typescript-eslint/no-deprecated const safeRandomNumber = randomNumber === 0 ? 1 : randomNumber; return safeRandomNumber as Seed; } @@ -171,6 +172,6 @@ export function setSeed(rng: RNG, seed: Seed): void { } // The game expects seeds in the range of 1 to 4294967295 (1^32 - 1). - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated rng.SetSeed(seed, RECOMMENDED_SHIFT_IDX); } diff --git a/packages/isaacscript-common/src/functions/roomData.ts b/packages/isaacscript-common/src/functions/roomData.ts index 3fdea4313..ecb330086 100644 --- a/packages/isaacscript-common/src/functions/roomData.ts +++ b/packages/isaacscript-common/src/functions/roomData.ts @@ -65,9 +65,7 @@ export function getRoomData(roomGridIndex?: int): RoomConfig | undefined { export function getRoomDescriptor(roomGridIndex?: int): RoomDescriptor { const level = game.GetLevel(); - if (roomGridIndex === undefined) { - roomGridIndex = getRoomGridIndex(); - } + roomGridIndex ??= getRoomGridIndex(); return level.GetRoomByIdx(roomGridIndex); } diff --git a/packages/isaacscript-common/src/functions/roomGrid.ts b/packages/isaacscript-common/src/functions/roomGrid.ts index 892a3e9e4..95ae57dc0 100644 --- a/packages/isaacscript-common/src/functions/roomGrid.ts +++ b/packages/isaacscript-common/src/functions/roomGrid.ts @@ -94,8 +94,8 @@ function isValidGridPositionLRoom(gridPosition: Vector, roomShape: RoomShape) { horizontalBottomRight, } = rectangles; return ( - inRectangle(gridPosition, verticalTopLeft, verticalBottomRight) || - inRectangle(gridPosition, horizontalTopLeft, horizontalBottomRight) + inRectangle(gridPosition, verticalTopLeft, verticalBottomRight) + || inRectangle(gridPosition, horizontalTopLeft, horizontalBottomRight) ); } diff --git a/packages/isaacscript-common/src/functions/rooms.ts b/packages/isaacscript-common/src/functions/rooms.ts index 3d6740646..5cbc216ca 100644 --- a/packages/isaacscript-common/src/functions/rooms.ts +++ b/packages/isaacscript-common/src/functions/rooms.ts @@ -1,7 +1,6 @@ import type { BackdropType, BossID, - ItemPoolType, MinibossID, RoomShape, } from "isaac-typescript-definitions"; @@ -14,6 +13,7 @@ import { DungeonSubType, GridRoom, HomeRoomSubType, + ItemPoolType, RoomDescriptorFlag, RoomType, SoundEffect, @@ -106,8 +106,8 @@ export function getReadOnlyRooms(): ReadonlyArray> { for (let i = 0; i < roomList.Size; i++) { const readOnlyRoomDescriptor = roomList.Get(i); if ( - readOnlyRoomDescriptor !== undefined && - readOnlyRoomDescriptor.Data !== undefined + readOnlyRoomDescriptor !== undefined + && readOnlyRoomDescriptor.Data !== undefined ) { readOnlyRoomDescriptors.push(readOnlyRoomDescriptor); } @@ -166,14 +166,25 @@ export function getRoomDataForTypeVariant( /** * Helper function to get the item pool type for the current room. For example, this returns * `ItemPoolType.ItemPoolType.POOL_ANGEL` if you are in an Angel Room. + * + * This function is a wrapper around the `ItemPool.GetPoolForRoom` method. + * + * Note that `ItemPool.GetPoolForRoom` will return -1 in `RoomType.DEFAULT` (1) rooms, but this + * function will convert -1 to `ItemPoolType.TREASURE` (0) for convenience purposes (since the game + * is "supposed" to use the Treasure Room pool for collectibles spawned in normal rooms). If you + * need to distinguish between real Treasure Rooms and default rooms, then use the + * `ItemPool.GetPoolForRoom` method directly. */ export function getRoomItemPoolType(): ItemPoolType { const itemPool = game.GetItemPool(); const room = game.GetRoom(); const roomType = room.GetType(); const roomSeed = room.GetSpawnSeed(); + const itemPoolTypeOrNegativeOne = itemPool.GetPoolForRoom(roomType, roomSeed); - return itemPool.GetPoolForRoom(roomType, roomSeed); + return itemPoolTypeOrNegativeOne === -1 + ? ItemPoolType.TREASURE + : itemPoolTypeOrNegativeOne; } /** @@ -216,8 +227,7 @@ export function getRooms( * Room descriptors without any data are assumed to be non-existent and are not included. * * @param includeExtraDimensionalRooms Optional. On some floors (e.g. Downpour 2, Mines 2), - * extra-dimensional rooms are automatically be generated. Default - * is false. + * extra-dimensional rooms will be generated. Default is false. */ export function getRoomsInsideGrid( includeExtraDimensionalRooms = false, @@ -559,32 +569,32 @@ export function isAllRoomsClear( const roomTypeWhitelist = new ReadonlySet(onlyCheckRoomTypes); matchingRooms = roomsInsideGrid.filter( (roomDescriptor) => - roomDescriptor.Data !== undefined && - roomTypeWhitelist.has(roomDescriptor.Data.Type), + roomDescriptor.Data !== undefined + && roomTypeWhitelist.has(roomDescriptor.Data.Type), ); } if (!includeSecretRoom) { matchingRooms = matchingRooms.filter( (roomDescriptor) => - roomDescriptor.Data !== undefined && - roomDescriptor.Data.Type !== RoomType.SECRET, + roomDescriptor.Data !== undefined + && roomDescriptor.Data.Type !== RoomType.SECRET, ); } if (!includeSuperSecretRoom) { matchingRooms = matchingRooms.filter( (roomDescriptor) => - roomDescriptor.Data !== undefined && - roomDescriptor.Data.Type !== RoomType.SUPER_SECRET, + roomDescriptor.Data !== undefined + && roomDescriptor.Data.Type !== RoomType.SUPER_SECRET, ); } if (!includeUltraSecretRoom) { matchingRooms = matchingRooms.filter( (roomDescriptor) => - roomDescriptor.Data !== undefined && - roomDescriptor.Data.Type !== RoomType.ULTRA_SECRET, + roomDescriptor.Data !== undefined + && roomDescriptor.Data.Type !== RoomType.ULTRA_SECRET, ); } @@ -599,8 +609,9 @@ export function isAllRoomsClear( */ export function isAngelShop(roomData: RoomConfig): boolean { return ( - roomData.Type === RoomType.ANGEL && - roomData.Subtype === AngelRoomSubType.SHOP + roomData.Type === RoomType.ANGEL + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && roomData.Subtype === AngelRoomSubType.SHOP ); } @@ -614,8 +625,9 @@ export function isAngelShop(roomData: RoomConfig): boolean { */ export function isBeastRoom(roomData: RoomConfig): boolean { return ( - roomData.Type === RoomType.DUNGEON && - roomData.Subtype === DungeonSubType.BEAST_ROOM + roomData.Type === RoomType.DUNGEON + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && roomData.Subtype === DungeonSubType.BEAST_ROOM ); } @@ -633,9 +645,10 @@ export function isBigRoom(roomData: RoomConfig): boolean { */ export function isBossRoomOf(roomData: RoomConfig, bossID: BossID): boolean { return ( - roomData.Type === RoomType.BOSS && - roomData.StageID === StageID.SPECIAL_ROOMS && - roomData.Subtype === bossID + roomData.Type === RoomType.BOSS + && roomData.StageID === StageID.SPECIAL_ROOMS + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && roomData.Subtype === bossID ); } @@ -646,8 +659,9 @@ export function isBossRoomOf(roomData: RoomConfig, bossID: BossID): boolean { */ export function isCrawlSpace(roomData: RoomConfig): boolean { return ( - roomData.Type === RoomType.DUNGEON && - roomData.Subtype === DungeonSubType.NORMAL + roomData.Type === RoomType.DUNGEON + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && roomData.Subtype === DungeonSubType.NORMAL ); } @@ -668,9 +682,11 @@ export function isCrawlSpaceWithBlackMarketEntrance( */ export function isDeathCertificateArea(roomData: RoomConfig): boolean { return ( - roomData.StageID === StageID.HOME && - (roomData.Subtype === HomeRoomSubType.DEATH_CERTIFICATE_ENTRANCE || - roomData.Subtype === HomeRoomSubType.DEATH_CERTIFICATE_ITEMS) + roomData.StageID === StageID.HOME + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && (roomData.Subtype === HomeRoomSubType.DEATH_CERTIFICATE_ENTRANCE + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + || roomData.Subtype === HomeRoomSubType.DEATH_CERTIFICATE_ITEMS) ); } @@ -701,10 +717,11 @@ export function isDevilsCrownTreasureRoom( */ export function isDogmaRoom(roomData: RoomConfig): boolean { return ( - roomData.StageID === StageID.HOME && - roomData.Type === RoomType.DEFAULT && - roomData.Variant === 1000 && - roomData.Subtype === HomeRoomSubType.LIVING_ROOM + roomData.StageID === StageID.HOME + && roomData.Type === RoomType.DEFAULT + && roomData.Variant === 1000 + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && roomData.Subtype === HomeRoomSubType.LIVING_ROOM ); } @@ -729,6 +746,7 @@ export function isDoubleTrouble(roomData: RoomConfig): boolean { * Helper function to determine if the index of the provided room is equal to `GridRoom.GENESIS`. */ export function isGenesisRoom(roomGridIndex: int): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison return roomGridIndex === GridRoom.GENESIS; } @@ -740,9 +758,11 @@ export function isGenesisRoom(roomGridIndex: int): boolean { */ export function isHomeCloset(roomData: RoomConfig): boolean { return ( - roomData.StageID === StageID.HOME && - (roomData.Subtype === HomeRoomSubType.CLOSET_LEFT || - roomData.Subtype === HomeRoomSubType.CLOSET_RIGHT) + roomData.StageID === StageID.HOME + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && (roomData.Subtype === HomeRoomSubType.CLOSET_LEFT + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + || roomData.Subtype === HomeRoomSubType.CLOSET_RIGHT) ); } @@ -755,6 +775,7 @@ export function isLRoom(roomData: RoomConfig): boolean { * Helper function to determine if the index of the provided room is equal to `GridRoom.MEGA_SATAN`. */ export function isMegaSatanRoom(roomGridIndex: int): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison return roomGridIndex === GridRoom.MEGA_SATAN; } @@ -764,10 +785,9 @@ export function isMegaSatanRoom(roomGridIndex: int): boolean { */ export function isMineShaft(roomData: RoomConfig): boolean { return ( - (roomData.StageID === StageID.MINES || - roomData.StageID === StageID.ASHPIT) && - // eslint-disable-next-line isaacscript/strict-enums - MINE_SHAFT_ROOM_SUB_TYPE_SET.has(roomData.Subtype) + (roomData.StageID === StageID.MINES || roomData.StageID === StageID.ASHPIT) + // eslint-disable-next-line complete/strict-enums + && MINE_SHAFT_ROOM_SUB_TYPE_SET.has(roomData.Subtype) ); } @@ -780,9 +800,10 @@ export function isMinibossRoomOf( minibossID: MinibossID, ): boolean { return ( - roomData.Type === RoomType.MINI_BOSS && - roomData.StageID === StageID.SPECIAL_ROOMS && - roomData.Subtype === minibossID + roomData.Type === RoomType.MINI_BOSS + && roomData.StageID === StageID.SPECIAL_ROOMS + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && roomData.Subtype === minibossID ); } @@ -792,10 +813,11 @@ export function isMinibossRoomOf( */ export function isMirrorRoom(roomData: RoomConfig): boolean { return ( - roomData.Type === RoomType.DEFAULT && - (roomData.StageID === StageID.DOWNPOUR || - roomData.StageID === StageID.DROSS) && - roomData.Subtype === DownpourRoomSubType.MIRROR + roomData.Type === RoomType.DEFAULT + && (roomData.StageID === StageID.DOWNPOUR + || roomData.StageID === StageID.DROSS) + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + && roomData.Subtype === DownpourRoomSubType.MIRROR ); } @@ -828,6 +850,7 @@ export function isRoomType( * floor. */ export function isSecretExit(roomGridIndex: int): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison return roomGridIndex === GridRoom.SECRET_EXIT; } @@ -848,6 +871,7 @@ export function isSecretRoomType(roomType: RoomType): boolean { * the only way to detect them is by using the grid index. */ export function isSecretShop(roomGridIndex: int): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison return roomGridIndex === GridRoom.SECRET_SHOP; } diff --git a/packages/isaacscript-common/src/functions/set.ts b/packages/isaacscript-common/src/functions/set.ts index 3b28a39d3..510577912 100644 --- a/packages/isaacscript-common/src/functions/set.ts +++ b/packages/isaacscript-common/src/functions/set.ts @@ -10,7 +10,7 @@ import { isPrimitive } from "./types"; * This function is variadic, meaning that you can specify N sets to add to the first set. */ export function addSetsToSet( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types mainSet: Set, ...setsToAdd: ReadonlyArray> ): void { @@ -26,8 +26,9 @@ export function addSetsToSet( * * This function is variadic, meaning that you can specify N sets. */ -// eslint-disable-next-line isaacscript/no-mutable-return -export function combineSets(...sets: ReadonlyArray>): Set { +export function combineSets( + ...sets: ReadonlyArray> +): ReadonlySet { const newSet = new Set(); for (const set of sets) { for (const value of set) { @@ -39,7 +40,7 @@ export function combineSets(...sets: ReadonlyArray>): Set { } /** Helper function to copy a set. (You can also use a Set constructor to accomplish this task.) */ -// eslint-disable-next-line isaacscript/no-mutable-return +// eslint-disable-next-line complete/no-mutable-return export function copySet(oldSet: ReadonlySet): Set { const newSet = new Set(); for (const value of oldSet) { @@ -56,7 +57,7 @@ export function copySet(oldSet: ReadonlySet): Set { * This function is variadic, meaning that you can specify N sets to remove from the first set. */ export function deleteSetsFromSet( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types mainSet: Set, ...setsToRemove: ReadonlyArray> ): void { @@ -123,9 +124,9 @@ export function getSetCombinations( * Normally, set values are returned in insertion order, so use this function when the ordering of * the contents is important. */ -// eslint-disable-next-line isaacscript/no-mutable-return export function getSortedSetValues( set: ReadonlySet, + // eslint-disable-next-line complete/no-mutable-return ): T[] { const values = [...set]; @@ -167,9 +168,9 @@ export function objectKeysToReadonlySet( * * Also see the `objectKeysToReadonlySet` function. */ -// eslint-disable-next-line isaacscript/no-mutable-return export function objectKeysToSet( object: Record, + // eslint-disable-next-line complete/no-mutable-return ): Set { const set = new Set(); @@ -203,9 +204,9 @@ export function objectValuesToReadonlySet< * * Also see the `objectValuesToReadonlySet` function. */ -// eslint-disable-next-line isaacscript/no-mutable-return export function objectValuesToSet( object: Record, + // eslint-disable-next-line complete/no-mutable-return ): Set { const set = new Set(); @@ -222,7 +223,7 @@ export function objectValuesToSet( * * This function is variadic, meaning that you can pass as many things as you want to add. */ -// eslint-disable-next-line isaacscript/prefer-readonly-parameter-types +// eslint-disable-next-line complete/prefer-readonly-parameter-types export function setAdd(set: Set, ...elements: readonly T[]): void { for (const element of elements) { set.add(element); diff --git a/packages/isaacscript-common/src/functions/sort.ts b/packages/isaacscript-common/src/functions/sort.ts index cc2fc6e05..1352f65bb 100644 --- a/packages/isaacscript-common/src/functions/sort.ts +++ b/packages/isaacscript-common/src/functions/sort.ts @@ -149,11 +149,11 @@ export function sortTwoDimensionalArray( * * Under the hood, this uses the merge sort algorithm. */ -// eslint-disable-next-line isaacscript/no-mutable-return export function stableSort( - // eslint-disable-next-line isaacscript/prefer-readonly-parameter-types + // eslint-disable-next-line complete/prefer-readonly-parameter-types array: T[], sortFunc: (a: T, b: T) => -1 | 0 | 1 = sortNormal, + // eslint-disable-next-line complete/no-mutable-return ): T[] { // Base case: an array of zero or one elements is already sorted if (array.length <= 1) { @@ -174,8 +174,8 @@ export function stableSort( let leftIndex = 0; let rightIndex = 0; while ( - leftIndex < sortedLeftArray.length && - rightIndex < sortedRightArray.length + leftIndex < sortedLeftArray.length + && rightIndex < sortedRightArray.length ) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const left = sortedLeftArray[leftIndex]!; diff --git a/packages/isaacscript-common/src/functions/sound.ts b/packages/isaacscript-common/src/functions/sound.ts index 456182349..767453b46 100644 --- a/packages/isaacscript-common/src/functions/sound.ts +++ b/packages/isaacscript-common/src/functions/sound.ts @@ -24,13 +24,8 @@ export function getMusicForStage( ): Music { const level = game.GetLevel(); - if (stage === undefined) { - stage = level.GetStage(); - } - - if (stageType === undefined) { - stageType = level.GetStageType(); - } + stage ??= level.GetStage(); + stageType ??= level.GetStageType(); const stageTypeToMusic = STAGE_TO_MUSIC[stage]; return stageTypeToMusic[stageType]; diff --git a/packages/isaacscript-common/src/functions/spawnCollectible.ts b/packages/isaacscript-common/src/functions/spawnCollectible.ts index 79e1b4eea..938fca732 100644 --- a/packages/isaacscript-common/src/functions/spawnCollectible.ts +++ b/packages/isaacscript-common/src/functions/spawnCollectible.ts @@ -44,9 +44,7 @@ export function spawnCollectible( forceFreeItem = false, spawner?: Entity, ): EntityPickupCollectible { - if (seedOrRNG === undefined) { - seedOrRNG = getRandomSeed(); - } + seedOrRNG ??= getRandomSeed(); const seed = isRNG(seedOrRNG) ? seedOrRNG.Next() : seedOrRNG; const collectible = spawnPickupWithSeed( @@ -67,9 +65,9 @@ export function spawnCollectible( } if ( - anyPlayerIs(PlayerType.KEEPER_B) && - !isQuestCollectible(collectibleType) && - !forceFreeItem + anyPlayerIs(PlayerType.KEEPER_B) + && !isQuestCollectible(collectibleType) + && !forceFreeItem ) { // When playing Tainted Keeper, collectibles are supposed to have a price, and manually spawned // items will not have a price, so we have to set it manually. diff --git a/packages/isaacscript-common/src/functions/stage.ts b/packages/isaacscript-common/src/functions/stage.ts index 962092c7e..9f4542682 100644 --- a/packages/isaacscript-common/src/functions/stage.ts +++ b/packages/isaacscript-common/src/functions/stage.ts @@ -133,13 +133,8 @@ export function getLevelName( ): string { const level = game.GetLevel(); - if (stage === undefined) { - stage = level.GetStage(); - } - - if (stageType === undefined) { - stageType = level.GetStageType(); - } + stage ??= level.GetStage(); + stageType ??= level.GetStageType(); const stageID = getStageID(stage, stageType); const stageIDName = getStageIDName(stageID); @@ -195,13 +190,8 @@ export function getStage(): LevelStage { export function getStageID(stage?: LevelStage, stageType?: StageType): StageID { const level = game.GetLevel(); - if (stage === undefined) { - stage = level.GetStage(); - } - - if (stageType === undefined) { - stageType = level.GetStageType(); - } + stage ??= level.GetStage(); + stageType ??= level.GetStageType(); if (game.IsGreedMode()) { const stageTypeToStageID = STAGE_TO_STAGE_ID_GREED_MODE.get(stage); @@ -255,10 +245,10 @@ export function getStageTypeSuffix(stageType: StageType): string { */ export function isFinalFloor(stage: LevelStage, stageType: StageType): boolean { return ( - stage === LevelStage.DARK_ROOM_CHEST || - stage === LevelStage.VOID || - stage === LevelStage.HOME || - (stage === LevelStage.WOMB_2 && isRepentanceStage(stageType)) // Corpse 2 + stage === LevelStage.DARK_ROOM_CHEST + || stage === LevelStage.VOID + || stage === LevelStage.HOME + || (stage === LevelStage.WOMB_2 && isRepentanceStage(stageType)) // Corpse 2 ); } @@ -284,8 +274,8 @@ export function isStageWithNaturalDevilRoom( effectiveStage: LevelStage, ): boolean { return ( - inRange(effectiveStage, LevelStage.BASEMENT_2, LevelStage.WOMB_2) && - effectiveStage !== LevelStage.BLUE_WOMB + inRange(effectiveStage, LevelStage.BASEMENT_2, LevelStage.WOMB_2) + && effectiveStage !== LevelStage.BLUE_WOMB ); } @@ -323,8 +313,8 @@ export function isStageWithSecretExitToMausoleum( const repentanceStage = isRepentanceStage(stageType); return ( - (stage === LevelStage.DEPTHS_1 && !repentanceStage) || - (stage === LevelStage.CAVES_2 && repentanceStage) + (stage === LevelStage.DEPTHS_1 && !repentanceStage) + || (stage === LevelStage.CAVES_2 && repentanceStage) ); } @@ -339,8 +329,8 @@ export function isStageWithSecretExitToMines( const repentanceStage = isRepentanceStage(stageType); return ( - (stage === LevelStage.CAVES_1 && !repentanceStage) || - (stage === LevelStage.BASEMENT_2 && repentanceStage) + (stage === LevelStage.CAVES_1 && !repentanceStage) + || (stage === LevelStage.BASEMENT_2 && repentanceStage) ); } @@ -355,8 +345,8 @@ export function isStageWithShovelTrapdoors( const repentanceStage = isRepentanceStage(stageType); return ( - stage < LevelStage.WOMB_2 || - (stage === LevelStage.WOMB_2 && !repentanceStage) + stage < LevelStage.WOMB_2 + || (stage === LevelStage.WOMB_2 && !repentanceStage) ); } @@ -384,8 +374,8 @@ export function onCathedral(): boolean { const stageType = level.GetStageType(); return ( - stage === LevelStage.SHEOL_CATHEDRAL && - stageType === StageType.WRATH_OF_THE_LAMB + stage === LevelStage.SHEOL_CATHEDRAL + && stageType === StageType.WRATH_OF_THE_LAMB ); } @@ -395,8 +385,8 @@ export function onChest(): boolean { const stageType = level.GetStageType(); return ( - stage === LevelStage.DARK_ROOM_CHEST && - stageType === StageType.WRATH_OF_THE_LAMB + stage === LevelStage.DARK_ROOM_CHEST + && stageType === StageType.WRATH_OF_THE_LAMB ); } diff --git a/packages/isaacscript-common/src/functions/string.ts b/packages/isaacscript-common/src/functions/string.ts index 68644a7df..1d5e9aff1 100644 --- a/packages/isaacscript-common/src/functions/string.ts +++ b/packages/isaacscript-common/src/functions/string.ts @@ -114,10 +114,10 @@ export function getObjectPartialMatch( * const array = ["foo", "bar"]; * const searchText = "f"; * const match = getPartialMatch(array, searchText); // match is now equal to "foo" - * - * @returns If a match was found, returns the array element. If a match was not - * found, returns undefined. * ``` + * + * @returns If a match was found, returns the array element. If a match was not found, returns + * undefined. */ export function getPartialMatch( searchText: string, @@ -153,9 +153,9 @@ export function parseSemanticVersion(versionString: string): string.match(versionString, "(%d+).(%d+).(%d+)"); if ( - majorVersionString === undefined || - minorVersionString === undefined || - patchVersionString === undefined + majorVersionString === undefined + || minorVersionString === undefined + || patchVersionString === undefined ) { return undefined; } @@ -165,9 +165,9 @@ export function parseSemanticVersion(versionString: string): const patchVersion = parseIntSafe(patchVersionString); if ( - majorVersion === undefined || - minorVersion === undefined || - patchVersion === undefined + majorVersion === undefined + || minorVersion === undefined + || patchVersion === undefined ) { return undefined; } diff --git a/packages/isaacscript-common/src/functions/tears.ts b/packages/isaacscript-common/src/functions/tears.ts index 60e04f6c6..9876df335 100644 --- a/packages/isaacscript-common/src/functions/tears.ts +++ b/packages/isaacscript-common/src/functions/tears.ts @@ -103,8 +103,8 @@ export function isTearFromFamiliar( } return ( - (familiarVariant === undefined || familiarVariant === familiar.Variant) && - (subType === undefined || subType === familiar.SubType) + (familiarVariant === undefined || familiarVariant === familiar.Variant) + && (subType === undefined || subType === familiar.SubType) ); } diff --git a/packages/isaacscript-common/src/functions/trinketGive.ts b/packages/isaacscript-common/src/functions/trinketGive.ts index 997605585..fb46809f7 100644 --- a/packages/isaacscript-common/src/functions/trinketGive.ts +++ b/packages/isaacscript-common/src/functions/trinketGive.ts @@ -124,14 +124,14 @@ export function temporarilyRemoveTrinket( let numSmeltedTrinkets = numTrinkets; const trinketWasInSlot1 = - trinketType1 === trinketType || - trinketType1 === getGoldenTrinketType(trinketType); + trinketType1 === trinketType + || trinketType1 === getGoldenTrinketType(trinketType); if (trinketWasInSlot1) { numSmeltedTrinkets--; } const trinketWasInSlot2 = - trinketType2 === trinketType || - trinketType2 === getGoldenTrinketType(trinketType); + trinketType2 === trinketType + || trinketType2 === getGoldenTrinketType(trinketType); if (trinketWasInSlot2) { numSmeltedTrinkets--; } diff --git a/packages/isaacscript-common/src/functions/trinkets.ts b/packages/isaacscript-common/src/functions/trinkets.ts index c2072bb7c..e3e7755a2 100644 --- a/packages/isaacscript-common/src/functions/trinkets.ts +++ b/packages/isaacscript-common/src/functions/trinkets.ts @@ -69,9 +69,7 @@ export function getMysteriousPaperEffectForFrame( player: EntityPlayer, frameCount?: int, ): MysteriousPaperEffect | undefined { - if (frameCount === undefined) { - frameCount = player.FrameCount; - } + frameCount ??= player.FrameCount; if (!player.HasTrinket(TrinketType.MYSTERIOUS_PAPER)) { return undefined; diff --git a/packages/isaacscript-common/src/functions/tstlClass.ts b/packages/isaacscript-common/src/functions/tstlClass.ts index 47988ebf4..8c636c050 100644 --- a/packages/isaacscript-common/src/functions/tstlClass.ts +++ b/packages/isaacscript-common/src/functions/tstlClass.ts @@ -45,10 +45,10 @@ export function getTSTLClassName(object: unknown): string | undefined { } /** - * Helper function to determine if a given object is a TypeScriptToLua `Map`. + * Helper function to determine if a given object is a `DefaultMap` from `isaacscript-common`. * * It is not reliable to use the `instanceof` operator to determine this because each Lua module has - * their own copies of the entire lualib and thus their own instantiated version of a `Map`. + * their own copies of the entire lualib and thus their own instantiated version of a `DefaultMap`. */ export function isDefaultMap( object: unknown, diff --git a/packages/isaacscript-common/src/functions/types.ts b/packages/isaacscript-common/src/functions/types.ts index 1372147b6..5f84f0ef6 100644 --- a/packages/isaacscript-common/src/functions/types.ts +++ b/packages/isaacscript-common/src/functions/types.ts @@ -18,7 +18,7 @@ * Here, using `as` does not give an error because TypeScript allows you to assert a type to a * supertype or a subtype. Thus, using `as` to perform a type assertion is not as safe as using a * variable declaration or a helper function. However, if we use a variable declaration, then the - * `isaacscript/strict-enums` rule is triggered, which requires suppressing the lint rule with a `// + * `complete/strict-enums` rule is triggered, which requires suppressing the lint rule with a `// * eslint-disable-next-line`. Thus, the safest and more concise way to do a type assertion is to use * a helper function. * @@ -44,7 +44,7 @@ import type { * Helper function to safely cast an `int` to a `CardType`. (This is better than using the `as` * TypeScript keyword to do a type assertion, since that can obfuscate compiler errors. ) * - * This is useful to satisfy the "isaacscript/strict-enums" ESLint rule. + * This is useful to satisfy the "complete/strict-enums" ESLint rule. */ export function asCardType(num: int): CardType { return num; @@ -54,7 +54,7 @@ export function asCardType(num: int): CardType { * Helper function to safely cast an `int` to a `CollectibleType`. (This is better than using the * `as` TypeScript keyword to do a type assertion, since that can obfuscate compiler errors. ) * - * This is useful to satisfy the "isaacscript/strict-enums" ESLint rule. + * This is useful to satisfy the "complete/strict-enums" ESLint rule. */ export function asCollectibleType(num: int): CollectibleType { return num; @@ -64,7 +64,7 @@ export function asCollectibleType(num: int): CollectibleType { * Helper function to safely cast an enum to an `int`. (This is better than using the `as` * TypeScript keyword to do a type assertion, since that can obfuscate compiler errors. ) * - * This is useful to satisfy the "isaacscript/strict-enums" ESLint rule. + * This is useful to satisfy the "complete/strict-enums" ESLint rule. */ export function asFloat(num: number): float { return num; @@ -74,7 +74,7 @@ export function asFloat(num: number): float { * Helper function to safely cast an enum to an `int`. (This is better than using the `as` * TypeScript keyword to do a type assertion, since that can obfuscate compiler errors. ) * - * This is useful to satisfy the "isaacscript/strict-enums" ESLint rule. + * This is useful to satisfy the "complete/strict-enums" ESLint rule. */ export function asInt(num: number): int { return num; @@ -84,7 +84,7 @@ export function asInt(num: number): int { * Helper function to safely cast an `int` to a `LevelStage`. (This is better than using the `as` * TypeScript keyword to do a type assertion, since that can obfuscate compiler errors. ) * - * This is useful to satisfy the "isaacscript/strict-enums" ESLint rule. + * This is useful to satisfy the "complete/strict-enums" ESLint rule. */ export function asLevelStage(num: int): LevelStage { return num; @@ -94,7 +94,7 @@ export function asLevelStage(num: int): LevelStage { * Helper function to safely cast an `int` to a `NPCState`. (This is better than using the `as` * TypeScript keyword to do a type assertion, since that can obfuscate compiler errors. ) * - * This is useful to satisfy the "isaacscript/strict-enums" ESLint rule. + * This is useful to satisfy the "complete/strict-enums" ESLint rule. */ export function asNPCState(num: int): NPCState { return num; @@ -104,7 +104,7 @@ export function asNPCState(num: int): NPCState { * Helper function to safely cast an enum to a `number`. (This is better than using the `as` * TypeScript keyword to do a type assertion, since that can obfuscate compiler errors. ) * - * This is useful to satisfy the "isaacscript/strict-enums" ESLint rule. + * This is useful to satisfy the "complete/strict-enums" ESLint rule. */ export function asNumber(num: number): number { return num; @@ -114,7 +114,7 @@ export function asNumber(num: number): number { * Helper function to safely cast an `int` to a `PillColor`. (This is better than using the `as` * TypeScript keyword to do a type assertion, since that can obfuscate compiler errors. ) * - * This is useful to satisfy the "isaacscript/strict-enums" ESLint rule. + * This is useful to satisfy the "complete/strict-enums" ESLint rule. */ export function asPillColor(num: int): PillColor { return num; @@ -124,7 +124,7 @@ export function asPillColor(num: int): PillColor { * Helper function to safely cast an `int` to a `PillEffect`. (This is better than using the `as` * TypeScript keyword to do a type assertion, since that can obfuscate compiler errors. ) * - * This is useful to satisfy the "isaacscript/strict-enums" ESLint rule. + * This is useful to satisfy the "complete/strict-enums" ESLint rule. */ export function asPillEffect(num: int): PillEffect { return num; @@ -134,7 +134,7 @@ export function asPillEffect(num: int): PillEffect { * Helper function to safely cast an `int` to a `PlayerType`. (This is better than using the `as` * TypeScript keyword to do a type assertion, since that can obfuscate compiler errors. ) * - * This is useful to satisfy the "isaacscript/strict-enums" ESLint rule. + * This is useful to satisfy the "complete/strict-enums" ESLint rule. */ export function asPlayerType(num: int): PlayerType { return num; @@ -144,7 +144,7 @@ export function asPlayerType(num: int): PlayerType { * Helper function to safely cast an `int` to a `RoomType`. (This is better than using the `as` * TypeScript keyword to do a type assertion, since that can obfuscate compiler errors. ) * - * This is useful to satisfy the "isaacscript/strict-enums" ESLint rule. + * This is useful to satisfy the "complete/strict-enums" ESLint rule. */ export function asRoomType(num: int): RoomType { return num; @@ -154,7 +154,7 @@ export function asRoomType(num: int): RoomType { * Helper function to safely cast an enum to a `string`. (This is better than using the `as` * TypeScript keyword to do a type assertion, since that can obfuscate compiler errors. ) * - * This is useful to satisfy the "isaacscript/strict-enums" ESLint rule. + * This is useful to satisfy the "complete/strict-enums" ESLint rule. */ export function asString(str: string): string { return str; @@ -164,7 +164,7 @@ export function asString(str: string): string { * Helper function to safely cast an `int` to a `TrinketType`. (This is better than using the `as` * TypeScript keyword to do a type assertion, since that can obfuscate compiler errors. ) * - * This is useful to satisfy the "isaacscript/strict-enums" ESLint rule. + * This is useful to satisfy the "complete/strict-enums" ESLint rule. */ export function asTrinketType(num: int): TrinketType { return num; @@ -197,9 +197,9 @@ export function isPrimitive( ): variable is boolean | number | string { const variableType = typeof variable; return ( - variableType === "boolean" || - variableType === "number" || - variableType === "string" + variableType === "boolean" + || variableType === "number" + || variableType === "string" ); } @@ -225,7 +225,7 @@ export function isUserdata(variable: unknown): variable is LuaUserdata { * * Under the hood, this uses the built-in `tonumber` and `math.floor` functions. * - * This is named `parseIntSafe` in order to match the helper function in `isaacscript-common-ts`. + * This is named `parseIntSafe` in order to match the helper function from `complete-common`. */ export function parseIntSafe(string: string): int | undefined { if (!isString(string)) { diff --git a/packages/isaacscript-common/src/functions/utils.ts b/packages/isaacscript-common/src/functions/utils.ts index efcde8d53..6f2086cb3 100644 --- a/packages/isaacscript-common/src/functions/utils.ts +++ b/packages/isaacscript-common/src/functions/utils.ts @@ -1,3 +1,4 @@ +import { game } from "../core/cachedClasses"; import { ReadonlySet } from "../types/ReadonlySet"; import { getAllPlayers } from "./playerIndex"; import { isFunction } from "./types"; @@ -155,7 +156,7 @@ export function isMultiplayer(): boolean { } /** - * Helper function to check if the player is using Afterbirth+ or Repentance. + * Helper function to check if the player has the Repentance DLC installed. * * This function should always be used over the `REPENTANCE` constant, since the latter is not safe. * @@ -181,6 +182,23 @@ export function isRepentance(): boolean { return isFunction(getAnimation); } +/** + * Helper function to check if the player has the Repentance+ DLC installed. + * + * This function should always be used over the `REPENTANCE_PLUS` constant, since the latter is not + * safe. + * + * Specifically, this function checks for `Room:DamageGridWithSource` method: + * https://bindingofisaacrebirth.wiki.gg/wiki/The_Binding_of_Isaac:_Repentance%2B#Modding_Changes + */ +export function isRepentancePlus(): boolean { + const room = game.GetRoom(); + const metatable = getmetatable(room) as LuaMap | undefined; + assertDefined(metatable, "Failed to get the metatable of the room class."); + const damageGridWithSource = metatable.get("DamageGridWithSource"); + return isFunction(damageGridWithSource); +} + /** * Helper function to check if the player is using REPENTOGON, an exe-hack which expands the modding * API. diff --git a/packages/isaacscript-common/src/index.ts b/packages/isaacscript-common/src/index.ts index faf85d9ef..39cee5f72 100644 --- a/packages/isaacscript-common/src/index.ts +++ b/packages/isaacscript-common/src/index.ts @@ -136,19 +136,19 @@ export * from "./functions/utils"; export * from "./functions/vector"; export * from "./functions/versusScreen"; export * from "./functions/weighted"; -export * from "./interfaces/ChargeBarSprites"; -export * from "./interfaces/Corner"; -export * from "./interfaces/CustomStageTSConfig"; -export * from "./interfaces/GridEntityCustomData"; -export * from "./interfaces/JSONRoomsFile"; -export * from "./interfaces/PlayerHealth"; -export * from "./interfaces/PlayerStats"; -export * from "./interfaces/PocketItemDescription"; -export * from "./interfaces/RoomDescription"; -export * from "./interfaces/SaveData"; -export * from "./interfaces/StageHistoryEntry"; -export * from "./interfaces/TrinketSituation"; -export * from "./interfaces/TSTLClassMetatable"; +export type * from "./interfaces/ChargeBarSprites"; +export type * from "./interfaces/Corner"; +export type * from "./interfaces/CustomStageTSConfig"; +export type * from "./interfaces/GridEntityCustomData"; +export type * from "./interfaces/JSONRoomsFile"; +export type * from "./interfaces/PlayerHealth"; +export type * from "./interfaces/PlayerStats"; +export type * from "./interfaces/PocketItemDescription"; +export type * from "./interfaces/RoomDescription"; +export type * from "./interfaces/SaveData"; +export type * from "./interfaces/StageHistoryEntry"; +export type * from "./interfaces/TrinketSituation"; +export type * from "./interfaces/TSTLClassMetatable"; export * from "./maps/cardNameToTypeMap"; export * from "./maps/characterNameToTypeMap"; export * from "./maps/collectibleNameToTypeMap"; @@ -158,47 +158,47 @@ export * from "./maps/transformationNameToPlayerFormMap"; export * from "./maps/trinketNameToTypeMap"; export * from "./objects/colors"; export * from "./objects/kColors"; -export * from "./types/AddSubtract"; -export * from "./types/AllButFirst"; -export * from "./types/AllButLast"; -export * from "./types/AnyClass"; -export * from "./types/AnyEntity"; -export * from "./types/AnyFunction"; -export * from "./types/AnyGridEntity"; -export * from "./types/CompositionTypeSatisfiesEnum"; -export * from "./types/ConversionHeartSubType"; -export * from "./types/Decrement"; -export * from "./types/EntityID"; -export * from "./types/ERange"; -export * from "./types/FunctionTuple"; -export * from "./types/GridEntityID"; -export * from "./types/HasFunction"; -export * from "./types/Immutable"; -export * from "./types/Increment"; -export * from "./types/IRange"; -export * from "./types/LowercaseKeys"; -export * from "./types/NaturalNumbersLessThan"; -export * from "./types/NaturalNumbersLessThanOrEqualTo"; -export * from "./types/ObjectValues"; +export type * from "./types/AddSubtract"; +export type * from "./types/AllButFirst"; +export type * from "./types/AllButLast"; +export type * from "./types/AnyClass"; +export type * from "./types/AnyEntity"; +export type * from "./types/AnyFunction"; +export type * from "./types/AnyGridEntity"; +export type * from "./types/CompositionTypeSatisfiesEnum"; +export type * from "./types/ConversionHeartSubType"; +export type * from "./types/Decrement"; +export type * from "./types/EntityID"; +export type * from "./types/ERange"; +export type * from "./types/FunctionTuple"; +export type * from "./types/GridEntityID"; +export type * from "./types/HasFunction"; +export type * from "./types/Immutable"; +export type * from "./types/Increment"; +export type * from "./types/IRange"; +export type * from "./types/LowercaseKeys"; +export type * from "./types/NaturalNumbersLessThan"; +export type * from "./types/NaturalNumbersLessThanOrEqualTo"; +export type * from "./types/ObjectValues"; export * from "./types/PickingUpItem"; -export * from "./types/PickupIndex"; -export * from "./types/PlayerIndex"; -export * from "./types/PossibleStatType"; -export * from "./types/PublicInterface"; +export type * from "./types/PickupIndex"; +export type * from "./types/PlayerIndex"; +export type * from "./types/PossibleStatType"; +export type * from "./types/PublicInterface"; export * from "./types/ReadonlyMap"; -export * from "./types/ReadonlyRecord"; +export type * from "./types/ReadonlyRecord"; export * from "./types/ReadonlySet"; -export * from "./types/StartsWithLowercase"; -export * from "./types/StartsWithUppercase"; -export * from "./types/TSTLClass"; -export * from "./types/Tuple"; -export * from "./types/TupleKeys"; -export * from "./types/TupleToIntersection"; -export * from "./types/TupleToUnion"; -export * from "./types/TupleWithLengthBetween"; -export * from "./types/TupleWithMaxLength"; -export * from "./types/UnionToIntersection"; -export * from "./types/UppercaseKeys"; -export * from "./types/WeightedArray"; -export * from "./types/WidenLiteral"; -export * from "./types/Writable"; +export type * from "./types/StartsWithLowercase"; +export type * from "./types/StartsWithUppercase"; +export type * from "./types/TSTLClass"; +export type * from "./types/Tuple"; +export type * from "./types/TupleKeys"; +export type * from "./types/TupleToIntersection"; +export type * from "./types/TupleToUnion"; +export type * from "./types/TupleWithLengthBetween"; +export type * from "./types/TupleWithMaxLength"; +export type * from "./types/UnionToIntersection"; +export type * from "./types/UppercaseKeys"; +export type * from "./types/WeightedArray"; +export type * from "./types/WidenLiteral"; +export type * from "./types/Writable"; diff --git a/packages/isaacscript-common/src/interfaces/private/AddCallbackParametersCustom.ts b/packages/isaacscript-common/src/interfaces/private/AddCallbackParametersCustom.ts index 9aeb7c5b0..3eccc4aff 100644 --- a/packages/isaacscript-common/src/interfaces/private/AddCallbackParametersCustom.ts +++ b/packages/isaacscript-common/src/interfaces/private/AddCallbackParametersCustom.ts @@ -215,6 +215,13 @@ export interface AddCallbackParametersCustom { subType?: int, ]; + [ModCallbackCustom.POST_ENTITY_REMOVE_FILTER]: [ + callback: (entity: Entity) => void, + entityType?: EntityType, + variant?: int, + subType?: int, + ]; + // - Co-op babies cannot turn into Esau Jr, so it does not make sense to filter by // `PlayerVariant`. // - The character of Esau Jr. is equal to `PlayerType.ISAAC`, so it does not make sense to filter diff --git a/packages/isaacscript-common/src/lib/jsonLua.js b/packages/isaacscript-common/src/lib/jsonLua.js index 9ee78c4db..2a04c7901 100644 --- a/packages/isaacscript-common/src/lib/jsonLua.js +++ b/packages/isaacscript-common/src/lib/jsonLua.js @@ -30,11 +30,11 @@ function lua_load(a, b) { "Lua parser not available, perhaps you're not using the lua+parser.js version of the library?", ); eval( - "fn = function " + - (b || "load") + - "() {\nreturn (function () {\n" + - lua_parser.parse(a) + - "\n})()[0];\n};", + "fn = function " + + (b || "load") + + "() {\nreturn (function () {\n" + + lua_parser.parse(a) + + "\n})()[0];\n};", ); } function slice(a, b) { @@ -181,8 +181,8 @@ function lua_eq(a, b) { } function lua_lt(a, b) { if ( - ("number" == typeof a && "number" == typeof b) || - ("string" == typeof a && "string" == typeof b) + ("number" == typeof a && "number" == typeof b) + || ("string" == typeof a && "string" == typeof b) ) return a < b; var c = a.metatable && a.metatable.str.__lt; @@ -192,16 +192,16 @@ function lua_lt(a, b) { } function lua_lte(a, b) { if ( - ("number" == typeof a && "number" == typeof b) || - ("string" == typeof a && "string" == typeof b) + ("number" == typeof a && "number" == typeof b) + || ("string" == typeof a && "string" == typeof b) ) return a <= b; var c = a.metatable && a.metatable.str.__le; if (c && c == (b.metatable && b.metatable.str.__le)) return lua_true(lua_rawcall(c, [a, b])[0]); if ( - (c = a.metatable && a.metatable.str.__lt) && - c == (b.metatable && b.metatable.str.__lt) + (c = a.metatable && a.metatable.str.__lt) + && c == (b.metatable && b.metatable.str.__lt) ) return lua_not(lua_rawcall(c, [b, a])[0]); throw Error("Unable to compare " + a + " and " + b); @@ -221,8 +221,8 @@ function lua_add(a, b) { if (isNaN(c) || isNaN(d)) { if ( (c = - (a.metatable && a.metatable.str.__add) || - (b.metatable && b.metatable.str.__add)) + (a.metatable && a.metatable.str.__add) + || (b.metatable && b.metatable.str.__add)) ) return lua_rawcall(c, [a, b])[0]; throw Error("Adding <" + a + "> and <" + b + "> not supported"); @@ -235,8 +235,8 @@ function lua_subtract(a, b) { if (isNaN(c) || isNaN(d)) { if ( (c = - (a.metatable && a.metatable.str.__sub) || - (b.metatable && b.metatable.str.__sub)) + (a.metatable && a.metatable.str.__sub) + || (b.metatable && b.metatable.str.__sub)) ) return lua_rawcall(c, [a, b])[0]; throw Error("Subtracting <" + a + "> and <" + b + "> not supported"); @@ -249,8 +249,8 @@ function lua_divide(a, b) { if (isNaN(c) || isNaN(d)) { if ( (c = - (a.metatable && a.metatable.str.__div) || - (b.metatable && b.metatable.str.__div)) + (a.metatable && a.metatable.str.__div) + || (b.metatable && b.metatable.str.__div)) ) return lua_rawcall(c, [a, b])[0]; throw Error("Dividing <" + a + "> and <" + b + "> not supported"); @@ -263,8 +263,8 @@ function lua_multiply(a, b) { if (isNaN(c) || isNaN(d)) { if ( (c = - (a.metatable && a.metatable.str.__mul) || - (b.metatable && b.metatable.str.__mul)) + (a.metatable && a.metatable.str.__mul) + || (b.metatable && b.metatable.str.__mul)) ) return lua_rawcall(c, [a, b])[0]; throw Error("Multiplying <" + a + "> and <" + b + "> not supported"); @@ -277,8 +277,8 @@ function lua_power(a, b) { if (isNaN(c) || isNaN(d)) { if ( (c = - (a.metatable && a.metatable.str.__pow) || - (b.metatable && b.metatable.str.__pow)) + (a.metatable && a.metatable.str.__pow) + || (b.metatable && b.metatable.str.__pow)) ) return lua_rawcall(c, [a, b])[0]; throw Error("<" + a + "> to the power of <" + b + "> not supported"); @@ -291,8 +291,8 @@ function lua_mod(a, b) { if (isNaN(c) || isNaN(d)) { if ( (c = - (a.metatable && a.metatable.str.__mod) || - (b.metatable && b.metatable.str.__mod)) + (a.metatable && a.metatable.str.__mod) + || (b.metatable && b.metatable.str.__mod)) ) return lua_rawcall(c, [a, b])[0]; throw Error("Modulo <" + a + "> and <" + b + "> not supported"); @@ -393,13 +393,13 @@ function lua_concat(a, b) { if ("number" == typeof a && "number" == typeof b) throw Error("number concat not supported yet"); if ( - ("string" == typeof a || "number" == typeof a) && - ("string" == typeof b || "number" == typeof b) + ("string" == typeof a || "number" == typeof a) + && ("string" == typeof b || "number" == typeof b) ) return a + b; var c = - (a.metatable && a.metatable.str.__concat) || - (b.metatable && b.metatable.str.__concat); + (a.metatable && a.metatable.str.__concat) + || (b.metatable && b.metatable.str.__concat); if (c) return lua_rawcall(c, [a, b])[0]; throw Error("Unable to concat " + a + " and " + b); } @@ -495,7 +495,7 @@ var lua_libs = {}, }, rawset: function (a, b, c) { if ("object" == typeof a && null != a && null != b) - return lua_rawset(a, b, c), [a]; + return (lua_rawset(a, b, c), [a]); throw Error("Unable set key " + b + " in " + a); }, select: function (a) { @@ -901,7 +901,7 @@ lua_libs.table = { if (a.arraymode) return [a.uints.length]; var b = 0, c; - for (c in a.uints) (a = parseFloat(c)), a > b && (b = a); + for (c in a.uints) ((a = parseFloat(c)), a > b && (b = a)); return [b]; }, remove: function (a, b) { @@ -1075,8 +1075,8 @@ var lua_script = (function () { } lua_tableset(_stack, _val, true); if ( - !lua_eq(lua_call(G.str["rawget"], [_val, 1])[0], null) || - lua_eq(lua_call(G.str["next"], [_val])[0], null) + !lua_eq(lua_call(G.str["rawget"], [_val, 1])[0], null) + || lua_eq(lua_call(G.str["next"], [_val])[0], null) ) { var _n_8 = 0; tmp = lua_call(G.str["pairs"], [_val]); @@ -1214,9 +1214,9 @@ var lua_script = (function () { var _encode_number_1 = function (_val) { var tmp; if ( - !lua_eq(_val, _val) || - lua_lte(_val, lua_unm(lua_tableget(G.str["math"], "huge"))) || - lua_lte(lua_tableget(G.str["math"], "huge"), _val) + !lua_eq(_val, _val) + || lua_lte(_val, lua_unm(lua_tableget(G.str["math"], "huge"))) + || lua_lte(lua_tableget(G.str["math"], "huge"), _val) ) { lua_call(G.str["error"], [ lua_concat( diff --git a/packages/isaacscript-common/src/objects/LRoomShapeToRectangles.ts b/packages/isaacscript-common/src/objects/LRoomShapeToRectangles.ts index d4abb906f..7c59ca024 100644 --- a/packages/isaacscript-common/src/objects/LRoomShapeToRectangles.ts +++ b/packages/isaacscript-common/src/objects/LRoomShapeToRectangles.ts @@ -16,7 +16,7 @@ const TWO_BY_TWO_BOTTOM_RIGHT = newReadonlyVector(25, 13); * wall would be at "Vector(-1, -1)".) */ // We don't use `as const` since we need the object to be indexable by all `RoomShape`. -// eslint-disable-next-line isaacscript/require-capital-const-assertions +// eslint-disable-next-line complete/require-capital-const-assertions export const L_ROOM_SHAPE_TO_RECTANGLES: Readonly< Partial> > = { diff --git a/packages/isaacscript-common/src/objects/backdropTypeToRockAltType.ts b/packages/isaacscript-common/src/objects/backdropTypeToRockAltType.ts index 99417e3f8..ee749d332 100644 --- a/packages/isaacscript-common/src/objects/backdropTypeToRockAltType.ts +++ b/packages/isaacscript-common/src/objects/backdropTypeToRockAltType.ts @@ -63,4 +63,6 @@ export const BACKDROP_TYPE_TO_ROCK_ALT_TYPE = { [BackdropType.MINES_SHAFT]: RockAltType.MUSHROOM, // 58 [BackdropType.ASHPIT_SHAFT]: RockAltType.MUSHROOM, // 59 [BackdropType.DARK_CLOSET]: RockAltType.SKULL, // 60 + [BackdropType.DEATHMATCH]: RockAltType.URN, // 61 + [BackdropType.LIL_PORTAL]: RockAltType.URN, // 62 } as const satisfies Record; diff --git a/packages/isaacscript-common/src/objects/roomShapeToDoorSlotsToGridIndexDelta.ts b/packages/isaacscript-common/src/objects/roomShapeToDoorSlotsToGridIndexDelta.ts index 197ade31f..1d3dc56d7 100644 --- a/packages/isaacscript-common/src/objects/roomShapeToDoorSlotsToGridIndexDelta.ts +++ b/packages/isaacscript-common/src/objects/roomShapeToDoorSlotsToGridIndexDelta.ts @@ -12,7 +12,7 @@ const DOWN = LEVEL_GRID_ROW_WIDTH; * top right corner in the case of `RoomShape.LTL`). */ // We don't use `as const` since we need the map to be indexable by all `DoorSlot`. -// eslint-disable-next-line isaacscript/require-capital-const-assertions +// eslint-disable-next-line complete/require-capital-const-assertions export const ROOM_SHAPE_TO_DOOR_SLOTS_TO_GRID_INDEX_DELTA: Readonly< Record> > = { diff --git a/packages/isaacscript-common/src/objects/roomTypeNames.ts b/packages/isaacscript-common/src/objects/roomTypeNames.ts index f9edcaadf..8d76eb218 100644 --- a/packages/isaacscript-common/src/objects/roomTypeNames.ts +++ b/packages/isaacscript-common/src/objects/roomTypeNames.ts @@ -30,4 +30,5 @@ export const ROOM_TYPE_NAMES = { [RoomType.SECRET_EXIT]: "Secret Exit", // 27 [RoomType.BLUE]: "Blue Room", // 28 [RoomType.ULTRA_SECRET]: "Ultra Secret Room", // 29 + [RoomType.DEATHMATCH]: "Deathmatch", // 30 } as const satisfies Record; diff --git a/packages/isaacscript-common/src/objects/roomTypeSpecialGotoPrefixes.ts b/packages/isaacscript-common/src/objects/roomTypeSpecialGotoPrefixes.ts index 7f6e5dbfc..bae41e65a 100644 --- a/packages/isaacscript-common/src/objects/roomTypeSpecialGotoPrefixes.ts +++ b/packages/isaacscript-common/src/objects/roomTypeSpecialGotoPrefixes.ts @@ -30,4 +30,5 @@ export const ROOM_TYPE_SPECIAL_GOTO_PREFIXES = { [RoomType.SECRET_EXIT]: "secretexit", // 27 [RoomType.BLUE]: "blue", // 28 [RoomType.ULTRA_SECRET]: "ultrasecret", // 29 + [RoomType.DEATHMATCH]: "deathmatch", // 30 } as const satisfies Record; diff --git a/packages/isaacscript-common/src/shouldFire.ts b/packages/isaacscript-common/src/shouldFire.ts index c8a88fba2..a14291229 100644 --- a/packages/isaacscript-common/src/shouldFire.ts +++ b/packages/isaacscript-common/src/shouldFire.ts @@ -68,9 +68,8 @@ export function shouldFireBomb( const [callbackBombVariant, callbackSubType] = optionalArgs; return ( - (callbackBombVariant === undefined || - callbackBombVariant === bomb.Variant) && - (callbackSubType === undefined || callbackSubType === bomb.SubType) + (callbackBombVariant === undefined || callbackBombVariant === bomb.Variant) + && (callbackSubType === undefined || callbackSubType === bomb.SubType) ); } @@ -92,8 +91,8 @@ export function shouldFireCollectibleType( const [callbackCollectibleType] = optionalArgs; return ( - callbackCollectibleType === undefined || - callbackCollectibleType === collectibleType + callbackCollectibleType === undefined + || callbackCollectibleType === collectibleType ); } @@ -122,9 +121,9 @@ export function shouldFireEffect( const [callbackEffectVariant, callbackSubType] = optionalArgs; return ( - (callbackEffectVariant === undefined || - callbackEffectVariant === effect.Variant) && - (callbackSubType === undefined || callbackSubType === effect.SubType) + (callbackEffectVariant === undefined + || callbackEffectVariant === effect.Variant) + && (callbackSubType === undefined || callbackSubType === effect.SubType) ); } @@ -144,9 +143,9 @@ export function shouldFireEntity( const [callbackEntityType, callbackVariant, callbackSubType] = optionalArgs; return ( - (callbackEntityType === undefined || callbackEntityType === entity.Type) && - (callbackVariant === undefined || callbackVariant === entity.Variant) && - (callbackSubType === undefined || callbackSubType === entity.SubType) + (callbackEntityType === undefined || callbackEntityType === entity.Type) + && (callbackVariant === undefined || callbackVariant === entity.Variant) + && (callbackSubType === undefined || callbackSubType === entity.SubType) ); } @@ -162,9 +161,9 @@ export function shouldFireFamiliar( const [callbackFamiliarVariant, callbackSubType] = optionalArgs; return ( - (callbackFamiliarVariant === undefined || - callbackFamiliarVariant === familiar.Variant) && - (callbackSubType === undefined || callbackSubType === familiar.SubType) + (callbackFamiliarVariant === undefined + || callbackFamiliarVariant === familiar.Variant) + && (callbackSubType === undefined || callbackSubType === familiar.SubType) ); } @@ -181,9 +180,9 @@ export function shouldFireGridEntity( const variant = gridEntity.GetVariant(); return ( - (callbackGridEntityType === undefined || - callbackGridEntityType === gridEntityType) && - (callbackVariant === undefined || callbackVariant === variant) + (callbackGridEntityType === undefined + || callbackGridEntityType === gridEntityType) + && (callbackVariant === undefined || callbackVariant === variant) ); } @@ -202,8 +201,8 @@ export function shouldFireGridEntityCustom( const [callbackGridEntityTypeCustom] = optionalArgs; return ( - callbackGridEntityTypeCustom === undefined || - callbackGridEntityTypeCustom === gridEntityTypeCustom + callbackGridEntityTypeCustom === undefined + || callbackGridEntityTypeCustom === gridEntityTypeCustom ); } @@ -215,9 +214,11 @@ export function shouldFireItemPickup( const [callbackItemType, callbackSubtype] = optionalArgs; return ( - (callbackItemType === undefined || - callbackItemType === pickingUpItem.itemType) && - (callbackSubtype === undefined || callbackSubtype === pickingUpItem.subType) + (callbackItemType === undefined + || callbackItemType === pickingUpItem.itemType) + && (callbackSubtype === undefined + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + || callbackSubtype === pickingUpItem.subType) ); } @@ -232,9 +233,9 @@ export function shouldFireKnife( const [callbackKnifeVariant, callbackSubType] = optionalArgs; return ( - (callbackKnifeVariant === undefined || - callbackKnifeVariant === knife.Variant) && - (callbackSubType === undefined || callbackSubType === knife.SubType) + (callbackKnifeVariant === undefined + || callbackKnifeVariant === knife.Variant) + && (callbackSubType === undefined || callbackSubType === knife.SubType) ); } @@ -246,9 +247,9 @@ export function shouldFireLaser( const [callbackLaserVariant, callbackSubType] = optionalArgs; return ( - (callbackLaserVariant === undefined || - callbackLaserVariant === laser.Variant) && - (callbackSubType === undefined || callbackSubType === laser.SubType) + (callbackLaserVariant === undefined + || callbackLaserVariant === laser.Variant) + && (callbackSubType === undefined || callbackSubType === laser.SubType) ); } @@ -260,8 +261,8 @@ export function shouldFireLevel( const [callbackStage, callbackStageType] = optionalArgs; return ( - (callbackStage === undefined || callbackStage === stage) && - (callbackStageType === undefined || callbackStageType === stageType) + (callbackStage === undefined || callbackStage === stage) + && (callbackStageType === undefined || callbackStageType === stageType) ); } @@ -277,9 +278,9 @@ export function shouldFireNPC( const [callbackEntityType, callbackVariant, callbackSubType] = optionalArgs; return ( - (callbackEntityType === undefined || callbackEntityType === npc.Type) && - (callbackVariant === undefined || callbackVariant === npc.Variant) && - (callbackSubType === undefined || callbackSubType === npc.SubType) + (callbackEntityType === undefined || callbackEntityType === npc.Type) + && (callbackVariant === undefined || callbackVariant === npc.Variant) + && (callbackSubType === undefined || callbackSubType === npc.SubType) ); } @@ -302,10 +303,10 @@ export function shouldFirePickup( const [callbackPickupVariant, callbackPickupSubType] = optionalArgs; return ( - (callbackPickupVariant === undefined || - callbackPickupVariant === pickup.Variant) && - (callbackPickupSubType === undefined || - callbackPickupSubType === pickup.SubType) + (callbackPickupVariant === undefined + || callbackPickupVariant === pickup.Variant) + && (callbackPickupSubType === undefined + || callbackPickupSubType === pickup.SubType) ); } @@ -357,9 +358,9 @@ export function shouldFirePlayer( const character = player.GetPlayerType(); return ( - (callbackPlayerVariant === undefined || - callbackPlayerVariant === player.Variant) && - (callbackCharacter === undefined || callbackCharacter === character) + (callbackPlayerVariant === undefined + || callbackPlayerVariant === player.Variant) + && (callbackCharacter === undefined || callbackCharacter === character) ); } @@ -373,8 +374,8 @@ export function shouldFirePoop( const poopGridEntityVariant = poop.GetVariant(); return ( - callbackPoopGridEntityVariant === undefined || - callbackPoopGridEntityVariant === poopGridEntityVariant + callbackPoopGridEntityVariant === undefined + || callbackPoopGridEntityVariant === poopGridEntityVariant ); } @@ -388,8 +389,8 @@ export function shouldFirePressurePlate( const pressurePlateVariant = pressurePlate.GetVariant(); return ( - callbackPressurePlateVariant === undefined || - callbackPressurePlateVariant === pressurePlateVariant + callbackPressurePlateVariant === undefined + || callbackPressurePlateVariant === pressurePlateVariant ); } @@ -404,9 +405,9 @@ export function shouldFireProjectile( const [callbackProjectileVariant, callbackSubType] = optionalArgs; return ( - (callbackProjectileVariant === undefined || - callbackProjectileVariant === projectile.Variant) && - (callbackSubType === undefined || callbackSubType === projectile.SubType) + (callbackProjectileVariant === undefined + || callbackProjectileVariant === projectile.Variant) + && (callbackSubType === undefined || callbackSubType === projectile.SubType) ); } @@ -421,9 +422,8 @@ export function shouldFireRock( const variant = rock.GetVariant(); return ( - (callbackGridEntity === undefined || - callbackGridEntity === gridEntityType) && - (callbackVariant === undefined || callbackVariant === variant) + (callbackGridEntity === undefined || callbackGridEntity === gridEntityType) + && (callbackVariant === undefined || callbackVariant === variant) ); } @@ -449,9 +449,8 @@ export function shouldFireSlot( const [callbackSlotVariant, callbackSubType] = optionalArgs; return ( - (callbackSlotVariant === undefined || - callbackSlotVariant === slot.Variant) && - (callbackSubType === undefined || callbackSubType === slot.SubType) + (callbackSlotVariant === undefined || callbackSlotVariant === slot.Variant) + && (callbackSubType === undefined || callbackSubType === slot.SubType) ); } @@ -490,9 +489,8 @@ export function shouldFireTear( const [callbackTearVariant, callbackSubType] = optionalArgs; return ( - (callbackTearVariant === undefined || - callbackTearVariant === tear.Variant) && - (callbackSubType === undefined || callbackSubType === tear.SubType) + (callbackTearVariant === undefined || callbackTearVariant === tear.Variant) + && (callbackSubType === undefined || callbackSubType === tear.SubType) ); } diff --git a/packages/isaacscript-common/src/types/AddSubtract.ts b/packages/isaacscript-common/src/types/AddSubtract.ts index 5e435b57c..fa25174e5 100644 --- a/packages/isaacscript-common/src/types/AddSubtract.ts +++ b/packages/isaacscript-common/src/types/AddSubtract.ts @@ -1,9 +1,17 @@ -/** From: https://gist.github.com/ryandabler/8b4ff4f36aed47bc09acc03174638468 */ +/** + * Helper type to add two other types. + * + * From: https://gist.github.com/ryandabler/8b4ff4f36aed47bc09acc03174638468 + */ export type Add = Length< [...BuildTuple, ...BuildTuple] >; -/** From: https://gist.github.com/ryandabler/8b4ff4f36aed47bc09acc03174638468 */ +/** + * Helper type to subtract two other types. + * + * From: https://gist.github.com/ryandabler/8b4ff4f36aed47bc09acc03174638468 + */ export type Subtract = A extends A ? BuildTuple extends [...infer U, ...BuildTuple] ? Length diff --git a/packages/isaacscript-common/src/types/Increment.ts b/packages/isaacscript-common/src/types/Increment.ts index d67ce15f3..456bfff39 100644 --- a/packages/isaacscript-common/src/types/Increment.ts +++ b/packages/isaacscript-common/src/types/Increment.ts @@ -3,8 +3,8 @@ * * From: https://stackoverflow.com/questions/54243431/typescript-increment-number-type */ -export type Increment = [...Arr, unknown]["length"] & - number; +export type Increment = [...Arr, unknown]["length"] + & number; type Arr = T["length"] extends N ? T diff --git a/packages/isaacscript-common/src/types/PickingUpItem.ts b/packages/isaacscript-common/src/types/PickingUpItem.ts index 494ae3d0a..614322de6 100644 --- a/packages/isaacscript-common/src/types/PickingUpItem.ts +++ b/packages/isaacscript-common/src/types/PickingUpItem.ts @@ -50,6 +50,7 @@ export function newPickingUpItem(): PickingUpItem { }; } +/** Helper function to reset a `PickupUpItem` object to all 0 values. */ export function resetPickingUpItem(pickingUpItem: PickingUpItem): void { pickingUpItem.itemType = DEFAULT_ITEM_TYPE; pickingUpItem.subType = DEFAULT_SUB_TYPE; @@ -61,21 +62,27 @@ const COLLECTIBLE_ITEM_TYPES = new ReadonlySet([ ItemType.FAMILIAR, // 4 ]); -/** Helper function to narrow the type of `PickingUpItem`. */ +/** Helper function to narrow the type of `PickingUpItem` to `ItemType.NULL` (0). */ export function isPickingUpItemNull( pickingUpItem: PickingUpItem, ): pickingUpItem is PickingUpItemTrinket { return pickingUpItem.itemType === ItemType.NULL; } -/** Helper function to narrow the type of `PickingUpItem`. */ +/** + * Helper function to narrow the type of `PickingUpItem` to one of the following: + * + * - `ItemType.PASSIVE` (1) + * - `ItemType.ACTIVE` (3) + * - `ItemType.FAMILIAR` (4) + */ export function isPickingUpItemCollectible( pickingUpItem: PickingUpItem, ): pickingUpItem is PickingUpItemCollectible { return COLLECTIBLE_ITEM_TYPES.has(pickingUpItem.itemType); } -/** Helper function to narrow the type of `PickingUpItem`. */ +/** Helper function to narrow the type of `PickingUpItem` to `ItemType.TRINKET` (2). */ export function isPickingUpItemTrinket( pickingUpItem: PickingUpItem, ): pickingUpItem is PickingUpItemTrinket { diff --git a/packages/isaacscript-common/src/types/TupleWithLengthBetween.ts b/packages/isaacscript-common/src/types/TupleWithLengthBetween.ts index 347129cba..d48a4691b 100644 --- a/packages/isaacscript-common/src/types/TupleWithLengthBetween.ts +++ b/packages/isaacscript-common/src/types/TupleWithLengthBetween.ts @@ -19,7 +19,7 @@ export type TupleWithLengthBetween< // ----- /* eslint-disable @typescript-eslint/no-unused-vars */ -/* eslint-disable isaacscript/require-unannotated-const-assertions */ +/* eslint-disable complete/require-unannotated-const-assertions */ // @ts-expect-error Tuple of length 0 with min length 1 and max length 2. const zeroOneTwo: TupleWithLengthBetween = [] as const; @@ -38,6 +38,6 @@ const threeOneTwo: TupleWithLengthBetween = [ ] as const; /* eslint-enable @typescript-eslint/no-unused-vars */ -/* eslint-enable isaacscript/require-unannotated-const-assertions */ +/* eslint-enable complete/require-unannotated-const-assertions */ // See "TupleWithMaxLength.ts" for more tests. diff --git a/packages/isaacscript-common/src/types/TupleWithMaxLength.ts b/packages/isaacscript-common/src/types/TupleWithMaxLength.ts index 00ead8cfc..692e1039e 100644 --- a/packages/isaacscript-common/src/types/TupleWithMaxLength.ts +++ b/packages/isaacscript-common/src/types/TupleWithMaxLength.ts @@ -14,7 +14,7 @@ export type TupleWithMaxLength = readonly T[] & { // ----- /* eslint-disable @typescript-eslint/no-unused-vars */ -/* eslint-disable isaacscript/require-unannotated-const-assertions */ +/* eslint-disable complete/require-unannotated-const-assertions */ // Tuple of length 0 with max length 0. const zeroZero: TupleWithMaxLength = [] as const; @@ -44,4 +44,4 @@ const twoTwo: TupleWithMaxLength = ["1", "2"] as const; const threeTwo: TupleWithMaxLength = ["1", "2", "3"] as const; /* eslint-enable @typescript-eslint/no-unused-vars */ -/* eslint-enable isaacscript/require-unannotated-const-assertions */ +/* eslint-enable complete/require-unannotated-const-assertions */ diff --git a/packages/isaacscript-common/tsconfig.bundle.json b/packages/isaacscript-common/tsconfig.bundle.json index ec9db79a3..081a001d5 100644 --- a/packages/isaacscript-common/tsconfig.bundle.json +++ b/packages/isaacscript-common/tsconfig.bundle.json @@ -12,8 +12,7 @@ "tstl": { "buildMode": "default", // Needed since we cannot bundle a library. "luaTarget": "5.3", - "luaBundle": "isaacscript-common.lua", // Will bundle all output Lua files into a single file. - // Also exports everything from `isaac-typescript-definitions` + "luaBundle": "isaacscript-common.lua", "luaBundleEntry": "./src/indexLua.ts", "luaPlugins": [ // A plugin to add an explanatory comment at the top of the compiled "main.lua" file (for diff --git a/packages/isaacscript-common/tsconfig.json b/packages/isaacscript-common/tsconfig.json index 003eae680..6b2d60609 100644 --- a/packages/isaacscript-common/tsconfig.json +++ b/packages/isaacscript-common/tsconfig.json @@ -2,12 +2,17 @@ "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-isaacscript-schema.json", "extends": [ - "../isaacscript-tsconfig/tsconfig.base.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + "../isaacscript-tsconfig/tsconfig.mod.json", ], // https://www.typescriptlang.org/docs/handbook/compiler-options.html "compilerOptions": { + // We need to negate the default "outDir" of "mod". + "outDir": "${configDir}/dist", + // Needed so that the output goes to "./dist/index.lua" instead of "./dist/src/index.lua". "rootDir": "src", diff --git a/packages/isaacscript-common/yarn.lock b/packages/isaacscript-common/yarn.lock deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/isaacscript-lint/LICENSE b/packages/isaacscript-lint/LICENSE index b2cf86336..968812d65 100644 --- a/packages/isaacscript-lint/LICENSE +++ b/packages/isaacscript-lint/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2022 IsaacScript +Copyright (c) 2022 The IsaacScript Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/packages/isaacscript-lint/README.md b/packages/isaacscript-lint/README.md index d8f684364..722ee1382 100644 --- a/packages/isaacscript-lint/README.md +++ b/packages/isaacscript-lint/README.md @@ -1,247 +1,17 @@ -# isaacscript-lint +# `isaacscript-lint` [![npm version](https://img.shields.io/npm/v/isaacscript-lint.svg)](https://www.npmjs.com/package/isaacscript-lint) -This is a helper/meta package to install all of the dependencies necessary for [Prettier](https://prettier.io/) & [ESLint](https://eslint.org/) to work with a typical TypeScript project. (Prettier is the best code formatter and ESLint is the best code problem checker.) +This is a meta package to install all of the dependencies necessary for [Prettier](https://prettier.io/) & [ESLint](https://eslint.org/) to work with a typical IsaacScript project. (Prettier is the best code formatter and ESLint is the best code problem checker.) -
- -## Why This Package Is Useful - -It's a pain to get Prettier & ESLint working with TypeScript. So, `isaacscript-lint` is designed to make it as easy as possible. Don't clutter your `package.json` file with 15+ different ESLint-related dependencies. Don't bother researching which of the hundreds of existing ESLint rules to turn on and turn off. Just use `isaacscript-lint`. - -If you are ready to start, see the [installation instructions](#installation-instructions-for-typescript-projects) below. - -
- -## Why Code Formatting is Important - -In the 90's, the most popular scripting language in the world was [Perl](https://www.perl.org/), invented by [Larry Wall](https://en.wikipedia.org/wiki/Larry_Wall). One of Larry's slogans was that "There Is Always More Than One Way To Do It", abbreviated as the TIAMTOWTDI principle. In Perl, there were many different ways to do even the most basic thing, like adding an element to an array. This resulted in a Perl ecosystem where programs often looked nothing like each other, where everyone had different coding styles, and where everything was hard to read and comprehend. - -One of the key insights of [Guido van Rossum](https://en.wikipedia.org/wiki/Guido_van_Rossum), the creator of the [Python](https://www.python.org/) programming language, was that [code is read much more often than it is written](https://www.python.org/dev/peps/pep-0008/). Python was designed to be concise, clean, and readable. It had standard ways of doing things and recommended that everyone follow the [PEP-8 coding standard](https://www.python.org/dev/peps/pep-0008/). And so, in the 90s, there was a massive movement away from Perl and towards Python. Now, Python is the [most popular programming language in the world](https://pypl.github.io/PYPL.html). - -[Go](https://golang.org/), the programming language designed at Google in 2009, took this concept a step further. They included a code formatter inside of the language itself, called `gofmt` (which is short for "Go formatter"). When you are coding a Go program, it will automatically format all of the code as soon as you save the file. This can be surprising and disturbing for newcomers: "Why does `gofmt` make my code ugly?!" - -However, once people get used to the formatter, they realize that it saves them a _tremendous amount of time_. By ignoring all formatting and typing out code "raw", and then summoning the formatter to instantly fix everything, you can quite literally code twice as fast. Rob Pike, one of the creators of Go, famously said that "gofmt's style is no one's favorite, yet gofmt is everyone's favorite". ([This YouTube clip](https://www.youtube.com/embed/PAAkCSZUG1c?start=523&end=568) of Rob is a much-watch!) - -`gofmt` is nice because it saves people from mundane code formatting. But there is also a benefit that is entirely separate and not readily apparent. When looking at other people's Go code on StackOverflow or GitHub, you realize that it looks exactly like your code. It's easy to read and comprehend. And you can copy-paste code snippets from other programs into your own applications without having to change anything! For programmers, this is not the norm, and it feels great - it's the hidden superpower of Go. - -When Rob says that everyone loves `gofmt`, he isn't lying. Programmers across the world have taken this concept and ran with it. People now use [rustfmt](https://github.com/rust-lang/rustfmt) in [Rust](https://www.rust-lang.org/), [Black](https://github.com/psf/black) in [Python](https://www.python.org/), and [Prettier](https://prettier.io/) in [JavaScript](https://www.javascript.com/) & [TypeScript](https://www.typescriptlang.org/). - -The root of the problem here is that when people try out a new programming language, they often use the same formatting and conventions that they used in their previous language. This fractures the ecosystem and makes everyone's code inconsistent and hard to read. The lesson of Go is that whenever you code in a new language, you should use the standard style that everyone else uses for that language. In this way, every language can have the superpower that Go has. - -
- -## Why We Use Prettier & ESLint - -### Prettier - -In JavaScript and TypeScript land, there isn't an official code formatting standard like there is in Go, but we can get close. - -[Prettier](https://prettier.io/) is an auto-formatter for JavaScript/TypeScript. First released in 2017, it has become widespread and is probably considered to be the industry standard in 2023. Prettier works by completely rebuilding your code from scratch using the [AST](https://en.wikipedia.org/wiki/Abstract_syntax_tree), which allows it to make better transformations than other tools. - -In `isaacscript-lint`, we choose we choose the Prettier style for code formatting, since it is the most popular TypeScript style. Any ESLint rules that conflict with Prettier are turned off with [`eslint-config-prettier`](https://github.com/prettier/eslint-config-prettier). - -Prettier handles almost everything, but the `isaacscript-lint` linting config also has a few formatting-related rules turned on, like [`isaacscript/format-jsdoc-comments`](https://github.com/IsaacScript/isaacscript/blob/main/packages/eslint-plugin-isaacscript/docs/rules/format-jsdoc-comments.md) (since Prettier does not format comments). - -### ESLint - -ESLint is the best tool to lint JavaScript and TypeScript, as it has a massive ecosystem of rules and plugins that can help find errors in your codebase. - -With `isaacscript-lint`, the philosophy is that we want to enable as many lint rules as possible, so that we can catch as many bugs as possible. It takes a lot of work to figure out which rules to turn on and which to not bother with, but we've done it for you. This is documented in more detail on [the docs for `eslint-config-isaacscript`](https://isaacscript.github.io/eslint-config-isaacscript). - -### Using Prettier & ESLint Together - -In order to avoid running two different tools, we could use [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) to run Prettier as an ESLint rule. However, doing this [is not recommended by Prettier](https://prettier.io/docs/en/integrating-with-linters.html). Thus, in order to use `isaacscript-lint`, you should be running both Prettier and ESLint on save. (More info on that is below.) - -
- -## Installation Instructions for TypeScript Projects - -### Step 0 - Get a TypeScript Project Set Up - -It should have a `package.json` file, a `tsconfig.json` file, and so on. - -### Step 1 - Install the Dependency - -```sh -# If you use npm: -npm install isaacscript-lint --save-dev - -# If you use yarn: -yarn install isaacscript-lint --dev - -# If you use pnpm: -pnpm install isaacscript-lint --save-dev -``` - -(It should be a development dependency because it is only used to lint your code pre-production.) - -### Step 2 - `.eslintrc.cjs` - -Create a `.eslintrc.cjs` file in the root of your repository: - -```js -// This is the configuration file for ESLint, the TypeScript linter: -// https://eslint.org/docs/latest/use/configure/ -module.exports = { - extends: [ - // The linter base is the shared IsaacScript config: - // https://github.com/IsaacScript/isaacscript/blob/main/packages/eslint-config-isaacscript/base.js - "eslint-config-isaacscript/base", - ], - - parserOptions: { - // ESLint needs to know about the project's TypeScript settings in order for TypeScript-specific - // things to lint correctly. We do not point this at "./tsconfig.json" because certain files - // (such at this file) should be linted but not included in the actual project output. - project: "./tsconfig.eslint.json", - }, - - rules: { - // Insert changed or disabled rules here, if necessary. - }, -}; -``` - -This file must have a period at the beginning! - -Note that [the new config format for ESLint that was released in 2023](https://eslint.org/docs/latest/use/configure/configuration-files-new) is not yet recommended for production use. - -### Step 3 - `tsconfig.eslint.json` - -Create a `tsconfig.eslint.json` file in the root of your repository: - -```ts -// A special TypeScript configuration file, used by ESLint only. -{ - "extends": "./tsconfig.json", - - // We want to lint every file in the repository, regardless of whether it is actually bundled into - // the TypeScript output. Two entries for each file extension are needed because TypeScript will - // exclude files that begin with a period from an asterisk glob by default. - "include": [ - "./**/*.js", - "./**/.*.js", - "./**/*.cjs", - "./**/.*.cjs", - "./**/*.mjs", - "./**/.*.mjs", - "./**/*.jsx", - "./**/.*.jsx", - "./**/*.ts", - "./**/.*.ts", - "./**/*.cts", - "./**/.*.cts", - "./**/*.mts", - "./**/.*.mts", - "./**/*.tsx", - "./**/.*.tsx" - ], -} -``` - -### Step 4 - Enabling Auto-Fix on Save - -- You will probably want to set up your code editor such that both Prettier and ESLint are automatically run every time the file is saved. -- If you see VSCode, see [the VSCode section below](#integration-with-vscode). -- It's also possible to set this up in other editors such as [Webstorm](https://www.jetbrains.com/webstorm/) and [Neovim](https://neovim.io/), but we don't provide detailed instructions for that here. - -
- -## Adding or Removing Rules - -You can add extra ESLint rules (or ignore existing ESLint rules) by editing the `rules` section of your `.eslintrc.cjs` file. For example: - -```js - rules: { - "@typescript-eslint/no-unused-vars": "off", - }, -``` - -
- -## Integration with VSCode - -[Visual Studio Code](https://code.visualstudio.com/), or VSCode for short, is the most popular TypeScript editor / IDE. - -
- -### Extensions - -In order for the linter to work inside of VSCode, you will have to install the following extensions: - -- [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) -- [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) - -Additionally, you might also want to install the CSpell extension, which is extremely useful to spell check an entire codebase: - -- [CSpell](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker) - -Once installed, these extensions provide a nice dichotomy: - -- Red squiggly underlines are type-errors from the TypeScript compiler. -- Yellow squiggly underlines are warnings from ESLint. -- Blue squiggly underlines are misspelled words. (You can use "Quick Fix" to find suggestions for the proper spelling. Or, you can right click --> `Spelling` --> `Add Words to CSpell Configuration` to ignore a specific word.) - -#### `.vscode/settings.json` - -Furthermore, you will probably want Prettier and ESLint to be run automatically every time you save a TypeScript file. You can tell VSCode to do this by adding the following to your project's `.vscode/settings.json` file: - -```ts -// These are Visual Studio Code settings that should apply to this particular repository. -{ - "[javascript]": { - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit", - }, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true, - }, - - "[typescript]": { - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit", - }, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true, - }, -} -``` - -(Create this file if it does not already exist.) - -You can also commit this file to your project's repository so that this behavior is automatically inherited by anyone who clones the project (and uses VSCode). - -#### `.vscode/extensions.json` - -Optionally, you can also provide a hint to anyone cloning your repository that they should install the required extensions: - -```ts -// These are Visual Studio Code extensions that are intended to be used with this particular -// repository: https://go.microsoft.com/fwlink/?LinkId=827846 -{ - "recommendations": [ - "esbenp.prettier-vscode", // The TypeScript formatter - "dbaeumer.vscode-eslint", // The TypeScript linter - "streetsidesoftware.code-spell-checker", // A spell-checker extension based on CSpell - ], -} -``` - -
+(By default, IsaacScript mods are automatically configured to use this meta package.) ## Package Documentation -- [`@prettier/plugin-xml`](https://github.com/prettier/plugin-xml) - Allows Prettier to format XML files, which are common in some kinds of projects. -- [`cspell`](https://github.com/streetsidesoftware/cspell) - A spell checker for code that is intended to be paired with the [Code Spell Checker VSCode extension](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker). -- [`cspell-check-unused-words`](https://github.com/Zamiell/cspell-check-unused-words) - A helpful script that can detect unused words inside your CSpell configuration, allowing you to clean up unnecessary entries. -- [`eslint`](https://github.com/eslint/eslint) - The main linter engine for JavaScript/TypeScript, as explained above. -- [`eslint-config-isaacscript`](https://github.com/IsaacScript/isaacscript/tree/main/packages/eslint-config-isaacscript) - Contains the master ESLint configuration. -- [`knip`](https://github.com/webpro/knip) - A tool to look for unused files, dependencies, and exports. -- [`prettier`](https://github.com/prettier/prettier) - The main code formatter, as explained above. -- [`prettier-plugin-organize-imports`](https://github.com/simonhaenisch/prettier-plugin-organize-imports) - A plugin used because Prettier will not organize imports automatically. -- [`prettier-plugin-packagejson`](https://github.com/matzkoh/prettier-plugin-packagejson) - A plugin used because Prettier will not organize "package.json" files automatically. -- [`ts-prune`](https://github.com/nadeesha/ts-prune) - A tool to look for unused exports. (This is not needed if you use `knip`.) - -
+- [`@prettier/plugin-xml`](https://github.com/prettier/plugin-xml) - Allows Prettier to format XML files, which are common in Binding of Isaac mods. +- [`complete-lint`](https://complete-ts.github.io/overview.html) - A meta-package to install all of the necessary ESLint and Prettier dependencies. +- [`eslint-config-isaacscript`] - Contains the master ESLint configuration. +- [`eslint-import-resolver-typescript`](https://github.com/import-js/eslint-import-resolver-typescript) - Necessary for `eslint-plugin-import-x` to work properly, which is part of `eslint-config-complete`. (Even though it is a direct dependency of `eslint-config-complete`, it does not work properly when it is a nested transitive dependency, so it must explicitly be in this package.) +- [`isaacscript-spell](https://github.com/IsaacScript/isaacscript/tree/main/packages/isaacscript-spell) - A collection of CSpell dictionaries for IsaacScript mods. +- [`isaacscript-tsconfig`](https://github.com/IsaacScript/isaacscript/tree/main/packages/isaacscript-tsconfig) - A TypeScript configuration file for IsaacScript mods. +- [`ts-prune`](https://github.com/nadeesha/ts-prune) - A tool to look for unused exports. diff --git a/packages/isaacscript-lint/package.json b/packages/isaacscript-lint/package.json index 27a35f3cb..93d6afe57 100644 --- a/packages/isaacscript-lint/package.json +++ b/packages/isaacscript-lint/package.json @@ -1,6 +1,6 @@ { "name": "isaacscript-lint", - "version": "6.20.0", + "version": "7.3.2", "description": "A linting dependency meta-package for IsaacScript and TypeScript projects.", "keywords": [ "isaacscript", @@ -20,22 +20,14 @@ "license": "MIT", "author": "Zamiell", "type": "module", - "files": [ - "LICENSE", - "package.json", - "README.md" - ], "dependencies": { - "@prettier/plugin-xml": "^3.4.1", - "cspell": "^8.14.1", - "cspell-check-unused-words": "^1.2.1", - "eslint": "^9.9.0", - "eslint-config-isaacscript": "^4.20.0", - "knip": "^5.27.2", - "prettier": "^3.3.3", - "prettier-plugin-organize-imports": "^4.0.0", - "prettier-plugin-packagejson": "^2.5.1", - "ts-prune-2": "^0.10.7" + "@prettier/plugin-xml": "3.4.2", + "complete-lint": "5.5.0", + "eslint-config-isaacscript": "6.0.1", + "eslint-import-resolver-typescript": "4.4.4", + "isaacscript-spell": "1.15.2", + "isaacscript-tsconfig": "7.0.1", + "ts-prune-2": "0.10.7" }, "peerDependencies": { "typescript": ">= 5.0.0" diff --git a/packages/isaacscript-lua/README.md b/packages/isaacscript-lua/README.md index 78aaa8c3b..28a383f38 100644 --- a/packages/isaacscript-lua/README.md +++ b/packages/isaacscript-lua/README.md @@ -1,4 +1,4 @@ -# isaacscript-lua +# `isaacscript-lua` This is a Python script to help manage IsaacScript-related libraries in a Lua project. @@ -9,7 +9,7 @@ This is a Python script to help manage IsaacScript-related libraries in a Lua pr Install the tool: ```sh -pip install --upgrade isaacscript-lua +python -m pip install --upgrade isaacscript-lua ``` Install the isaacscript-common` library: diff --git a/packages/isaacscript-spell/LICENSE b/packages/isaacscript-spell/LICENSE index b2cf86336..968812d65 100644 --- a/packages/isaacscript-spell/LICENSE +++ b/packages/isaacscript-spell/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2022 IsaacScript +Copyright (c) 2022 The IsaacScript Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/packages/isaacscript-spell/README.md b/packages/isaacscript-spell/README.md index 054c598dd..5c6d638dd 100644 --- a/packages/isaacscript-spell/README.md +++ b/packages/isaacscript-spell/README.md @@ -1,4 +1,4 @@ -# isaacscript-spell +# `isaacscript-spell` [![npm version](https://img.shields.io/npm/v/isaacscript-spell.svg)](https://www.npmjs.com/package/isaacscript-spell) @@ -6,14 +6,10 @@ These are CSpell dictionaries for [_The Binding of Isaac: Repentance_](https://s [IsaacScript](https://isaacscript.github.io/) mods are automatically configured to use these dictionaries. -
- ## Dictionaries This package contains two dictionaries. Each dictionary is composed of multiple word lists. -
- ### `isaac` | Word List | Description | @@ -23,13 +19,9 @@ This package contains two dictionaries. Each dictionary is composed of multiple | lua.txt | These are words in the Lua programming language. | | other.txt | These are words that apply to Isaac modding in general. | -
- ### `isaacscript` | Word List | Description | | ----------------- | ---------------------------------------------------------------------------------------------- | | isaacscript.txt | These are words contained within IsaacScript template files and elsewhere within the monorepo. | | missing-words.txt | These are general-purpose words that should be in the CSpell base dictionary. | - -
diff --git a/packages/isaacscript-spell/dictionaries/isaac/api.txt b/packages/isaacscript-spell/dictionaries/isaac/api.txt index 7132ce3b0..2319fb0df 100644 --- a/packages/isaacscript-spell/dictionaries/isaac/api.txt +++ b/packages/isaacscript-spell/dictionaries/isaac/api.txt @@ -1,6 +1,5 @@ # These are words from the Lua API. Words from misspelled enums are not included, since those are # fixed in the reimplemented IsaacScript enums. - addplayer # Console command Akeldama ALGIZ @@ -50,6 +49,7 @@ cutscenes CYCLOPIA DAGAZ DATAMINER +DEATHMATCH DECAP DERP DINGA diff --git a/packages/isaacscript-spell/dictionaries/isaac/files.txt b/packages/isaacscript-spell/dictionaries/isaac/files.txt index 5941e95cc..d1d975d46 100644 --- a/packages/isaacscript-spell/dictionaries/isaac/files.txt +++ b/packages/isaacscript-spell/dictionaries/isaac/files.txt @@ -1,5 +1,4 @@ # These are words from files in the "resources" directory, like "entities2.xml". - addcostumeonpickup # items.xml altpath # challenges.xml ambushroomdoor # door_03_ambushroomdoor.png @@ -27,6 +26,7 @@ craftquality # items_metadata.xml deathanm # items.xml devilprice # items.xml devilroomdoor # door_07_devilroomdoor.png +devilsacrifice # items_metadata.xml endstage # challenges.xml fadecolor # cutscenes.xml firedelay # items.xml diff --git a/packages/isaacscript-spell/dictionaries/isaac/isaac.txt b/packages/isaacscript-spell/dictionaries/isaac/isaac.txt index c99c90360..9e9977e27 100644 --- a/packages/isaacscript-spell/dictionaries/isaac/isaac.txt +++ b/packages/isaacscript-spell/dictionaries/isaac/isaac.txt @@ -1,5 +1,4 @@ # These are words that apply to Isaac modding in general. - Antibirth basehp # REPENTOGON API Beelzeblub @@ -13,6 +12,7 @@ Bonies bossid # REPENTOGON API brokenhearts # REPENTOGON API bskinparent # REPENTOGON API +Catinsurance # YouTube tutorial maker Chronometrics # Creator of Basement Renovator cleareffectsonremove # REPENTOGON API collisiondamage # REPENTOGON API @@ -22,6 +22,7 @@ collisionradius # REPENTOGON API collisionradiusxmulti # REPENTOGON API collisionradiusymulti # REPENTOGON API colorblood # REPENTOGON API +coloroffset # Game shader combobox # ImGui element completionparent # REPENTOGON API contentfolder # metadata.vdf @@ -30,6 +31,7 @@ coregfx # REPENTOGON API costumesuffix # REPENTOGON API craftable Cucco # Creator of Job +customcache # REPENTOGON API customtags # REPENTOGON API damagemodifier # REPENTOGON API damagemultiplier # REPENTOGON API @@ -93,7 +95,7 @@ Losts luacheck luarooms luckmodifier # REPENTOGON API -Lytebringr # YouTube tutorial maker +MAPI # MiniMAPI, a common mod modcostume # REPENTOGON API modders Moters diff --git a/packages/isaacscript-spell/dictionaries/isaac/lua.txt b/packages/isaacscript-spell/dictionaries/isaac/lua.txt index a1efd335a..7f2fafe51 100644 --- a/packages/isaacscript-spell/dictionaries/isaac/lua.txt +++ b/packages/isaacscript-spell/dictionaries/isaac/lua.txt @@ -1,5 +1,4 @@ # These are words in the Lua programming language. - Brane # ZeroBrane Studio codestyle # sumneko word collectgarbage # Global diff --git a/packages/isaacscript-spell/dictionaries/isaacscript/general.txt b/packages/isaacscript-spell/dictionaries/isaacscript/general.txt index 282ed1ff0..a48dce93b 100644 --- a/packages/isaacscript-spell/dictionaries/isaacscript/general.txt +++ b/packages/isaacscript-spell/dictionaries/isaacscript/general.txt @@ -14,6 +14,7 @@ codebases cyclomatic decompilation decrementation +desyncs easings gamepad grimoire diff --git a/packages/isaacscript-spell/dictionaries/isaacscript/isaacscript.txt b/packages/isaacscript-spell/dictionaries/isaacscript/isaacscript.txt index 648b4c40b..d33c919bb 100644 --- a/packages/isaacscript-spell/dictionaries/isaacscript/isaacscript.txt +++ b/packages/isaacscript-spell/dictionaries/isaacscript/isaacscript.txt @@ -9,4 +9,5 @@ isaacscript NPCID # Custom enum packagejson # prettier.config.mjs sarisia # ci.yml +tseslint tstl diff --git a/packages/isaacscript-spell/eslint.config.mjs b/packages/isaacscript-spell/eslint.config.mjs index ad69b5433..46f20dbb9 100644 --- a/packages/isaacscript-spell/eslint.config.mjs +++ b/packages/isaacscript-spell/eslint.config.mjs @@ -1,5 +1,6 @@ -import tseslint from "typescript-eslint"; -import { base } from "../eslint-config-isaacscript/base.js"; -import { monorepo } from "../eslint-config-isaacscript/monorepo.js"; +// @ts-check -export default tseslint.config(...base, ...monorepo); +import { completeConfigBase } from "eslint-config-complete"; +import { defineConfig } from "eslint/config"; + +export default defineConfig(...completeConfigBase); diff --git a/packages/isaacscript-spell/package.json b/packages/isaacscript-spell/package.json index 42103c705..d83c8a9cd 100644 --- a/packages/isaacscript-spell/package.json +++ b/packages/isaacscript-spell/package.json @@ -1,6 +1,6 @@ { "name": "isaacscript-spell", - "version": "1.15.0", + "version": "1.15.2", "description": "Spelling dictionaries for The Binding of Isaac: Repentance.", "keywords": [ "isaac", @@ -21,12 +21,14 @@ "type": "module", "files": [ "dictionaries", - "cspell-isaacscript.json", - "LICENSE", - "package.json", - "README.md" + "cspell-isaacscript.json" ], "scripts": { "lint": "tsx ./scripts/lint.ts" + }, + "devDependencies": { + "complete-common": "2.21.0", + "complete-node": "16.4.0", + "typescript-eslint": "8.57.1" } } diff --git a/packages/isaacscript-spell/scripts/lint.ts b/packages/isaacscript-spell/scripts/lint.ts index 1a2b58241..68133bf25 100644 --- a/packages/isaacscript-spell/scripts/lint.ts +++ b/packages/isaacscript-spell/scripts/lint.ts @@ -1,27 +1,27 @@ -import chalk from "chalk"; +import { sortCaseInsensitive } from "complete-common"; import { - $, diff, echo, exit, getFileNamesInDirectory, isDirectory, - lintScript, + lintCommands, readFile, -} from "isaacscript-common-node"; -import { sortCaseInsensitive } from "isaacscript-common-ts"; +} from "complete-node"; import path from "node:path"; -await lintScript(async ({ packageRoot }) => { - const promises = [$`tsc --noEmit`, $`eslint --max-warnings 0 .`]; - await Promise.all(promises); +const PACKAGE_ROOT = path.resolve(import.meta.dirname, ".."); - checkDictionaries(packageRoot); -}); +await lintCommands(import.meta.dirname, [ + "tsc --noEmit", + "eslint --max-warnings 0 .", + // eslint-disable-next-line unicorn/prefer-top-level-await + ["checkDictionaries", checkDictionaries(PACKAGE_ROOT)], +]); -function checkDictionaries(packageRoot: string) { +async function checkDictionaries(packageRoot: string) { const dictionariesPath = path.join(packageRoot, "dictionaries"); - const dictionaryNames = getFileNamesInDirectory(dictionariesPath); + const dictionaryNames = await getFileNamesInDirectory(dictionariesPath); const allWordsSet = new Set(); let oneOrMoreFailures = false; @@ -29,18 +29,22 @@ function checkDictionaries(packageRoot: string) { // Check for alphabetically sorted and unique. for (const dictionaryName of dictionaryNames) { const dictionaryDirectoryPath = path.join(dictionariesPath, dictionaryName); - if (!isDirectory(dictionaryDirectoryPath)) { + // eslint-disable-next-line no-await-in-loop + const directory = await isDirectory(dictionaryDirectoryPath); + if (!directory) { continue; } - const fileNames = getFileNamesInDirectory(dictionaryDirectoryPath); + // eslint-disable-next-line no-await-in-loop + const fileNames = await getFileNamesInDirectory(dictionaryDirectoryPath); for (const fileName of fileNames) { if (!fileName.endsWith(".txt")) { continue; } const filePath = path.join(dictionaryDirectoryPath, fileName); - const fileContent = readFile(filePath); + // eslint-disable-next-line no-await-in-loop + const fileContent = await readFile(filePath); const lines = fileContent.split("\n"); const words = lines.filter( (line) => line !== "" && !line.startsWith("#"), @@ -61,7 +65,7 @@ function checkDictionaries(packageRoot: string) { const sortedWordsString = sortedWords.join("\n"); if (wordsString !== sortedWordsString) { oneOrMoreFailures = true; - echo(`The "${chalk.green(filePath)}" is not sorted:`); + echo(`The "${filePath}" file is not sorted:`); diff(wordsString, sortedWordsString); echo(); } diff --git a/packages/isaacscript-spell/tsconfig.json b/packages/isaacscript-spell/tsconfig.json index 450bb0414..c335f04d0 100644 --- a/packages/isaacscript-spell/tsconfig.json +++ b/packages/isaacscript-spell/tsconfig.json @@ -1,12 +1,14 @@ // We must have a "tsconfig.json" file next to the "eslint.config.mjs" file. (Otherwise, we would // put this in the "scripts" directory like we do elsewhere in this monorepo.) { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "../isaacscript-tsconfig/tsconfig.base.json", - "../isaacscript-tsconfig/tsconfig.node.json", - "../../tsconfig.monorepo.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], "include": ["./scripts/*.ts"], diff --git a/packages/isaacscript-tsconfig/LICENSE b/packages/isaacscript-tsconfig/LICENSE index b2cf86336..968812d65 100644 --- a/packages/isaacscript-tsconfig/LICENSE +++ b/packages/isaacscript-tsconfig/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2022 IsaacScript +Copyright (c) 2022 The IsaacScript Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/packages/isaacscript-tsconfig/README.md b/packages/isaacscript-tsconfig/README.md index 97543dd36..46354c95c 100644 --- a/packages/isaacscript-tsconfig/README.md +++ b/packages/isaacscript-tsconfig/README.md @@ -1,9 +1,5 @@ -# isaacscript-tsconfig +# `isaacscript-tsconfig` [![npm version](https://img.shields.io/npm/v/isaacscript-tsconfig.svg)](https://www.npmjs.com/package/isaacscript-tsconfig) -These are shared TypeScript configuration files that are intended to be used in either [TypeScript](https://www.typescriptlang.org/) projects or [IsaacScript](https://isaacscript.github.io/) mods. - -IsaacScript mods are automatically configured to use these configs. - -Note that if you use these configs with `pnpm`, you must also install `@tsconfig/strictest`, since pnpm does not properly handle transitive dependencies. +This is a shared TypeScript configuration file that is intended to be used in [IsaacScript](https://isaacscript.github.io/) mods. (By default, IsaacScript mods are automatically configured to use this config.) diff --git a/packages/isaacscript-tsconfig/package.json b/packages/isaacscript-tsconfig/package.json index addd085ef..c9a1e424d 100644 --- a/packages/isaacscript-tsconfig/package.json +++ b/packages/isaacscript-tsconfig/package.json @@ -1,6 +1,6 @@ { "name": "isaacscript-tsconfig", - "version": "5.0.0", + "version": "7.0.1", "description": "A sharable TypeScript config for TypeScript and IsaacScript projects.", "keywords": [ "isaacscript", @@ -21,16 +21,13 @@ "author": "Zamiell", "type": "module", "files": [ - "LICENSE", - "package.json", - "README.md", "tsconfig.base.json", "tsconfig.browser.json", "tsconfig.mod.json", "tsconfig.node.json" ], "dependencies": { - "@tsconfig/node-lts": "^20.1.3", - "@tsconfig/strictest": "^2.0.5" + "@tsconfig/node-lts": "24.0.0", + "@tsconfig/strictest": "2.0.8" } } diff --git a/packages/isaacscript-tsconfig/schemas/tsconfig-trailing-commas-schema.json b/packages/isaacscript-tsconfig/schemas/tsconfig-trailing-commas-schema.json deleted file mode 100644 index 066a496d1..000000000 --- a/packages/isaacscript-tsconfig/schemas/tsconfig-trailing-commas-schema.json +++ /dev/null @@ -1,13 +0,0 @@ -// The URL for this file is at: -// https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-tsconfig/schemas/tsconfig-trailing-commas-schema.json -{ - "title": "tsconfig.json", - "description": "JSON schema for the TypeScript compiler's configuration file", - "$schema": "http://json-schema.org/draft-07/schema", - "allOf": [ - { - "$ref": "https://json.schemastore.org/tsconfig" - } - ], - "allowTrailingCommas": true -} diff --git a/packages/isaacscript-tsconfig/tsconfig.base.json b/packages/isaacscript-tsconfig/tsconfig.base.json deleted file mode 100644 index 04d55ca7e..000000000 --- a/packages/isaacscript-tsconfig/tsconfig.base.json +++ /dev/null @@ -1,41 +0,0 @@ -// This is a tsconfig.json intended to be used as a base for all TypeScript projects. It only -// contains options that have to do with code checking strictness and omits all options having to do -// with environment or transpilation (besides the "include" and "outDir" options). -{ - // We extend the strictest base config: - // https://github.com/tsconfig/bases/blob/main/bases/strictest.json - // Note the "esModuleInterop" and "skipLibCheck" options from `strictest` do not have to do with - // strictness, but we leave these values unchanged: - // https://github.com/tsconfig/bases/issues/156 - "extends": "@tsconfig/strictest/tsconfig.json", - - // https://www.typescriptlang.org/docs/handbook/compiler-options.html - "compilerOptions": { - // The "strictest" config has the "exactOptionalPropertyTypes" flag set to true. However, this - // is only needed in rare cases, like when using the `in` operator. Furthermore, it can cause - // spurious errors when trying to clear an attribute of an object. - "exactOptionalPropertyTypes": false, - - // The "strictest" config has the "noFallthroughCasesInSwitch" flag set to true. However, we - // prefer the "no-fallthrough" ESLint rule instead, as this does not have to do with types. - "noFallthroughCasesInSwitch": false, - - // The "strictest" config has the "noUnusedLocals" and the "noUnusedParameters" flags set to - // true. However, we prefer the "@typescript-eslint/no-unused-vars" ESLint rule instead, since - // unused local variables can be useful while debugging. Furthermore, the ESLint rule has the - // ability to ignore certain specific variable prefixes, while the TypeScript version does not. - "noUnusedLocals": false, - "noUnusedParameters": false, - - // We standardize the destination for compiled output to be the "dist" directory, since this is - // idiomatic in the TypeScript ecosystem. - "outDir": "${configDir}/dist", - }, - - // We standardize the input directory to be the "src" directory, since this is idiomatic in the - // TypeScript ecosystem. This is important because projects do not typically want to compile tests - // or scripts; those directories typically contain their own "tsconfig.json" files. (By default, - // the value for "include" is "**/*", which would include tests, scripts, and other configuration - // files.) - "include": ["${configDir}/src/**/*.ts", "${configDir}/src/**/*.tsx"], -} diff --git a/packages/isaacscript-tsconfig/tsconfig.browser.json b/packages/isaacscript-tsconfig/tsconfig.browser.json deleted file mode 100644 index 736d4e54d..000000000 --- a/packages/isaacscript-tsconfig/tsconfig.browser.json +++ /dev/null @@ -1,10 +0,0 @@ -// This is a tsconfig.json intended to be used by TypeScript programs used in a browser environment. -{ - // https://www.typescriptlang.org/docs/handbook/compiler-options.html - "compilerOptions": { - // "lib" specifies a set of bundled library declaration files that describe the target run-time - // environment. We choose "ES2021" because that is the earliest version that supports the - // `String.replaceAll` method. - "lib": ["DOM", "ES2021"], - }, -} diff --git a/packages/isaacscript-tsconfig/tsconfig.mod.json b/packages/isaacscript-tsconfig/tsconfig.mod.json index eb44f3720..611fb57f9 100644 --- a/packages/isaacscript-tsconfig/tsconfig.mod.json +++ b/packages/isaacscript-tsconfig/tsconfig.mod.json @@ -1,4 +1,4 @@ -// This is a tsconfig.json intended to be used by IsaacScript mods. +// This is a TypeScript configuration intended to be used by IsaacScript mods. { // https://www.typescriptlang.org/docs/handbook/compiler-options.html "compilerOptions": { @@ -20,6 +20,9 @@ // the standard library. (The standard library does not use ECMAScript decorators due to // limitations in TSTL.) "experimentalDecorators": true, + + // We need to override the "outDir" specified by the base config. + "outDir": "${configDir}/mod", }, // We cannot add values to the "tstl" object here (for TypeScriptToLua), since the entire object diff --git a/packages/isaacscript-tsconfig/tsconfig.node.json b/packages/isaacscript-tsconfig/tsconfig.node.json deleted file mode 100644 index b60282713..000000000 --- a/packages/isaacscript-tsconfig/tsconfig.node.json +++ /dev/null @@ -1,6 +0,0 @@ -// This is a tsconfig.json intended to be used by TypeScript programs used in a Node.js environment. -{ - // We extend the recommended Node config: - // https://github.com/tsconfig/bases/blob/main/bases/node-lts.json - "extends": "@tsconfig/node-lts/tsconfig.json", -} diff --git a/prettier.config.mjs b/prettier.config.mjs index 1b44f6552..fe7947f82 100644 --- a/prettier.config.mjs +++ b/prettier.config.mjs @@ -1,6 +1,8 @@ // This is the configuration file for Prettier, the auto-formatter: // https://prettier.io/docs/en/configuration.html +// @ts-check + /** @type {import("prettier").Config} */ const config = { plugins: [ @@ -33,6 +35,11 @@ const config = { }, }, ], + + // We break from the default Prettier config for only a single option: operator position. There + // are no known arguments for placing operators at the end of the line, as outlined in this + // thread: https://github.com/prettier/prettier/issues/3806 + experimentalOperatorPosition: "start", }; export default config; diff --git a/scripts/getMonorepoPackageNames.ts b/scripts/getMonorepoPackageNames.ts deleted file mode 100644 index 3210b6556..000000000 --- a/scripts/getMonorepoPackageNames.ts +++ /dev/null @@ -1,76 +0,0 @@ -// This is a script intended to be used inside of a GitHub Actions YAML file. - -import { - PACKAGE_JSON, - appendFile, - echo, - fatalError, - getArgs, - getFileNamesInDirectory, - isDirectory, - isFile, - isMain, - packageJSONHasScript, -} from "isaacscript-common-node"; -import path from "node:path"; - -const REPO_ROOT = path.join(import.meta.dirname, ".."); -const PACKAGES_PATH = path.join(REPO_ROOT, "packages"); -const GITHUB_ACTIONS_OUTPUT_VARIABLE_NAME = "matrix"; - -if (isMain()) { - main(); -} - -function main() { - // Validate environment variables. - const gitHubOutputFile = process.env["GITHUB_OUTPUT"]; - if (gitHubOutputFile === undefined || gitHubOutputFile === "") { - fatalError("Failed to read the environment variable: GITHUB_OUTPUT"); - } - - const args = getArgs(); - const scriptName = args[0]; - const packageNames = getMonorepoPackageNames(scriptName); - const packageNamesString = JSON.stringify(packageNames); - - echo(packageNamesString); - - // Quoting `packageNamesString` is unnecessary and will cause downstream errors. - const gitHubActionsOutput = `${GITHUB_ACTIONS_OUTPUT_VARIABLE_NAME}=${packageNamesString}\n`; - appendFile(gitHubOutputFile, gitHubActionsOutput); -} - -/** - * Helper function to get the package names in a monorepo by looking at all of the subdirectories in - * the "packages" directory. - * - * @param scriptName Optional. If specified, the package names will be filtered to only include - * those that include scripts with the given name. - */ -export function getMonorepoPackageNames( - scriptName?: string, -): readonly string[] { - const packageNames: string[] = []; - - const fileNames = getFileNamesInDirectory(PACKAGES_PATH); - for (const fileName of fileNames) { - const filePath = path.join(PACKAGES_PATH, fileName); - if (isDirectory(filePath)) { - packageNames.push(fileName); - } - } - - if (scriptName === undefined || scriptName === "") { - return packageNames; - } - - return packageNames.filter((packageName) => { - const packageJSONPath = path.join(PACKAGES_PATH, packageName, PACKAGE_JSON); - if (!isFile(packageJSONPath)) { - return false; - } - - return packageJSONHasScript(packageJSONPath, scriptName); - }); -} diff --git a/scripts/lint-all.ts b/scripts/lint-all.ts new file mode 100644 index 000000000..71475bd77 --- /dev/null +++ b/scripts/lint-all.ts @@ -0,0 +1,18 @@ +import { $, getMonorepoPackageNames, lintScript } from "complete-node"; +import path from "node:path"; + +// This script runs the lint scripts for each individual package. It does not run the lint scripts +// for the monorepo itself. For that, use the "lint.ts" script. +await lintScript(import.meta.dirname, async (packageRoot) => { + const lintPackages = await getMonorepoPackageNames(packageRoot, "lint"); + + await Promise.all( + lintPackages.map(async (packageName) => { + const packagePath = path.join(packageRoot, "packages", packageName); + const $$ = $({ cwd: packagePath }); + await $$`npm run lint`; + }), + ); + + console.log("Successfully linted all monorepo packages."); +}); diff --git a/scripts/lint.ts b/scripts/lint.ts index f6802b875..50bdb200d 100644 --- a/scripts/lint.ts +++ b/scripts/lint.ts @@ -1,40 +1,33 @@ -import { $, exit, lintScript } from "isaacscript-common-node"; -import { packageJSONLint } from "./packageJSONLint.js"; - -await lintScript(async () => { - const promises = [ - // Use Prettier to check formatting. - // - "--log-level=warn" makes it only output errors. - $`prettier --log-level=warn --check .`, - - // Type-check the code using the TypeScript compiler. - $`tsc --noEmit`, - - // Use ESLint to lint the TypeScript. - // - "--max-warnings 0" makes warnings fail, since we set all ESLint errors to warnings. - $`eslint --max-warnings 0 scripts *.mjs`, // We have to exclude the packages directory. - - // Check for unused files, dependencies, and exports. - // TODO: Re-enable knip - // https://github.com/webpro/knip/issues/570 - /// $`knip --exclude dependencies`, - // (Knip cannot handle Google-style monorepos, so we have to exclude dependencies.) - - // Spell check every file using CSpell. - // - "--no-progress" and "--no-summary" make it only output errors. - $`cspell --no-progress --no-summary .`, - - // Check for unused CSpell words. - $`cspell-check-unused-words`, - - // Check for template updates. - /// $`tsx ./packages/isaacscript-cli/src/main.ts check --ignore bundleEntry.ts,ci.yml,eslint.config.mjs,lint.ts,tsconfig.eslint.json,tsconfig.json`, - ]; - - await Promise.all(promises); - - // The "packageJSONLint.ts" script uses synchronous APIs, so we must run it separately. - if (!packageJSONLint(false)) { - exit(1); - } -}); +import { lintCommands, lintMonorepoPackageJSONs } from "complete-node"; +import path from "node:path"; + +const MONOREPO_ROOT = path.resolve(import.meta.dirname, ".."); + +await lintCommands(import.meta.dirname, [ + // Use TypeScript to type-check the code. + "tsc --noEmit", + + // Use ESLint to lint the TypeScript code. + // - "--max-warnings 0" makes warnings fail, since we set all ESLint errors to warnings. + "eslint --max-warnings 0 scripts *.mjs", // We have to exclude the packages directory. + + // Use Prettier to check formatting. + // - "--log-level=warn" makes it only output errors. + "prettier --log-level=warn --check .", + + // Use Knip to check for unused files, exports, and dependencies. + "knip --no-progress", + + // Use CSpell to spell check every file. + // - "--no-progress" and "--no-summary" make it only output errors. + "cspell --no-progress --no-summary .", + + // Check for unused words in the CSpell configuration file. + "cspell-check-unused-words", + + // Check for template updates. + "tsx ./packages/isaacscript-cli/src/main.ts check --ignore bundleEntry.ts,ci.yml,eslint.config.mjs,lint.ts,tsconfig.json", + + // Check to see if the child "package.json" files are up to date. + ["lintMonorepoPackageJSONs", lintMonorepoPackageJSONs(MONOREPO_ROOT)], +]); diff --git a/scripts/lintAll.ts b/scripts/lintAll.ts deleted file mode 100644 index 27d4252d0..000000000 --- a/scripts/lintAll.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { $op, lintScript } from "isaacscript-common-node"; -import path from "node:path"; -import { getMonorepoPackageNames } from "./getMonorepoPackageNames.js"; - -await lintScript(async ({ packageRoot }) => { - const lintPackages = getMonorepoPackageNames("lint"); - - const promises: Array> = []; - - for (const lintPackage of lintPackages) { - const packagePath = path.join(packageRoot, "packages", lintPackage); - const $$ = $op({ cwd: packagePath }); - promises.push($$`npm run lint`); - } - - await Promise.all(promises); -}); diff --git a/scripts/packageJSONLint.ts b/scripts/packageJSONLint.ts deleted file mode 100644 index 4de3238cc..000000000 --- a/scripts/packageJSONLint.ts +++ /dev/null @@ -1,393 +0,0 @@ -// Performs various checks on every "package.json" file in the repository. - -import { globSync } from "glob"; -import { - PACKAGE_JSON, - echo, - exit, - getArgs, - getPackageJSON, - getPackageJSONDependencies, - isFile, - isMain, - readFile, -} from "isaacscript-common-node"; -import type { ReadonlyRecord } from "isaacscript-common-ts"; -import { isKebabCase } from "isaacscript-common-ts"; -import path from "node:path"; - -const REPO_ROOT = path.join(import.meta.dirname, ".."); -const REPO_ROOT_PACKAGE_JSON_PATH = path.join(REPO_ROOT, PACKAGE_JSON); - -if (isMain()) { - main(); -} - -function main() { - const args = getArgs(); - const verbose = args.includes("--verbose"); - - if (verbose) { - echo('Checking "package.json" files...'); - } - - if (!packageJSONLint(verbose)) { - exit(1); - } - - if (verbose) { - echo('All "package.json" files are valid.'); - } -} - -/** @returns Whether or not all "package.json" files are valid. */ -export function packageJSONLint(verbose: boolean): boolean { - if (!isPackageJSONValid(REPO_ROOT_PACKAGE_JSON_PATH, undefined, verbose)) { - return false; - } - const rootDeps = getDeps(REPO_ROOT_PACKAGE_JSON_PATH); - - const packageJSONPaths = globSync(`./packages/**/${PACKAGE_JSON}`, { - ignore: ["**/dist/**", "**/node_modules/**"], - cwd: REPO_ROOT, - }); - - checkRootDepsUpToDate(rootDeps, packageJSONPaths); - - let allValid = true; - for (const packageJSONPath of packageJSONPaths) { - if (!isPackageJSONValid(packageJSONPath, rootDeps, verbose)) { - allValid = false; - } - } - - return allValid; -} - -function isPackageJSONValid( - packageJSONPath: string, - rootDeps: ReadonlyRecord | undefined, - verbose: boolean, -): boolean { - if (verbose) { - console.log(`Checking: ${packageJSONPath}`); - } - - const isRoot = rootDeps === undefined; - const isTemplateFile = packageJSONPath.includes("dynamic"); - const isDocs = packageJSONPath.includes("docs"); - const shouldBePrivate = isRoot || isDocs; - - const packageJSON = getPackageJSON(packageJSONPath); - - const { name } = packageJSON; - if (typeof name !== "string" || name === "") { - echo(`File is missing a "name" field: ${packageJSONPath}`); - return false; - } - - if (!isTemplateFile && !isKebabCase(name)) { - echo(`File has a non-kebab-case "name" field: ${packageJSONPath}`); - return false; - } - - const { version } = packageJSON; - if (!shouldBePrivate && (typeof version !== "string" || version === "")) { - echo(`File is missing a "version" field: ${packageJSONPath}`); - return false; - } - - const privateField = packageJSON["private"]; - if (shouldBePrivate && privateField !== true) { - echo(`File must have a private field equal to true: ${packageJSONPath}`); - return false; - } - - if (!shouldBePrivate && privateField !== undefined) { - echo(`File must not have a private field: ${packageJSONPath}`); - return false; - } - - const { description } = packageJSON; - if (typeof description !== "string" || description === "") { - echo(`File is missing a "description" field: ${packageJSONPath}`); - return false; - } - - if (!description.endsWith(".")) { - echo( - `File must have a trailing period in the "description" field: ${packageJSONPath}`, - ); - return false; - } - - if (!shouldBePrivate) { - const { keywords } = packageJSON; - if (typeof keywords !== "object") { - echo(`File is missing a "keywords" field: ${packageJSONPath}`); - } - - if (!Array.isArray(keywords)) { - echo(`File has an invalid a "keywords" field: ${packageJSONPath}`); - return false; - } - } - - if (!isTemplateFile) { - const { homepage } = packageJSON; - if (typeof homepage !== "string" || homepage === "") { - echo(`File is missing a "homepage" field: ${packageJSONPath}`); - return false; - } - - if (homepage !== "https://isaacscript.github.io/") { - echo(`File has an invalid "homepage" field: ${packageJSONPath}`); - return false; - } - - const { bugs } = packageJSON; - if (typeof bugs !== "object") { - echo(`File is missing a "bugs" field: ${packageJSONPath}`); - return false; - } - - const bugsURL = (bugs as Record)["url"]; - if (typeof bugsURL !== "string" || bugsURL === "") { - echo(`File is missing a "bugs.url" field: ${packageJSONPath}`); - return false; - } - - if (bugsURL !== "https://github.com/IsaacScript/isaacscript/issues") { - echo(`File has an invalid "bugs.url" field: ${packageJSONPath}`); - return false; - } - - const { repository } = packageJSON; - if (typeof repository !== "object") { - echo(`File is missing a "repository" field: ${packageJSONPath}`); - return false; - } - - const repositoryType = (repository as Record)["type"]; - if (typeof repositoryType !== "string" || repositoryType === "") { - echo(`File is missing a "repository.type" field: ${packageJSONPath}`); - return false; - } - - if (repositoryType !== "git") { - echo(`File has an invalid "repository.type" field: ${packageJSONPath}`); - return false; - } - - const repositoryURL = (repository as Record)["url"]; - if (typeof repositoryURL !== "string" || repositoryURL === "") { - echo(`File is missing a "repository.url" field: ${packageJSONPath}`); - return false; - } - - if ( - repositoryURL !== "git+https://github.com/IsaacScript/isaacscript.git" - ) { - echo(`File has an invalid "repository.url" field: ${packageJSONPath}`); - return false; - } - } - - const { license } = packageJSON; - if (typeof license !== "string" || license === "") { - echo(`File is missing a "license" field: ${packageJSONPath}`); - return false; - } - - if (license !== "GPL-3.0" && license !== "MIT") { - echo(`File has an invalid "license" field: ${packageJSONPath}`); - return false; - } - - if (!isTemplateFile) { - const packageDirectory = path.dirname(packageJSONPath); - const licensePath = path.join(packageDirectory, "LICENSE"); - if (!isFile(licensePath)) { - echo(`File does not exist: ${licensePath}`); - return false; - } - - const licenseFile = readFile(licensePath); - switch (license) { - case "GPL-3.0": { - if (!licenseFile.includes("GNU GENERAL PUBLIC LICENSE")) { - echo(`Invalid GPL license file: ${licensePath}`); - return false; - } - - break; - } - - case "MIT": { - if (!licenseFile.includes("The MIT License (MIT)")) { - echo(`Invalid MIT license file: ${licensePath}`); - return false; - } - - break; - } - } - - const { author } = packageJSON; - if (typeof author !== "string" || author === "") { - echo(`File is missing a "author" field: ${packageJSONPath}`); - return false; - } - - if (author !== "Zamiell") { - echo(`File has an invalid "author" field: ${packageJSONPath}`); - return false; - } - } - - // Docusaurus is bugged with the type field. Building will fail regardless of whether you specify - // "commonjs" or "module". - if (!isDocs) { - const { type } = packageJSON; - if (typeof type !== "string" || type === "") { - echo(`File is missing a "type" field: ${packageJSONPath}`); - return false; - } - } - - if (!isTemplateFile && rootDeps !== undefined) { - const { dependencies } = packageJSON; - if (!checkDeps(dependencies, rootDeps, packageJSONPath)) { - return false; - } - - const { devDependencies } = packageJSON; - if (!checkDeps(devDependencies, rootDeps, packageJSONPath)) { - return false; - } - - // We skip checking for peer dependencies, since they are all based on the major version. - // e.g. "typescript": ">= 5.0.0" - } - - return true; -} - -/** Gets the dependencies of the root monorepo "package.json" file. */ -function getDeps(packageJSONPath: string): Record { - const dependencies = - getPackageJSONDependencies(packageJSONPath, "dependencies") ?? {}; - const devDependencies = - getPackageJSONDependencies(packageJSONPath, "devDependencies") ?? {}; - const peerDependencies = - getPackageJSONDependencies(packageJSONPath, "peerDependencies") ?? {}; - - const deps = { - ...dependencies, - ...devDependencies, - ...peerDependencies, - }; - - // `eslint-plugin-isaacscript` is not a root dependency of the monorepo, so it has to be - // explicitly added to the list of deps. - const pluginVersion = getVersionForSpecificPackage( - "eslint-plugin-isaacscript", - ); - deps["eslint-plugin-isaacscript"] = `^${pluginVersion}`; - - return deps; -} - -function getVersionForSpecificPackage(packageName: string): string { - const packageJSONPath = path.join( - REPO_ROOT, - "packages", - packageName, - "package.json", - ); - const packageJSON = getPackageJSON(packageJSONPath); - const packageVersion = packageJSON["version"]; - if (typeof packageVersion !== "string") { - throw new TypeError(`Failed to parse the version from: ${packageJSONPath}`); - } - - return packageVersion; -} - -function checkDeps( - object: unknown, - rootDeps: ReadonlyRecord, - packageJSONPath: string, -): boolean { - const deps = object as Record | undefined | null; - - if (deps === undefined || deps === null || typeof deps !== "object") { - return true; - } - - let atLeastOneError = false; - for (const [key, value] of Object.entries(deps)) { - let rootDepValue = rootDeps[key]; - if (rootDepValue === undefined) { - // This is an internal dependency; thus, we need to look up the correct version in the - // respective "package.json" file. - const depPackageJSONPath = path.join( - REPO_ROOT, - "packages", - key, - PACKAGE_JSON, - ); - const depPackageJSON = getPackageJSON(depPackageJSONPath); - const depVersion = depPackageJSON["version"]; - if (typeof depVersion !== "string") { - throw new TypeError( - `Failed to get the version from: ${depPackageJSONPath}`, - ); - } - - rootDepValue = `^${depVersion}`; - } - - if (value !== rootDepValue) { - echo( - `Incorrect dependency: ${packageJSONPath} - ${key}: ${value} --> ${rootDepValue}`, - ); - atLeastOneError = true; - } - } - - return !atLeastOneError; -} - -function checkRootDepsUpToDate( - rootDeps: ReadonlyRecord, - packageJSONPaths: readonly string[], -) { - for (const [rootDepName, rootDepVersion] of Object.entries(rootDeps)) { - const matchingPackageJSONPath = packageJSONPaths.find((packageJSONPath) => - packageJSONPath.includes(`/${rootDepName}/`), - ); - if (matchingPackageJSONPath === undefined) { - continue; - } - - const packageJSON = getPackageJSON(matchingPackageJSONPath); - - const { version } = packageJSON; - if (typeof version !== "string" || version === "") { - throw new Error( - `Failed to find the version for file: ${matchingPackageJSONPath}`, - ); - } - - const versionString = `^${version}`; - if ( - rootDepVersion !== versionString && - rootDepName !== "eslint-plugin-isaacscript" - ) { - throw new Error( - `Root dependency "${rootDepName}" is not up to date: ${rootDepVersion} --> ${versionString}`, - ); - } - } -} diff --git a/scripts/publish.ts b/scripts/publish.ts index 7054c6c51..887ab31a4 100644 --- a/scripts/publish.ts +++ b/scripts/publish.ts @@ -1,153 +1,3 @@ -import chalk from "chalk"; -import { - $o, - $op, - $s, - $sq, - PACKAGE_JSON, - echo, - exit, - fatalError, - getArgs, - getElapsedSeconds, - getPackageJSONScripts, - getPackageJSONVersion, - isDirectory, - isGitRepositoryClean, - isLoggedInToNPM, -} from "isaacscript-common-node"; -import { isEnumValue, isSemanticVersion } from "isaacscript-common-ts"; -import path from "node:path"; -import { updateIsaacScriptMonorepo } from "./update.js"; +import { monorepoPublish } from "complete-node"; -enum VersionBump { - major = "major", - minor = "minor", - patch = "patch", - dev = "dev", -} - -const UPDATES_ENABLED = false as boolean; -const REPO_ROOT = path.join(import.meta.dirname, ".."); - -const startTime = Date.now(); - -// Validate that we are on the correct branch. -const branch = $o`git branch --show-current`; -if (branch !== "main") { - echo("Error: You must be on the main branch before publishing."); - exit(1); -} - -// Validate that we can push and pull to the repository. -$s`git branch --set-upstream-to=origin/main main --quiet`; -$s`git pull --rebase --quiet`; -$s`git push --set-upstream origin main --quiet`; - -// Validate that we are logged in to npm. -if (!isLoggedInToNPM()) { - fatalError( - `You are not logged into npm. Please run: ${chalk.green("npm adduser")}`, - ); -} - -// Validate command-line arguments. -const args = getArgs(); -const packageName = args[0]; -if (packageName === undefined || packageName === "") { - echo("Error: The package name is required as an argument."); - exit(1); -} - -const packagePath = path.join(REPO_ROOT, "packages", packageName); -if (!isDirectory(packagePath)) { - echo(`Error: The directory of "${chalk.green(packagePath)}" does not exist.`); - exit(1); -} - -const versionBump = args[1]; -if (versionBump === undefined || versionBump === "") { - echo("Error: The version bump description is required as an argument."); - exit(1); -} -if (!isEnumValue(versionBump, VersionBump) && !isSemanticVersion(versionBump)) { - echo(`Error: The following version bump is not valid: ${versionBump}`); - exit(1); -} - -const $$ = $op({ cwd: packagePath }); - -// Before bumping the version, check to see if this package compiles and lints and tests (so that we -// can avoid unnecessary version bumps). -const scripts = getPackageJSONScripts(packagePath); -if (scripts !== undefined) { - const promises: Array> = []; - - for (const scriptName of ["build", "lint", "test"]) { - const scriptCommand = scripts[scriptName]; - if (typeof scriptCommand === "string") { - promises.push($$`npm run ${scriptName}`); - } - } - - await Promise.all(promises); -} - -/** - * Normally, the "version" command of the packager manager will automatically make a Git commit for - * you. However: - * - * - The npm version command is bugged with subdirectories: https://github.com/npm/cli/issues/2010 - * - The yarn version command is bugged with with spaces inside of the --message" flag. - * - * Thus, we manually revert to doing a commit ourselves. - */ -if (isEnumValue(versionBump, VersionBump) && versionBump === VersionBump.dev) { - $$.sync`npm version prerelease --preid=dev --commit-hooks=false`; -} else { - $$.sync`npm version ${versionBump} --commit-hooks=false`; -} - -// Manually make a Git commit. (See above comment.) -const packageJSONPath = path.join(packagePath, PACKAGE_JSON); -$sq`git add ${packageJSONPath}`; -const newVersion = getPackageJSONVersion(packagePath); -const tag = `${packageName}-${newVersion}`; -const commitMessage = `chore(release): ${tag}`; -$sq`git commit --message ${commitMessage}`; -$sq`git tag ${tag}`; -// (Defer doing a "git push" until the end so that we only trigger a single CI run.) - -// Upload the package to npm. -const npmTag = - isEnumValue(versionBump, VersionBump) && versionBump === VersionBump.dev - ? "next" - : "latest"; -// - The "--access=public" flag is only technically needed for the first publish (unless the package -// is a scoped package), but it is saved here for posterity. -// - The "--ignore-scripts" flag is needed since the "npm publish" command will run the "publish" -// script in the "package.json" file, causing an infinite loop. -$$.sync`npm publish --access=public --ignore-scripts --tag=${npmTag}`; - -const elapsedSeconds = getElapsedSeconds(startTime); -const secondsText = elapsedSeconds === 1 ? "second" : "seconds"; -const version = getPackageJSONVersion(packagePath); -console.log( - `Successfully published package "${chalk.green( - packageName, - )}" version "${chalk.green(version)}" in ${elapsedSeconds} ${secondsText}.`, -); - -// Finally, check for dependency updates to ensure that we keep the monorepo up to date. -if (UPDATES_ENABLED) { - console.log("Checking for monorepo updates..."); - updateIsaacScriptMonorepo(); - - if (!isGitRepositoryClean(REPO_ROOT)) { - const gitCommitMessage = "chore: updating dependencies"; - $sq`git add --all`; - $sq`git commit --message ${gitCommitMessage}`; - } -} - -$sq`git push --set-upstream origin main`; +await monorepoPublish(import.meta.dirname); diff --git a/scripts/update.ts b/scripts/update.ts index b7b3b6e47..5c87882cd 100644 --- a/scripts/update.ts +++ b/scripts/update.ts @@ -1,119 +1,3 @@ -// - `eslint` is stuck on version 8.57.0 until we can migrate to the flat config. -// - `typedoc-plugin-markdown` is stuck on version 3.17.1 since version 4 is not compatible with the -// complicated build script that reshuffles the file names. -// - `typescript` is stuck on version 5.4.5 until `@typescript-eslint` works. -// - `typedoc` is stuck on version 0.25.13 until I can rewrite the complicated docs build script. +import { updatePackageJSONDependenciesMonorepo } from "complete-node"; -import { - $s, - PACKAGE_JSON, - echo, - getPackageJSONDependencies, - getPackageJSONField, - isFile, - isMain, - setPackageJSONDependency, - updatePackageJSON, -} from "isaacscript-common-node"; -import { trimPrefix } from "isaacscript-common-ts"; -import path from "node:path"; -import { getMonorepoPackageNames } from "./getMonorepoPackageNames.js"; - -const REPO_ROOT = path.join(import.meta.dirname, ".."); - -if (isMain()) { - updateIsaacScriptMonorepo(); -} - -export function updateIsaacScriptMonorepo(): void { - // Certain monorepo packages are dependant on other monorepo packages, so check to see if those - // are all up to date first. (This is independent of the root "package.json" file.) - const updatedSomething = updateIndividualPackageDeps(); - - const hasNewDependencies = updatePackageJSON(REPO_ROOT); - if (hasNewDependencies) { - // Now that the main dependencies have changed, we might need to update the "package.json" files - // in the individual packages. However, we don't want to blow away "peerDependencies", since - // they are in the form of ">= 5.0.0". Thus, we specify "--types prod,dev" to exclude syncing - // "peerDependencies". - $s`syncpack fix-mismatches --types prod,dev`; - } - - if (updatedSomething || hasNewDependencies) { - echo("Updated to the latest dependencies."); - } else { - echo("No new updates."); - } -} - -/** - * `syncpack` will automatically update most of the dependencies in the individual project - * "package.json" files, but not the ones that do not exist in the root "package.json". - * - * @returns Whether anything was updated. - */ -function updateIndividualPackageDeps(): boolean { - let updatedSomething = false; - - const monorepoPackageNames = getMonorepoPackageNames(); - for (const monorepoPackageName of monorepoPackageNames) { - const monorepoPackagePath = path.join( - REPO_ROOT, - "packages", - monorepoPackageName, - ); - - // Some packages do not have "package.json" files, like "isaacscript-lua". - const packageJSONPath = path.join(monorepoPackagePath, PACKAGE_JSON); - if (!isFile(packageJSONPath)) { - continue; - } - - // Some packages do not have version fields, like "docs". - const version = getPackageJSONField(packageJSONPath, "version"); - if (version === undefined) { - continue; - } - - for (const monorepoPackageName2 of monorepoPackageNames) { - const monorepoPackagePath2 = path.join( - REPO_ROOT, - "packages", - monorepoPackageName2, - ); - - // Some packages do not have "package.json" files, like "isaacscript-lua". - const packageJSONPath2 = path.join(monorepoPackagePath2, PACKAGE_JSON); - if (!isFile(packageJSONPath2)) { - continue; - } - - const dependencies = getPackageJSONDependencies( - monorepoPackagePath2, - "dependencies", - ); - if (dependencies === undefined) { - continue; - } - - const depVersion = dependencies[monorepoPackageName]; - if (depVersion === undefined) { - continue; - } - - const depVersionTrimmed = trimPrefix(depVersion, "^"); - - if (depVersionTrimmed !== version) { - const versionWithPrefix = `^${version}`; - setPackageJSONDependency( - monorepoPackagePath2, - monorepoPackageName, - versionWithPrefix, - ); - updatedSomething = true; - } - } - } - - return updatedSomething; -} +await updatePackageJSONDependenciesMonorepo(import.meta.dirname); diff --git a/todo.txt b/todo.txt index 12a86ec74..cd8e2f2df 100644 --- a/todo.txt +++ b/todo.txt @@ -1,3 +1,8 @@ +- install npm ci git hook +- redo fandom links to wiki.gg + +- redo ci for docs so that it matches complete (but with typesense instead of algolia) + - check the purpose of __DOCS_LINE_THAT_WILL_BE_AUTOMATICALLY_REMOVED__ !- rewrite create docs script to work with latest typedoc-plugin-markdown @@ -7,50 +12,13 @@ - // TODO: Re-enable. -- redo isaacscript-lint / config in separate repo? - - release new version with flat config - - GET RID OF ALL: "./**/.*.mjs", - -- release tsconfig in dev after this and everything else is sorted out +- release new version with flat config - use `sort-keys` eslint plugin to sort object alphabetically in base-typescript-eslint https://eslint.org/docs/latest/rules/sort-keys -- package.mod.json: dynamically fetch TypeScript version from TSTL GitHub repo - -- try removing ESLint parserOptions, since they might not be needed with flat config - -- new TSESLint changes: - - https://typescript-eslint.io/blog/announcing-typescript-eslint-v8 - - change project to projectServices - - remove tsconfig.eslint.json - -- remove eslint-plugin-deprecation when available in tseslint - -- re-enable knip in lint.ts -- re-enable check-ts in lint.ts -- see top comment of "update.ts" (and uncomment "no-useless-assignment") - - import eslint-plugin-plugin -- change to knip.config.jsonc (potentially, once Knip v4 releases) -- change to cspell.config.jsonc (if knip is changed) - - use stack overflow to remove isaac-typescript-definitions from deps - difficult, do it when I have the courage - make sure that isaacscript-common still works through link in dev - -- test rule "import-x/no-default-export" once this issue is closed and released: - https://github.com/un-ts/eslint-plugin-import-x/issues/121 - (currently the rule is not working with the flat config, but I suspect that the latest release - might fix this) - this issue is also relevant: - https://github.com/un-ts/eslint-plugin-import-x/issues/29 - -- lint projects: - - fix returning `Promise` - - fix `prefer-readonly-parameter-types` for Array - - https://github.com/typescript-eslint/typescript-eslint/issues/7114 - - https://github.com/typescript-eslint/typescript-eslint/issues/8079 - - https://github.com/typescript-eslint/typescript-eslint/issues/4571 - - `T extends Foo[]` --> `T extends readonly Foo[]` diff --git a/tsconfig.json b/tsconfig.json index 0f25100ac..c335f04d0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,14 @@ // We must have a "tsconfig.json" file next to the "eslint.config.mjs" file. (Otherwise, we would // put this in the "scripts" directory like we do elsewhere in this monorepo.) { - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", + "$schema": "https://raw.githubusercontent.com/complete-ts/complete/main/packages/complete-tsconfig/schemas/tsconfig-strict-schema.json", "extends": [ - "./packages/isaacscript-tsconfig/tsconfig.base.json", - "./packages/isaacscript-tsconfig/tsconfig.node.json", - "./tsconfig.monorepo.json", + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.base.json + "complete-tsconfig/tsconfig.base.json", + + // https://github.com/complete-ts/complete/blob/main/packages/complete-tsconfig/tsconfig.node.json + "complete-tsconfig/tsconfig.node.json", ], "include": ["./scripts/*.ts"], diff --git a/tsconfig.monorepo.json b/tsconfig.monorepo.json deleted file mode 100644 index 1d31cfecd..000000000 --- a/tsconfig.monorepo.json +++ /dev/null @@ -1,21 +0,0 @@ -// This is a tsconfig.json intended to be used by packages in this monorepo. It is designed to be -// extended from in addition to the appropriate environment tsconfig (e.g. Node.js, browser, etc.). -{ - "$schema": "https://raw.githubusercontent.com/IsaacScript/isaacscript/main/packages/isaacscript-cli/schemas/tsconfig-strict-schema.json", - - // https://www.typescriptlang.org/docs/handbook/compiler-options.html - "compilerOptions": { - // We do not have to put the "baseUrl" option here because the correct value will be - // automatically inferred by TypeScript. - - // We only have to include the packages that are imported by other packages. - "paths": { - "isaacscript-common-node": [ - "./packages/isaacscript-common-node/src/index.ts", - ], - "isaacscript-common-ts": [ - "./packages/isaacscript-common-ts/src/index.ts", - ], - }, - }, -} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index c0d7c14c6..000000000 --- a/yarn.lock +++ /dev/null @@ -1,18875 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 8 - cacheKey: 10c0 - -"@algolia/autocomplete-core@npm:1.8.2": - version: 1.8.2 - resolution: "@algolia/autocomplete-core@npm:1.8.2" - dependencies: - "@algolia/autocomplete-shared": "npm:1.8.2" - checksum: 10c0/e237fb98435091aaf0a3fd8b86ce79dcd533a7efb828ed3fbd0df09902af5c0bb10f3266757a723b2381d12a8c611564b3465d40d03b7e497e61d5142f7a46df - languageName: node - linkType: hard - -"@algolia/autocomplete-core@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-core@npm:1.9.3" - dependencies: - "@algolia/autocomplete-plugin-algolia-insights": "npm:1.9.3" - "@algolia/autocomplete-shared": "npm:1.9.3" - checksum: 10c0/a751b20f15c9a30b8b2d5a4f1f62fb4dbd012fb7ffec1b12308d6e7388b5a4dc83af52176634f17facb57a7727204843c5aa2f6e80efafaaf244275f44af11d9 - languageName: node - linkType: hard - -"@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3" - dependencies: - "@algolia/autocomplete-shared": "npm:1.9.3" - peerDependencies: - search-insights: ">= 1 < 3" - checksum: 10c0/574196f66fe828be1029439032376685020524d6c729dea99caef336cc7be244d2539fa91b3fe80db80efe3420c2c05063cab3534514be6c637bf1914b17a6f6 - languageName: node - linkType: hard - -"@algolia/autocomplete-preset-algolia@npm:1.8.2": - version: 1.8.2 - resolution: "@algolia/autocomplete-preset-algolia@npm:1.8.2" - dependencies: - "@algolia/autocomplete-shared": "npm:1.8.2" - peerDependencies: - "@algolia/client-search": ">= 4.9.1 < 6" - algoliasearch: ">= 4.9.1 < 6" - checksum: 10c0/adf7212905c5d0838a82613b5549e273a99f5cd49aa005ae6d230bc5d035419d5eb09d511dfbba6598012964b796871c4d1fc195068645d2982543144e010b87 - languageName: node - linkType: hard - -"@algolia/autocomplete-preset-algolia@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-preset-algolia@npm:1.9.3" - dependencies: - "@algolia/autocomplete-shared": "npm:1.9.3" - peerDependencies: - "@algolia/client-search": ">= 4.9.1 < 6" - algoliasearch: ">= 4.9.1 < 6" - checksum: 10c0/38c1872db4dae69b4eec622db940c7a992d8530e33fbac7df593473ef404312076d9933b4a7ea25c2d401ea5b62ebd64b56aa25b5cdd8e8ba3fd309a39d9d816 - languageName: node - linkType: hard - -"@algolia/autocomplete-shared@npm:1.8.2": - version: 1.8.2 - resolution: "@algolia/autocomplete-shared@npm:1.8.2" - checksum: 10c0/339004b719b5b2a5e657750afcc3796d0818e66d7be215a2b443f45ac0c801fb8760d0fce68d7ea3f2ca29bc958318e35206432700108137cfce8947a363e561 - languageName: node - linkType: hard - -"@algolia/autocomplete-shared@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-shared@npm:1.9.3" - peerDependencies: - "@algolia/client-search": ">= 4.9.1 < 6" - algoliasearch: ">= 4.9.1 < 6" - checksum: 10c0/1aa926532c32be6bb5384c8c0ae51a312c9d79ed7486371218dfcb61c8ea1ed46171bdc9f9b596a266aece104a0ef76d6aac2f9a378a5a6eb4460e638d59f6ae - languageName: node - linkType: hard - -"@algolia/cache-browser-local-storage@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/cache-browser-local-storage@npm:4.24.0" - dependencies: - "@algolia/cache-common": "npm:4.24.0" - checksum: 10c0/68823c3b1c07dab093de98e678e2ff7fcf7a40915a157715f6f51d073e3865086be98cbbe554b7bf9e0514db5dd9e726033e27e566d9e5db059cb5059c3436cc - languageName: node - linkType: hard - -"@algolia/cache-common@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/cache-common@npm:4.24.0" - checksum: 10c0/ad481ad50d7ea92d0cce525757627f4a647b5373dc6d3cbed6405d05cb83f21a110919e7133e5233d5b13c2c8f59ed9e927efdbc82e70571707709075b07d2c6 - languageName: node - linkType: hard - -"@algolia/cache-in-memory@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/cache-in-memory@npm:4.24.0" - dependencies: - "@algolia/cache-common": "npm:4.24.0" - checksum: 10c0/2956600b2722f113373dbb71449f546afb5a0fb1a3d1558a1a3e957b7a630d1f25045c29646c8dbb44cdffe6ff4c9d1219bf63fc9fd8e4d5467381c7150e09f9 - languageName: node - linkType: hard - -"@algolia/client-account@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/client-account@npm:4.24.0" - dependencies: - "@algolia/client-common": "npm:4.24.0" - "@algolia/client-search": "npm:4.24.0" - "@algolia/transporter": "npm:4.24.0" - checksum: 10c0/3dd52dd692a2194eb45844280e6261192d5a4ef99aec729a09a01da5cf071fd77b37c6d164bf8877823efc1484d576068d76ada764a4f0624238a3475bc199b2 - languageName: node - linkType: hard - -"@algolia/client-analytics@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/client-analytics@npm:4.24.0" - dependencies: - "@algolia/client-common": "npm:4.24.0" - "@algolia/client-search": "npm:4.24.0" - "@algolia/requester-common": "npm:4.24.0" - "@algolia/transporter": "npm:4.24.0" - checksum: 10c0/8d02e6d0eb0dcde099832c62fa7d7e9910b2757b4d37e07e1eefb65a12fef7e7ce3d73fda23e8ee02d53953a91efc15086016b1af5e9fea9227dfc0fc61c9f63 - languageName: node - linkType: hard - -"@algolia/client-common@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/client-common@npm:4.24.0" - dependencies: - "@algolia/requester-common": "npm:4.24.0" - "@algolia/transporter": "npm:4.24.0" - checksum: 10c0/9e75d0bb51bb04f099e823e4397d1bac6659e1ecb7c7a73a5eaf9153632d544bd6c62a4961b606490220b236361eb8b7b77a5e4c47f12aefdd2952b14ce2fd18 - languageName: node - linkType: hard - -"@algolia/client-common@npm:5.0.0": - version: 5.0.0 - resolution: "@algolia/client-common@npm:5.0.0" - checksum: 10c0/7c14b05547373cffe8966e32b7325bf6f869dc5fda5317a67541df08b627047035a104c619e0d9192b7053e0c50ca236c7a3079314667d90afa64effdec01a87 - languageName: node - linkType: hard - -"@algolia/client-personalization@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/client-personalization@npm:4.24.0" - dependencies: - "@algolia/client-common": "npm:4.24.0" - "@algolia/requester-common": "npm:4.24.0" - "@algolia/transporter": "npm:4.24.0" - checksum: 10c0/9193e032841ae991ce6dd8c8988608d0d83a6785681abf26055812506aaf070db8d8f44403d0270384ff39530677603d103c330a869a397181d594bebe46b4b0 - languageName: node - linkType: hard - -"@algolia/client-search@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/client-search@npm:4.24.0" - dependencies: - "@algolia/client-common": "npm:4.24.0" - "@algolia/requester-common": "npm:4.24.0" - "@algolia/transporter": "npm:4.24.0" - checksum: 10c0/d161235014fa73acc0ff04d737c695b7357c060d31db6d602464b27ba846208c6aeb35b179e76d4c33b51329b77de0c460f6cb21b66d364c18a5534874c7b987 - languageName: node - linkType: hard - -"@algolia/client-search@npm:^5.0.0": - version: 5.0.0 - resolution: "@algolia/client-search@npm:5.0.0" - dependencies: - "@algolia/client-common": "npm:5.0.0" - "@algolia/requester-browser-xhr": "npm:5.0.0" - "@algolia/requester-node-http": "npm:5.0.0" - checksum: 10c0/2b33fe231c972720b8cdb18d7e4fa956abd154872f349b68b50063636137039dc5a836668ca8cbec374bc5cbdcd1a0594f2be6aff8cccfb1951c7f21086e5a10 - languageName: node - linkType: hard - -"@algolia/events@npm:^4.0.1": - version: 4.0.1 - resolution: "@algolia/events@npm:4.0.1" - checksum: 10c0/f398d815c6ed21ac08f6caadf1e9155add74ac05d99430191c3b1f1335fd91deaf468c6b304e6225c9885d3d44c06037c53def101e33d9c22daff175b2a65ca9 - languageName: node - linkType: hard - -"@algolia/logger-common@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/logger-common@npm:4.24.0" - checksum: 10c0/1ebe93901a2b3ce41696b535d028337c1c6a98a4262868117c16dd603cc8bb106b840e45cf53c08d098cf518e07bedc64a59cc86bef18795dc49031c2c208d31 - languageName: node - linkType: hard - -"@algolia/logger-console@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/logger-console@npm:4.24.0" - dependencies: - "@algolia/logger-common": "npm:4.24.0" - checksum: 10c0/fdfa3983e6c38cc7b69d66e1085ac702e009d693bd49d64b27cad9ba4197788a8784529a8ed9c25e6ccd51cc4ad3a2427241ecc322c22ca2c8ce6a8d4d94fe69 - languageName: node - linkType: hard - -"@algolia/recommend@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/recommend@npm:4.24.0" - dependencies: - "@algolia/cache-browser-local-storage": "npm:4.24.0" - "@algolia/cache-common": "npm:4.24.0" - "@algolia/cache-in-memory": "npm:4.24.0" - "@algolia/client-common": "npm:4.24.0" - "@algolia/client-search": "npm:4.24.0" - "@algolia/logger-common": "npm:4.24.0" - "@algolia/logger-console": "npm:4.24.0" - "@algolia/requester-browser-xhr": "npm:4.24.0" - "@algolia/requester-common": "npm:4.24.0" - "@algolia/requester-node-http": "npm:4.24.0" - "@algolia/transporter": "npm:4.24.0" - checksum: 10c0/685fb5c1d85d7b9fd39d9246b49da5be4199fecc144bb350ed92fc191b66e4e1101ee6df9ca857ac5096f587638fa3366e01ddca0258f11000aa092ed68daea3 - languageName: node - linkType: hard - -"@algolia/requester-browser-xhr@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/requester-browser-xhr@npm:4.24.0" - dependencies: - "@algolia/requester-common": "npm:4.24.0" - checksum: 10c0/2d277b291bcc0a388f114116879c15a96c057f698b026c32e719b354c2e2e03e05b3c304f45d2354eb4dd8dfa519d481af51ce8ef19b6fb4fd6d384cf41373de - languageName: node - linkType: hard - -"@algolia/requester-browser-xhr@npm:5.0.0": - version: 5.0.0 - resolution: "@algolia/requester-browser-xhr@npm:5.0.0" - dependencies: - "@algolia/client-common": "npm:5.0.0" - checksum: 10c0/fe969aa28fdf5018ace416b9ad59fc396f38fa51fde6a1e43d60917f1e77abf57c7d9347e4701099c55d43242e2666687bf5bf8ecd02c5b3ab290cf35b6a3b04 - languageName: node - linkType: hard - -"@algolia/requester-common@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/requester-common@npm:4.24.0" - checksum: 10c0/cf88ca1f04f4243515bbfa05d7cf51afe6a57904390d9e1ccab799bae20f6fa77e954d9eee9d5c718086582aeb478e271ccf1d5a6a5ab943494250dce820268e - languageName: node - linkType: hard - -"@algolia/requester-node-http@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/requester-node-http@npm:4.24.0" - dependencies: - "@algolia/requester-common": "npm:4.24.0" - checksum: 10c0/e9cef1463f29035a44f12941ddeb343a213ff512c61ade46a07db19b2023f49a5ac12024a3f56d8b9c0c5b2bd32466030c5e27b26a6a6e17773b810388ddb3b7 - languageName: node - linkType: hard - -"@algolia/requester-node-http@npm:5.0.0": - version: 5.0.0 - resolution: "@algolia/requester-node-http@npm:5.0.0" - dependencies: - "@algolia/client-common": "npm:5.0.0" - checksum: 10c0/b8571a26e0f2d89a2ff2ad7028b9d092865cdcb894c2a1ab969b330840c99b1cd6a80e3c8c4d91ae8f25092137cf42409b562a588c76075be3e8dcd85d3b535c - languageName: node - linkType: hard - -"@algolia/transporter@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/transporter@npm:4.24.0" - dependencies: - "@algolia/cache-common": "npm:4.24.0" - "@algolia/logger-common": "npm:4.24.0" - "@algolia/requester-common": "npm:4.24.0" - checksum: 10c0/9eee8e6613c8d2a5562e4df284dc7b0804a7bf80586fd8512ad769dc4829f947a334480378d94efd3cc57ca4d400886eb677786a3c5664f85881093f9e27cab7 - languageName: node - linkType: hard - -"@ampproject/remapping@npm:^2.2.0": - version: 2.3.0 - resolution: "@ampproject/remapping@npm:2.3.0" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed - languageName: node - linkType: hard - -"@arktype/fs@npm:^0.2.1": - version: 0.2.1 - resolution: "@arktype/fs@npm:0.2.1" - checksum: 10c0/0508aa2744c5ea04327c3d9d0d272380a21db55200d1945604123e8c5ef8e31a9763af3c52f78e2b081c4afb7af757068ca783f89f7a9d908eff28cd74cdb2c9 - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.24.2, @babel/code-frame@npm:^7.24.7, @babel/code-frame@npm:^7.8.3": - version: 7.24.7 - resolution: "@babel/code-frame@npm:7.24.7" - dependencies: - "@babel/highlight": "npm:^7.24.7" - picocolors: "npm:^1.0.0" - checksum: 10c0/ab0af539473a9f5aeaac7047e377cb4f4edd255a81d84a76058595f8540784cc3fbe8acf73f1e073981104562490aabfb23008cd66dc677a456a4ed5390fdde6 - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/compat-data@npm:7.25.2" - checksum: 10c0/5bf1f14d6e5f0d37c19543e99209ff4a94bb97915e1ce01e5334a144aa08cd56b6e62ece8135dac77e126723d63d4d4b96fc603a12c43b88c28f4b5e070270c5 - languageName: node - linkType: hard - -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.21.3, @babel/core@npm:^7.23.3, @babel/core@npm:^7.23.7, @babel/core@npm:^7.23.9, @babel/core@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/core@npm:7.25.2" - dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.0" - "@babel/helper-compilation-targets": "npm:^7.25.2" - "@babel/helper-module-transforms": "npm:^7.25.2" - "@babel/helpers": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.0" - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.2" - "@babel/types": "npm:^7.25.2" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10c0/a425fa40e73cb72b6464063a57c478bc2de9dbcc19c280f1b55a3d88b35d572e87e8594e7d7b4880331addb6faef641bbeb701b91b41b8806cd4deae5d74f401 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.23.3, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.7.2": - version: 7.25.0 - resolution: "@babel/generator@npm:7.25.0" - dependencies: - "@babel/types": "npm:^7.25.0" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 10c0/d0e2dfcdc8bdbb5dded34b705ceebf2e0bc1b06795a1530e64fb6a3ccf313c189db7f60c1616effae48114e1a25adc75855bc4496f3779a396b3377bae718ce7 - languageName: node - linkType: hard - -"@babel/helper-annotate-as-pure@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" - dependencies: - "@babel/types": "npm:^7.24.7" - checksum: 10c0/4679f7df4dffd5b3e26083ae65228116c3da34c3fff2c11ae11b259a61baec440f51e30fd236f7a0435b9d471acd93d0bc5a95df8213cbf02b1e083503d81b9a - languageName: node - linkType: hard - -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.24.7" - dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/0ed84abf848c79fb1cd4c1ddac12c771d32c1904d87fc3087f33cfdeb0c2e0db4e7892b74b407d9d8d0c000044f3645a7391a781f788da8410c290bb123a1f13 - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.7, @babel/helper-compilation-targets@npm:^7.24.8, @babel/helper-compilation-targets@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-compilation-targets@npm:7.25.2" - dependencies: - "@babel/compat-data": "npm:^7.25.2" - "@babel/helper-validator-option": "npm:^7.24.8" - browserslist: "npm:^4.23.1" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10c0/de10e986b5322c9f807350467dc845ec59df9e596a5926a3b5edbb4710d8e3b8009d4396690e70b88c3844fe8ec4042d61436dd4b92d1f5f75655cf43ab07e99 - languageName: node - linkType: hard - -"@babel/helper-create-class-features-plugin@npm:^7.24.7, @babel/helper-create-class-features-plugin@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helper-create-class-features-plugin@npm:7.25.0" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-member-expression-to-functions": "npm:^7.24.8" - "@babel/helper-optimise-call-expression": "npm:^7.24.7" - "@babel/helper-replace-supers": "npm:^7.25.0" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.0" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/2f8ac36cfeb45d462432acea64c78312cc9180dda7aa9337b77017961e373c323065362d2452f3d6f8bffeb254ff3f7346ac1b25c8ad7b81db813a95924f4053 - languageName: node - linkType: hard - -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.24.7, @babel/helper-create-regexp-features-plugin@npm:^7.25.0": - version: 7.25.2 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.2" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - regexpu-core: "npm:^5.3.1" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/85a7e3639c118856fb1113f54fb7e3bf7698171ddfd0cd6fccccd5426b3727bc1434fe7f69090441dcde327feef9de917e00d35e47ab820047057518dd675317 - languageName: node - linkType: hard - -"@babel/helper-define-polyfill-provider@npm:^0.6.2": - version: 0.6.2 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.6" - "@babel/helper-plugin-utils": "npm:^7.22.5" - debug: "npm:^4.1.1" - lodash.debounce: "npm:^4.0.8" - resolve: "npm:^1.14.2" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/f777fe0ee1e467fdaaac059c39ed203bdc94ef2465fb873316e9e1acfc511a276263724b061e3b0af2f6d7ad3ff174f2bb368fde236a860e0f650fda43d7e022 - languageName: node - linkType: hard - -"@babel/helper-member-expression-to-functions@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-member-expression-to-functions@npm:7.24.8" - dependencies: - "@babel/traverse": "npm:^7.24.8" - "@babel/types": "npm:^7.24.8" - checksum: 10c0/7e14a5acc91f6cd26305a4441b82eb6f616bd70b096a4d2099a968f16b26d50207eec0b9ebfc466fefd62bd91587ac3be878117cdfec819b7151911183cb0e5a - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-module-imports@npm:7.24.7" - dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/97c57db6c3eeaea31564286e328a9fb52b0313c5cfcc7eee4bc226aebcf0418ea5b6fe78673c0e4a774512ec6c86e309d0f326e99d2b37bfc16a25a032498af0 - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.24.7, @babel/helper-module-transforms@npm:^7.24.8, @babel/helper-module-transforms@npm:^7.25.0, @babel/helper-module-transforms@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-module-transforms@npm:7.25.2" - dependencies: - "@babel/helper-module-imports": "npm:^7.24.7" - "@babel/helper-simple-access": "npm:^7.24.7" - "@babel/helper-validator-identifier": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.2" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/adaa15970ace0aee5934b5a633789b5795b6229c6a9cf3e09a7e80aa33e478675eee807006a862aa9aa517935d81f88a6db8a9f5936e3a2a40ec75f8062bc329 - languageName: node - linkType: hard - -"@babel/helper-optimise-call-expression@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-optimise-call-expression@npm:7.24.7" - dependencies: - "@babel/types": "npm:^7.24.7" - checksum: 10c0/ca6a9884705dea5c95a8b3ce132d1e3f2ae951ff74987d400d1d9c215dae9c0f9e29924d8f8e131e116533d182675bc261927be72f6a9a2968eaeeaa51eb1d0f - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.24.8, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.24.8 - resolution: "@babel/helper-plugin-utils@npm:7.24.8" - checksum: 10c0/0376037f94a3bfe6b820a39f81220ac04f243eaee7193774b983e956c1750883ff236b30785795abbcda43fac3ece74750566830c2daa4d6e3870bb0dff34c2d - languageName: node - linkType: hard - -"@babel/helper-remap-async-to-generator@npm:^7.24.7, @babel/helper-remap-async-to-generator@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helper-remap-async-to-generator@npm:7.25.0" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-wrap-function": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.0" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/0d17b5f7bb6a607edc9cc62fff8056dd9f341bf2f919884f97b99170d143022a5e7ae57922c4891e4fc360ad291e708d2f8cd8989f1d3cd7a17600159984f5a6 - languageName: node - linkType: hard - -"@babel/helper-replace-supers@npm:^7.24.7, @babel/helper-replace-supers@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helper-replace-supers@npm:7.25.0" - dependencies: - "@babel/helper-member-expression-to-functions": "npm:^7.24.8" - "@babel/helper-optimise-call-expression": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.0" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/b4b6650ab3d56c39a259367cd97f8df2f21c9cebb3716fea7bca40a150f8847bfb82f481e98927c7c6579b48a977b5a8f77318a1c6aeb497f41ecd6dbc3fdfef - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-simple-access@npm:7.24.7" - dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/7230e419d59a85f93153415100a5faff23c133d7442c19e0cd070da1784d13cd29096ee6c5a5761065c44e8164f9f80e3a518c41a0256df39e38f7ad6744fed7 - languageName: node - linkType: hard - -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.7" - dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/e3a9b8ac9c262ac976a1bcb5fe59694db5e6f0b4f9e7bdba5c7693b8b5e28113c23bdaa60fe8d3ec32a337091b67720b2053bcb3d5655f5406536c3d0584242b - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-string-parser@npm:7.24.8" - checksum: 10c0/6361f72076c17fabf305e252bf6d580106429014b3ab3c1f5c4eb3e6d465536ea6b670cc0e9a637a77a9ad40454d3e41361a2909e70e305116a23d68ce094c08 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.24.5, @babel/helper-validator-identifier@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-validator-identifier@npm:7.24.7" - checksum: 10c0/87ad608694c9477814093ed5b5c080c2e06d44cb1924ae8320474a74415241223cc2a725eea2640dd783ff1e3390e5f95eede978bc540e870053152e58f1d651 - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.24.7, @babel/helper-validator-option@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-validator-option@npm:7.24.8" - checksum: 10c0/73db93a34ae89201351288bee7623eed81a54000779462a986105b54ffe82069e764afd15171a428b82e7c7a9b5fec10b5d5603b216317a414062edf5c67a21f - languageName: node - linkType: hard - -"@babel/helper-wrap-function@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helper-wrap-function@npm:7.25.0" - dependencies: - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10c0/d54601a98384c191cbc1ff07b03a19e288ef8d5c6bfafe270b2a303d96e7304eb296002921ed464cc1b105a547d1db146eb86b0be617924dee1ba1b379cdc216 - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helpers@npm:7.25.0" - dependencies: - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10c0/b7fe007fc4194268abf70aa3810365085e290e6528dcb9fbbf7a765d43c74b6369ce0f99c5ccd2d44c413853099daa449c9a0123f0b212ac8d18643f2e8174b8 - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/highlight@npm:7.24.7" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.24.7" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10c0/674334c571d2bb9d1c89bdd87566383f59231e16bcdcf5bb7835babdf03c9ae585ca0887a7b25bdf78f303984af028df52831c7989fecebb5101cc132da9393a - languageName: node - linkType: hard - -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.3": - version: 7.25.3 - resolution: "@babel/parser@npm:7.25.3" - dependencies: - "@babel/types": "npm:^7.25.2" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/874b01349aedb805d6694f867a752fdc7469778fad76aca4548d2cc6ce96087c3ba5fb917a6f8d05d2d1a74aae309b5f50f1a4dba035f5a2c9fcfe6e106d2c4e - languageName: node - linkType: hard - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.3": - version: 7.25.3 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/traverse": "npm:^7.25.3" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/814b4d3f102e7556a5053d1acf57ef601cfcff39a2c81b8cdc6a5c842e3cb9838f5925d1466a5f1e6416e74c9c83586a3c07fbd7fb8610a396c2becdf9ae5790 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/9645a1f47b3750acadb1353c02e71cc712d072aafe5ce115ed3a886bc14c5d9200cfb0b5b5e60e813baa549b800cf798f8714019fd246c699053cf68c428e426 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/ed1ce1c90cac46c01825339fd0f2a96fa071b016fb819d8dfaf8e96300eae30e74870cb47e4dc80d4ce2fb287869f102878b4f3b35bc927fec8b1d0d76bcf612 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.13.0 - checksum: 10c0/aeb6e7aa363a47f815cf956ea1053c5dd8b786a17799f065c9688ba4b0051fe7565d258bbe9400bfcbfb3114cb9fda66983e10afe4d750bc70ff75403e15dd36 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/traverse": "npm:^7.25.0" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/45988025537a9d4a27b610fd696a18fd9ba9336621a69b4fb40560eeb10c79657f85c92a37f30c7c8fb29c22970eea0b373315795a891f1a05549a6cfe5a6bfe - languageName: node - linkType: hard - -"@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": - version: 7.21.0-placeholder-for-preset-env.2 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/e605e0070da087f6c35579499e65801179a521b6842c15181a1e305c04fded2393f11c1efd09b087be7f8b083d1b75e8f3efcbc1292b4f60d3369e14812cff63 - languageName: node - linkType: hard - -"@babel/plugin-syntax-async-generators@npm:^7.8.4": - version: 7.8.4 - resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/d13efb282838481348c71073b6be6245b35d4f2f964a8f71e4174f235009f929ef7613df25f8d2338e2d3e44bc4265a9f8638c6aaa136d7a61fe95985f9725c8 - languageName: node - linkType: hard - -"@babel/plugin-syntax-bigint@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/686891b81af2bc74c39013655da368a480f17dd237bf9fbc32048e5865cb706d5a8f65438030da535b332b1d6b22feba336da8fa931f663b6b34e13147d12dde - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-properties@npm:^7.12.13": - version: 7.12.13 - resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.12.13" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/95168fa186416195280b1264fb18afcdcdcea780b3515537b766cb90de6ce042d42dd6a204a39002f794ae5845b02afb0fd4861a3308a861204a55e68310a120 - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-static-block@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/4464bf9115f4a2d02ce1454411baf9cfb665af1da53709c5c56953e5e2913745b0fcce82982a00463d6facbdd93445c691024e310b91431a1e2f024b158f6371 - languageName: node - linkType: hard - -"@babel/plugin-syntax-dynamic-import@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-dynamic-import@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/9c50927bf71adf63f60c75370e2335879402648f468d0172bc912e303c6a3876927d8eb35807331b57f415392732ed05ab9b42c68ac30a936813ab549e0246c5 - languageName: node - linkType: hard - -"@babel/plugin-syntax-export-namespace-from@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-export-namespace-from@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/5100d658ba563829700cd8d001ddc09f4c0187b1a13de300d729c5b3e87503f75a6d6c99c1794182f7f1a9f546ee009df4f15a0ce36376e206ed0012fa7cdc24 - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-assertions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/b82c53e095274ee71c248551352d73441cf65b3b3fc0107258ba4e9aef7090772a425442b3ed1c396fa207d0efafde8929c87a17d3c885b3ca2021316e87e246 - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-attributes@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/eccc54d0f03c96d0eec7a6e2fa124dadbc7298345b62ffc4238f173308c4325b5598f139695ff05a95cf78412ef6903599e4b814496612bf39aad4715a16375b - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-meta@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/0b08b5e4c3128523d8e346f8cfc86824f0da2697b1be12d71af50a31aff7a56ceb873ed28779121051475010c28d6146a6bfea8518b150b71eeb4e46190172ee - languageName: node - linkType: hard - -"@babel/plugin-syntax-json-strings@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/e98f31b2ec406c57757d115aac81d0336e8434101c224edd9a5c93cefa53faf63eacc69f3138960c8b25401315af03df37f68d316c151c4b933136716ed6906e - languageName: node - linkType: hard - -"@babel/plugin-syntax-jsx@npm:^7.24.7, @babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.24.7 - resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/f44d927a9ae8d5ef016ff5b450e1671e56629ddc12e56b938e41fd46e141170d9dfc9a53d6cb2b9a20a7dd266a938885e6a3981c60c052a2e1daed602ac80e51 - languageName: node - linkType: hard - -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/2594cfbe29411ad5bc2ad4058de7b2f6a8c5b86eda525a993959438615479e59c012c14aec979e538d60a584a1a799b60d1b8942c3b18468cb9d99b8fd34cd0b - languageName: node - linkType: hard - -"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/2024fbb1162899094cfc81152449b12bd0cc7053c6d4bda8ac2852545c87d0a851b1b72ed9560673cbf3ef6248257262c3c04aabf73117215c1b9cc7dd2542ce - languageName: node - linkType: hard - -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9 - languageName: node - linkType: hard - -"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/ee1eab52ea6437e3101a0a7018b0da698545230015fc8ab129d292980ec6dff94d265e9e90070e8ae5fed42f08f1622c14c94552c77bcac784b37f503a82ff26 - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/27e2493ab67a8ea6d693af1287f7e9acec206d1213ff107a928e85e173741e1d594196f99fec50e9dde404b09164f39dec5864c767212154ffe1caa6af0bc5af - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/46edddf2faa6ebf94147b8e8540dfc60a5ab718e2de4d01b2c0bdf250a4d642c2bd47cbcbb739febcb2bf75514dbcefad3c52208787994b8d0f8822490f55e81 - languageName: node - linkType: hard - -"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/69822772561706c87f0a65bc92d0772cea74d6bc0911537904a676d5ff496a6d3ac4e05a166d8125fce4a16605bace141afc3611074e170a994e66e5397787f3 - languageName: node - linkType: hard - -"@babel/plugin-syntax-top-level-await@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/14bf6e65d5bc1231ffa9def5f0ef30b19b51c218fcecaa78cd1bdf7939dfdf23f90336080b7f5196916368e399934ce5d581492d8292b46a2fb569d8b2da106f - languageName: node - linkType: hard - -"@babel/plugin-syntax-typescript@npm:^7.24.7, @babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.24.7 - resolution: "@babel/plugin-syntax-typescript@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/cdabd2e8010fb0ad15b49c2c270efc97c4bfe109ead36c7bbcf22da7a74bc3e49702fc4f22f12d2d6049e8e22a5769258df1fd05f0420ae45e11bdd5bc07805a - languageName: node - linkType: hard - -"@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.18.6" - "@babel/helper-plugin-utils": "npm:^7.18.6" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/9144e5b02a211a4fb9a0ce91063f94fbe1004e80bde3485a0910c9f14897cf83fabd8c21267907cff25db8e224858178df0517f14333cfcf3380ad9a4139cb50 - languageName: node - linkType: hard - -"@babel/plugin-transform-arrow-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/6ac05a54e5582f34ac6d5dc26499e227227ec1c7fa6fc8de1f3d40c275f140d3907f79bbbd49304da2d7008a5ecafb219d0b71d78ee3290ca22020d878041245 - languageName: node - linkType: hard - -"@babel/plugin-transform-async-generator-functions@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-remap-async-to-generator": "npm:^7.25.0" - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - "@babel/traverse": "npm:^7.25.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/5348c3a33d16e0d62f13482c6fa432185ba096d58880b08d42450f7db662d6b03e6149d495c8620897dcd3da35061068cbd6c09da7d0ec95743e55a788809e4e - languageName: node - linkType: hard - -"@babel/plugin-transform-async-to-generator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.7" - dependencies: - "@babel/helper-module-imports": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-remap-async-to-generator": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/83c82e243898875af8457972a26ab29baf8a2078768ee9f35141eb3edff0f84b165582a2ff73e90a9e08f5922bf813dbf15a85c1213654385198f4591c0dc45d - languageName: node - linkType: hard - -"@babel/plugin-transform-block-scoped-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/113e86de4612ae91773ff5cb6b980f01e1da7e26ae6f6012127415d7ae144e74987bc23feb97f63ba4bc699331490ddea36eac004d76a20d5369e4cc6a7f61cd - languageName: node - linkType: hard - -"@babel/plugin-transform-block-scoping@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-block-scoping@npm:7.25.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/382931c75a5d0ea560387e76cb57b03461300527e4784efcb2fb62f36c1eb0ab331327b6034def256baa0cad9050925a61f9c0d56261b6afd6a29c3065fb0bd4 - languageName: node - linkType: hard - -"@babel/plugin-transform-class-properties@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-class-properties@npm:7.24.7" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/75018a466c7ede3d2397e158891c224ba7fca72864506ce067ddbc02fc65191d44da4d6379c996d0c7f09019e26b5c3f5f1d3a639cd98366519723886f0689d0 - languageName: node - linkType: hard - -"@babel/plugin-transform-class-static-block@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-class-static-block@npm:7.24.7" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.12.0 - checksum: 10c0/b0ade39a3d09dce886f79dbd5907c3d99b48167eddb6b9bbde24a0598129654d7017e611c20494cdbea48b07ac14397cd97ea34e3754bbb2abae4e698128eccb - languageName: node - linkType: hard - -"@babel/plugin-transform-classes@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-classes@npm:7.25.0" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-compilation-targets": "npm:^7.24.8" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-replace-supers": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.0" - globals: "npm:^11.1.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/4451dccf8a7979427ae042afe381233f30764a8072faf0de1337a4fc297c6d7cb40df9e28931ac096e5b56392d0cd97d3ce10aee68288150a8701624d362a791 - languageName: node - linkType: hard - -"@babel/plugin-transform-computed-properties@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-computed-properties@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/template": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/25636dbc1f605c0b8bc60aa58628a916b689473d11551c9864a855142e36742fe62d4a70400ba3b74902338e77fb3d940376c0a0ba154b6b7ec5367175233b49 - languageName: node - linkType: hard - -"@babel/plugin-transform-destructuring@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-destructuring@npm:7.24.8" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/804968c1d5f5072c717505296c1e5d5ec33e90550423de66de82bbcb78157156e8470bbe77a04ab8c710a88a06360a30103cf223ac7eff4829adedd6150de5ce - languageName: node - linkType: hard - -"@babel/plugin-transform-dotall-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.7" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/793f14c9494972d294b7e7b97b747f47874b6d57d7804d3443c701becf5db192c9311be6a1835c07664486df1f5c60d33196c36fb7e11a53015e476b4c145b33 - languageName: node - linkType: hard - -"@babel/plugin-transform-duplicate-keys@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/75ff7ec1117ac500e77bf20a144411d39c0fdd038f108eec061724123ce6d1bb8d5bd27968e466573ee70014f8be0043361cdb0ef388f8a182d1d97ad67e51b9 - languageName: node - linkType: hard - -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.0" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.0" - "@babel/helper-plugin-utils": "npm:^7.24.8" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/1c9b57ddd9b33696e88911d0e7975e1573ebc46219c4b30eb1dc746cbb71aedfac6f6dab7fdfdec54dd58f31468bf6ab56b157661ea4ffe58f906d71f89544c8 - languageName: node - linkType: hard - -"@babel/plugin-transform-dynamic-import@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/eeda48372efd0a5103cb22dadb13563c975bce18ae85daafbb47d57bb9665d187da9d4fe8d07ac0a6e1288afcfcb73e4e5618bf75ff63fddf9736bfbf225203b - languageName: node - linkType: hard - -"@babel/plugin-transform-exponentiation-operator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.7" - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/ace3e11c94041b88848552ba8feb39ae4d6cad3696d439ff51445bd2882d8b8775d85a26c2c0edb9b5e38c9e6013cc11b0dea89ec8f93c7d9d7ee95e3645078c - languageName: node - linkType: hard - -"@babel/plugin-transform-export-namespace-from@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/4e144d7f1c57bc63b4899dbbbdfed0880f2daa75ea9c7251c7997f106e4b390dc362175ab7830f11358cb21f6b972ca10a43a2e56cd789065f7606b082674c0c - languageName: node - linkType: hard - -"@babel/plugin-transform-for-of@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-for-of@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/77629b1173e55d07416f05ba7353caa09d2c2149da2ca26721ab812209b63689d1be45116b68eadc011c49ced59daf5320835b15245eb7ae93ae0c5e8277cfc0 - languageName: node - linkType: hard - -"@babel/plugin-transform-function-name@npm:^7.25.1": - version: 7.25.1 - resolution: "@babel/plugin-transform-function-name@npm:7.25.1" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.24.8" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/traverse": "npm:^7.25.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/e74912174d5e33d1418b840443c2e226a7b76cc017c1ed20ee30a566e4f1794d4a123be03180da046241576e8b692731807ba1f52608922acf1cb2cb6957593f - languageName: node - linkType: hard - -"@babel/plugin-transform-json-strings@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-json-strings@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/17c72cd5bf3e90e722aabd333559275f3309e3fa0b9cea8c2944ab83ae01502c71a2be05da5101edc02b3fc8df15a8dbb9b861cbfcc8a52bf5e797cf01d3a40a - languageName: node - linkType: hard - -"@babel/plugin-transform-literals@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/plugin-transform-literals@npm:7.25.2" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/0796883217b0885d37e7f6d350773be349e469a812b6bf11ccf862a6edf65103d3e7c849529d65381b441685c12e756751d8c2489a0fd3f8139bb5ef93185f58 - languageName: node - linkType: hard - -"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/dbe882eb9053931f2ab332c50fc7c2a10ef507d6421bd9831adbb4cb7c9f8e1e5fbac4fbd2e007f6a1bf1df1843547559434012f118084dc0bf42cda3b106272 - languageName: node - linkType: hard - -"@babel/plugin-transform-member-expression-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/e789ae359bdf2d20e90bedef18dfdbd965c9ebae1cee398474a0c349590fda7c8b874e1a2ceee62e47e5e6ec1730e76b0f24e502164357571854271fc12cc684 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-amd@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-amd@npm:7.24.7" - dependencies: - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/6df7de7fce34117ca4b2fa07949b12274c03668cbfe21481c4037b6300796d50ae40f4f170527b61b70a67f26db906747797e30dbd0d9809a441b6e220b5728f - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-commonjs@npm:^7.24.7, @babel/plugin-transform-modules-commonjs@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.8" - dependencies: - "@babel/helper-module-transforms": "npm:^7.24.8" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-simple-access": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/f1cf552307ebfced20d3907c1dd8be941b277f0364aa655e2b5fee828c84c54065745183104dae86f1f93ea0406db970a463ef7ceaaed897623748e99640e5a7 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-systemjs@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.0" - dependencies: - "@babel/helper-module-transforms": "npm:^7.25.0" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-validator-identifier": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/fca6198da71237e4bb1274b3b67a0c81d56013c9535361242b6bfa87d70a9597854aadb45d4d8203369be4a655e158be2a5d20af0040b1f8d1bfc47db3ad7b68 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-umd@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-umd@npm:7.24.7" - dependencies: - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/7791d290121db210e4338b94b4a069a1a79e4c7a8d7638d8159a97b281851bbed3048dac87a4ae718ad963005e6c14a5d28e6db2eeb2b04e031cee92fb312f85 - languageName: node - linkType: hard - -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.7" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/41a0b0f2d0886318237440aa3b489f6d0305361d8671121777d9ff89f9f6de9d0c02ce93625049061426c8994064ef64deae8b819d1b14c00374a6a2336fb5d9 - languageName: node - linkType: hard - -"@babel/plugin-transform-new-target@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-new-target@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/2540808a35e1a978e537334c43dab439cf24c93e7beb213a2e71902f6710e60e0184316643790c0a6644e7a8021e52f7ab8165e6b3e2d6651be07bdf517b67df - languageName: node - linkType: hard - -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/7243c8ff734ed5ef759dd8768773c4b443c12e792727e759a1aec2c7fa2bfdd24f1ecb42e292a7b3d8bd3d7f7b861cf256a8eb4ba144fc9cc463892c303083d9 - languageName: node - linkType: hard - -"@babel/plugin-transform-numeric-separator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/e18e09ca5a6342645d00ede477731aa6e8714ff357efc9d7cda5934f1703b3b6fb7d3298dce3ce3ba53e9ff1158eab8f1aadc68874cc21a6099d33a1ca457789 - languageName: node - linkType: hard - -"@babel/plugin-transform-object-rest-spread@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.7" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/9ad64bc003f583030f9da50614b485852f8edac93f8faf5d1cd855201a4852f37c5255ae4daf70dd4375bdd4874e16e39b91f680d4668ec219ba05441ce286eb - languageName: node - linkType: hard - -"@babel/plugin-transform-object-super@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-object-super@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-replace-supers": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/770cebb4b4e1872c216b17069db9a13b87dfee747d359dc56d9fcdd66e7544f92dc6ab1861a4e7e0528196aaff2444e4f17dc84efd8eaf162d542b4ba0943869 - languageName: node - linkType: hard - -"@babel/plugin-transform-optional-catch-binding@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/1e2f10a018f7d03b3bde6c0b70d063df8d5dd5209861d4467726cf834f5e3d354e2276079dc226aa8e6ece35f5c9b264d64b8229a8bb232829c01e561bcfb07a - languageName: node - linkType: hard - -"@babel/plugin-transform-optional-chaining@npm:^7.24.7, @babel/plugin-transform-optional-chaining@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.8" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/4ffbe1aad7dec7c9aa2bf6ceb4b2f91f96815b2784f2879bde80e46934f59d64a12cb2c6262e40897c4754d77d2c35d8a5cfed63044fdebf94978b1ed3d14b17 - languageName: node - linkType: hard - -"@babel/plugin-transform-parameters@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-parameters@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/53bf190d6926771545d5184f1f5f3f5144d0f04f170799ad46a43f683a01fab8d5fe4d2196cf246774530990c31fe1f2b9f0def39f0a5ddbb2340b924f5edf01 - languageName: node - linkType: hard - -"@babel/plugin-transform-private-methods@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-private-methods@npm:7.24.7" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/5b7bf923b738fbe3ad6c33b260e0a7451be288edfe4ef516303fa787a1870cd87533bfbf61abb779c22ed003c2fc484dec2436fe75a48756f686c0241173d364 - languageName: node - linkType: hard - -"@babel/plugin-transform-private-property-in-object@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.7" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/c6fa7defb90b1b0ed46f24ff94ff2e77f44c1f478d1090e81712f33cf992dda5ba347016f030082a2f770138bac6f4a9c2c1565e9f767a125901c77dd9c239ba - languageName: node - linkType: hard - -"@babel/plugin-transform-property-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-property-literals@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/52564b58f3d111dc02d241d5892a4b01512e98dfdf6ef11b0ed62f8b11b0acacccef0fc229b44114fe8d1a57a8b70780b11bdd18b807d3754a781a07d8f57433 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-constant-elements@npm:^7.21.3": - version: 7.25.1 - resolution: "@babel/plugin-transform-react-constant-elements@npm:7.25.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/8e9a61e8d74804ad3e4c8051463b2d8c42be5aa1f381f7b0db3ac8696a5cb5faead54036b1e4bcd53f6ab74c0bb3e45e4d9a1a2f50b9a575a8d7965b77d89c28 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-display-name@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-react-display-name@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/c14a07a9e75723c96f1a0a306b8a8e899ff1c6a0cc3d62bcda79bb1b54e4319127b258651c513a1a47da152cdc22e16525525a30ae5933a2980c7036fd0b4d24 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx-development@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-react-jsx-development@npm:7.24.7" - dependencies: - "@babel/plugin-transform-react-jsx": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/fce647db50f90a5291681f0f97865d9dc76981262dff71d6d0332e724b85343de5860c26f9e9a79e448d61e1d70916b07ce91e8c7f2b80dceb4b16aee41794d8 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx@npm:^7.24.7": - version: 7.25.2 - resolution: "@babel/plugin-transform-react-jsx@npm:7.25.2" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-module-imports": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/plugin-syntax-jsx": "npm:^7.24.7" - "@babel/types": "npm:^7.25.2" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/8c5b515f38118471197605e02bea54a8a4283010e3c55bad8cfb78de59ad63612b14d40baca63689afdc9d57b147aac4c7794fe5f7736c9e1ed6dd38784be624 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-pure-annotations@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.7" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/fae517d293d9c93b7b920458c3e4b91cb0400513889af41ba184a5f3acc8bfef27242cc262741bb8f87870df376f1733a0d0f52b966d342e2aaaf5607af8f73d - languageName: node - linkType: hard - -"@babel/plugin-transform-regenerator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-regenerator@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - regenerator-transform: "npm:^0.15.2" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/d2dc2c788fdae9d97217e70d46ba8ca9db0035c398dc3e161552b0c437113719a75c04f201f9c91ddc8d28a1da60d0b0853f616dead98a396abb9c845c44892b - languageName: node - linkType: hard - -"@babel/plugin-transform-reserved-words@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-reserved-words@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/2229de2768615e7f5dc0bbc55bc121b5678fd6d2febd46c74a58e42bb894d74cd5955c805880f4e02d0e1cf94f6886270eda7fafc1be9305a1ec3b9fd1d063f5 - languageName: node - linkType: hard - -"@babel/plugin-transform-runtime@npm:^7.22.9": - version: 7.24.7 - resolution: "@babel/plugin-transform-runtime@npm:7.24.7" - dependencies: - "@babel/helper-module-imports": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.10.1" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/a33f5095872bbba00b8ee553dfe6941477e69a017a2e65e9dd86e80dab5c627635093b796eb1eb22aaaf2f874704f63ad1d99b952b83b59ef6b368ae04e5bb41 - languageName: node - linkType: hard - -"@babel/plugin-transform-shorthand-properties@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/41b155bdbb3be66618358488bf7731b3b2e8fff2de3dbfd541847720a9debfcec14db06a117abedd03c9cd786db20a79e2a86509a4f19513f6e1b610520905cf - languageName: node - linkType: hard - -"@babel/plugin-transform-spread@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-spread@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/facba1553035f76b0d2930d4ada89a8cd0f45b79579afd35baefbfaf12e3b86096995f4b0c402cf9ee23b3f2ea0a4460c3b1ec0c192d340962c948bb223d4e66 - languageName: node - linkType: hard - -"@babel/plugin-transform-sticky-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/5a74ed2ed0a3ab51c3d15fcaf09d9e2fe915823535c7a4d7b019813177d559b69677090e189ec3d5d08b619483eb5ad371fbcfbbff5ace2a76ba33ee566a1109 - languageName: node - linkType: hard - -"@babel/plugin-transform-template-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-template-literals@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/3630f966257bcace122f04d3157416a09d40768c44c3a800855da81146b009187daa21859d1c3b7d13f4e19e8888e60613964b175b2275d451200fb6d8d6cfe6 - languageName: node - linkType: hard - -"@babel/plugin-transform-typeof-symbol@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.8" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/2f570a4fbbdc5fd85f48165a97452826560051e3b8efb48c3bb0a0a33ee8485633439e7b71bfe3ef705583a1df43f854f49125bd759abdedc195b2cf7e60012a - languageName: node - linkType: hard - -"@babel/plugin-transform-typescript@npm:^7.24.7": - version: 7.25.2 - resolution: "@babel/plugin-transform-typescript@npm:7.25.2" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-create-class-features-plugin": "npm:^7.25.0" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - "@babel/plugin-syntax-typescript": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/b3c941da39ee7ecf72df1b78a01d4108160438245f2ab61befe182f51d17fd0034733c6d079b7efad81e03a66438aa3881a671cd68c5eb0fc775df86b88df996 - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-escapes@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/8b18e2e66af33471a6971289492beff5c240e56727331db1d34c4338a6a368a82a7ed6d57ec911001b6d65643aed76531e1e7cac93265fb3fb2717f54d845e69 - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-property-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.7" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/bc57656eb94584d1b74a385d378818ac2b3fca642e3f649fead8da5fb3f9de22f8461185936915dfb33d5a9104e62e7a47828331248b09d28bb2d59e9276de3e - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.7" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/83f72a345b751566b601dc4d07e9f2c8f1bc0e0c6f7abb56ceb3095b3c9d304de73f85f2f477a09f8cc7edd5e65afd0ff9e376cdbcbea33bc0c28f3705b38fd9 - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.7" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/7457c0ee8e80a80cb6fdc1fe54ab115b52815627616ce9151be8ef292fc99d04a910ec24f11382b4f124b89374264396892b086886bd2a9c2317904d87c9b21b - languageName: node - linkType: hard - -"@babel/preset-env@npm:^7.20.2, @babel/preset-env@npm:^7.22.9, @babel/preset-env@npm:^7.25.3": - version: 7.25.3 - resolution: "@babel/preset-env@npm:7.25.3" - dependencies: - "@babel/compat-data": "npm:^7.25.2" - "@babel/helper-compilation-targets": "npm:^7.25.2" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-validator-option": "npm:^7.24.8" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.3" - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.0" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.0" - "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - "@babel/plugin-syntax-class-properties": "npm:^7.12.13" - "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.24.7" - "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" - "@babel/plugin-syntax-import-meta": "npm:^7.10.4" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" - "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.24.7" - "@babel/plugin-transform-async-generator-functions": "npm:^7.25.0" - "@babel/plugin-transform-async-to-generator": "npm:^7.24.7" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.7" - "@babel/plugin-transform-block-scoping": "npm:^7.25.0" - "@babel/plugin-transform-class-properties": "npm:^7.24.7" - "@babel/plugin-transform-class-static-block": "npm:^7.24.7" - "@babel/plugin-transform-classes": "npm:^7.25.0" - "@babel/plugin-transform-computed-properties": "npm:^7.24.7" - "@babel/plugin-transform-destructuring": "npm:^7.24.8" - "@babel/plugin-transform-dotall-regex": "npm:^7.24.7" - "@babel/plugin-transform-duplicate-keys": "npm:^7.24.7" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.0" - "@babel/plugin-transform-dynamic-import": "npm:^7.24.7" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.7" - "@babel/plugin-transform-export-namespace-from": "npm:^7.24.7" - "@babel/plugin-transform-for-of": "npm:^7.24.7" - "@babel/plugin-transform-function-name": "npm:^7.25.1" - "@babel/plugin-transform-json-strings": "npm:^7.24.7" - "@babel/plugin-transform-literals": "npm:^7.25.2" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" - "@babel/plugin-transform-member-expression-literals": "npm:^7.24.7" - "@babel/plugin-transform-modules-amd": "npm:^7.24.7" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" - "@babel/plugin-transform-modules-systemjs": "npm:^7.25.0" - "@babel/plugin-transform-modules-umd": "npm:^7.24.7" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" - "@babel/plugin-transform-new-target": "npm:^7.24.7" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.7" - "@babel/plugin-transform-numeric-separator": "npm:^7.24.7" - "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" - "@babel/plugin-transform-object-super": "npm:^7.24.7" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.8" - "@babel/plugin-transform-parameters": "npm:^7.24.7" - "@babel/plugin-transform-private-methods": "npm:^7.24.7" - "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" - "@babel/plugin-transform-property-literals": "npm:^7.24.7" - "@babel/plugin-transform-regenerator": "npm:^7.24.7" - "@babel/plugin-transform-reserved-words": "npm:^7.24.7" - "@babel/plugin-transform-shorthand-properties": "npm:^7.24.7" - "@babel/plugin-transform-spread": "npm:^7.24.7" - "@babel/plugin-transform-sticky-regex": "npm:^7.24.7" - "@babel/plugin-transform-template-literals": "npm:^7.24.7" - "@babel/plugin-transform-typeof-symbol": "npm:^7.24.8" - "@babel/plugin-transform-unicode-escapes": "npm:^7.24.7" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.7" - "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.7" - "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.10.4" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" - core-js-compat: "npm:^3.37.1" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/9287dc2e296fe2aa3367d84c2a799db17c9d1e48bba86525f47c6f51f5ba2e2cce454f45f4ae2ef928f9077c0640b04556b55b94835675ceeca94a0c5133205e - languageName: node - linkType: hard - -"@babel/preset-modules@npm:0.1.6-no-external-plugins": - version: 0.1.6-no-external-plugins - resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.0.0" - "@babel/types": "npm:^7.4.4" - esutils: "npm:^2.0.2" - peerDependencies: - "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/9d02f70d7052446c5f3a4fb39e6b632695fb6801e46d31d7f7c5001f7c18d31d1ea8369212331ca7ad4e7877b73231f470b0d559162624128f1b80fe591409e6 - languageName: node - linkType: hard - -"@babel/preset-react@npm:^7.18.6, @babel/preset-react@npm:^7.22.5": - version: 7.24.7 - resolution: "@babel/preset-react@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-validator-option": "npm:^7.24.7" - "@babel/plugin-transform-react-display-name": "npm:^7.24.7" - "@babel/plugin-transform-react-jsx": "npm:^7.24.7" - "@babel/plugin-transform-react-jsx-development": "npm:^7.24.7" - "@babel/plugin-transform-react-pure-annotations": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/9658b685b25cedaadd0b65c4e663fbc7f57394b5036ddb4c99b1a75b0711fb83292c1c625d605c05b73413fc7a6dc20e532627f6a39b6dc8d4e00415479b054c - languageName: node - linkType: hard - -"@babel/preset-typescript@npm:^7.21.0, @babel/preset-typescript@npm:^7.22.5, @babel/preset-typescript@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/preset-typescript@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-validator-option": "npm:^7.24.7" - "@babel/plugin-syntax-jsx": "npm:^7.24.7" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.7" - "@babel/plugin-transform-typescript": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/986bc0978eedb4da33aba8e1e13a3426dd1829515313b7e8f4ba5d8c18aff1663b468939d471814e7acf4045d326ae6cff37239878d169ac3fe53a8fde71f8ee - languageName: node - linkType: hard - -"@babel/regjsgen@npm:^0.8.0": - version: 0.8.0 - resolution: "@babel/regjsgen@npm:0.8.0" - checksum: 10c0/4f3ddd8c7c96d447e05c8304c1d5ba3a83fcabd8a716bc1091c2f31595cdd43a3a055fff7cb5d3042b8cb7d402d78820fcb4e05d896c605a7d8bcf30f2424c4a - languageName: node - linkType: hard - -"@babel/runtime-corejs3@npm:^7.22.6": - version: 7.25.0 - resolution: "@babel/runtime-corejs3@npm:7.25.0" - dependencies: - core-js-pure: "npm:^3.30.2" - regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/7c9e7896749b5968bc6a7638cf1735e5d2dc791780f4f46daf15a45777780cd0485d1357e92f54b03f815269064dc84d771e83486d49e18b847ffa8cfb6a6afa - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.8.4": - version: 7.25.0 - resolution: "@babel/runtime@npm:7.25.0" - dependencies: - regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/bd3faf246170826cef2071a94d7b47b49d532351360ecd17722d03f6713fd93a3eb3dbd9518faa778d5e8ccad7392a7a604e56bd37aaad3f3aa68d619ccd983d - languageName: node - linkType: hard - -"@babel/standalone@npm:^7.23.8": - version: 7.25.3 - resolution: "@babel/standalone@npm:7.25.3" - checksum: 10c0/01844e05abce4dda485d75a898de5abb5cc03fabc46b67854e96b303e713b04f92f36219782939bfa9f175c82b4718701c3ca0751810b95379acebc93e5af35a - languageName: node - linkType: hard - -"@babel/template@npm:^7.24.7, @babel/template@npm:^7.25.0, @babel/template@npm:^7.3.3": - version: 7.25.0 - resolution: "@babel/template@npm:7.25.0" - dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/parser": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10c0/4e31afd873215744c016e02b04f43b9fa23205d6d0766fb2e93eb4091c60c1b88897936adb895fb04e3c23de98dfdcbe31bc98daaa1a4e0133f78bb948e1209b - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.22.8, @babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3": - version: 7.25.3 - resolution: "@babel/traverse@npm:7.25.3" - dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.3" - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.2" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/4c8a1966fa90b53a783a4afd2fcdaa6ab1a912e6621dca9fcc6633e80ccb9491620e88caf73b537da4e16cefd537b548c87d7087868d5b0066414dea375c0e9b - languageName: node - linkType: hard - -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.23.6, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": - version: 7.25.2 - resolution: "@babel/types@npm:7.25.2" - dependencies: - "@babel/helper-string-parser": "npm:^7.24.8" - "@babel/helper-validator-identifier": "npm:^7.24.7" - to-fast-properties: "npm:^2.0.0" - checksum: 10c0/e489435856be239f8cc1120c90a197e4c2865385121908e5edb7223cfdff3768cba18f489adfe0c26955d9e7bbb1fb10625bc2517505908ceb0af848989bd864 - languageName: node - linkType: hard - -"@bcoe/v8-coverage@npm:^0.2.3": - version: 0.2.3 - resolution: "@bcoe/v8-coverage@npm:0.2.3" - checksum: 10c0/6b80ae4cb3db53f486da2dc63b6e190a74c8c3cca16bb2733f234a0b6a9382b09b146488ae08e2b22cf00f6c83e20f3e040a2f7894f05c045c946d6a090b1d52 - languageName: node - linkType: hard - -"@colors/colors@npm:1.5.0": - version: 1.5.0 - resolution: "@colors/colors@npm:1.5.0" - checksum: 10c0/eb42729851adca56d19a08e48d5a1e95efd2a32c55ae0323de8119052be0510d4b7a1611f2abcbf28c044a6c11e6b7d38f99fccdad7429300c37a8ea5fb95b44 - languageName: node - linkType: hard - -"@commander-js/extra-typings@npm:^12.1.0": - version: 12.1.0 - resolution: "@commander-js/extra-typings@npm:12.1.0" - peerDependencies: - commander: ~12.1.0 - checksum: 10c0/5d29eaa724b577e2a52a393ad54992924d2559931b8e493ab892477b7a4e878e475c6bf771260f8585d835f7d8e17ae4a2656c191e9595d210ae0b48291c0b3d - languageName: node - linkType: hard - -"@cspell/cspell-bundled-dicts@npm:8.14.1": - version: 8.14.1 - resolution: "@cspell/cspell-bundled-dicts@npm:8.14.1" - dependencies: - "@cspell/dict-ada": "npm:^4.0.2" - "@cspell/dict-aws": "npm:^4.0.3" - "@cspell/dict-bash": "npm:^4.1.3" - "@cspell/dict-companies": "npm:^3.1.4" - "@cspell/dict-cpp": "npm:^5.1.12" - "@cspell/dict-cryptocurrencies": "npm:^5.0.0" - "@cspell/dict-csharp": "npm:^4.0.2" - "@cspell/dict-css": "npm:^4.0.13" - "@cspell/dict-dart": "npm:^2.0.3" - "@cspell/dict-django": "npm:^4.1.0" - "@cspell/dict-docker": "npm:^1.1.7" - "@cspell/dict-dotnet": "npm:^5.0.2" - "@cspell/dict-elixir": "npm:^4.0.3" - "@cspell/dict-en-common-misspellings": "npm:^2.0.4" - "@cspell/dict-en-gb": "npm:1.1.33" - "@cspell/dict-en_us": "npm:^4.3.23" - "@cspell/dict-filetypes": "npm:^3.0.4" - "@cspell/dict-fonts": "npm:^4.0.0" - "@cspell/dict-fsharp": "npm:^1.0.1" - "@cspell/dict-fullstack": "npm:^3.2.0" - "@cspell/dict-gaming-terms": "npm:^1.0.5" - "@cspell/dict-git": "npm:^3.0.0" - "@cspell/dict-golang": "npm:^6.0.9" - "@cspell/dict-google": "npm:^1.0.1" - "@cspell/dict-haskell": "npm:^4.0.1" - "@cspell/dict-html": "npm:^4.0.5" - "@cspell/dict-html-symbol-entities": "npm:^4.0.0" - "@cspell/dict-java": "npm:^5.0.7" - "@cspell/dict-julia": "npm:^1.0.1" - "@cspell/dict-k8s": "npm:^1.0.6" - "@cspell/dict-latex": "npm:^4.0.0" - "@cspell/dict-lorem-ipsum": "npm:^4.0.0" - "@cspell/dict-lua": "npm:^4.0.3" - "@cspell/dict-makefile": "npm:^1.0.0" - "@cspell/dict-monkeyc": "npm:^1.0.6" - "@cspell/dict-node": "npm:^5.0.1" - "@cspell/dict-npm": "npm:^5.0.18" - "@cspell/dict-php": "npm:^4.0.8" - "@cspell/dict-powershell": "npm:^5.0.5" - "@cspell/dict-public-licenses": "npm:^2.0.7" - "@cspell/dict-python": "npm:^4.2.4" - "@cspell/dict-r": "npm:^2.0.1" - "@cspell/dict-ruby": "npm:^5.0.2" - "@cspell/dict-rust": "npm:^4.0.5" - "@cspell/dict-scala": "npm:^5.0.3" - "@cspell/dict-software-terms": "npm:^4.0.6" - "@cspell/dict-sql": "npm:^2.1.5" - "@cspell/dict-svelte": "npm:^1.0.2" - "@cspell/dict-swift": "npm:^2.0.1" - "@cspell/dict-terraform": "npm:^1.0.0" - "@cspell/dict-typescript": "npm:^3.1.6" - "@cspell/dict-vue": "npm:^3.0.0" - checksum: 10c0/2c60cc8d2009174a0842f65e94b5d91d9adccd2076a8c451cb844372aaa11a990eb3b3958969d340411aef84be3e053c5347a3b2272fdbd646f83c92e24578c1 - languageName: node - linkType: hard - -"@cspell/cspell-json-reporter@npm:8.14.1": - version: 8.14.1 - resolution: "@cspell/cspell-json-reporter@npm:8.14.1" - dependencies: - "@cspell/cspell-types": "npm:8.14.1" - checksum: 10c0/c89aa8888555d3ec3745f68cf5d28b7f943903b376b584f61225e73d8044e5651bcafef60641813c9a1d682156b22db06c1b59a97cad151436e931566ba0ff32 - languageName: node - linkType: hard - -"@cspell/cspell-pipe@npm:8.14.1": - version: 8.14.1 - resolution: "@cspell/cspell-pipe@npm:8.14.1" - checksum: 10c0/18aeb9563c87a884c373125dda376689bfc4d13b2d0763ed257216a77621caae06a472123f1629c32b79814e94639dfc10e7771270257fdd3ca45c932050a5a2 - languageName: node - linkType: hard - -"@cspell/cspell-resolver@npm:8.14.1": - version: 8.14.1 - resolution: "@cspell/cspell-resolver@npm:8.14.1" - dependencies: - global-directory: "npm:^4.0.1" - checksum: 10c0/eac59f9881b259e9145d24ef1598399b4e78ff49b99c0e6dea6464ab46bcda177a59eaadd9b1e726cb8bb2bb6fb59c2e2dff6a4a6e3ba15670ad3822802d3a12 - languageName: node - linkType: hard - -"@cspell/cspell-service-bus@npm:8.14.1": - version: 8.14.1 - resolution: "@cspell/cspell-service-bus@npm:8.14.1" - checksum: 10c0/40a420edfecbaaf01f8cb3ea319ba6d2d07c04a913c20f44b6b80ec187a201c08b51c33d19dc9454399c5e4707ffe28f3b7a8d8e3b00e0b08f7c8083ea304763 - languageName: node - linkType: hard - -"@cspell/cspell-types@npm:8.14.1": - version: 8.14.1 - resolution: "@cspell/cspell-types@npm:8.14.1" - checksum: 10c0/aaf334edf14e346917eb41c5534eea748a32fd32431b4b2ea3e29fa7f085b2901a36a52d8d5c5ffa6b184c19444728e6b87f888583b80bcf1c7f87409523f031 - languageName: node - linkType: hard - -"@cspell/dict-ada@npm:^4.0.2": - version: 4.0.2 - resolution: "@cspell/dict-ada@npm:4.0.2" - checksum: 10c0/ef2e34ddfc635a398522a04b0193e2130051a644dffa52f31faa59e864f88d1624b50b53115ed16cc4508f36b43ba8819f504635f437f34ee7d451d3bb441a71 - languageName: node - linkType: hard - -"@cspell/dict-aws@npm:^4.0.3": - version: 4.0.3 - resolution: "@cspell/dict-aws@npm:4.0.3" - checksum: 10c0/ace49e0734ddbe6d28c0db604677e697ef3ca13c953a6f8f7ff166f95dca222fcc50f7b0a4287f7705d2e48fb49549e880ada1de86e725aa25d98ddf39cc3774 - languageName: node - linkType: hard - -"@cspell/dict-bash@npm:^4.1.3": - version: 4.1.3 - resolution: "@cspell/dict-bash@npm:4.1.3" - checksum: 10c0/b91920a38d7db74cdf1da7677ddfa1853643175dacba90b65a9d58343cacb0280f86a3927288c673c9ccc0587b200bc8447b210fdd89e8ea2f66956207d55024 - languageName: node - linkType: hard - -"@cspell/dict-companies@npm:^3.1.4": - version: 3.1.4 - resolution: "@cspell/dict-companies@npm:3.1.4" - checksum: 10c0/ffa5b25a73c6754d9da8ce8238928dad1be71f6269012c2c5752a9bd2d42a0774f028837ae85e647a8ec0b40b0824d1e0bd34809a7395849017b604b0f42076c - languageName: node - linkType: hard - -"@cspell/dict-cpp@npm:^5.1.12": - version: 5.1.12 - resolution: "@cspell/dict-cpp@npm:5.1.12" - checksum: 10c0/e1c43a1808138024868489f29e5aaa4cfec98dea098b074a88715a26a9ed7ed01655d9d0436704c5a36c3753b84f686cecde8aa6293bfd2ed2118490256e63b6 - languageName: node - linkType: hard - -"@cspell/dict-cryptocurrencies@npm:^5.0.0": - version: 5.0.0 - resolution: "@cspell/dict-cryptocurrencies@npm:5.0.0" - checksum: 10c0/d5b124eb5d037103ffa2b282779dda8a01ec6622c5498282e05b58f92ce262dae9ac8995748e47a89578e9d658ffd963aa430e85699618c8428166fbe741370d - languageName: node - linkType: hard - -"@cspell/dict-csharp@npm:^4.0.2": - version: 4.0.2 - resolution: "@cspell/dict-csharp@npm:4.0.2" - checksum: 10c0/146b7edeb8aa1acf6b0ccb283a2a5e0e8f2612e6fc67cca9b26e0fabe954a92042d314860bb5418522d6db265bd5933b6c68004d2b8225ad89498bf795b51f89 - languageName: node - linkType: hard - -"@cspell/dict-css@npm:^4.0.13": - version: 4.0.13 - resolution: "@cspell/dict-css@npm:4.0.13" - checksum: 10c0/6ba283825c3e25ff46503db3e38fc8ee27469463fcd2f85f01e673029e4fe34f097f4991288673569d0ba17c2c08b4c663de14d6b4dc6259fd9934f12131198c - languageName: node - linkType: hard - -"@cspell/dict-dart@npm:^2.0.3": - version: 2.0.3 - resolution: "@cspell/dict-dart@npm:2.0.3" - checksum: 10c0/640b432ced4888c4a6dbdeb2006ed778b59cab7eeb1445e85a66320c1eefe42e905da7c4c89003c42eca97f785380038d603200b8e1f3bea9bc39b81cfadabf7 - languageName: node - linkType: hard - -"@cspell/dict-data-science@npm:^2.0.1": - version: 2.0.1 - resolution: "@cspell/dict-data-science@npm:2.0.1" - checksum: 10c0/527eca5c42e981f49562b92032894f480b8c67612cb269ee23cdf5779a4118958b8fab1941af464d17748d183f3fe747204d22c6b815439caa218a87c031d178 - languageName: node - linkType: hard - -"@cspell/dict-django@npm:^4.1.0": - version: 4.1.0 - resolution: "@cspell/dict-django@npm:4.1.0" - checksum: 10c0/85b7f58d772f169f7471f2c1bcb8a0207cdff7c32677bf470bcbcc74ce6498269623cfcc7910730eeac7f052633f8d4c63574367c1afe5f46a2917748ed397ca - languageName: node - linkType: hard - -"@cspell/dict-docker@npm:^1.1.7": - version: 1.1.7 - resolution: "@cspell/dict-docker@npm:1.1.7" - checksum: 10c0/e34428f3e18d3ebb94854e4034746a8a0ef81354994f09d289254f75b9ce11fee53f64c706e1e598d5131fbe50d536401c4e5b854e44b965e6e193d454fa87b7 - languageName: node - linkType: hard - -"@cspell/dict-dotnet@npm:^5.0.2": - version: 5.0.2 - resolution: "@cspell/dict-dotnet@npm:5.0.2" - checksum: 10c0/c5a1a7cbef0b8d0f917e783ff0e7880d2516be72adaa05664e0f9bfa0cfd622812e23146150b4fff0257784e48db1b9d72126f1a4518ae0c4a8c4a97e803a65a - languageName: node - linkType: hard - -"@cspell/dict-elixir@npm:^4.0.3": - version: 4.0.3 - resolution: "@cspell/dict-elixir@npm:4.0.3" - checksum: 10c0/c24b742b0615f310c89a05ded6648a63ee8e0a9d63326fd155846ce4acba2337a1cef3f58d653b9d8f4b6636d466dfeac2bf7122f374ae39a4d539894ebc5523 - languageName: node - linkType: hard - -"@cspell/dict-en-common-misspellings@npm:^2.0.4": - version: 2.0.4 - resolution: "@cspell/dict-en-common-misspellings@npm:2.0.4" - checksum: 10c0/b26132803f9408c766ff5a5e83a5b42a63921f4771d6dadc46bda9bf27f29f9735b69a1ff8230de735ba191b0788123dcb9dbbe9c40c2b1c029f9cdf8a9345ac - languageName: node - linkType: hard - -"@cspell/dict-en-gb@npm:1.1.33": - version: 1.1.33 - resolution: "@cspell/dict-en-gb@npm:1.1.33" - checksum: 10c0/09563d1016f652dc8164a5f692be49beb78a847a54d5e470d406ae4db125bf8021db75d3db63f7a0c1d1b7a5dfbec4b709fb2ff3520447dcad690adb98d74130 - languageName: node - linkType: hard - -"@cspell/dict-en_us@npm:^4.3.23": - version: 4.3.23 - resolution: "@cspell/dict-en_us@npm:4.3.23" - checksum: 10c0/fc9bda1cb345cebcb25bb40008b87867418c3ec7ab758b1758a333aff724fac978a446106a19cce25e3401d41e5e6520ab1cad1f793c9e4ec24858aea0e37d20 - languageName: node - linkType: hard - -"@cspell/dict-filetypes@npm:^3.0.4": - version: 3.0.4 - resolution: "@cspell/dict-filetypes@npm:3.0.4" - checksum: 10c0/8400748182c641d3308acd827b126380fd4b9b428a1bedc6bed53f7e21ee011e8acc99c5b177b75d1bafe1bf7ae6b1a6bf45406bccdd346ef62d64089ad0285e - languageName: node - linkType: hard - -"@cspell/dict-fonts@npm:^4.0.0": - version: 4.0.0 - resolution: "@cspell/dict-fonts@npm:4.0.0" - checksum: 10c0/d7b62691ebb34cf5538f65e18e4188716a87e3fcd56cabde090040b5c81676bc0004304bda47bc14c58417ac710b4627b3513a5bbeb99be1fae6d9b5f291bd2c - languageName: node - linkType: hard - -"@cspell/dict-fsharp@npm:^1.0.1": - version: 1.0.1 - resolution: "@cspell/dict-fsharp@npm:1.0.1" - checksum: 10c0/bc1a83f35eab65e4704889cbfa4625dbbf07219987c2535f0c469f741f047ee8d14ea2fb65d32b669fd27b63a79a119b65e587d28ec9608e064a6f49d2274ca6 - languageName: node - linkType: hard - -"@cspell/dict-fullstack@npm:^3.2.0": - version: 3.2.0 - resolution: "@cspell/dict-fullstack@npm:3.2.0" - checksum: 10c0/fdf7577808a435a8af2535b81d9cd645693563602d0e0babd1c7206b6fefb2349d51082e4610b6bc162ec93fed10c6a28b016d880af0d60203d68994b07071f4 - languageName: node - linkType: hard - -"@cspell/dict-gaming-terms@npm:^1.0.5": - version: 1.0.5 - resolution: "@cspell/dict-gaming-terms@npm:1.0.5" - checksum: 10c0/2017d228104dcf1642fce087e1e1aae76927d0d05f229bd44d0652acfdf93c17e287079920b885f7d78bd9154434ace674d986e94425b9187e4984d54b410597 - languageName: node - linkType: hard - -"@cspell/dict-git@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-git@npm:3.0.0" - checksum: 10c0/baf9de7896f4da603600c735fe861c8ce3db8f8533ac6f52b0541096090ae8efcdcde33aab19b69e8bd6d72af45d664b1f2cfda6fbb157a81608bc6d0d39ce6d - languageName: node - linkType: hard - -"@cspell/dict-golang@npm:^6.0.9": - version: 6.0.9 - resolution: "@cspell/dict-golang@npm:6.0.9" - checksum: 10c0/31af38194a2ea09a8d352681dda7277d86536211bbe72b9709b098321098909a783642fdd8e44426e9c041e6e4d6312970689899f4bced0a166364e7fe57b875 - languageName: node - linkType: hard - -"@cspell/dict-google@npm:^1.0.1": - version: 1.0.1 - resolution: "@cspell/dict-google@npm:1.0.1" - checksum: 10c0/de4678cb861c0103c821f435098d38b6874a628c08ba154fa0c4a75594abefe61299578eb5cec745623590e539cda6512425144eac336cd375ae1e2449d532e1 - languageName: node - linkType: hard - -"@cspell/dict-haskell@npm:^4.0.1": - version: 4.0.1 - resolution: "@cspell/dict-haskell@npm:4.0.1" - checksum: 10c0/7693a06b74a393aec35b67304ae56dad1ce3509951bec64053d992011e0309e9c420edd13a073ab3e500c0ac53e15dd92472097d689f7602c6d9ad10a2ee0dab - languageName: node - linkType: hard - -"@cspell/dict-html-symbol-entities@npm:^4.0.0": - version: 4.0.0 - resolution: "@cspell/dict-html-symbol-entities@npm:4.0.0" - checksum: 10c0/35d3223f02f0d091ac6a93424d4c31a075ece530bee00853ee1f5827e5ed25d08407a522a3c747cbfbaa891333df3aa9cf6107a21f2a030667f74228655c9081 - languageName: node - linkType: hard - -"@cspell/dict-html@npm:^4.0.5": - version: 4.0.5 - resolution: "@cspell/dict-html@npm:4.0.5" - checksum: 10c0/6e1b9262bba042a951a6020dfd99efb5fb3a29a5ad8bbdc96a1dd197dc1d89384448afd3b6ff7227a48f2439a90bd3b297566b35c94dcc032f8b473ac147c16a - languageName: node - linkType: hard - -"@cspell/dict-java@npm:^5.0.7": - version: 5.0.7 - resolution: "@cspell/dict-java@npm:5.0.7" - checksum: 10c0/ea3ff17db1e618b6ef4c6f6cf34dc9409dd85831f8b3f0ec55da6b238cfae1f8b13ff6de717d355f3668605004047f538e46f1502d7f0fee7100267a5d34db0a - languageName: node - linkType: hard - -"@cspell/dict-julia@npm:^1.0.1": - version: 1.0.1 - resolution: "@cspell/dict-julia@npm:1.0.1" - checksum: 10c0/7c8fbe4f1e6df956f9ad87b05fa6c21f19607951b1eaadda3823e43a533aa52bec54bf2887cb59308167d9bd9bf7252b0fffeb2ac50a1cc0d46bcfb0f561ac10 - languageName: node - linkType: hard - -"@cspell/dict-k8s@npm:^1.0.6": - version: 1.0.6 - resolution: "@cspell/dict-k8s@npm:1.0.6" - checksum: 10c0/d9bb457c03bc65d156915fedccebf7e3f387fab09d1b4b79c368e761b1bf22f4e1b6f35932592427a04cdf76aecf5c2eb3f80639f4e3a6a1d9c77d30aa1a1ddc - languageName: node - linkType: hard - -"@cspell/dict-latex@npm:^4.0.0": - version: 4.0.0 - resolution: "@cspell/dict-latex@npm:4.0.0" - checksum: 10c0/d96392866378e680d2fe29770bb8f38b1abad8c2b5b29e003bdbfe7aee79de1841fe699b6e357629e7b94dbaf882fd33e5e316d066be7fc02f0cea6caa8dcde4 - languageName: node - linkType: hard - -"@cspell/dict-lorem-ipsum@npm:^4.0.0": - version: 4.0.0 - resolution: "@cspell/dict-lorem-ipsum@npm:4.0.0" - checksum: 10c0/9f518643664f4ccc8b3e4126abf78385d9ea4abd1d9fc4d5e89f3a140175c62e2d5f729a97845d912f899e908dd8a9ebbc3a0debd2a41f15cee7a2f15d44b04b - languageName: node - linkType: hard - -"@cspell/dict-lua@npm:^4.0.3": - version: 4.0.3 - resolution: "@cspell/dict-lua@npm:4.0.3" - checksum: 10c0/3c6bf9942f3194071d293c0024e3be1b203cdd953222cc4140e97572f1991697c3cc7b6be0c828788eaefb72e7013c8b41937e9b1c14188f79c38b45786fcca5 - languageName: node - linkType: hard - -"@cspell/dict-makefile@npm:^1.0.0": - version: 1.0.0 - resolution: "@cspell/dict-makefile@npm:1.0.0" - checksum: 10c0/b0618d71cfae52c8cbe023d316195ff7fc80b29504ed983e4994df6109b62ef1e3af00500cf60ad9489b9ca9ca85b33aeb8a56f6dfff4bf8e1ac08b25a38e823 - languageName: node - linkType: hard - -"@cspell/dict-monkeyc@npm:^1.0.6": - version: 1.0.6 - resolution: "@cspell/dict-monkeyc@npm:1.0.6" - checksum: 10c0/8d0889be1fda98825172b34330dfdf0b3da73fb0167cf4018771428e80ec91e205bc655538a9959ed5e7ebcc1f6842916485d037a726a098e725874b19c0ac9e - languageName: node - linkType: hard - -"@cspell/dict-node@npm:^5.0.1": - version: 5.0.1 - resolution: "@cspell/dict-node@npm:5.0.1" - checksum: 10c0/ef1d5fb11a4591dde96cc65425aff8f856a39d922c04b796e7cf4e4f6693a01ca32d24be3258334e9629a57b7213a5bd53d21189b1861e2f21b5113510980374 - languageName: node - linkType: hard - -"@cspell/dict-npm@npm:^5.0.18": - version: 5.0.18 - resolution: "@cspell/dict-npm@npm:5.0.18" - checksum: 10c0/91660ef92a35c7ee0a926a1443cffe3ad8441e6f2753aed3668c6bbc45d387483dfc3d86a239966065b7c80623769b742546f65eab8a4cd3d54d370a2dcdee1b - languageName: node - linkType: hard - -"@cspell/dict-php@npm:^4.0.8": - version: 4.0.8 - resolution: "@cspell/dict-php@npm:4.0.8" - checksum: 10c0/284e761e073ae3f46519ebee6e4202915d3ee108c335340302ff852bf21dc2f75cbaf4928c119120e925159a4fa8dc6f20f9ed27f8a69023bff542429635a6ba - languageName: node - linkType: hard - -"@cspell/dict-powershell@npm:^5.0.5": - version: 5.0.5 - resolution: "@cspell/dict-powershell@npm:5.0.5" - checksum: 10c0/21e71cd3257592e20296f935c78a02538683c66c90c21b2498acb9ba20e4947168161dc1cb1e2eb8a21741e5934586c942ed81bc10b5f5effb621999f0fe15d0 - languageName: node - linkType: hard - -"@cspell/dict-public-licenses@npm:^2.0.7": - version: 2.0.7 - resolution: "@cspell/dict-public-licenses@npm:2.0.7" - checksum: 10c0/fab600fca77e239ca174cb5b7c5fcf52fb3578f9f4d876d5ff0068fc00674ff64bd70fe860284df0250cde1526ae12f3e2503e2715722fd6ec68131276e5a49e - languageName: node - linkType: hard - -"@cspell/dict-python@npm:^4.2.4": - version: 4.2.4 - resolution: "@cspell/dict-python@npm:4.2.4" - dependencies: - "@cspell/dict-data-science": "npm:^2.0.1" - checksum: 10c0/aa5abb0894bc6a9c2f717e73e7ac708c2861a95c5f136c464465e22ec4fb1fe78315a7807fd3b9a4bb85e88d7e241e1bedb585e8386243911041041ce3420d5d - languageName: node - linkType: hard - -"@cspell/dict-r@npm:^2.0.1": - version: 2.0.1 - resolution: "@cspell/dict-r@npm:2.0.1" - checksum: 10c0/c8eead19fed04ff748c8ac75c55c4cf32b0383b0b9d05a23299e7e5d2d6f0c33fe94ff4c73080fdbd5b7e2fcdeaf726373a993122ec35e3a8f2b61f202c4a837 - languageName: node - linkType: hard - -"@cspell/dict-ruby@npm:^5.0.2": - version: 5.0.2 - resolution: "@cspell/dict-ruby@npm:5.0.2" - checksum: 10c0/d966f7cef9065d93671e82605bd30639ff3846b2cc3c89029a6b01898b0cc6575cf88d95e5854f9bc26fe5c02c4cefa7ff35ace4be401607cc4839ed26a116d1 - languageName: node - linkType: hard - -"@cspell/dict-rust@npm:^4.0.5": - version: 4.0.5 - resolution: "@cspell/dict-rust@npm:4.0.5" - checksum: 10c0/caf999200744da013635874efe99c9d4f554f4f1947e62665233607285c2dc34c0379205f1334c57515aec416d9f3545377a457b8cf77f7d428aedaca01a9696 - languageName: node - linkType: hard - -"@cspell/dict-scala@npm:^5.0.3": - version: 5.0.3 - resolution: "@cspell/dict-scala@npm:5.0.3" - checksum: 10c0/3928e07384fea92fe17ac9a1758be6ebee48558eebad54410518e5d532662166a570114709db83deeaf7f6d62b8c5324d0b34f0717bdf8ec23e9d94268e3660e - languageName: node - linkType: hard - -"@cspell/dict-software-terms@npm:^4.0.6": - version: 4.0.6 - resolution: "@cspell/dict-software-terms@npm:4.0.6" - checksum: 10c0/8e02e024f1304eae4d247e01370f4ef469660d131eba92a9c0bace1046ef4f0ddaa558f8df2622774a860ddf01d1ec523d7ade857aed50de2fac4163542ec406 - languageName: node - linkType: hard - -"@cspell/dict-sql@npm:^2.1.5": - version: 2.1.5 - resolution: "@cspell/dict-sql@npm:2.1.5" - checksum: 10c0/0104aa958b2f3e70c73832baf8ec12adbdeac23379745488dd9866a00dd78cc5197c7eb16b51cd1e58f14cb48dace9d39f4ec9c6783b722aebf5f4ec7e3e4ead - languageName: node - linkType: hard - -"@cspell/dict-svelte@npm:^1.0.2": - version: 1.0.2 - resolution: "@cspell/dict-svelte@npm:1.0.2" - checksum: 10c0/bd650fd25d2ea83808a69eb2a6cb7a5b82295c3dde1c334fc54ff439287c5bf13e3293397e2c45e8b2d1b69fd133e17f4eb920b64df2571c5a399ac1e206f551 - languageName: node - linkType: hard - -"@cspell/dict-swift@npm:^2.0.1": - version: 2.0.1 - resolution: "@cspell/dict-swift@npm:2.0.1" - checksum: 10c0/e29ffc8379d50ef9397018c25b1be05177d4ecb1e18d3b97834f9edf0306af349b5593d7d93a7f2624616c1beeb35eb1e56560d351f459b776c3dd6b2c0ac601 - languageName: node - linkType: hard - -"@cspell/dict-terraform@npm:^1.0.0": - version: 1.0.0 - resolution: "@cspell/dict-terraform@npm:1.0.0" - checksum: 10c0/ea6905b0ac588ec0dc5482dc85cd174e76ca7027a95da4ed7c9478608ab74848b0805e20df225761dc60ffa2c739696ddfe1bb194fc4204ccbdd81ac85e22fb5 - languageName: node - linkType: hard - -"@cspell/dict-typescript@npm:^3.1.6": - version: 3.1.6 - resolution: "@cspell/dict-typescript@npm:3.1.6" - checksum: 10c0/ed2c7e959e6fff9705cd28ab2ba0d26263107135772a195568c74f0269b9b35491d653162ba7e898f2096f1d6ac7978fc1b6ed0cb8f40757ba6ea148ae059bfe - languageName: node - linkType: hard - -"@cspell/dict-vue@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-vue@npm:3.0.0" - checksum: 10c0/2995b912e26cf88cb6ec9728a9adc5b24a0243c001887d425b14a61ef2be22aca38fa99a84d7698d8982aef65c8db4abf583c3d916c2166b9e8d99cec80800cd - languageName: node - linkType: hard - -"@cspell/dynamic-import@npm:8.14.1": - version: 8.14.1 - resolution: "@cspell/dynamic-import@npm:8.14.1" - dependencies: - import-meta-resolve: "npm:^4.1.0" - checksum: 10c0/bd130d2162030eeb3db3adf6026bca39583d8044ad2ec99071ba2c03e1a851973941b1266e2194db2214e3b32dfe7211a500a479ff5e28504503d7e584e1faa7 - languageName: node - linkType: hard - -"@cspell/filetypes@npm:8.14.1": - version: 8.14.1 - resolution: "@cspell/filetypes@npm:8.14.1" - checksum: 10c0/7d370d892e02d7f3f2b77a1c564088b459a1837dbe034d4f6f779f433c03c4629f058d8846f4d6398b5b20f7227eb4283f12018302c8a60fc6f79c8f94cf36ee - languageName: node - linkType: hard - -"@cspell/strong-weak-map@npm:8.14.1": - version: 8.14.1 - resolution: "@cspell/strong-weak-map@npm:8.14.1" - checksum: 10c0/6992b96c377d8d8f134fce3b4ee8677c90854d3da6bdaa718ae3d281bbfd422067c9272eb0a9114a8a11f7ac381c0cc3403584ade71908e4ff9c0fc34aa3005c - languageName: node - linkType: hard - -"@cspell/url@npm:8.14.1": - version: 8.14.1 - resolution: "@cspell/url@npm:8.14.1" - checksum: 10c0/28d118a5f31783c8f154292875eb9035a631d68427596ac306a010faec71023cd74ee0d2a8f5854a8c4643ecc136e83f40c95ba62e3afd64a68753e889a848b2 - languageName: node - linkType: hard - -"@discoveryjs/json-ext@npm:0.5.7": - version: 0.5.7 - resolution: "@discoveryjs/json-ext@npm:0.5.7" - checksum: 10c0/e10f1b02b78e4812646ddf289b7d9f2cb567d336c363b266bd50cd223cf3de7c2c74018d91cd2613041568397ef3a4a2b500aba588c6e5bd78c38374ba68f38c - languageName: node - linkType: hard - -"@docsearch/css@npm:3.6.1": - version: 3.6.1 - resolution: "@docsearch/css@npm:3.6.1" - checksum: 10c0/546b7b725044d006fe5fd2061763fbd1f944d9db21c7b86adb2d11e7bd5eee41b102f1ecccb001bb1603ef7503282cc9ad204482db62e4bc0b038c46a9cd9e6d - languageName: node - linkType: hard - -"@docsearch/react@npm:^3.5.2": - version: 3.6.1 - resolution: "@docsearch/react@npm:3.6.1" - dependencies: - "@algolia/autocomplete-core": "npm:1.9.3" - "@algolia/autocomplete-preset-algolia": "npm:1.9.3" - "@docsearch/css": "npm:3.6.1" - algoliasearch: "npm:^4.19.1" - peerDependencies: - "@types/react": ">= 16.8.0 < 19.0.0" - react: ">= 16.8.0 < 19.0.0" - react-dom: ">= 16.8.0 < 19.0.0" - search-insights: ">= 1 < 3" - peerDependenciesMeta: - "@types/react": - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true - checksum: 10c0/890d46ed1f971a6af9f64377c9e510e4b39324bfedcc143c7bd35ba883f8fdac3dc844b0a0000059fd3dec16a0443e7f723d65c468ca7bafd03be546caf38479 - languageName: node - linkType: hard - -"@docusaurus/core@npm:3.4.0": - version: 3.4.0 - resolution: "@docusaurus/core@npm:3.4.0" - dependencies: - "@babel/core": "npm:^7.23.3" - "@babel/generator": "npm:^7.23.3" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-transform-runtime": "npm:^7.22.9" - "@babel/preset-env": "npm:^7.22.9" - "@babel/preset-react": "npm:^7.22.5" - "@babel/preset-typescript": "npm:^7.22.5" - "@babel/runtime": "npm:^7.22.6" - "@babel/runtime-corejs3": "npm:^7.22.6" - "@babel/traverse": "npm:^7.22.8" - "@docusaurus/cssnano-preset": "npm:3.4.0" - "@docusaurus/logger": "npm:3.4.0" - "@docusaurus/mdx-loader": "npm:3.4.0" - "@docusaurus/utils": "npm:3.4.0" - "@docusaurus/utils-common": "npm:3.4.0" - "@docusaurus/utils-validation": "npm:3.4.0" - autoprefixer: "npm:^10.4.14" - babel-loader: "npm:^9.1.3" - babel-plugin-dynamic-import-node: "npm:^2.3.3" - boxen: "npm:^6.2.1" - chalk: "npm:^4.1.2" - chokidar: "npm:^3.5.3" - clean-css: "npm:^5.3.2" - cli-table3: "npm:^0.6.3" - combine-promises: "npm:^1.1.0" - commander: "npm:^5.1.0" - copy-webpack-plugin: "npm:^11.0.0" - core-js: "npm:^3.31.1" - css-loader: "npm:^6.8.1" - css-minimizer-webpack-plugin: "npm:^5.0.1" - cssnano: "npm:^6.1.2" - del: "npm:^6.1.1" - detect-port: "npm:^1.5.1" - escape-html: "npm:^1.0.3" - eta: "npm:^2.2.0" - eval: "npm:^0.1.8" - file-loader: "npm:^6.2.0" - fs-extra: "npm:^11.1.1" - html-minifier-terser: "npm:^7.2.0" - html-tags: "npm:^3.3.1" - html-webpack-plugin: "npm:^5.5.3" - leven: "npm:^3.1.0" - lodash: "npm:^4.17.21" - mini-css-extract-plugin: "npm:^2.7.6" - p-map: "npm:^4.0.0" - postcss: "npm:^8.4.26" - postcss-loader: "npm:^7.3.3" - prompts: "npm:^2.4.2" - react-dev-utils: "npm:^12.0.1" - react-helmet-async: "npm:^1.3.0" - react-loadable: "npm:@docusaurus/react-loadable@6.0.0" - react-loadable-ssr-addon-v5-slorber: "npm:^1.0.1" - react-router: "npm:^5.3.4" - react-router-config: "npm:^5.1.1" - react-router-dom: "npm:^5.3.4" - rtl-detect: "npm:^1.0.4" - semver: "npm:^7.5.4" - serve-handler: "npm:^6.1.5" - shelljs: "npm:^0.8.5" - terser-webpack-plugin: "npm:^5.3.9" - tslib: "npm:^2.6.0" - update-notifier: "npm:^6.0.2" - url-loader: "npm:^4.1.1" - webpack: "npm:^5.88.1" - webpack-bundle-analyzer: "npm:^4.9.0" - webpack-dev-server: "npm:^4.15.1" - webpack-merge: "npm:^5.9.0" - webpackbar: "npm:^5.0.2" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - bin: - docusaurus: bin/docusaurus.mjs - checksum: 10c0/28a9d2c4c893930e7fa7bbf5df2aed79a5cdc618c9f40d5b867846cb78ee371a52af41a59c6adf677cd480cb4350dfad4866de4b06928b4169c295c601472867 - languageName: node - linkType: hard - -"@docusaurus/core@npm:3.5.2, @docusaurus/core@npm:^3.5.2": - version: 3.5.2 - resolution: "@docusaurus/core@npm:3.5.2" - dependencies: - "@babel/core": "npm:^7.23.3" - "@babel/generator": "npm:^7.23.3" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-transform-runtime": "npm:^7.22.9" - "@babel/preset-env": "npm:^7.22.9" - "@babel/preset-react": "npm:^7.22.5" - "@babel/preset-typescript": "npm:^7.22.5" - "@babel/runtime": "npm:^7.22.6" - "@babel/runtime-corejs3": "npm:^7.22.6" - "@babel/traverse": "npm:^7.22.8" - "@docusaurus/cssnano-preset": "npm:3.5.2" - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/mdx-loader": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" - autoprefixer: "npm:^10.4.14" - babel-loader: "npm:^9.1.3" - babel-plugin-dynamic-import-node: "npm:^2.3.3" - boxen: "npm:^6.2.1" - chalk: "npm:^4.1.2" - chokidar: "npm:^3.5.3" - clean-css: "npm:^5.3.2" - cli-table3: "npm:^0.6.3" - combine-promises: "npm:^1.1.0" - commander: "npm:^5.1.0" - copy-webpack-plugin: "npm:^11.0.0" - core-js: "npm:^3.31.1" - css-loader: "npm:^6.8.1" - css-minimizer-webpack-plugin: "npm:^5.0.1" - cssnano: "npm:^6.1.2" - del: "npm:^6.1.1" - detect-port: "npm:^1.5.1" - escape-html: "npm:^1.0.3" - eta: "npm:^2.2.0" - eval: "npm:^0.1.8" - file-loader: "npm:^6.2.0" - fs-extra: "npm:^11.1.1" - html-minifier-terser: "npm:^7.2.0" - html-tags: "npm:^3.3.1" - html-webpack-plugin: "npm:^5.5.3" - leven: "npm:^3.1.0" - lodash: "npm:^4.17.21" - mini-css-extract-plugin: "npm:^2.7.6" - p-map: "npm:^4.0.0" - postcss: "npm:^8.4.26" - postcss-loader: "npm:^7.3.3" - prompts: "npm:^2.4.2" - react-dev-utils: "npm:^12.0.1" - react-helmet-async: "npm:^1.3.0" - react-loadable: "npm:@docusaurus/react-loadable@6.0.0" - react-loadable-ssr-addon-v5-slorber: "npm:^1.0.1" - react-router: "npm:^5.3.4" - react-router-config: "npm:^5.1.1" - react-router-dom: "npm:^5.3.4" - rtl-detect: "npm:^1.0.4" - semver: "npm:^7.5.4" - serve-handler: "npm:^6.1.5" - shelljs: "npm:^0.8.5" - terser-webpack-plugin: "npm:^5.3.9" - tslib: "npm:^2.6.0" - update-notifier: "npm:^6.0.2" - url-loader: "npm:^4.1.1" - webpack: "npm:^5.88.1" - webpack-bundle-analyzer: "npm:^4.9.0" - webpack-dev-server: "npm:^4.15.1" - webpack-merge: "npm:^5.9.0" - webpackbar: "npm:^5.0.2" - peerDependencies: - "@mdx-js/react": ^3.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 - bin: - docusaurus: bin/docusaurus.mjs - checksum: 10c0/0868fc7cfbc38e7d927d60e927abf883fe442fe723123a58425a5402905a48bfb57b4e59ff555944af54ad3be462380d43e0f737989f6f300f11df2ca29d0498 - languageName: node - linkType: hard - -"@docusaurus/cssnano-preset@npm:3.4.0": - version: 3.4.0 - resolution: "@docusaurus/cssnano-preset@npm:3.4.0" - dependencies: - cssnano-preset-advanced: "npm:^6.1.2" - postcss: "npm:^8.4.38" - postcss-sort-media-queries: "npm:^5.2.0" - tslib: "npm:^2.6.0" - checksum: 10c0/bcbdfb9d34d8b26bf89c8e414f5fc775bae5c12a0c280064a8aaf30c7260ffb760dee5ce86171f87cf4dcdeddb39a815ebfc6bdfd5ec14fb26c5cb340c51af55 - languageName: node - linkType: hard - -"@docusaurus/cssnano-preset@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/cssnano-preset@npm:3.5.2" - dependencies: - cssnano-preset-advanced: "npm:^6.1.2" - postcss: "npm:^8.4.38" - postcss-sort-media-queries: "npm:^5.2.0" - tslib: "npm:^2.6.0" - checksum: 10c0/10fd97d66aa7973d86322ac205978edc18636e13dc1f5eb7e6fca5169c4203660bd958f2a483a2b1639d05c1878f5d0eb5f07676eee5d5aa3b71b417d35fa42a - languageName: node - linkType: hard - -"@docusaurus/eslint-plugin@npm:^3.5.2": - version: 3.5.2 - resolution: "@docusaurus/eslint-plugin@npm:3.5.2" - dependencies: - "@typescript-eslint/utils": "npm:^5.62.0" - tslib: "npm:^2.6.0" - peerDependencies: - eslint: ">=6" - checksum: 10c0/7c8e617e45047af20df2099f3d6e2fb63a80213c7cb1236da2fbebb51e53b71c4c78436caeb3fe85f4410b2073fee8480be65be4da1093147d4ea2f4975b63de - languageName: node - linkType: hard - -"@docusaurus/logger@npm:3.4.0": - version: 3.4.0 - resolution: "@docusaurus/logger@npm:3.4.0" - dependencies: - chalk: "npm:^4.1.2" - tslib: "npm:^2.6.0" - checksum: 10c0/0759eee9bc01cf0c16da70ccd0cd3363e649f00bb6d04595bf436a4d40235b6f78d6d18f8a5499244693f067a708e3fb3126c122c01b1c0fa3665198d24a80a2 - languageName: node - linkType: hard - -"@docusaurus/logger@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/logger@npm:3.5.2" - dependencies: - chalk: "npm:^4.1.2" - tslib: "npm:^2.6.0" - checksum: 10c0/5360228a980c024445483c88e14c2f2e69ca7b8386c0c39bd147307b0296277fdf06c27e43dba0e43d9ea6abee7b0269a4d6fe166e57ad5ffb2e093759ff6c03 - languageName: node - linkType: hard - -"@docusaurus/mdx-loader@npm:3.4.0": - version: 3.4.0 - resolution: "@docusaurus/mdx-loader@npm:3.4.0" - dependencies: - "@docusaurus/logger": "npm:3.4.0" - "@docusaurus/utils": "npm:3.4.0" - "@docusaurus/utils-validation": "npm:3.4.0" - "@mdx-js/mdx": "npm:^3.0.0" - "@slorber/remark-comment": "npm:^1.0.0" - escape-html: "npm:^1.0.3" - estree-util-value-to-estree: "npm:^3.0.1" - file-loader: "npm:^6.2.0" - fs-extra: "npm:^11.1.1" - image-size: "npm:^1.0.2" - mdast-util-mdx: "npm:^3.0.0" - mdast-util-to-string: "npm:^4.0.0" - rehype-raw: "npm:^7.0.0" - remark-directive: "npm:^3.0.0" - remark-emoji: "npm:^4.0.0" - remark-frontmatter: "npm:^5.0.0" - remark-gfm: "npm:^4.0.0" - stringify-object: "npm:^3.3.0" - tslib: "npm:^2.6.0" - unified: "npm:^11.0.3" - unist-util-visit: "npm:^5.0.0" - url-loader: "npm:^4.1.1" - vfile: "npm:^6.0.1" - webpack: "npm:^5.88.1" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/3a3295e01571ceefdc74abbfdc5125b6acd2c7bfe13cac0c6c79f61c9fc16e1244594748c92ceb01baae648d4aedd594fa1b513aca66f7a74244d347c91820b0 - languageName: node - linkType: hard - -"@docusaurus/mdx-loader@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/mdx-loader@npm:3.5.2" - dependencies: - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" - "@mdx-js/mdx": "npm:^3.0.0" - "@slorber/remark-comment": "npm:^1.0.0" - escape-html: "npm:^1.0.3" - estree-util-value-to-estree: "npm:^3.0.1" - file-loader: "npm:^6.2.0" - fs-extra: "npm:^11.1.1" - image-size: "npm:^1.0.2" - mdast-util-mdx: "npm:^3.0.0" - mdast-util-to-string: "npm:^4.0.0" - rehype-raw: "npm:^7.0.0" - remark-directive: "npm:^3.0.0" - remark-emoji: "npm:^4.0.0" - remark-frontmatter: "npm:^5.0.0" - remark-gfm: "npm:^4.0.0" - stringify-object: "npm:^3.3.0" - tslib: "npm:^2.6.0" - unified: "npm:^11.0.3" - unist-util-visit: "npm:^5.0.0" - url-loader: "npm:^4.1.1" - vfile: "npm:^6.0.1" - webpack: "npm:^5.88.1" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/52f193578cd3f369c155a2a7a5db532dc482ecb460e3b32ca1111e0036ea8939bfaf4094860929510e639f9a00d1edbbedc797ccdef9eddc381bedaa255d5ab3 - languageName: node - linkType: hard - -"@docusaurus/module-type-aliases@npm:3.4.0": - version: 3.4.0 - resolution: "@docusaurus/module-type-aliases@npm:3.4.0" - dependencies: - "@docusaurus/types": "npm:3.4.0" - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - "@types/react-router-config": "npm:*" - "@types/react-router-dom": "npm:*" - react-helmet-async: "npm:*" - react-loadable: "npm:@docusaurus/react-loadable@6.0.0" - peerDependencies: - react: "*" - react-dom: "*" - checksum: 10c0/37645717442eaf2d62dcb972db544f5231392f1dbeb7499d725cef50b4c2762d7a95facff8a759f9127814861c6ccb859f69661f1634b7bf8c27be13f9d3e626 - languageName: node - linkType: hard - -"@docusaurus/module-type-aliases@npm:3.5.2, @docusaurus/module-type-aliases@npm:^3.5.2": - version: 3.5.2 - resolution: "@docusaurus/module-type-aliases@npm:3.5.2" - dependencies: - "@docusaurus/types": "npm:3.5.2" - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - "@types/react-router-config": "npm:*" - "@types/react-router-dom": "npm:*" - react-helmet-async: "npm:*" - react-loadable: "npm:@docusaurus/react-loadable@6.0.0" - peerDependencies: - react: "*" - react-dom: "*" - checksum: 10c0/5174c8ad4a545b4ef8aa16bae6f6a2d501ab0d4ddd400cca83c55b6b35eac79b1d7cff52d6041da4f0f339a969d72be1f40e57d5ea73a50a61e0688505627e0c - languageName: node - linkType: hard - -"@docusaurus/plugin-content-blog@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-content-blog@npm:3.5.2" - dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/mdx-loader": "npm:3.5.2" - "@docusaurus/theme-common": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" - cheerio: "npm:1.0.0-rc.12" - feed: "npm:^4.2.2" - fs-extra: "npm:^11.1.1" - lodash: "npm:^4.17.21" - reading-time: "npm:^1.5.0" - srcset: "npm:^4.0.0" - tslib: "npm:^2.6.0" - unist-util-visit: "npm:^5.0.0" - utility-types: "npm:^3.10.0" - webpack: "npm:^5.88.1" - peerDependencies: - "@docusaurus/plugin-content-docs": "*" - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/0cdd4944e19c4ed02783be311dd735728a03282585517f48277358373cf46740b5659daa14bdaf58f80e0f949579a97110aa785a15333ad420154acc997471e6 - languageName: node - linkType: hard - -"@docusaurus/plugin-content-docs@npm:3.4.0": - version: 3.4.0 - resolution: "@docusaurus/plugin-content-docs@npm:3.4.0" - dependencies: - "@docusaurus/core": "npm:3.4.0" - "@docusaurus/logger": "npm:3.4.0" - "@docusaurus/mdx-loader": "npm:3.4.0" - "@docusaurus/module-type-aliases": "npm:3.4.0" - "@docusaurus/types": "npm:3.4.0" - "@docusaurus/utils": "npm:3.4.0" - "@docusaurus/utils-common": "npm:3.4.0" - "@docusaurus/utils-validation": "npm:3.4.0" - "@types/react-router-config": "npm:^5.0.7" - combine-promises: "npm:^1.1.0" - fs-extra: "npm:^11.1.1" - js-yaml: "npm:^4.1.0" - lodash: "npm:^4.17.21" - tslib: "npm:^2.6.0" - utility-types: "npm:^3.10.0" - webpack: "npm:^5.88.1" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/dc12d09c7ecd9f18bf48ee16432f01a974880f251a6c68b0be6cc6876edd2f25561cf4b0829a34bc9daa9ec5d44c8797a0b096dc7480346fb502482734ea728c - languageName: node - linkType: hard - -"@docusaurus/plugin-content-docs@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-content-docs@npm:3.5.2" - dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/mdx-loader": "npm:3.5.2" - "@docusaurus/module-type-aliases": "npm:3.5.2" - "@docusaurus/theme-common": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" - "@types/react-router-config": "npm:^5.0.7" - combine-promises: "npm:^1.1.0" - fs-extra: "npm:^11.1.1" - js-yaml: "npm:^4.1.0" - lodash: "npm:^4.17.21" - tslib: "npm:^2.6.0" - utility-types: "npm:^3.10.0" - webpack: "npm:^5.88.1" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/fd245e323bd2735c9a65bbb50c8411db3bf8b562ad812ef92c4637554b1606aeaf2f2da95ea447a6fb158d96836677d7f95a6a006dae3c4730c231c5527fd7ce - languageName: node - linkType: hard - -"@docusaurus/plugin-content-pages@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-content-pages@npm:3.5.2" - dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/mdx-loader": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" - fs-extra: "npm:^11.1.1" - tslib: "npm:^2.6.0" - webpack: "npm:^5.88.1" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/4ca00fad896976095a64f485c6b58da5426fb8301921b2d3099d3604f3a3485461543e373415b54ce743104ff67f54e4f6fb4364547fce3d8c88be57e1c87426 - languageName: node - linkType: hard - -"@docusaurus/plugin-debug@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-debug@npm:3.5.2" - dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - fs-extra: "npm:^11.1.1" - react-json-view-lite: "npm:^1.2.0" - tslib: "npm:^2.6.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/2d47f01154a026b9c9028df72fa87a633772c5079501a8e7c48ca48ba87fd1f4ec6e7e277c8123315cccbc43a9897e45e8a0b8b975cc337a74316eee03f7b320 - languageName: node - linkType: hard - -"@docusaurus/plugin-google-analytics@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-google-analytics@npm:3.5.2" - dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" - tslib: "npm:^2.6.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/19e2fbdb625a0345c7f5571ae39fae5803b32933f7f69ba481daf56b4640d68c899049a8c0a7a774e533723364361a7e56839e4fd279940717c5c35d66c226b5 - languageName: node - linkType: hard - -"@docusaurus/plugin-google-gtag@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-google-gtag@npm:3.5.2" - dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" - "@types/gtag.js": "npm:^0.0.12" - tslib: "npm:^2.6.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/ba502ae3e0b766b8eebafe89935365199cbc66f9d472950d3d95362619b1f78dddf8e45a73c7e9a1040be965b927ea5ce76037b3f7ee5443c25cab8e6e232934 - languageName: node - linkType: hard - -"@docusaurus/plugin-google-tag-manager@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-google-tag-manager@npm:3.5.2" - dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" - tslib: "npm:^2.6.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/067eed163b41ac03e85b70ec677525479bae6f4b7137e837d81dd48d03ab8c246b52be3236283cbc4607039beddc618adcfe451f91b19e2d41d343cd0952bd73 - languageName: node - linkType: hard - -"@docusaurus/plugin-sitemap@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-sitemap@npm:3.5.2" - dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" - fs-extra: "npm:^11.1.1" - sitemap: "npm:^7.1.1" - tslib: "npm:^2.6.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/9490c3a11869fb50abe7d8d9c235d57b18247a2dbe59d2351a6a919f0a4cf5445879e019db049a5dd55cbbb1ce0e19d5f1342e368e593408652f48d19331f961 - languageName: node - linkType: hard - -"@docusaurus/preset-classic@npm:^3.5.2": - version: 3.5.2 - resolution: "@docusaurus/preset-classic@npm:3.5.2" - dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/plugin-content-blog": "npm:3.5.2" - "@docusaurus/plugin-content-docs": "npm:3.5.2" - "@docusaurus/plugin-content-pages": "npm:3.5.2" - "@docusaurus/plugin-debug": "npm:3.5.2" - "@docusaurus/plugin-google-analytics": "npm:3.5.2" - "@docusaurus/plugin-google-gtag": "npm:3.5.2" - "@docusaurus/plugin-google-tag-manager": "npm:3.5.2" - "@docusaurus/plugin-sitemap": "npm:3.5.2" - "@docusaurus/theme-classic": "npm:3.5.2" - "@docusaurus/theme-common": "npm:3.5.2" - "@docusaurus/theme-search-algolia": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/ea15474b01399a7bf05d6fd8b0edbf2856ffc83baa0d726b6e90c365ffc93ed39a78ac3d5690750f43051387ff96a8b455927ffa712f4589f4e4b45a4490aaaa - languageName: node - linkType: hard - -"@docusaurus/theme-classic@npm:3.5.2, @docusaurus/theme-classic@npm:^3.5.2": - version: 3.5.2 - resolution: "@docusaurus/theme-classic@npm:3.5.2" - dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/mdx-loader": "npm:3.5.2" - "@docusaurus/module-type-aliases": "npm:3.5.2" - "@docusaurus/plugin-content-blog": "npm:3.5.2" - "@docusaurus/plugin-content-docs": "npm:3.5.2" - "@docusaurus/plugin-content-pages": "npm:3.5.2" - "@docusaurus/theme-common": "npm:3.5.2" - "@docusaurus/theme-translations": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" - "@mdx-js/react": "npm:^3.0.0" - clsx: "npm:^2.0.0" - copy-text-to-clipboard: "npm:^3.2.0" - infima: "npm:0.2.0-alpha.44" - lodash: "npm:^4.17.21" - nprogress: "npm:^0.2.0" - postcss: "npm:^8.4.26" - prism-react-renderer: "npm:^2.3.0" - prismjs: "npm:^1.29.0" - react-router-dom: "npm:^5.3.4" - rtlcss: "npm:^4.1.0" - tslib: "npm:^2.6.0" - utility-types: "npm:^3.10.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/b0f1dd2a81b96d5522ce456de77e0edd539ea07406ff370b624d878a46af4b33f66892242bc177bf04a0026831fccd3621d722c174ebb8a05a8e6f6ed07d72c3 - languageName: node - linkType: hard - -"@docusaurus/theme-common@npm:3.5.2, @docusaurus/theme-common@npm:^3.5.2": - version: 3.5.2 - resolution: "@docusaurus/theme-common@npm:3.5.2" - dependencies: - "@docusaurus/mdx-loader": "npm:3.5.2" - "@docusaurus/module-type-aliases": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - "@types/react-router-config": "npm:*" - clsx: "npm:^2.0.0" - parse-numeric-range: "npm:^1.3.0" - prism-react-renderer: "npm:^2.3.0" - tslib: "npm:^2.6.0" - utility-types: "npm:^3.10.0" - peerDependencies: - "@docusaurus/plugin-content-docs": "*" - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/ae84a910b98c2b6706110e1580af96e5d87d5b29fe1f085d461932aa9608ee3df90e257d809ddcea5c5d848a160933d16052db1669dd062b5d13870834ac0394 - languageName: node - linkType: hard - -"@docusaurus/theme-search-algolia@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/theme-search-algolia@npm:3.5.2" - dependencies: - "@docsearch/react": "npm:^3.5.2" - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/plugin-content-docs": "npm:3.5.2" - "@docusaurus/theme-common": "npm:3.5.2" - "@docusaurus/theme-translations": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" - algoliasearch: "npm:^4.18.0" - algoliasearch-helper: "npm:^3.13.3" - clsx: "npm:^2.0.0" - eta: "npm:^2.2.0" - fs-extra: "npm:^11.1.1" - lodash: "npm:^4.17.21" - tslib: "npm:^2.6.0" - utility-types: "npm:^3.10.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/c617528fc0574611e49eb355f99df47e77a295a3c87792f185ec53ce0e7a6b239f017e0d9f8b45d91c87f3c615e9008441978d6daf35debcbb1b48fc9d2d98ee - languageName: node - linkType: hard - -"@docusaurus/theme-translations@npm:3.4.0": - version: 3.4.0 - resolution: "@docusaurus/theme-translations@npm:3.4.0" - dependencies: - fs-extra: "npm:^11.1.1" - tslib: "npm:^2.6.0" - checksum: 10c0/e32ce684d2c9269534ab6f1a71086ae2520e68cd5c42ecb0222da7d7b8a60cd96dc23dbcd0f0856b5439b71efd6552f321c66f17d218967c6b02b46589181e2a - languageName: node - linkType: hard - -"@docusaurus/theme-translations@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/theme-translations@npm:3.5.2" - dependencies: - fs-extra: "npm:^11.1.1" - tslib: "npm:^2.6.0" - checksum: 10c0/aa427b55a6d642ff30d67d5b9b8bc9f16f92b8902b125d3d6499c59e7e4ece3549a8a8e9fc017ef1cc68d9b9d5426a35812f8bf829c049103607867d605adc7b - languageName: node - linkType: hard - -"@docusaurus/tsconfig@npm:^3.5.2": - version: 3.5.2 - resolution: "@docusaurus/tsconfig@npm:3.5.2" - checksum: 10c0/1cde5cfadfc94605ba9a1ec8484bc58700bcff99944fa20c6f6d93599126914dc33f15c3464ee3279cf6becafcea86909d1d25a20f8f97e95c8ddf6b1122eac8 - languageName: node - linkType: hard - -"@docusaurus/types@npm:3.4.0": - version: 3.4.0 - resolution: "@docusaurus/types@npm:3.4.0" - dependencies: - "@mdx-js/mdx": "npm:^3.0.0" - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - commander: "npm:^5.1.0" - joi: "npm:^17.9.2" - react-helmet-async: "npm:^1.3.0" - utility-types: "npm:^3.10.0" - webpack: "npm:^5.88.1" - webpack-merge: "npm:^5.9.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/c86b95dfbf02db6faa9bb4d6c552d54f2e57924a95937cff6f1884e0ef66f7bbaf84e645fffa229f2571fea6ee469d3dd15abff20f81f7dc886ad38c4c79cbdb - languageName: node - linkType: hard - -"@docusaurus/types@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/types@npm:3.5.2" - dependencies: - "@mdx-js/mdx": "npm:^3.0.0" - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - commander: "npm:^5.1.0" - joi: "npm:^17.9.2" - react-helmet-async: "npm:^1.3.0" - utility-types: "npm:^3.10.0" - webpack: "npm:^5.88.1" - webpack-merge: "npm:^5.9.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/a06607a8ed96871d9a2c1239e1d94e584acd5c638f7eb4071feb1f18221c25c9b78794b3f804884db201cfdfc67cecdf37a823efe854f435fb4f5a36b28237d4 - languageName: node - linkType: hard - -"@docusaurus/utils-common@npm:3.4.0": - version: 3.4.0 - resolution: "@docusaurus/utils-common@npm:3.4.0" - dependencies: - tslib: "npm:^2.6.0" - peerDependencies: - "@docusaurus/types": "*" - peerDependenciesMeta: - "@docusaurus/types": - optional: true - checksum: 10c0/df8e27a88621f5984624ac8c15061dd3eb2f33d3c3f5e08381d3aa316347a62884b2b5f051f54050516ceea1d4656012893be09ca81eae56809f4eb723924f56 - languageName: node - linkType: hard - -"@docusaurus/utils-common@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/utils-common@npm:3.5.2" - dependencies: - tslib: "npm:^2.6.0" - peerDependencies: - "@docusaurus/types": "*" - peerDependenciesMeta: - "@docusaurus/types": - optional: true - checksum: 10c0/17723bed0174d98895eff9666e9988757cb1b3562d90045db7a9a90294d686ca5472f5d7c171de7f306148ae24573ae7e959d31167a8dac8c1b4d7606459e056 - languageName: node - linkType: hard - -"@docusaurus/utils-validation@npm:3.4.0": - version: 3.4.0 - resolution: "@docusaurus/utils-validation@npm:3.4.0" - dependencies: - "@docusaurus/logger": "npm:3.4.0" - "@docusaurus/utils": "npm:3.4.0" - "@docusaurus/utils-common": "npm:3.4.0" - fs-extra: "npm:^11.2.0" - joi: "npm:^17.9.2" - js-yaml: "npm:^4.1.0" - lodash: "npm:^4.17.21" - tslib: "npm:^2.6.0" - checksum: 10c0/5a4c13bd41f1c5132b33c09f29f788fb76c3a9b0c4326e8bb2661041ab8c9cabd682f5d3f6203fae49e28bc975217b99e485dcc23065afb16498978774b37ee6 - languageName: node - linkType: hard - -"@docusaurus/utils-validation@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/utils-validation@npm:3.5.2" - dependencies: - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" - fs-extra: "npm:^11.2.0" - joi: "npm:^17.9.2" - js-yaml: "npm:^4.1.0" - lodash: "npm:^4.17.21" - tslib: "npm:^2.6.0" - checksum: 10c0/b179f7e68f9e3bfad7d03001ca9280e4122592a8995ea7ca31a8a59c5ce3b568af1177b06b41417c98bcd4cd30a7a054d0c06be8384b3f05be37bf239df96213 - languageName: node - linkType: hard - -"@docusaurus/utils@npm:3.4.0": - version: 3.4.0 - resolution: "@docusaurus/utils@npm:3.4.0" - dependencies: - "@docusaurus/logger": "npm:3.4.0" - "@docusaurus/utils-common": "npm:3.4.0" - "@svgr/webpack": "npm:^8.1.0" - escape-string-regexp: "npm:^4.0.0" - file-loader: "npm:^6.2.0" - fs-extra: "npm:^11.1.1" - github-slugger: "npm:^1.5.0" - globby: "npm:^11.1.0" - gray-matter: "npm:^4.0.3" - jiti: "npm:^1.20.0" - js-yaml: "npm:^4.1.0" - lodash: "npm:^4.17.21" - micromatch: "npm:^4.0.5" - prompts: "npm:^2.4.2" - resolve-pathname: "npm:^3.0.0" - shelljs: "npm:^0.8.5" - tslib: "npm:^2.6.0" - url-loader: "npm:^4.1.1" - utility-types: "npm:^3.10.0" - webpack: "npm:^5.88.1" - peerDependencies: - "@docusaurus/types": "*" - peerDependenciesMeta: - "@docusaurus/types": - optional: true - checksum: 10c0/b80444985e97c1c9586a2b2669438b02e3a122d382b38633f0a7317365b5d3ad05beb882328ada4b09bb3de7e18d29f89d2a4e02fadf4acebdc5dd768b2265b9 - languageName: node - linkType: hard - -"@docusaurus/utils@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/utils@npm:3.5.2" - dependencies: - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" - "@svgr/webpack": "npm:^8.1.0" - escape-string-regexp: "npm:^4.0.0" - file-loader: "npm:^6.2.0" - fs-extra: "npm:^11.1.1" - github-slugger: "npm:^1.5.0" - globby: "npm:^11.1.0" - gray-matter: "npm:^4.0.3" - jiti: "npm:^1.20.0" - js-yaml: "npm:^4.1.0" - lodash: "npm:^4.17.21" - micromatch: "npm:^4.0.5" - prompts: "npm:^2.4.2" - resolve-pathname: "npm:^3.0.0" - shelljs: "npm:^0.8.5" - tslib: "npm:^2.6.0" - url-loader: "npm:^4.1.1" - utility-types: "npm:^3.10.0" - webpack: "npm:^5.88.1" - peerDependencies: - "@docusaurus/types": "*" - peerDependenciesMeta: - "@docusaurus/types": - optional: true - checksum: 10c0/a4d2d530c16ffd93bb84f5bc221efb767cba5915cfabd36f83130ba008cbb03a4d79ec324bb1dd0ef2d25d1317692357ee55ec8df0e9e801022e37c633b80ca9 - languageName: node - linkType: hard - -"@effect/schema@npm:0.69.0": - version: 0.69.0 - resolution: "@effect/schema@npm:0.69.0" - dependencies: - fast-check: "npm:^3.20.0" - peerDependencies: - effect: ^3.5.7 - checksum: 10c0/f94589d053f3965d06e9cfd82412a205e8d3e06ae84a1e6268e3dbac78f2cb19c79e832af9f77e2643db88ed500ff6bdf543373b30d74727ed6ce715a0b30177 - languageName: node - linkType: hard - -"@es-joy/jsdoccomment@npm:~0.48.0": - version: 0.48.0 - resolution: "@es-joy/jsdoccomment@npm:0.48.0" - dependencies: - comment-parser: "npm:1.4.1" - esquery: "npm:^1.6.0" - jsdoc-type-pratt-parser: "npm:~4.1.0" - checksum: 10c0/8d87c7c0426fade009c30ab429d4ede53fd253d40b55079c02bdacdaa4c0fe904aaea5e3084cd98052f2bed6b3030c381d84f4a3251b343a71fee6f681a08bee - languageName: node - linkType: hard - -"@esbuild/aix-ppc64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/aix-ppc64@npm:0.19.12" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/aix-ppc64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/aix-ppc64@npm:0.23.1" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-arm64@npm:0.19.12" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/android-arm64@npm:0.23.1" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-arm@npm:0.19.12" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/android-arm@npm:0.23.1" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-x64@npm:0.19.12" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/android-x64@npm:0.23.1" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/darwin-arm64@npm:0.19.12" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/darwin-arm64@npm:0.23.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/darwin-x64@npm:0.19.12" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/darwin-x64@npm:0.23.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/freebsd-arm64@npm:0.19.12" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/freebsd-arm64@npm:0.23.1" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/freebsd-x64@npm:0.19.12" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/freebsd-x64@npm:0.23.1" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-arm64@npm:0.19.12" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-arm64@npm:0.23.1" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-arm@npm:0.19.12" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-arm@npm:0.23.1" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-ia32@npm:0.19.12" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-ia32@npm:0.23.1" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-loong64@npm:0.19.12" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-loong64@npm:0.23.1" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-mips64el@npm:0.19.12" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-mips64el@npm:0.23.1" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-ppc64@npm:0.19.12" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-ppc64@npm:0.23.1" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-riscv64@npm:0.19.12" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-riscv64@npm:0.23.1" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-s390x@npm:0.19.12" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-s390x@npm:0.23.1" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-x64@npm:0.19.12" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-x64@npm:0.23.1" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/netbsd-x64@npm:0.19.12" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/netbsd-x64@npm:0.23.1" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/openbsd-arm64@npm:0.23.1" - conditions: os=openbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/openbsd-x64@npm:0.19.12" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/openbsd-x64@npm:0.23.1" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/sunos-x64@npm:0.19.12" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/sunos-x64@npm:0.23.1" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-arm64@npm:0.19.12" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/win32-arm64@npm:0.23.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-ia32@npm:0.19.12" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/win32-ia32@npm:0.23.1" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-x64@npm:0.19.12" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/win32-x64@npm:0.23.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.1.2, @eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" - dependencies: - eslint-visitor-keys: "npm:^3.3.0" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.11.0": - version: 4.11.0 - resolution: "@eslint-community/regexpp@npm:4.11.0" - checksum: 10c0/0f6328869b2741e2794da4ad80beac55cba7de2d3b44f796a60955b0586212ec75e6b0253291fd4aad2100ad471d1480d8895f2b54f1605439ba4c875e05e523 - languageName: node - linkType: hard - -"@eslint/compat@npm:^1.1.1": - version: 1.1.1 - resolution: "@eslint/compat@npm:1.1.1" - checksum: 10c0/ca8aa3811fa22d45913f5724978e6f3ae05fb7685b793de4797c9db3b0e22b530f0f492011b253754bffce879d7cece65762cc3391239b5d2249aef8230edc9a - languageName: node - linkType: hard - -"@eslint/config-array@npm:^0.17.1": - version: 0.17.1 - resolution: "@eslint/config-array@npm:0.17.1" - dependencies: - "@eslint/object-schema": "npm:^2.1.4" - debug: "npm:^4.3.1" - minimatch: "npm:^3.1.2" - checksum: 10c0/b986a0a96f2b42467578968ce3d4ae3b9284e587f8490f2dcdc44ff1b8d30580c62b221da6e58d07b09e156c3050e2dc38267f9370521d9cafc099c4e30154ef - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^3.1.0": - version: 3.1.0 - resolution: "@eslint/eslintrc@npm:3.1.0" - dependencies: - ajv: "npm:^6.12.4" - debug: "npm:^4.3.2" - espree: "npm:^10.0.1" - globals: "npm:^14.0.0" - ignore: "npm:^5.2.0" - import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" - minimatch: "npm:^3.1.2" - strip-json-comments: "npm:^3.1.1" - checksum: 10c0/5b7332ed781edcfc98caa8dedbbb843abfb9bda2e86538529c843473f580e40c69eb894410eddc6702f487e9ee8f8cfa8df83213d43a8fdb549f23ce06699167 - languageName: node - linkType: hard - -"@eslint/js@npm:9.9.0, @eslint/js@npm:^9.9.0": - version: 9.9.0 - resolution: "@eslint/js@npm:9.9.0" - checksum: 10c0/6ec9f1f0d576132444d6a5c66a8a08b0be9444e3ebb563fa6a6bebcf5299df3da7e454dc04c0fa601bb811197f00764b3a04430d8458cdb8e3a4677993d23f30 - languageName: node - linkType: hard - -"@eslint/object-schema@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/object-schema@npm:2.1.4" - checksum: 10c0/e9885532ea70e483fb007bf1275968b05bb15ebaa506d98560c41a41220d33d342e19023d5f2939fed6eb59676c1bda5c847c284b4b55fce521d282004da4dda - languageName: node - linkType: hard - -"@hapi/hoek@npm:^9.0.0, @hapi/hoek@npm:^9.3.0": - version: 9.3.0 - resolution: "@hapi/hoek@npm:9.3.0" - checksum: 10c0/a096063805051fb8bba4c947e293c664b05a32b47e13bc654c0dd43813a1cec993bdd8f29ceb838020299e1d0f89f68dc0d62a603c13c9cc8541963f0beca055 - languageName: node - linkType: hard - -"@hapi/topo@npm:^5.1.0": - version: 5.1.0 - resolution: "@hapi/topo@npm:5.1.0" - dependencies: - "@hapi/hoek": "npm:^9.0.0" - checksum: 10c0/b16b06d9357947149e032bdf10151eb71aea8057c79c4046bf32393cb89d0d0f7ca501c40c0f7534a5ceca078de0700d2257ac855c15e59fe4e00bba2f25c86f - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 - languageName: node - linkType: hard - -"@humanwhocodes/retry@npm:^0.3.0": - version: 0.3.0 - resolution: "@humanwhocodes/retry@npm:0.3.0" - checksum: 10c0/7111ec4e098b1a428459b4e3be5a5d2a13b02905f805a2468f4fa628d072f0de2da26a27d04f65ea2846f73ba51f4204661709f05bfccff645e3cedef8781bb6 - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: "npm:^5.1.2" - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: "npm:^7.0.1" - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: "npm:^8.1.0" - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e - languageName: node - linkType: hard - -"@istanbuljs/load-nyc-config@npm:^1.0.0": - version: 1.1.0 - resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" - dependencies: - camelcase: "npm:^5.3.1" - find-up: "npm:^4.1.0" - get-package-type: "npm:^0.1.0" - js-yaml: "npm:^3.13.1" - resolve-from: "npm:^5.0.0" - checksum: 10c0/dd2a8b094887da5a1a2339543a4933d06db2e63cbbc2e288eb6431bd832065df0c099d091b6a67436e71b7d6bf85f01ce7c15f9253b4cbebcc3b9a496165ba42 - languageName: node - linkType: hard - -"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": - version: 0.1.3 - resolution: "@istanbuljs/schema@npm:0.1.3" - checksum: 10c0/61c5286771676c9ca3eb2bd8a7310a9c063fb6e0e9712225c8471c582d157392c88f5353581c8c9adbe0dff98892317d2fdfc56c3499aa42e0194405206a963a - languageName: node - linkType: hard - -"@jest/console@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/console@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - slash: "npm:^3.0.0" - checksum: 10c0/7be408781d0a6f657e969cbec13b540c329671819c2f57acfad0dae9dbfe2c9be859f38fe99b35dba9ff1536937dc6ddc69fdcd2794812fa3c647a1619797f6c - languageName: node - linkType: hard - -"@jest/core@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/core@npm:29.7.0" - dependencies: - "@jest/console": "npm:^29.7.0" - "@jest/reporters": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - ansi-escapes: "npm:^4.2.1" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - exit: "npm:^0.1.2" - graceful-fs: "npm:^4.2.9" - jest-changed-files: "npm:^29.7.0" - jest-config: "npm:^29.7.0" - jest-haste-map: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-regex-util: "npm:^29.6.3" - jest-resolve: "npm:^29.7.0" - jest-resolve-dependencies: "npm:^29.7.0" - jest-runner: "npm:^29.7.0" - jest-runtime: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - jest-watcher: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - pretty-format: "npm:^29.7.0" - slash: "npm:^3.0.0" - strip-ansi: "npm:^6.0.0" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: 10c0/934f7bf73190f029ac0f96662c85cd276ec460d407baf6b0dbaec2872e157db4d55a7ee0b1c43b18874602f662b37cb973dda469a4e6d88b4e4845b521adeeb2 - languageName: node - linkType: hard - -"@jest/environment@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/environment@npm:29.7.0" - dependencies: - "@jest/fake-timers": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - jest-mock: "npm:^29.7.0" - checksum: 10c0/c7b1b40c618f8baf4d00609022d2afa086d9c6acc706f303a70bb4b67275868f620ad2e1a9efc5edd418906157337cce50589a627a6400bbdf117d351b91ef86 - languageName: node - linkType: hard - -"@jest/expect-utils@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/expect-utils@npm:29.7.0" - dependencies: - jest-get-type: "npm:^29.6.3" - checksum: 10c0/60b79d23a5358dc50d9510d726443316253ecda3a7fb8072e1526b3e0d3b14f066ee112db95699b7a43ad3f0b61b750c72e28a5a1cac361d7a2bb34747fa938a - languageName: node - linkType: hard - -"@jest/expect@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/expect@npm:29.7.0" - dependencies: - expect: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - checksum: 10c0/b41f193fb697d3ced134349250aed6ccea075e48c4f803159db102b826a4e473397c68c31118259868fd69a5cba70e97e1c26d2c2ff716ca39dc73a2ccec037e - languageName: node - linkType: hard - -"@jest/fake-timers@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/fake-timers@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - "@sinonjs/fake-timers": "npm:^10.0.2" - "@types/node": "npm:*" - jest-message-util: "npm:^29.7.0" - jest-mock: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - checksum: 10c0/cf0a8bcda801b28dc2e2b2ba36302200ee8104a45ad7a21e6c234148932f826cb3bc57c8df3b7b815aeea0861d7b6ca6f0d4778f93b9219398ef28749e03595c - languageName: node - linkType: hard - -"@jest/globals@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/globals@npm:29.7.0" - dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/expect": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - jest-mock: "npm:^29.7.0" - checksum: 10c0/a385c99396878fe6e4460c43bd7bb0a5cc52befb462cc6e7f2a3810f9e7bcce7cdeb51908fd530391ee452dc856c98baa2c5f5fa8a5b30b071d31ef7f6955cea - languageName: node - linkType: hard - -"@jest/reporters@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/reporters@npm:29.7.0" - dependencies: - "@bcoe/v8-coverage": "npm:^0.2.3" - "@jest/console": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@jridgewell/trace-mapping": "npm:^0.3.18" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - collect-v8-coverage: "npm:^1.0.0" - exit: "npm:^0.1.2" - glob: "npm:^7.1.3" - graceful-fs: "npm:^4.2.9" - istanbul-lib-coverage: "npm:^3.0.0" - istanbul-lib-instrument: "npm:^6.0.0" - istanbul-lib-report: "npm:^3.0.0" - istanbul-lib-source-maps: "npm:^4.0.0" - istanbul-reports: "npm:^3.1.3" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-worker: "npm:^29.7.0" - slash: "npm:^3.0.0" - string-length: "npm:^4.0.1" - strip-ansi: "npm:^6.0.0" - v8-to-istanbul: "npm:^9.0.1" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: 10c0/a754402a799541c6e5aff2c8160562525e2a47e7d568f01ebfc4da66522de39cbb809bbb0a841c7052e4270d79214e70aec3c169e4eae42a03bc1a8a20cb9fa2 - languageName: node - linkType: hard - -"@jest/schemas@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/schemas@npm:29.6.3" - dependencies: - "@sinclair/typebox": "npm:^0.27.8" - checksum: 10c0/b329e89cd5f20b9278ae1233df74016ebf7b385e0d14b9f4c1ad18d096c4c19d1e687aa113a9c976b16ec07f021ae53dea811fb8c1248a50ac34fbe009fdf6be - languageName: node - linkType: hard - -"@jest/source-map@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/source-map@npm:29.6.3" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.18" - callsites: "npm:^3.0.0" - graceful-fs: "npm:^4.2.9" - checksum: 10c0/a2f177081830a2e8ad3f2e29e20b63bd40bade294880b595acf2fc09ec74b6a9dd98f126a2baa2bf4941acd89b13a4ade5351b3885c224107083a0059b60a219 - languageName: node - linkType: hard - -"@jest/test-result@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/test-result@npm:29.7.0" - dependencies: - "@jest/console": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/istanbul-lib-coverage": "npm:^2.0.0" - collect-v8-coverage: "npm:^1.0.0" - checksum: 10c0/7de54090e54a674ca173470b55dc1afdee994f2d70d185c80236003efd3fa2b753fff51ffcdda8e2890244c411fd2267529d42c4a50a8303755041ee493e6a04 - languageName: node - linkType: hard - -"@jest/test-sequencer@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/test-sequencer@npm:29.7.0" - dependencies: - "@jest/test-result": "npm:^29.7.0" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" - slash: "npm:^3.0.0" - checksum: 10c0/593a8c4272797bb5628984486080cbf57aed09c7cfdc0a634e8c06c38c6bef329c46c0016e84555ee55d1cd1f381518cf1890990ff845524c1123720c8c1481b - languageName: node - linkType: hard - -"@jest/transform@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/transform@npm:29.7.0" - dependencies: - "@babel/core": "npm:^7.11.6" - "@jest/types": "npm:^29.6.3" - "@jridgewell/trace-mapping": "npm:^0.3.18" - babel-plugin-istanbul: "npm:^6.1.1" - chalk: "npm:^4.0.0" - convert-source-map: "npm:^2.0.0" - fast-json-stable-stringify: "npm:^2.1.0" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" - jest-regex-util: "npm:^29.6.3" - jest-util: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - pirates: "npm:^4.0.4" - slash: "npm:^3.0.0" - write-file-atomic: "npm:^4.0.2" - checksum: 10c0/7f4a7f73dcf45dfdf280c7aa283cbac7b6e5a904813c3a93ead7e55873761fc20d5c4f0191d2019004fac6f55f061c82eb3249c2901164ad80e362e7a7ede5a6 - languageName: node - linkType: hard - -"@jest/types@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/types@npm:29.6.3" - dependencies: - "@jest/schemas": "npm:^29.6.3" - "@types/istanbul-lib-coverage": "npm:^2.0.0" - "@types/istanbul-reports": "npm:^3.0.0" - "@types/node": "npm:*" - "@types/yargs": "npm:^17.0.8" - chalk: "npm:^4.0.0" - checksum: 10c0/ea4e493dd3fb47933b8ccab201ae573dcc451f951dc44ed2a86123cd8541b82aa9d2b1031caf9b1080d6673c517e2dcc25a44b2dc4f3fbc37bfc965d444888c0 - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" - dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.2 - resolution: "@jridgewell/resolve-uri@npm:3.1.2" - checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 - languageName: node - linkType: hard - -"@jridgewell/source-map@npm:^0.3.3": - version: 0.3.6 - resolution: "@jridgewell/source-map@npm:0.3.6" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - checksum: 10c0/6a4ecc713ed246ff8e5bdcc1ef7c49aaa93f7463d948ba5054dda18b02dcc6a055e2828c577bcceee058f302ce1fc95595713d44f5c45e43d459f88d267f2f04 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 - languageName: node - linkType: hard - -"@leichtgewicht/ip-codec@npm:^2.0.1": - version: 2.0.5 - resolution: "@leichtgewicht/ip-codec@npm:2.0.5" - checksum: 10c0/14a0112bd59615eef9e3446fea018045720cd3da85a98f801a685a818b0d96ef2a1f7227e8d271def546b2e2a0fe91ef915ba9dc912ab7967d2317b1a051d66b - languageName: node - linkType: hard - -"@mdx-js/mdx@npm:^3.0.0": - version: 3.0.1 - resolution: "@mdx-js/mdx@npm:3.0.1" - dependencies: - "@types/estree": "npm:^1.0.0" - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/mdx": "npm:^2.0.0" - collapse-white-space: "npm:^2.0.0" - devlop: "npm:^1.0.0" - estree-util-build-jsx: "npm:^3.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - estree-util-to-js: "npm:^2.0.0" - estree-walker: "npm:^3.0.0" - hast-util-to-estree: "npm:^3.0.0" - hast-util-to-jsx-runtime: "npm:^2.0.0" - markdown-extensions: "npm:^2.0.0" - periscopic: "npm:^3.0.0" - remark-mdx: "npm:^3.0.0" - remark-parse: "npm:^11.0.0" - remark-rehype: "npm:^11.0.0" - source-map: "npm:^0.7.0" - unified: "npm:^11.0.0" - unist-util-position-from-estree: "npm:^2.0.0" - unist-util-stringify-position: "npm:^4.0.0" - unist-util-visit: "npm:^5.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/8cd7084f1242209bbeef81f69ea670ffffa0656dda2893bbd46b1b2b26078a57f9d993f8f82ad8ba16bc969189235140007185276d7673471827331521eae2e0 - languageName: node - linkType: hard - -"@mdx-js/react@npm:^3.0.0, @mdx-js/react@npm:^3.0.1": - version: 3.0.1 - resolution: "@mdx-js/react@npm:3.0.1" - dependencies: - "@types/mdx": "npm:^2.0.0" - peerDependencies: - "@types/react": ">=16" - react: ">=16" - checksum: 10c0/d210d926ef488d39ad65f04d821936b668eadcdde3b6421e94ec4200ca7ad17f17d24c5cbc543882586af9f08b10e2eea715c728ce6277487945e05c5199f532 - languageName: node - linkType: hard - -"@microsoft/api-extractor-model@npm:7.29.5": - version: 7.29.5 - resolution: "@microsoft/api-extractor-model@npm:7.29.5" - dependencies: - "@microsoft/tsdoc": "npm:~0.15.0" - "@microsoft/tsdoc-config": "npm:~0.17.0" - "@rushstack/node-core-library": "npm:5.6.0" - checksum: 10c0/9140b0c3a99845d7c61a19172cce2007d893cf59195d3fe709c9c91e016eeecd395b71c2ecda243884db2c7c498297827ba2d5dd17bdf0fb46a2d0f4f3a1d744 - languageName: node - linkType: hard - -"@microsoft/api-extractor@npm:^7.47.6": - version: 7.47.6 - resolution: "@microsoft/api-extractor@npm:7.47.6" - dependencies: - "@microsoft/api-extractor-model": "npm:7.29.5" - "@microsoft/tsdoc": "npm:~0.15.0" - "@microsoft/tsdoc-config": "npm:~0.17.0" - "@rushstack/node-core-library": "npm:5.6.0" - "@rushstack/rig-package": "npm:0.5.3" - "@rushstack/terminal": "npm:0.13.4" - "@rushstack/ts-command-line": "npm:4.22.5" - lodash: "npm:~4.17.15" - minimatch: "npm:~3.0.3" - resolve: "npm:~1.22.1" - semver: "npm:~7.5.4" - source-map: "npm:~0.6.1" - typescript: "npm:5.4.2" - bin: - api-extractor: bin/api-extractor - checksum: 10c0/d8fe0b55fbe672b96b100668140b9cf2c5fbca830f3b1bc81aee0e3372bc47e451da2556547bea149e9df88adf53b4a47d5c7abc015c4072485d816613787289 - languageName: node - linkType: hard - -"@microsoft/tsdoc-config@npm:~0.17.0": - version: 0.17.0 - resolution: "@microsoft/tsdoc-config@npm:0.17.0" - dependencies: - "@microsoft/tsdoc": "npm:0.15.0" - ajv: "npm:~8.12.0" - jju: "npm:~1.4.0" - resolve: "npm:~1.22.2" - checksum: 10c0/9aa51b5b0fa93ad5c6a40ed1acf1f25c625b616efe29f2e5fa22ee9bddea12a4a39c833726e11ab592f20cfc9b8c3865978864dd02711d457fa971df3c091847 - languageName: node - linkType: hard - -"@microsoft/tsdoc@npm:0.15.0, @microsoft/tsdoc@npm:~0.15.0": - version: 0.15.0 - resolution: "@microsoft/tsdoc@npm:0.15.0" - checksum: 10c0/6beaf6e01ff54daeba69862cb3d27e03bbabfe299d23d0fade885f5b29bf98af01cecc746d23875fe60ba89514e3b630b71140b1b18d37301096f7a1e35451aa - languageName: node - linkType: hard - -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": "npm:2.0.5" - run-parallel: "npm:^1.1.9" - checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:1.2.8, @nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": "npm:2.1.5" - fastq: "npm:^1.6.0" - checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 - languageName: node - linkType: hard - -"@npmcli/agent@npm:^2.0.0": - version: 2.2.2 - resolution: "@npmcli/agent@npm:2.2.2" - dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/325e0db7b287d4154ecd164c0815c08007abfb07653cc57bceded17bb7fd240998a3cbdbe87d700e30bef494885eccc725ab73b668020811d56623d145b524ae - languageName: node - linkType: hard - -"@npmcli/fs@npm:^3.1.0": - version: 3.1.1 - resolution: "@npmcli/fs@npm:3.1.1" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/c37a5b4842bfdece3d14dfdb054f73fe15ed2d3da61b34ff76629fb5b1731647c49166fd2a8bf8b56fcfa51200382385ea8909a3cbecdad612310c114d3f6c99 - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd - languageName: node - linkType: hard - -"@pkgr/core@npm:^0.1.0": - version: 0.1.1 - resolution: "@pkgr/core@npm:0.1.1" - checksum: 10c0/3f7536bc7f57320ab2cf96f8973664bef624710c403357429fbf680a5c3b4843c1dbd389bb43daa6b1f6f1f007bb082f5abcb76bb2b5dc9f421647743b71d3d8 - languageName: node - linkType: hard - -"@pnpm/config.env-replace@npm:^1.1.0": - version: 1.1.0 - resolution: "@pnpm/config.env-replace@npm:1.1.0" - checksum: 10c0/4cfc4a5c49ab3d0c6a1f196cfd4146374768b0243d441c7de8fa7bd28eaab6290f514b98490472cc65dbd080d34369447b3e9302585e1d5c099befd7c8b5e55f - languageName: node - linkType: hard - -"@pnpm/network.ca-file@npm:^1.0.1": - version: 1.0.2 - resolution: "@pnpm/network.ca-file@npm:1.0.2" - dependencies: - graceful-fs: "npm:4.2.10" - checksum: 10c0/95f6e0e38d047aca3283550719155ce7304ac00d98911e4ab026daedaf640a63bd83e3d13e17c623fa41ac72f3801382ba21260bcce431c14fbbc06430ecb776 - languageName: node - linkType: hard - -"@pnpm/npm-conf@npm:^2.1.0": - version: 2.3.1 - resolution: "@pnpm/npm-conf@npm:2.3.1" - dependencies: - "@pnpm/config.env-replace": "npm:^1.1.0" - "@pnpm/network.ca-file": "npm:^1.0.1" - config-chain: "npm:^1.1.11" - checksum: 10c0/778a3a34ff7d6000a2594d2a9821f873f737bc56367865718b2cf0ba5d366e49689efe7975148316d7afd8e6f1dcef7d736fbb6ea7ef55caadd1dc93a36bb302 - languageName: node - linkType: hard - -"@polka/url@npm:^1.0.0-next.24": - version: 1.0.0-next.25 - resolution: "@polka/url@npm:1.0.0-next.25" - checksum: 10c0/ef61f0a0fe94bb6e1143fc5b9d5a12e6ca9dbd2c57843ebf81db432c21b9f1005c09e8a1ef8b6d5ddfa42146ca65b640feb2d353bd0d3546da46ba59e48a5349 - languageName: node - linkType: hard - -"@prettier/plugin-xml@npm:^3.4.1": - version: 3.4.1 - resolution: "@prettier/plugin-xml@npm:3.4.1" - dependencies: - "@xml-tools/parser": "npm:^1.0.11" - peerDependencies: - prettier: ^3.0.0 - checksum: 10c0/39bdc3d6e475ed4f804ea4dad8ad66c1e36743935eefde87bf9a68c44434695e74e52c8c6d70239de12dae141153f8979cce0b1c5c8f820693ff1f62bbe66044 - languageName: node - linkType: hard - -"@rollup/plugin-alias@npm:^5.0.0": - version: 5.1.0 - resolution: "@rollup/plugin-alias@npm:5.1.0" - dependencies: - slash: "npm:^4.0.0" - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10c0/fcae5d711b66c098cd237e09e3000e7dec27cf8b0fa82f5a9cd437c4d8d9428194f51d12822b8593b49f3d9e51c6df6a583037cab35763d92555f9c7fcb0db3d - languageName: node - linkType: hard - -"@rollup/plugin-commonjs@npm:^25.0.4": - version: 25.0.8 - resolution: "@rollup/plugin-commonjs@npm:25.0.8" - dependencies: - "@rollup/pluginutils": "npm:^5.0.1" - commondir: "npm:^1.0.1" - estree-walker: "npm:^2.0.2" - glob: "npm:^8.0.3" - is-reference: "npm:1.2.1" - magic-string: "npm:^0.30.3" - peerDependencies: - rollup: ^2.68.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10c0/00d6fe41c33476dcb4b4ac3068f869b8537153646ea18f1fb9d0dfd5592792148567dd735d58ac15e2fdd4ed6c98453d20fe5343105f8cfa93d291198c9a90f5 - languageName: node - linkType: hard - -"@rollup/plugin-json@npm:^6.0.0": - version: 6.1.0 - resolution: "@rollup/plugin-json@npm:6.1.0" - dependencies: - "@rollup/pluginutils": "npm:^5.1.0" - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10c0/9400c431b5e0cf3088ba2eb2d038809a2b0fb2a84ed004997da85582f48cd64958ed3168893c4f2c8109e38652400ed68282d0c92bf8ec07a3b2ef2e1ceab0b7 - languageName: node - linkType: hard - -"@rollup/plugin-node-resolve@npm:^15.2.1": - version: 15.2.3 - resolution: "@rollup/plugin-node-resolve@npm:15.2.3" - dependencies: - "@rollup/pluginutils": "npm:^5.0.1" - "@types/resolve": "npm:1.20.2" - deepmerge: "npm:^4.2.2" - is-builtin-module: "npm:^3.2.1" - is-module: "npm:^1.0.0" - resolve: "npm:^1.22.1" - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10c0/598c15615086f26e28c4b3dbf966682af7fb0e5bc277cc4e57f559668a3be675a63ab261eb34729ce9569c3a51342c48863e50b5efe02e0fc1571828f0113f9d - languageName: node - linkType: hard - -"@rollup/plugin-replace@npm:^5.0.2": - version: 5.0.7 - resolution: "@rollup/plugin-replace@npm:5.0.7" - dependencies: - "@rollup/pluginutils": "npm:^5.0.1" - magic-string: "npm:^0.30.3" - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10c0/1732af42febdb42d96fd7916b65ca94a550a028d1ea5efa40d5d7a99ab3c336e41efac14a77eefef18b956b4b7335969c6252f2a22bf0223dc8b4a7a53f89ed3 - languageName: node - linkType: hard - -"@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.0.3, @rollup/pluginutils@npm:^5.1.0": - version: 5.1.0 - resolution: "@rollup/pluginutils@npm:5.1.0" - dependencies: - "@types/estree": "npm:^1.0.0" - estree-walker: "npm:^2.0.2" - picomatch: "npm:^2.3.1" - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10c0/c7bed15711f942d6fdd3470fef4105b73991f99a478605e13d41888963330a6f9e32be37e6ddb13f012bc7673ff5e54f06f59fd47109436c1c513986a8a7612d - languageName: node - linkType: hard - -"@rushstack/node-core-library@npm:5.6.0": - version: 5.6.0 - resolution: "@rushstack/node-core-library@npm:5.6.0" - dependencies: - ajv: "npm:~8.13.0" - ajv-draft-04: "npm:~1.0.0" - ajv-formats: "npm:~3.0.1" - fs-extra: "npm:~7.0.1" - import-lazy: "npm:~4.0.0" - jju: "npm:~1.4.0" - resolve: "npm:~1.22.1" - semver: "npm:~7.5.4" - peerDependencies: - "@types/node": "*" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/9bf0069537590436bf8de047c53e0c9e12526f914e1161bc551560a9a76335f63d2bea33c0eae32a3185dffc944fe38a51c4b85d1c737aca8cebc1cc0329d5e3 - languageName: node - linkType: hard - -"@rushstack/rig-package@npm:0.5.3": - version: 0.5.3 - resolution: "@rushstack/rig-package@npm:0.5.3" - dependencies: - resolve: "npm:~1.22.1" - strip-json-comments: "npm:~3.1.1" - checksum: 10c0/ef0b0115b60007f965b875f671019ac7fc26592f6bf7d7b40fa8c68e8dc37e9f7dcda3b5533b489ebf04d28a182dc60987bfd365a8d4173c73d482b270647741 - languageName: node - linkType: hard - -"@rushstack/terminal@npm:0.13.4": - version: 0.13.4 - resolution: "@rushstack/terminal@npm:0.13.4" - dependencies: - "@rushstack/node-core-library": "npm:5.6.0" - supports-color: "npm:~8.1.1" - peerDependencies: - "@types/node": "*" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/017517200f2405d84a6330b4a9d3cf58a327d5a69036befd9e9527fe895a60abdb2055edf2e5891e09e19c784433b11c3b91823d7c46d7202b1e19628a9973b1 - languageName: node - linkType: hard - -"@rushstack/ts-command-line@npm:4.22.5": - version: 4.22.5 - resolution: "@rushstack/ts-command-line@npm:4.22.5" - dependencies: - "@rushstack/terminal": "npm:0.13.4" - "@types/argparse": "npm:1.0.38" - argparse: "npm:~1.0.9" - string-argv: "npm:~0.3.1" - checksum: 10c0/7755bbe81ba5a98dc6458e5f0cfb408d74a63210fb9888d2573af910ef1e887289bab5882f8da930a4f57f0688b1a7ad8bba4219104896ea56f268777fb410ca - languageName: node - linkType: hard - -"@sec-ant/readable-stream@npm:^0.4.1": - version: 0.4.1 - resolution: "@sec-ant/readable-stream@npm:0.4.1" - checksum: 10c0/64e9e9cf161e848067a5bf60cdc04d18495dc28bb63a8d9f8993e4dd99b91ad34e4b563c85de17d91ffb177ec17a0664991d2e115f6543e73236a906068987af - languageName: node - linkType: hard - -"@shikijs/core@npm:1.14.1": - version: 1.14.1 - resolution: "@shikijs/core@npm:1.14.1" - dependencies: - "@types/hast": "npm:^3.0.4" - checksum: 10c0/a9779634956010788f346f779a8e445d17101cae64e6769a7a4d6d479ccd5d47e6c897fd7a57445cea6b64f1b79f1126ff4f57dbc6ce28c1533f6b74450d752f - languageName: node - linkType: hard - -"@sideway/address@npm:^4.1.5": - version: 4.1.5 - resolution: "@sideway/address@npm:4.1.5" - dependencies: - "@hapi/hoek": "npm:^9.0.0" - checksum: 10c0/638eb6f7e7dba209053dd6c8da74d7cc995e2b791b97644d0303a7dd3119263bcb7225a4f6804d4db2bc4f96e5a9d262975a014f58eae4d1753c27cbc96ef959 - languageName: node - linkType: hard - -"@sideway/formula@npm:^3.0.1": - version: 3.0.1 - resolution: "@sideway/formula@npm:3.0.1" - checksum: 10c0/3fe81fa9662efc076bf41612b060eb9b02e846ea4bea5bd114f1662b7f1541e9dedcf98aff0d24400bcb92f113964a50e0290b86e284edbdf6346fa9b7e2bf2c - languageName: node - linkType: hard - -"@sideway/pinpoint@npm:^2.0.0": - version: 2.0.0 - resolution: "@sideway/pinpoint@npm:2.0.0" - checksum: 10c0/d2ca75dacaf69b8fc0bb8916a204e01def3105ee44d8be16c355e5f58189eb94039e15ce831f3d544f229889ccfa35562a0ce2516179f3a7ee1bbe0b71e55b36 - languageName: node - linkType: hard - -"@sinclair/typebox@npm:^0.27.8": - version: 0.27.8 - resolution: "@sinclair/typebox@npm:0.27.8" - checksum: 10c0/ef6351ae073c45c2ac89494dbb3e1f87cc60a93ce4cde797b782812b6f97da0d620ae81973f104b43c9b7eaa789ad20ba4f6a1359f1cc62f63729a55a7d22d4e - languageName: node - linkType: hard - -"@sindresorhus/is@npm:^4.6.0": - version: 4.6.0 - resolution: "@sindresorhus/is@npm:4.6.0" - checksum: 10c0/33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e - languageName: node - linkType: hard - -"@sindresorhus/is@npm:^5.2.0": - version: 5.6.0 - resolution: "@sindresorhus/is@npm:5.6.0" - checksum: 10c0/66727344d0c92edde5760b5fd1f8092b717f2298a162a5f7f29e4953e001479927402d9d387e245fb9dc7d3b37c72e335e93ed5875edfc5203c53be8ecba1b52 - languageName: node - linkType: hard - -"@sindresorhus/merge-streams@npm:^2.1.0": - version: 2.3.0 - resolution: "@sindresorhus/merge-streams@npm:2.3.0" - checksum: 10c0/69ee906f3125fb2c6bb6ec5cdd84e8827d93b49b3892bce8b62267116cc7e197b5cccf20c160a1d32c26014ecd14470a72a5e3ee37a58f1d6dadc0db1ccf3894 - languageName: node - linkType: hard - -"@sindresorhus/merge-streams@npm:^4.0.0": - version: 4.0.0 - resolution: "@sindresorhus/merge-streams@npm:4.0.0" - checksum: 10c0/482ee543629aa1933b332f811a1ae805a213681ecdd98c042b1c1b89387df63e7812248bb4df3910b02b3cc5589d3d73e4393f30e197c9dde18046ccd471fc6b - languageName: node - linkType: hard - -"@sinonjs/commons@npm:^3.0.0": - version: 3.0.1 - resolution: "@sinonjs/commons@npm:3.0.1" - dependencies: - type-detect: "npm:4.0.8" - checksum: 10c0/1227a7b5bd6c6f9584274db996d7f8cee2c8c350534b9d0141fc662eaf1f292ea0ae3ed19e5e5271c8fd390d27e492ca2803acd31a1978be2cdc6be0da711403 - languageName: node - linkType: hard - -"@sinonjs/fake-timers@npm:^10.0.2": - version: 10.3.0 - resolution: "@sinonjs/fake-timers@npm:10.3.0" - dependencies: - "@sinonjs/commons": "npm:^3.0.0" - checksum: 10c0/2e2fb6cc57f227912814085b7b01fede050cd4746ea8d49a1e44d5a0e56a804663b0340ae2f11af7559ea9bf4d087a11f2f646197a660ea3cb04e19efc04aa63 - languageName: node - linkType: hard - -"@slorber/remark-comment@npm:^1.0.0": - version: 1.0.0 - resolution: "@slorber/remark-comment@npm:1.0.0" - dependencies: - micromark-factory-space: "npm:^1.0.0" - micromark-util-character: "npm:^1.1.0" - micromark-util-symbol: "npm:^1.0.1" - checksum: 10c0/b8da9d8f560740959c421d3ce5be43952eace1c95cb65402d9473a15e66463346a37fb5f121a6b22a83af51e8845b0b4ff3c321f14ce31bd58fb126acf6c8ed9 - languageName: node - linkType: hard - -"@snyk/github-codeowners@npm:1.1.0": - version: 1.1.0 - resolution: "@snyk/github-codeowners@npm:1.1.0" - dependencies: - commander: "npm:^4.1.1" - ignore: "npm:^5.1.8" - p-map: "npm:^4.0.0" - bin: - github-codeowners: dist/cli.js - checksum: 10c0/92d860a904a1e67f8563d4ac4d540cc613f71193f7968933b4a4b1526e80a97f536f52d27762c158e3e39d48c2f3db4906ec78846309351c741abb1a28653af9 - languageName: node - linkType: hard - -"@stylistic/eslint-plugin-js@npm:2.6.4, @stylistic/eslint-plugin-js@npm:^2.6.4": - version: 2.6.4 - resolution: "@stylistic/eslint-plugin-js@npm:2.6.4" - dependencies: - "@types/eslint": "npm:^9.6.0" - acorn: "npm:^8.12.1" - eslint-visitor-keys: "npm:^4.0.0" - espree: "npm:^10.1.0" - peerDependencies: - eslint: ">=8.40.0" - checksum: 10c0/8795f25bc395c40f7938bfd4c4dc39a120f1f32fcfad0353f0187f3fe1f543a141435e5b10a0a5f3892727a7b18939e85161bf50e577054619fec0925f24edf8 - languageName: node - linkType: hard - -"@stylistic/eslint-plugin-jsx@npm:2.6.4": - version: 2.6.4 - resolution: "@stylistic/eslint-plugin-jsx@npm:2.6.4" - dependencies: - "@stylistic/eslint-plugin-js": "npm:^2.6.4" - "@types/eslint": "npm:^9.6.0" - eslint-visitor-keys: "npm:^4.0.0" - espree: "npm:^10.1.0" - estraverse: "npm:^5.3.0" - picomatch: "npm:^4.0.2" - peerDependencies: - eslint: ">=8.40.0" - checksum: 10c0/61d9c397c466d20870ceb4210d32c5cd44958a420118c47a20847b102f4fa013a2d55ff7dc5a0ef1ba8f9feae67874e4edd6284a7f2b3b9ed73bf0cad33e6ef2 - languageName: node - linkType: hard - -"@stylistic/eslint-plugin-plus@npm:2.6.4": - version: 2.6.4 - resolution: "@stylistic/eslint-plugin-plus@npm:2.6.4" - dependencies: - "@types/eslint": "npm:^9.6.0" - peerDependencies: - eslint: "*" - checksum: 10c0/5b71c3b669349009bb4d4271a9aba1b5798562ec3ce03d123873cfa64c82be6553738507759542536645ec36dc31459000963dbcb63552148a990b96c340d5c9 - languageName: node - linkType: hard - -"@stylistic/eslint-plugin-ts@npm:2.6.4": - version: 2.6.4 - resolution: "@stylistic/eslint-plugin-ts@npm:2.6.4" - dependencies: - "@stylistic/eslint-plugin-js": "npm:2.6.4" - "@types/eslint": "npm:^9.6.0" - "@typescript-eslint/utils": "npm:^8.1.0" - peerDependencies: - eslint: ">=8.40.0" - checksum: 10c0/764493c4b651a5e5e95a2fdb3518c87593f42590decfb894d92b3d45d6a118fff29f1c024b53964e695f439b1415cd58561ea823a19a8735a8693af6eb907dae - languageName: node - linkType: hard - -"@stylistic/eslint-plugin@npm:^2.6.4": - version: 2.6.4 - resolution: "@stylistic/eslint-plugin@npm:2.6.4" - dependencies: - "@stylistic/eslint-plugin-js": "npm:2.6.4" - "@stylistic/eslint-plugin-jsx": "npm:2.6.4" - "@stylistic/eslint-plugin-plus": "npm:2.6.4" - "@stylistic/eslint-plugin-ts": "npm:2.6.4" - "@types/eslint": "npm:^9.6.0" - peerDependencies: - eslint: ">=8.40.0" - checksum: 10c0/ca631323929aef3ae5dd0419f6b4ebbface235f1d3bb304b0c16a2f957b123107889d21bdf62d3a10f997aa0ab21c31a20f2ae6e713961055246c9fdf3aadcd7 - languageName: node - linkType: hard - -"@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/a50bd0baa34faf16bcba712091f94c7f0e230431fe99a9dfc3401fa92823ad3f68495b86ab9bf9044b53839e8c416cfbb37eb3f246ff33f261e0fa9ee1779c5b - languageName: node - linkType: hard - -"@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/8a98e59bd9971e066815b4129409932f7a4db4866834fe75677ea6d517972fb40b380a69a4413189f20e7947411f9ab1b0f029dd5e8068686a5a0188d3ccd4c7 - languageName: node - linkType: hard - -"@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/517dcca75223bd05d3f056a8514dbba3031278bea4eadf0842c576d84f4651e7a4e0e7082d3ee4ef42456de0f9c4531d8a1917c04876ca64b014b859ca8f1bde - languageName: node - linkType: hard - -"@svgr/babel-plugin-replace-jsx-attribute-value@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/004bd1892053b7e9c1b0bb14acc44e77634ec393722b87b1e4fae53e2c35122a2dd0d5c15e9070dbeec274e22e7693a2b8b48506733a8009ee92b12946fcb10a - languageName: node - linkType: hard - -"@svgr/babel-plugin-svg-dynamic-title@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/80e0a7fcf902f984c705051ca5c82ea6050ccbb70b651a8fea6d0eb5809e4dac274b49ea6be2d87f1eb9dfc0e2d6cdfffe1669ec2117f44b67a60a07d4c0b8b8 - languageName: node - linkType: hard - -"@svgr/babel-plugin-svg-em-dimensions@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/73e92c8277a89279745c0c500f59f083279a8dc30cd552b22981fade2a77628fb2bd2819ee505725fcd2e93f923e3790b52efcff409a159e657b46604a0b9a21 - languageName: node - linkType: hard - -"@svgr/babel-plugin-transform-react-native-svg@npm:8.1.0": - version: 8.1.0 - resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:8.1.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/655ed6bc7a208ceaa4ecff0a54ccc36008c3cb31efa90d11e171cab325ebbb21aa78f09c7b65f9b3ddeda3a85f348c0c862902c48be13c14b4de165c847974e3 - languageName: node - linkType: hard - -"@svgr/babel-plugin-transform-svg-component@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-plugin-transform-svg-component@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/4ac00bb99a3db4ef05e4362f116a3c608ee365a2d26cf7318d8d41a4a5b30a02c80455cce0e62c65b60ed815b5d632bedabac2ccd4b56f998fadef5286e3ded4 - languageName: node - linkType: hard - -"@svgr/babel-preset@npm:8.1.0": - version: 8.1.0 - resolution: "@svgr/babel-preset@npm:8.1.0" - dependencies: - "@svgr/babel-plugin-add-jsx-attribute": "npm:8.0.0" - "@svgr/babel-plugin-remove-jsx-attribute": "npm:8.0.0" - "@svgr/babel-plugin-remove-jsx-empty-expression": "npm:8.0.0" - "@svgr/babel-plugin-replace-jsx-attribute-value": "npm:8.0.0" - "@svgr/babel-plugin-svg-dynamic-title": "npm:8.0.0" - "@svgr/babel-plugin-svg-em-dimensions": "npm:8.0.0" - "@svgr/babel-plugin-transform-react-native-svg": "npm:8.1.0" - "@svgr/babel-plugin-transform-svg-component": "npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/49367d3ad0831f79b1056871b91766246f449d4d1168623af5e283fbaefce4a01d77ab00de6b045b55e956f9aae27895823198493cd232d88d3435ea4517ffc5 - languageName: node - linkType: hard - -"@svgr/core@npm:8.1.0": - version: 8.1.0 - resolution: "@svgr/core@npm:8.1.0" - dependencies: - "@babel/core": "npm:^7.21.3" - "@svgr/babel-preset": "npm:8.1.0" - camelcase: "npm:^6.2.0" - cosmiconfig: "npm:^8.1.3" - snake-case: "npm:^3.0.4" - checksum: 10c0/6a2f6b1bc79bce39f66f088d468985d518005fc5147ebf4f108570a933818b5951c2cb7da230ddff4b7c8028b5a672b2d33aa2acce012b8b9770073aa5a2d041 - languageName: node - linkType: hard - -"@svgr/hast-util-to-babel-ast@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/hast-util-to-babel-ast@npm:8.0.0" - dependencies: - "@babel/types": "npm:^7.21.3" - entities: "npm:^4.4.0" - checksum: 10c0/f4165b583ba9eaf6719e598977a7b3ed182f177983e55f9eb55a6a73982d81277510e9eb7ab41f255151fb9ed4edd11ac4bef95dd872f04ed64966d8c85e0f79 - languageName: node - linkType: hard - -"@svgr/plugin-jsx@npm:8.1.0": - version: 8.1.0 - resolution: "@svgr/plugin-jsx@npm:8.1.0" - dependencies: - "@babel/core": "npm:^7.21.3" - "@svgr/babel-preset": "npm:8.1.0" - "@svgr/hast-util-to-babel-ast": "npm:8.0.0" - svg-parser: "npm:^2.0.4" - peerDependencies: - "@svgr/core": "*" - checksum: 10c0/07b4d9e00de795540bf70556fa2cc258774d01e97a12a26234c6fdf42b309beb7c10f31ee24d1a71137239347b1547b8bb5587d3a6de10669f95dcfe99cddc56 - languageName: node - linkType: hard - -"@svgr/plugin-svgo@npm:8.1.0": - version: 8.1.0 - resolution: "@svgr/plugin-svgo@npm:8.1.0" - dependencies: - cosmiconfig: "npm:^8.1.3" - deepmerge: "npm:^4.3.1" - svgo: "npm:^3.0.2" - peerDependencies: - "@svgr/core": "*" - checksum: 10c0/bfd25460f23f1548bfb8f6f3bedd6d6972c1a4f8881bd35a4f8c115218da6e999e8f9ac0ef0ed88c4e0b93fcec37f382b94c0322f4ec2b26752a89e5cc8b9d7a - languageName: node - linkType: hard - -"@svgr/webpack@npm:^8.1.0": - version: 8.1.0 - resolution: "@svgr/webpack@npm:8.1.0" - dependencies: - "@babel/core": "npm:^7.21.3" - "@babel/plugin-transform-react-constant-elements": "npm:^7.21.3" - "@babel/preset-env": "npm:^7.20.2" - "@babel/preset-react": "npm:^7.18.6" - "@babel/preset-typescript": "npm:^7.21.0" - "@svgr/core": "npm:8.1.0" - "@svgr/plugin-jsx": "npm:8.1.0" - "@svgr/plugin-svgo": "npm:8.1.0" - checksum: 10c0/4c1cac45bd5890de8643e5a7bfb71f3bcd8b85ae5bbacf10b8ad9f939b7a98e8d601c3ada204ffb95223abf4a24beeac5a2a0d6928a52a1ab72a29da3c015c22 - languageName: node - linkType: hard - -"@szmarczak/http-timer@npm:^5.0.1": - version: 5.0.1 - resolution: "@szmarczak/http-timer@npm:5.0.1" - dependencies: - defer-to-connect: "npm:^2.0.1" - checksum: 10c0/4629d2fbb2ea67c2e9dc03af235c0991c79ebdddcbc19aed5d5732fb29ce01c13331e9b1a491584b9069bd6ecde6581dcbf871f11b7eefdebbab34de6cf2197e - languageName: node - linkType: hard - -"@trysound/sax@npm:0.2.0": - version: 0.2.0 - resolution: "@trysound/sax@npm:0.2.0" - checksum: 10c0/44907308549ce775a41c38a815f747009ac45929a45d642b836aa6b0a536e4978d30b8d7d680bbd116e9dd73b7dbe2ef0d1369dcfc2d09e83ba381e485ecbe12 - languageName: node - linkType: hard - -"@ts-morph/common@npm:~0.18.0": - version: 0.18.1 - resolution: "@ts-morph/common@npm:0.18.1" - dependencies: - fast-glob: "npm:^3.2.12" - minimatch: "npm:^5.1.0" - mkdirp: "npm:^1.0.4" - path-browserify: "npm:^1.0.1" - checksum: 10c0/7922a3e7e183090e2c326578d1ead07427b6cf316d0b390efa25f06e8d7b09085ffb23446b2cc7655dbee48a1b9330370862c1a411313eb1991a0daa9ac5e3da - languageName: node - linkType: hard - -"@tsconfig/node-lts@npm:^20.1.3": - version: 20.1.3 - resolution: "@tsconfig/node-lts@npm:20.1.3" - checksum: 10c0/60a43989c6cd8677c70f22f0cf5455e01a7299cf9ebe6f1158a41506080fe8bacbe01a8d948ec71a83142bb43290485dc89a29ce620056757ba3b9062c50537a - languageName: node - linkType: hard - -"@tsconfig/strictest@npm:^2.0.5": - version: 2.0.5 - resolution: "@tsconfig/strictest@npm:2.0.5" - checksum: 10c0/cfc86da2d57f7b4b0827701b132c37a4974284e5c40649656c0e474866dfd8a69f57c6718230d8a8139967e2a95438586b8224c13ab0ff9d3a43eda771c50cc4 - languageName: node - linkType: hard - -"@types/acorn@npm:^4.0.0": - version: 4.0.6 - resolution: "@types/acorn@npm:4.0.6" - dependencies: - "@types/estree": "npm:*" - checksum: 10c0/5a65a1d7e91fc95703f0a717897be60fa7ccd34b17f5462056274a246e6690259fe0a1baabc86fd3260354f87245cb3dc483346d7faad2b78fc199763978ede9 - languageName: node - linkType: hard - -"@types/argparse@npm:1.0.38": - version: 1.0.38 - resolution: "@types/argparse@npm:1.0.38" - checksum: 10c0/4fc892da5df16923f48180da2d1f4562fa8b0507cf636b24780444fa0a1d7321d4dc0c0ecbee6152968823f5a2ae0d321b4f8c705a489bf1ae1245bdeb0868fd - languageName: node - linkType: hard - -"@types/babel__core@npm:^7.1.14": - version: 7.20.5 - resolution: "@types/babel__core@npm:7.20.5" - dependencies: - "@babel/parser": "npm:^7.20.7" - "@babel/types": "npm:^7.20.7" - "@types/babel__generator": "npm:*" - "@types/babel__template": "npm:*" - "@types/babel__traverse": "npm:*" - checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff - languageName: node - linkType: hard - -"@types/babel__generator@npm:*": - version: 7.6.8 - resolution: "@types/babel__generator@npm:7.6.8" - dependencies: - "@babel/types": "npm:^7.0.0" - checksum: 10c0/f0ba105e7d2296bf367d6e055bb22996886c114261e2cb70bf9359556d0076c7a57239d019dee42bb063f565bade5ccb46009bce2044b2952d964bf9a454d6d2 - languageName: node - linkType: hard - -"@types/babel__template@npm:*": - version: 7.4.4 - resolution: "@types/babel__template@npm:7.4.4" - dependencies: - "@babel/parser": "npm:^7.1.0" - "@babel/types": "npm:^7.0.0" - checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b - languageName: node - linkType: hard - -"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": - version: 7.20.6 - resolution: "@types/babel__traverse@npm:7.20.6" - dependencies: - "@babel/types": "npm:^7.20.7" - checksum: 10c0/7ba7db61a53e28cac955aa99af280d2600f15a8c056619c05b6fc911cbe02c61aa4f2823299221b23ce0cce00b294c0e5f618ec772aa3f247523c2e48cf7b888 - languageName: node - linkType: hard - -"@types/body-parser@npm:*": - version: 1.19.5 - resolution: "@types/body-parser@npm:1.19.5" - dependencies: - "@types/connect": "npm:*" - "@types/node": "npm:*" - checksum: 10c0/aebeb200f25e8818d8cf39cd0209026750d77c9b85381cdd8deeb50913e4d18a1ebe4b74ca9b0b4d21952511eeaba5e9fbbf739b52731a2061e206ec60d568df - languageName: node - linkType: hard - -"@types/bonjour@npm:^3.5.9": - version: 3.5.13 - resolution: "@types/bonjour@npm:3.5.13" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/eebedbca185ac3c39dd5992ef18d9e2a9f99e7f3c2f52f5561f90e9ed482c5d224c7962db95362712f580ed5713264e777a98d8f0bd8747f4eadf62937baed16 - languageName: node - linkType: hard - -"@types/command-exists@npm:^1.2.3": - version: 1.2.3 - resolution: "@types/command-exists@npm:1.2.3" - checksum: 10c0/8e92b72b2e4e85bab6b832b9b95bc0f11b7f2c3b94ffe1ffc577fe70af699d901969e49a6307782bb262c195368ab78111db2fddda4a7dc1c218e319f2b63b9a - languageName: node - linkType: hard - -"@types/confusing-browser-globals@npm:^1.0.3": - version: 1.0.3 - resolution: "@types/confusing-browser-globals@npm:1.0.3" - checksum: 10c0/65aa3a176b695d5a724aba800d5f7027e9f825a39ab9742ac51addb926f0f2ddfdc719e962bdd82c18cc858bc6daa5b283362c8773303ee9fc06a8360fe93049 - languageName: node - linkType: hard - -"@types/connect-history-api-fallback@npm:^1.3.5": - version: 1.5.4 - resolution: "@types/connect-history-api-fallback@npm:1.5.4" - dependencies: - "@types/express-serve-static-core": "npm:*" - "@types/node": "npm:*" - checksum: 10c0/1b4035b627dcd714b05a22557f942e24a57ca48e7377dde0d2f86313fe685bc0a6566512a73257a55b5665b96c3041fb29228ac93331d8133011716215de8244 - languageName: node - linkType: hard - -"@types/connect@npm:*": - version: 3.4.38 - resolution: "@types/connect@npm:3.4.38" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c - languageName: node - linkType: hard - -"@types/debug@npm:^4.0.0": - version: 4.1.12 - resolution: "@types/debug@npm:4.1.12" - dependencies: - "@types/ms": "npm:*" - checksum: 10c0/5dcd465edbb5a7f226e9a5efd1f399c6172407ef5840686b73e3608ce135eeca54ae8037dcd9f16bdb2768ac74925b820a8b9ecc588a58ca09eca6acabe33e2f - languageName: node - linkType: hard - -"@types/diff@npm:^5.2.1": - version: 5.2.1 - resolution: "@types/diff@npm:5.2.1" - checksum: 10c0/62dcab32197ac67f212939cdd79aa3953327a482bec55c6a38ad9de8a0662a9f920b59504609a322fc242593bd9afb3d2704702f4bc98087a13171234b952361 - languageName: node - linkType: hard - -"@types/eslint-config-prettier@npm:^6.11.3": - version: 6.11.3 - resolution: "@types/eslint-config-prettier@npm:6.11.3" - checksum: 10c0/e49ef5b2cf9bfa173d678f50b392511e5567743a864552257978fcf98a876adcd41bb2fa074505ab4aae94862fb349eda2cf41aec698a4a1db77a2731b1fa1c6 - languageName: node - linkType: hard - -"@types/eslint-scope@npm:^3.7.3": - version: 3.7.7 - resolution: "@types/eslint-scope@npm:3.7.7" - dependencies: - "@types/eslint": "npm:*" - "@types/estree": "npm:*" - checksum: 10c0/a0ecbdf2f03912679440550817ff77ef39a30fa8bfdacaf6372b88b1f931828aec392f52283240f0d648cf3055c5ddc564544a626bcf245f3d09fcb099ebe3cc - languageName: node - linkType: hard - -"@types/eslint@npm:*, @types/eslint@npm:^9.6.0": - version: 9.6.0 - resolution: "@types/eslint@npm:9.6.0" - dependencies: - "@types/estree": "npm:*" - "@types/json-schema": "npm:*" - checksum: 10c0/69301356bc73b85e381ae00931291de2e96d1cc49a112c592c74ee32b2f85412203dea6a333b4315fd9839bb14f364f265cbfe7743fc5a78492ee0326dd6a2c1 - languageName: node - linkType: hard - -"@types/eslint__eslintrc@npm:^2.1.2": - version: 2.1.2 - resolution: "@types/eslint__eslintrc@npm:2.1.2" - dependencies: - "@types/eslint": "npm:*" - checksum: 10c0/ccbeb74886fbbee1b016ed9c920ad932cb0b970c42eec4cea27e04c2640d5a92c20e44d4610de73551c4c8f658963a769ddc9fd75eac72edf33f035129600637 - languageName: node - linkType: hard - -"@types/eslint__js@npm:^8.42.3": - version: 8.42.3 - resolution: "@types/eslint__js@npm:8.42.3" - dependencies: - "@types/eslint": "npm:*" - checksum: 10c0/ccc5180b92155929a089ffb03ed62625216dcd5e46dd3197c6f82370ce8b52c7cb9df66c06b0a3017995409e023bc9eafe5a3f009e391960eacefaa1b62d9a56 - languageName: node - linkType: hard - -"@types/estree-jsx@npm:^1.0.0": - version: 1.0.5 - resolution: "@types/estree-jsx@npm:1.0.5" - dependencies: - "@types/estree": "npm:*" - checksum: 10c0/07b354331516428b27a3ab99ee397547d47eb223c34053b48f84872fafb841770834b90cc1a0068398e7c7ccb15ec51ab00ec64b31dc5e3dbefd624638a35c6d - languageName: node - linkType: hard - -"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d - languageName: node - linkType: hard - -"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": - version: 4.19.5 - resolution: "@types/express-serve-static-core@npm:4.19.5" - dependencies: - "@types/node": "npm:*" - "@types/qs": "npm:*" - "@types/range-parser": "npm:*" - "@types/send": "npm:*" - checksum: 10c0/ba8d8d976ab797b2602c60e728802ff0c98a00f13d420d82770f3661b67fa36ea9d3be0b94f2ddd632afe1fbc6e41620008b01db7e4fabdd71a2beb5539b0725 - languageName: node - linkType: hard - -"@types/express@npm:*, @types/express@npm:^4.17.13": - version: 4.17.21 - resolution: "@types/express@npm:4.17.21" - dependencies: - "@types/body-parser": "npm:*" - "@types/express-serve-static-core": "npm:^4.17.33" - "@types/qs": "npm:*" - "@types/serve-static": "npm:*" - checksum: 10c0/12e562c4571da50c7d239e117e688dc434db1bac8be55613294762f84fd77fbd0658ccd553c7d3ab02408f385bc93980992369dd30e2ecd2c68c358e6af8fabf - languageName: node - linkType: hard - -"@types/figlet@npm:^1.5.8": - version: 1.5.8 - resolution: "@types/figlet@npm:1.5.8" - checksum: 10c0/b61385ca7d7c7716a7ee63d421b24d851fbe9ea43e67a746e0f90212fa6502fe9e34bf5b5e6761c363b828cd87eb953fc55b2f48bfe2801c309e0077230474c3 - languageName: node - linkType: hard - -"@types/glob@npm:^8.1.0": - version: 8.1.0 - resolution: "@types/glob@npm:8.1.0" - dependencies: - "@types/minimatch": "npm:^5.1.2" - "@types/node": "npm:*" - checksum: 10c0/ded07aa0d7a1caf3c47b85e262be82989ccd7933b4a14712b79c82fd45a239249811d9fc3a135b3e9457afa163e74a297033d7245b0dc63cd3d032f3906b053f - languageName: node - linkType: hard - -"@types/graceful-fs@npm:^4.1.3": - version: 4.1.9 - resolution: "@types/graceful-fs@npm:4.1.9" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/235d2fc69741448e853333b7c3d1180a966dd2b8972c8cbcd6b2a0c6cd7f8d582ab2b8e58219dbc62cce8f1b40aa317ff78ea2201cdd8249da5025adebed6f0b - languageName: node - linkType: hard - -"@types/gtag.js@npm:^0.0.12": - version: 0.0.12 - resolution: "@types/gtag.js@npm:0.0.12" - checksum: 10c0/fee8f4c6e627301b89ab616c9e219bd53fa6ea1ffd1d0a8021e21363f0bdb2cf7eb1a5bcda0c6f1502186379bc7784ec29c932e21634f4e07f9e7a8c56887400 - languageName: node - linkType: hard - -"@types/hast@npm:^3.0.0, @types/hast@npm:^3.0.4": - version: 3.0.4 - resolution: "@types/hast@npm:3.0.4" - dependencies: - "@types/unist": "npm:*" - checksum: 10c0/3249781a511b38f1d330fd1e3344eed3c4e7ea8eff82e835d35da78e637480d36fad37a78be5a7aed8465d237ad0446abc1150859d0fde395354ea634decf9f7 - languageName: node - linkType: hard - -"@types/history@npm:^4.7.11": - version: 4.7.11 - resolution: "@types/history@npm:4.7.11" - checksum: 10c0/3facf37c2493d1f92b2e93a22cac7ea70b06351c2ab9aaceaa3c56aa6099fb63516f6c4ec1616deb5c56b4093c026a043ea2d3373e6c0644d55710364d02c934 - languageName: node - linkType: hard - -"@types/html-minifier-terser@npm:^6.0.0": - version: 6.1.0 - resolution: "@types/html-minifier-terser@npm:6.1.0" - checksum: 10c0/a62fb8588e2f3818d82a2d7b953ad60a4a52fd767ae04671de1c16f5788bd72f1ed3a6109ed63fd190c06a37d919e3c39d8adbc1793a005def76c15a3f5f5dab - languageName: node - linkType: hard - -"@types/http-cache-semantics@npm:^4.0.2": - version: 4.0.4 - resolution: "@types/http-cache-semantics@npm:4.0.4" - checksum: 10c0/51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6 - languageName: node - linkType: hard - -"@types/http-errors@npm:*": - version: 2.0.4 - resolution: "@types/http-errors@npm:2.0.4" - checksum: 10c0/494670a57ad4062fee6c575047ad5782506dd35a6b9ed3894cea65830a94367bd84ba302eb3dde331871f6d70ca287bfedb1b2cf658e6132cd2cbd427ab56836 - languageName: node - linkType: hard - -"@types/http-proxy@npm:^1.17.8": - version: 1.17.15 - resolution: "@types/http-proxy@npm:1.17.15" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/e2bf2fcdf23c88141b8d2c85ed5e5418b62ef78285884a2b5a717af55f4d9062136aa475489d10292093343df58fb81975f34bebd6b9df322288fd9821cbee07 - languageName: node - linkType: hard - -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": - version: 2.0.6 - resolution: "@types/istanbul-lib-coverage@npm:2.0.6" - checksum: 10c0/3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 - languageName: node - linkType: hard - -"@types/istanbul-lib-report@npm:*": - version: 3.0.3 - resolution: "@types/istanbul-lib-report@npm:3.0.3" - dependencies: - "@types/istanbul-lib-coverage": "npm:*" - checksum: 10c0/247e477bbc1a77248f3c6de5dadaae85ff86ac2d76c5fc6ab1776f54512a745ff2a5f791d22b942e3990ddbd40f3ef5289317c4fca5741bedfaa4f01df89051c - languageName: node - linkType: hard - -"@types/istanbul-reports@npm:^3.0.0": - version: 3.0.4 - resolution: "@types/istanbul-reports@npm:3.0.4" - dependencies: - "@types/istanbul-lib-report": "npm:*" - checksum: 10c0/1647fd402aced5b6edac87274af14ebd6b3a85447ef9ad11853a70fd92a98d35f81a5d3ea9fcb5dbb5834e800c6e35b64475e33fcae6bfa9acc70d61497c54ee - languageName: node - linkType: hard - -"@types/jest@npm:^29.5.12": - version: 29.5.12 - resolution: "@types/jest@npm:29.5.12" - dependencies: - expect: "npm:^29.0.0" - pretty-format: "npm:^29.0.0" - checksum: 10c0/25fc8e4c611fa6c4421e631432e9f0a6865a8cb07c9815ec9ac90d630271cad773b2ee5fe08066f7b95bebd18bb967f8ce05d018ee9ab0430f9dfd1d84665b6f - languageName: node - linkType: hard - -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": - version: 7.0.15 - resolution: "@types/json-schema@npm:7.0.15" - checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db - languageName: node - linkType: hard - -"@types/klaw-sync@npm:^6.0.5": - version: 6.0.5 - resolution: "@types/klaw-sync@npm:6.0.5" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/4a5c1f60d314b0add5a66fb60d3180932e666ff1278639a96144f234a260890aa9a71b2547ccc7c574d298b222f369b49dbbcff60408ce8baaf91ad94f478852 - languageName: node - linkType: hard - -"@types/mdast@npm:^4.0.0, @types/mdast@npm:^4.0.2": - version: 4.0.4 - resolution: "@types/mdast@npm:4.0.4" - dependencies: - "@types/unist": "npm:*" - checksum: 10c0/84f403dbe582ee508fd9c7643ac781ad8597fcbfc9ccb8d4715a2c92e4545e5772cbd0dbdf18eda65789386d81b009967fdef01b24faf6640f817287f54d9c82 - languageName: node - linkType: hard - -"@types/mdx@npm:^2.0.0": - version: 2.0.13 - resolution: "@types/mdx@npm:2.0.13" - checksum: 10c0/5edf1099505ac568da55f9ae8a93e7e314e8cbc13d3445d0be61b75941226b005e1390d9b95caecf5dcb00c9d1bab2f1f60f6ff9876dc091a48b547495007720 - languageName: node - linkType: hard - -"@types/mime@npm:^1": - version: 1.3.5 - resolution: "@types/mime@npm:1.3.5" - checksum: 10c0/c2ee31cd9b993804df33a694d5aa3fa536511a49f2e06eeab0b484fef59b4483777dbb9e42a4198a0809ffbf698081fdbca1e5c2218b82b91603dfab10a10fbc - languageName: node - linkType: hard - -"@types/minimatch@npm:^5.1.2": - version: 5.1.2 - resolution: "@types/minimatch@npm:5.1.2" - checksum: 10c0/83cf1c11748891b714e129de0585af4c55dd4c2cafb1f1d5233d79246e5e1e19d1b5ad9e8db449667b3ffa2b6c80125c429dbee1054e9efb45758dbc4e118562 - languageName: node - linkType: hard - -"@types/ms@npm:*": - version: 0.7.34 - resolution: "@types/ms@npm:0.7.34" - checksum: 10c0/ac80bd90012116ceb2d188fde62d96830ca847823e8ca71255616bc73991aa7d9f057b8bfab79e8ee44ffefb031ddd1bcce63ea82f9e66f7c31ec02d2d823ccc - languageName: node - linkType: hard - -"@types/node-forge@npm:^1.3.0": - version: 1.3.11 - resolution: "@types/node-forge@npm:1.3.11" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/3d7d23ca0ba38ac0cf74028393bd70f31169ab9aba43f21deb787840170d307d662644bac07287495effe2812ddd7ac8a14dbd43f16c2936bbb06312e96fc3b9 - languageName: node - linkType: hard - -"@types/node@npm:*, @types/node@npm:^22.4.0": - version: 22.4.0 - resolution: "@types/node@npm:22.4.0" - dependencies: - undici-types: "npm:~6.19.2" - checksum: 10c0/84cd094b19a27e0db425f1d02614e4f7ac59b5eb3b21e288c8f8d4d0a4c9ad370107bc1a649d4c2b4e810cd133feea26e0bbf7e7c617f93e9e139d6d2568cf50 - languageName: node - linkType: hard - -"@types/node@npm:^17.0.5": - version: 17.0.45 - resolution: "@types/node@npm:17.0.45" - checksum: 10c0/0db377133d709b33a47892581a21a41cd7958f22723a3cc6c71d55ac018121382de42fbfc7970d5ae3e7819dbe5f40e1c6a5174aedf7e7964e9cb8fa72b580b0 - languageName: node - linkType: hard - -"@types/normalize-package-data@npm:^2.4.0": - version: 2.4.4 - resolution: "@types/normalize-package-data@npm:2.4.4" - checksum: 10c0/aef7bb9b015883d6f4119c423dd28c4bdc17b0e8a0ccf112c78b4fe0e91fbc4af7c6204b04bba0e199a57d2f3fbbd5b4a14bf8739bf9d2a39b2a0aad545e0f86 - languageName: node - linkType: hard - -"@types/parse-json@npm:^4.0.0": - version: 4.0.2 - resolution: "@types/parse-json@npm:4.0.2" - checksum: 10c0/b1b863ac34a2c2172fbe0807a1ec4d5cb684e48d422d15ec95980b81475fac4fdb3768a8b13eef39130203a7c04340fc167bae057c7ebcafd7dec9fe6c36aeb1 - languageName: node - linkType: hard - -"@types/prismjs@npm:^1.26.0": - version: 1.26.4 - resolution: "@types/prismjs@npm:1.26.4" - checksum: 10c0/996be7d119779c4cbe66e58342115a12d35a02226dae3aaa4a744c9652d5a3939c93c26182e18156965ac4f93575ebb309c3469c36f52e60ee5c0f8f27e874df - languageName: node - linkType: hard - -"@types/prompt@npm:^1.1.8": - version: 1.1.8 - resolution: "@types/prompt@npm:1.1.8" - dependencies: - "@types/node": "npm:*" - "@types/revalidator": "npm:*" - checksum: 10c0/6c05e383734bebe9905633d8d8706bcfe63cbd34b3f643c7c58a263d4368b09b037b18a455b3108ff9343b56ac0dda872efad1af6772e887125b31d4128e6175 - languageName: node - linkType: hard - -"@types/prop-types@npm:*": - version: 15.7.12 - resolution: "@types/prop-types@npm:15.7.12" - checksum: 10c0/1babcc7db6a1177779f8fde0ccc78d64d459906e6ef69a4ed4dd6339c920c2e05b074ee5a92120fe4e9d9f1a01c952f843ebd550bee2332fc2ef81d1706878f8 - languageName: node - linkType: hard - -"@types/qs@npm:*": - version: 6.9.15 - resolution: "@types/qs@npm:6.9.15" - checksum: 10c0/49c5ff75ca3adb18a1939310042d273c9fc55920861bd8e5100c8a923b3cda90d759e1a95e18334092da1c8f7b820084687770c83a1ccef04fb2c6908117c823 - languageName: node - linkType: hard - -"@types/range-parser@npm:*": - version: 1.2.7 - resolution: "@types/range-parser@npm:1.2.7" - checksum: 10c0/361bb3e964ec5133fa40644a0b942279ed5df1949f21321d77de79f48b728d39253e5ce0408c9c17e4e0fd95ca7899da36841686393b9f7a1e209916e9381a3c - languageName: node - linkType: hard - -"@types/react-router-config@npm:*, @types/react-router-config@npm:^5.0.7": - version: 5.0.11 - resolution: "@types/react-router-config@npm:5.0.11" - dependencies: - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - "@types/react-router": "npm:^5.1.0" - checksum: 10c0/3fa4daf8c14689a05f34e289fc53c4a892e97f35715455c507a8048d9875b19cd3d3142934ca973effed6a6c38f33539b6e173cd254f67e2021ecd5458d551c8 - languageName: node - linkType: hard - -"@types/react-router-dom@npm:*": - version: 5.3.3 - resolution: "@types/react-router-dom@npm:5.3.3" - dependencies: - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - "@types/react-router": "npm:*" - checksum: 10c0/a9231a16afb9ed5142678147eafec9d48582809295754fb60946e29fcd3757a4c7a3180fa94b45763e4c7f6e3f02379e2fcb8dd986db479dcab40eff5fc62a91 - languageName: node - linkType: hard - -"@types/react-router@npm:*, @types/react-router@npm:^5.1.0": - version: 5.1.20 - resolution: "@types/react-router@npm:5.1.20" - dependencies: - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - checksum: 10c0/1f7eee61981d2f807fa01a34a0ef98ebc0774023832b6611a69c7f28fdff01de5a38cabf399f32e376bf8099dcb7afaf724775bea9d38870224492bea4cb5737 - languageName: node - linkType: hard - -"@types/react@npm:*, @types/react@npm:^18.3.3": - version: 18.3.3 - resolution: "@types/react@npm:18.3.3" - dependencies: - "@types/prop-types": "npm:*" - csstype: "npm:^3.0.2" - checksum: 10c0/fe455f805c5da13b89964c3d68060cebd43e73ec15001a68b34634604a78140e6fc202f3f61679b9d809dde6d7a7c2cb3ed51e0fd1462557911db09879b55114 - languageName: node - linkType: hard - -"@types/resolve@npm:1.20.2": - version: 1.20.2 - resolution: "@types/resolve@npm:1.20.2" - checksum: 10c0/c5b7e1770feb5ccfb6802f6ad82a7b0d50874c99331e0c9b259e415e55a38d7a86ad0901c57665d93f75938be2a6a0bc9aa06c9749192cadb2e4512800bbc6e6 - languageName: node - linkType: hard - -"@types/retry@npm:0.12.0": - version: 0.12.0 - resolution: "@types/retry@npm:0.12.0" - checksum: 10c0/7c5c9086369826f569b83a4683661557cab1361bac0897a1cefa1a915ff739acd10ca0d62b01071046fe3f5a3f7f2aec80785fe283b75602dc6726781ea3e328 - languageName: node - linkType: hard - -"@types/revalidator@npm:*": - version: 0.3.12 - resolution: "@types/revalidator@npm:0.3.12" - checksum: 10c0/ec4ee90a4ec0400fa1955c7578d2bc0d9dc373425fce9db3d7f59ef2c534901af08c4d65bb05733cdbb64cd27c40ebe582d8e9bafc355c4391cdb23f176e240b - languageName: node - linkType: hard - -"@types/sax@npm:^1.2.1": - version: 1.2.7 - resolution: "@types/sax@npm:1.2.7" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/d077a761a0753b079bf8279b3993948030ca86ed9125437b9b29c1de40db9b2deb7fddc369f014b58861d450e8b8cc75f163aa29dc8cea81952efbfd859168cf - languageName: node - linkType: hard - -"@types/semver@npm:^7.3.12": - version: 7.5.8 - resolution: "@types/semver@npm:7.5.8" - checksum: 10c0/8663ff927234d1c5fcc04b33062cb2b9fcfbe0f5f351ed26c4d1e1581657deebd506b41ff7fdf89e787e3d33ce05854bc01686379b89e9c49b564c4cfa988efa - languageName: node - linkType: hard - -"@types/send@npm:*": - version: 0.17.4 - resolution: "@types/send@npm:0.17.4" - dependencies: - "@types/mime": "npm:^1" - "@types/node": "npm:*" - checksum: 10c0/7f17fa696cb83be0a104b04b424fdedc7eaba1c9a34b06027239aba513b398a0e2b7279778af521f516a397ced417c96960e5f50fcfce40c4bc4509fb1a5883c - languageName: node - linkType: hard - -"@types/serve-index@npm:^1.9.1": - version: 1.9.4 - resolution: "@types/serve-index@npm:1.9.4" - dependencies: - "@types/express": "npm:*" - checksum: 10c0/94c1b9e8f1ea36a229e098e1643d5665d9371f8c2658521718e259130a237c447059b903bac0dcc96ee2c15fd63f49aa647099b7d0d437a67a6946527a837438 - languageName: node - linkType: hard - -"@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10": - version: 1.15.7 - resolution: "@types/serve-static@npm:1.15.7" - dependencies: - "@types/http-errors": "npm:*" - "@types/node": "npm:*" - "@types/send": "npm:*" - checksum: 10c0/26ec864d3a626ea627f8b09c122b623499d2221bbf2f470127f4c9ebfe92bd8a6bb5157001372d4c4bd0dd37a1691620217d9dc4df5aa8f779f3fd996b1c60ae - languageName: node - linkType: hard - -"@types/sockjs@npm:^0.3.33": - version: 0.3.36 - resolution: "@types/sockjs@npm:0.3.36" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/b20b7820ee813f22de4f2ce98bdd12c68c930e016a8912b1ed967595ac0d8a4cbbff44f4d486dd97f77f5927e7b5725bdac7472c9ec5b27f53a5a13179f0612f - languageName: node - linkType: hard - -"@types/source-map-support@npm:^0.5.10": - version: 0.5.10 - resolution: "@types/source-map-support@npm:0.5.10" - dependencies: - source-map: "npm:^0.6.0" - checksum: 10c0/48aacf32e1b5a4301407123fb69001b6a79386860d19c756a76ef3b034f71375a843846fa2af2d2461a765411dfbbcb21069b0935761b3c81f8b722b1d9d581f - languageName: node - linkType: hard - -"@types/stack-utils@npm:^2.0.0": - version: 2.0.3 - resolution: "@types/stack-utils@npm:2.0.3" - checksum: 10c0/1f4658385ae936330581bcb8aa3a066df03867d90281cdf89cc356d404bd6579be0f11902304e1f775d92df22c6dd761d4451c804b0a4fba973e06211e9bd77c - languageName: node - linkType: hard - -"@types/touch@npm:^3.1.5": - version: 3.1.5 - resolution: "@types/touch@npm:3.1.5" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/e27a0c97c57a70e27d7517c474d55f9e14a5e682cdf36c352fb14968415e617be38d34a3edde166fd5ecb22dc9ef149fbff25eafab6f941db05203856d042581 - languageName: node - linkType: hard - -"@types/unidecode@npm:^0.1.3": - version: 0.1.3 - resolution: "@types/unidecode@npm:0.1.3" - checksum: 10c0/f450b919c2a300bfd7e11d3df95066d0e0424cf9758133d2929aca6bc359fc59511a9243357830f4657426830744ee8e0e28741b98b0767a4e1fcd45fb60e7da - languageName: node - linkType: hard - -"@types/unist@npm:*, @types/unist@npm:^3.0.0": - version: 3.0.3 - resolution: "@types/unist@npm:3.0.3" - checksum: 10c0/2b1e4adcab78388e088fcc3c0ae8700f76619dbcb4741d7d201f87e2cb346bfc29a89003cfea2d76c996e1061452e14fcd737e8b25aacf949c1f2d6b2bc3dd60 - languageName: node - linkType: hard - -"@types/unist@npm:^2.0.0": - version: 2.0.11 - resolution: "@types/unist@npm:2.0.11" - checksum: 10c0/24dcdf25a168f453bb70298145eb043cfdbb82472db0bc0b56d6d51cd2e484b9ed8271d4ac93000a80da568f2402e9339723db262d0869e2bf13bc58e081768d - languageName: node - linkType: hard - -"@types/ws@npm:^8.5.5": - version: 8.5.12 - resolution: "@types/ws@npm:8.5.12" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/3fd77c9e4e05c24ce42bfc7647f7506b08c40a40fe2aea236ef6d4e96fc7cb4006a81ed1b28ec9c457e177a74a72924f4768b7b4652680b42dfd52bc380e15f9 - languageName: node - linkType: hard - -"@types/xml2js@npm:^0.4.14": - version: 0.4.14 - resolution: "@types/xml2js@npm:0.4.14" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/06776e7f7aec55a698795e60425417caa7d7db3ff680a7b4ccaae1567c5fec28ff49b9975e9a0d74ff4acb8f4a43730501bbe64f9f761d784c6476ba4db12e13 - languageName: node - linkType: hard - -"@types/yargs-parser@npm:*": - version: 21.0.3 - resolution: "@types/yargs-parser@npm:21.0.3" - checksum: 10c0/e71c3bd9d0b73ca82e10bee2064c384ab70f61034bbfb78e74f5206283fc16a6d85267b606b5c22cb2a3338373586786fed595b2009825d6a9115afba36560a0 - languageName: node - linkType: hard - -"@types/yargs@npm:^17.0.8": - version: 17.0.33 - resolution: "@types/yargs@npm:17.0.33" - dependencies: - "@types/yargs-parser": "npm:*" - checksum: 10c0/d16937d7ac30dff697801c3d6f235be2166df42e4a88bf730fa6dc09201de3727c0a9500c59a672122313341de5f24e45ee0ff579c08ce91928e519090b7906b - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.1.0" - dependencies: - "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.1.0" - "@typescript-eslint/type-utils": "npm:8.1.0" - "@typescript-eslint/utils": "npm:8.1.0" - "@typescript-eslint/visitor-keys": "npm:8.1.0" - graphemer: "npm:^1.4.0" - ignore: "npm:^5.3.1" - natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^1.3.0" - peerDependencies: - "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^8.57.0 || ^9.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/7bbeae588f859b59c34d6a76cac06ef0fa605921b40c5d3b65b94829984280ea84c4dd3f5cb9ce2eb326f5563e9abb4c90ebff05c47f83f4def296c2ea1fa86c - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/parser@npm:8.1.0" - dependencies: - "@typescript-eslint/scope-manager": "npm:8.1.0" - "@typescript-eslint/types": "npm:8.1.0" - "@typescript-eslint/typescript-estree": "npm:8.1.0" - "@typescript-eslint/visitor-keys": "npm:8.1.0" - debug: "npm:^4.3.4" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/b94b2d3ab5ca505484d100701fad6a04a5dc8d595029bac1b9f5b8a4a91d80fd605b0f65d230b36a97ab7e5d55eeb0c28af2ab63929a3e4ab8fdefd2a548c36b - languageName: node - linkType: hard - -"@typescript-eslint/rule-tester@npm:^8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/rule-tester@npm:8.1.0" - dependencies: - "@typescript-eslint/typescript-estree": "npm:8.1.0" - "@typescript-eslint/utils": "npm:8.1.0" - ajv: "npm:^6.12.6" - json-stable-stringify-without-jsonify: "npm:^1.0.1" - lodash.merge: "npm:4.6.2" - semver: "npm:^7.6.0" - peerDependencies: - "@eslint/eslintrc": ">=2" - eslint: ^8.57.0 || ^9.0.0 - checksum: 10c0/b119afe19f41734222d9eb902480eadf8b61bbe1da0068b317c9ba1fe3efd903a1096902f6e1e8b1a456d6da855de714628474ffcaa29ad0bf420d96ddb4f59e - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/scope-manager@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/visitor-keys": "npm:5.62.0" - checksum: 10c0/861253235576c1c5c1772d23cdce1418c2da2618a479a7de4f6114a12a7ca853011a1e530525d0931c355a8fd237b9cd828fac560f85f9623e24054fd024726f - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/scope-manager@npm:7.18.0" - dependencies: - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" - checksum: 10c0/038cd58c2271de146b3a594afe2c99290034033326d57ff1f902976022c8b0138ffd3cb893ae439ae41003b5e4bcc00cabf6b244ce40e8668f9412cc96d97b8e - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/scope-manager@npm:8.1.0" - dependencies: - "@typescript-eslint/types": "npm:8.1.0" - "@typescript-eslint/visitor-keys": "npm:8.1.0" - checksum: 10c0/2bcf8cd176a1819bddcae16c572e7da8fba821b995a91cd53d64d8d6b85a17f5a895522f281ba57e34929574bddd4d6684ee3e545ec4e8096be4c3198e253a9a - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:8.1.0, @typescript-eslint/type-utils@npm:^8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/type-utils@npm:8.1.0" - dependencies: - "@typescript-eslint/typescript-estree": "npm:8.1.0" - "@typescript-eslint/utils": "npm:8.1.0" - debug: "npm:^4.3.4" - ts-api-utils: "npm:^1.3.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/62753941c4136e8d2daa72fe0410dea48e5317a6f12ece6382ca85e29912bd1b3f739b61d1060fc0a1f8c488dfc905beab4c8b8497951a21c3138a659c7271ec - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/types@npm:5.62.0" - checksum: 10c0/7febd3a7f0701c0b927e094f02e82d8ee2cada2b186fcb938bc2b94ff6fbad88237afc304cbaf33e82797078bbbb1baf91475f6400912f8b64c89be79bfa4ddf - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/types@npm:7.18.0" - checksum: 10c0/eb7371ac55ca77db8e59ba0310b41a74523f17e06f485a0ef819491bc3dd8909bb930120ff7d30aaf54e888167e0005aa1337011f3663dc90fb19203ce478054 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/types@npm:8.1.0" - checksum: 10c0/ceade44455f45974e68956016c4d1c6626580732f7f9675e14ffa63db80b551752b0df596b20473dae9f0dc6ed966e17417dc2cf36e1a82b6ab0edc97c5eaa50 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/visitor-keys": "npm:5.62.0" - debug: "npm:^4.3.4" - globby: "npm:^11.1.0" - is-glob: "npm:^4.0.3" - semver: "npm:^7.3.7" - tsutils: "npm:^3.21.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/d7984a3e9d56897b2481940ec803cb8e7ead03df8d9cfd9797350be82ff765dfcf3cfec04e7355e1779e948da8f02bc5e11719d07a596eb1cb995c48a95e38cf - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/typescript-estree@npm:7.18.0" - dependencies: - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" - debug: "npm:^4.3.4" - globby: "npm:^11.1.0" - is-glob: "npm:^4.0.3" - minimatch: "npm:^9.0.4" - semver: "npm:^7.6.0" - ts-api-utils: "npm:^1.3.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/0c7f109a2e460ec8a1524339479cf78ff17814d23c83aa5112c77fb345e87b3642616291908dcddea1e671da63686403dfb712e4a4435104f92abdfddf9aba81 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.1.0" - dependencies: - "@typescript-eslint/types": "npm:8.1.0" - "@typescript-eslint/visitor-keys": "npm:8.1.0" - debug: "npm:^4.3.4" - globby: "npm:^11.1.0" - is-glob: "npm:^4.0.3" - minimatch: "npm:^9.0.4" - semver: "npm:^7.6.0" - ts-api-utils: "npm:^1.3.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/a7bc8275df1c79c4cb14ef086c56674316dd4907efec53eddca35d0b5220428b69c82178ce2d95138da2e398269c8bd0764cae8020a36417e411e35c3c47bc4b - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:8.1.0, @typescript-eslint/utils@npm:^8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/utils@npm:8.1.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.1.0" - "@typescript-eslint/types": "npm:8.1.0" - "@typescript-eslint/typescript-estree": "npm:8.1.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - checksum: 10c0/c95503a6bdcd98b1ff04d1adbf46377b2036b1c510d90a4a056401f996f775f06c3108c95fb81cd6babc9c97b73b91b8e848f0337bc508de8a49c993582f0e75 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:^5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/utils@npm:5.62.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@types/json-schema": "npm:^7.0.9" - "@types/semver": "npm:^7.3.12" - "@typescript-eslint/scope-manager": "npm:5.62.0" - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/typescript-estree": "npm:5.62.0" - eslint-scope: "npm:^5.1.1" - semver: "npm:^7.3.7" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/f09b7d9952e4a205eb1ced31d7684dd55cee40bf8c2d78e923aa8a255318d97279825733902742c09d8690f37a50243f4c4d383ab16bd7aefaf9c4b438f785e1 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:^7.0.0, @typescript-eslint/utils@npm:^7.4.0": - version: 7.18.0 - resolution: "@typescript-eslint/utils@npm:7.18.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:7.18.0" - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/typescript-estree": "npm:7.18.0" - peerDependencies: - eslint: ^8.56.0 - checksum: 10c0/a25a6d50eb45c514469a01ff01f215115a4725fb18401055a847ddf20d1b681409c4027f349033a95c4ff7138d28c3b0a70253dfe8262eb732df4b87c547bd1e - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - eslint-visitor-keys: "npm:^3.3.0" - checksum: 10c0/7c3b8e4148e9b94d9b7162a596a1260d7a3efc4e65199693b8025c71c4652b8042501c0bc9f57654c1e2943c26da98c0f77884a746c6ae81389fcb0b513d995d - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/visitor-keys@npm:7.18.0" - dependencies: - "@typescript-eslint/types": "npm:7.18.0" - eslint-visitor-keys: "npm:^3.4.3" - checksum: 10c0/538b645f8ff1d9debf264865c69a317074eaff0255e63d7407046176b0f6a6beba34a6c51d511f12444bae12a98c69891eb6f403c9f54c6c2e2849d1c1cb73c0 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:8.1.0": - version: 8.1.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.1.0" - dependencies: - "@typescript-eslint/types": "npm:8.1.0" - eslint-visitor-keys: "npm:^3.4.3" - checksum: 10c0/b7544dbb0eec1ddbfcd95c04b51b9a739c2e768c16d1c88508f976a2b0d1bc02fefb7491930e06e48073a5c07c6f488cd8403bba3a8b918888b93a88d5ac3869 - languageName: node - linkType: hard - -"@typescript-to-lua/language-extensions@npm:1.19.0": - version: 1.19.0 - resolution: "@typescript-to-lua/language-extensions@npm:1.19.0" - checksum: 10c0/bbe688e4b2c380a265d8e68d886ef6a39025322735d1df057d28c4e8d7e1b1890f4a2359cde6ab51ec14fa81bd7d762723fc7df055496445d81de6e5c80456a7 - languageName: node - linkType: hard - -"@ungap/structured-clone@npm:^1.0.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 10c0/8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d - languageName: node - linkType: hard - -"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/ast@npm:1.12.1" - dependencies: - "@webassemblyjs/helper-numbers": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - checksum: 10c0/ba7f2b96c6e67e249df6156d02c69eb5f1bd18d5005303cdc42accb053bebbbde673826e54db0437c9748e97abd218366a1d13fa46859b23cde611b6b409998c - languageName: node - linkType: hard - -"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" - checksum: 10c0/37fe26f89e18e4ca0e7d89cfe3b9f17cfa327d7daf906ae01400416dbb2e33c8a125b4dc55ad7ff405e5fcfb6cf0d764074c9bc532b9a31a71e762be57d2ea0a - languageName: node - linkType: hard - -"@webassemblyjs/helper-api-error@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" - checksum: 10c0/a681ed51863e4ff18cf38d223429f414894e5f7496856854d9a886eeddcee32d7c9f66290f2919c9bb6d2fc2b2fae3f989b6a1e02a81e829359738ea0c4d371a - languageName: node - linkType: hard - -"@webassemblyjs/helper-buffer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" - checksum: 10c0/0270724afb4601237410f7fd845ab58ccda1d5456a8783aadfb16eaaf3f2c9610c28e4a5bcb6ad880cde5183c82f7f116d5ccfc2310502439d33f14b6888b48a - languageName: node - linkType: hard - -"@webassemblyjs/helper-numbers@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" - dependencies: - "@webassemblyjs/floating-point-hex-parser": "npm:1.11.6" - "@webassemblyjs/helper-api-error": "npm:1.11.6" - "@xtuc/long": "npm:4.2.2" - checksum: 10c0/c7d5afc0ff3bd748339b466d8d2f27b908208bf3ff26b2e8e72c39814479d486e0dca6f3d4d776fd9027c1efe05b5c0716c57a23041eb34473892b2731c33af3 - languageName: node - linkType: hard - -"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" - checksum: 10c0/79d2bebdd11383d142745efa32781249745213af8e022651847382685ca76709f83e1d97adc5f0d3c2b8546bf02864f8b43a531fdf5ca0748cb9e4e0ef2acaa5 - languageName: node - linkType: hard - -"@webassemblyjs/helper-wasm-section@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - checksum: 10c0/0546350724d285ae3c26e6fc444be4c3b5fb824f3be0ec8ceb474179dc3f4430336dd2e36a44b3e3a1a6815960e5eec98cd9b3a8ec66dc53d86daedd3296a6a2 - languageName: node - linkType: hard - -"@webassemblyjs/ieee754@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/ieee754@npm:1.11.6" - dependencies: - "@xtuc/ieee754": "npm:^1.2.0" - checksum: 10c0/59de0365da450322c958deadade5ec2d300c70f75e17ae55de3c9ce564deff5b429e757d107c7ec69bd0ba169c6b6cc2ff66293ab7264a7053c829b50ffa732f - languageName: node - linkType: hard - -"@webassemblyjs/leb128@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/leb128@npm:1.11.6" - dependencies: - "@xtuc/long": "npm:4.2.2" - checksum: 10c0/cb344fc04f1968209804de4da018679c5d4708a03b472a33e0fa75657bb024978f570d3ccf9263b7f341f77ecaa75d0e051b9cd4b7bb17a339032cfd1c37f96e - languageName: node - linkType: hard - -"@webassemblyjs/utf8@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/utf8@npm:1.11.6" - checksum: 10c0/14d6c24751a89ad9d801180b0d770f30a853c39f035a15fbc96266d6ac46355227abd27a3fd2eeaa97b4294ced2440a6b012750ae17bafe1a7633029a87b6bee - languageName: node - linkType: hard - -"@webassemblyjs/wasm-edit@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/helper-wasm-section": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-opt": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - "@webassemblyjs/wast-printer": "npm:1.12.1" - checksum: 10c0/972f5e6c522890743999e0ed45260aae728098801c6128856b310dd21f1ee63435fc7b518e30e0ba1cdafd0d1e38275829c1e4451c3536a1d9e726e07a5bba0b - languageName: node - linkType: hard - -"@webassemblyjs/wasm-gen@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 10c0/1e257288177af9fa34c69cab94f4d9036ebed611f77f3897c988874e75182eeeec759c79b89a7a49dd24624fc2d3d48d5580b62b67c4a1c9bfbdcd266b281c16 - languageName: node - linkType: hard - -"@webassemblyjs/wasm-opt@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - checksum: 10c0/992a45e1f1871033c36987459436ab4e6430642ca49328e6e32a13de9106fe69ae6c0ac27d7050efd76851e502d11cd1ac0e06b55655dfa889ad82f11a2712fb - languageName: node - linkType: hard - -"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-api-error": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 10c0/e85cec1acad07e5eb65b92d37c8e6ca09c6ca50d7ca58803a1532b452c7321050a0328c49810c337cc2dfd100c5326a54d5ebd1aa5c339ebe6ef10c250323a0e - languageName: node - linkType: hard - -"@webassemblyjs/wast-printer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wast-printer@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@xtuc/long": "npm:4.2.2" - checksum: 10c0/39bf746eb7a79aa69953f194943bbc43bebae98bd7cadd4d8bc8c0df470ca6bf9d2b789effaa180e900fab4e2691983c1f7d41571458bd2a26267f2f0c73705a - languageName: node - linkType: hard - -"@xml-tools/parser@npm:^1.0.11": - version: 1.0.11 - resolution: "@xml-tools/parser@npm:1.0.11" - dependencies: - chevrotain: "npm:7.1.1" - checksum: 10c0/5abc75163d6b2ac8e9006a54576523513535953237463297137c5a3665ce1b9d220b77b6dbb68ab93df3fab40bbc98bbb10e90dd690fd7646fdb021323827971 - languageName: node - linkType: hard - -"@xtuc/ieee754@npm:^1.2.0": - version: 1.2.0 - resolution: "@xtuc/ieee754@npm:1.2.0" - checksum: 10c0/a8565d29d135039bd99ae4b2220d3e167d22cf53f867e491ed479b3f84f895742d0097f935b19aab90265a23d5d46711e4204f14c479ae3637fbf06c4666882f - languageName: node - linkType: hard - -"@xtuc/long@npm:4.2.2": - version: 4.2.2 - resolution: "@xtuc/long@npm:4.2.2" - checksum: 10c0/8582cbc69c79ad2d31568c412129bf23d2b1210a1dfb60c82d5a1df93334da4ee51f3057051658569e2c196d8dc33bc05ae6b974a711d0d16e801e1d0647ccd1 - languageName: node - linkType: hard - -"@zamiell/sync-directory@npm:^6.0.5": - version: 6.0.5 - resolution: "@zamiell/sync-directory@npm:6.0.5" - dependencies: - chokidar: "npm:^3.3.1" - commander: "npm:^6.2.0" - fs-extra: "npm:^7.0.1" - is-absolute: "npm:^1.0.0" - readdir-enhanced: "npm:^1.5.2" - bin: - syncdir: cmd.js - checksum: 10c0/4ed0b093a7f36963f8f15e61bdb09556f12c772d3ff6ebc105d381ac7f5e09ce39c635dd2794f3517f51149075cc2a17dfa03c89b6d4622761851cb5a2ba011a - languageName: node - linkType: hard - -"@zamiell/typedoc-plugin-not-exported@npm:^0.3.0": - version: 0.3.0 - resolution: "@zamiell/typedoc-plugin-not-exported@npm:0.3.0" - peerDependencies: - typedoc: ">=0.26.2" - checksum: 10c0/66229c1abbefa9f16a3c8ac02922c954b2b0b38b752945abdd553f1862566f6b71632ad94fb4698d9b3ed4d8e8239d02eeb2a9326a095225dbc5787a8cdb511e - languageName: node - linkType: hard - -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 - languageName: node - linkType: hard - -"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": - version: 1.3.8 - resolution: "accepts@npm:1.3.8" - dependencies: - mime-types: "npm:~2.1.34" - negotiator: "npm:0.6.3" - checksum: 10c0/3a35c5f5586cfb9a21163ca47a5f77ac34fa8ceb5d17d2fa2c0d81f41cbd7f8c6fa52c77e2c039acc0f4d09e71abdc51144246900f6bef5e3c4b333f77d89362 - languageName: node - linkType: hard - -"acorn-import-attributes@npm:^1.9.5": - version: 1.9.5 - resolution: "acorn-import-attributes@npm:1.9.5" - peerDependencies: - acorn: ^8 - checksum: 10c0/5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d - languageName: node - linkType: hard - -"acorn-jsx@npm:^5.0.0, acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 - languageName: node - linkType: hard - -"acorn-walk@npm:^8.0.0": - version: 8.3.3 - resolution: "acorn-walk@npm:8.3.3" - dependencies: - acorn: "npm:^8.11.0" - checksum: 10c0/4a9e24313e6a0a7b389e712ba69b66b455b4cb25988903506a8d247e7b126f02060b05a8a5b738a9284214e4ca95f383dd93443a4ba84f1af9b528305c7f243b - languageName: node - linkType: hard - -"acorn@npm:^8.0.0, acorn@npm:^8.0.4, acorn@npm:^8.11.0, acorn@npm:^8.11.3, acorn@npm:^8.12.0, acorn@npm:^8.12.1, acorn@npm:^8.7.1, acorn@npm:^8.8.2": - version: 8.12.1 - resolution: "acorn@npm:8.12.1" - bin: - acorn: bin/acorn - checksum: 10c0/51fb26cd678f914e13287e886da2d7021f8c2bc0ccc95e03d3e0447ee278dd3b40b9c57dc222acd5881adcf26f3edc40901a4953403232129e3876793cd17386 - languageName: node - linkType: hard - -"address@npm:^1.0.1, address@npm:^1.1.2": - version: 1.2.2 - resolution: "address@npm:1.2.2" - checksum: 10c0/1c8056b77fb124456997b78ed682ecc19d2fd7ea8bd5850a2aa8c3e3134c913847c57bcae418622efd32ba858fa1e242a40a251ac31da0515664fc0ac03a047d - languageName: node - linkType: hard - -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: "npm:^4.3.4" - checksum: 10c0/e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: "npm:^2.0.0" - indent-string: "npm:^4.0.0" - checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 - languageName: node - linkType: hard - -"ajv-draft-04@npm:~1.0.0": - version: 1.0.0 - resolution: "ajv-draft-04@npm:1.0.0" - peerDependencies: - ajv: ^8.5.0 - peerDependenciesMeta: - ajv: - optional: true - checksum: 10c0/6044310bd38c17d77549fd326bd40ce1506fa10b0794540aa130180808bf94117fac8c9b448c621512bea60e4a947278f6a978e87f10d342950c15b33ddd9271 - languageName: node - linkType: hard - -"ajv-formats@npm:^2.1.1": - version: 2.1.1 - resolution: "ajv-formats@npm:2.1.1" - dependencies: - ajv: "npm:^8.0.0" - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - checksum: 10c0/e43ba22e91b6a48d96224b83d260d3a3a561b42d391f8d3c6d2c1559f9aa5b253bfb306bc94bbeca1d967c014e15a6efe9a207309e95b3eaae07fcbcdc2af662 - languageName: node - linkType: hard - -"ajv-formats@npm:~3.0.1": - version: 3.0.1 - resolution: "ajv-formats@npm:3.0.1" - dependencies: - ajv: "npm:^8.0.0" - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - checksum: 10c0/168d6bca1ea9f163b41c8147bae537e67bd963357a5488a1eaf3abe8baa8eec806d4e45f15b10767e6020679315c7e1e5e6803088dfb84efa2b4e9353b83dd0a - languageName: node - linkType: hard - -"ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2": - version: 3.5.2 - resolution: "ajv-keywords@npm:3.5.2" - peerDependencies: - ajv: ^6.9.1 - checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 - languageName: node - linkType: hard - -"ajv-keywords@npm:^5.1.0": - version: 5.1.0 - resolution: "ajv-keywords@npm:5.1.0" - dependencies: - fast-deep-equal: "npm:^3.1.3" - peerDependencies: - ajv: ^8.8.2 - checksum: 10c0/18bec51f0171b83123ba1d8883c126e60c6f420cef885250898bf77a8d3e65e3bfb9e8564f497e30bdbe762a83e0d144a36931328616a973ee669dc74d4a9590 - languageName: node - linkType: hard - -"ajv@npm:^6.12.2, ajv@npm:^6.12.4, ajv@npm:^6.12.5, ajv@npm:^6.12.6": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: "npm:^3.1.1" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.4.1" - uri-js: "npm:^4.2.2" - checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 - languageName: node - linkType: hard - -"ajv@npm:^8.0.0, ajv@npm:^8.17.1, ajv@npm:^8.9.0": - version: 8.17.1 - resolution: "ajv@npm:8.17.1" - dependencies: - fast-deep-equal: "npm:^3.1.3" - fast-uri: "npm:^3.0.1" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 - languageName: node - linkType: hard - -"ajv@npm:~8.12.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" - dependencies: - fast-deep-equal: "npm:^3.1.1" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.2.2" - checksum: 10c0/ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e - languageName: node - linkType: hard - -"ajv@npm:~8.13.0": - version: 8.13.0 - resolution: "ajv@npm:8.13.0" - dependencies: - fast-deep-equal: "npm:^3.1.3" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.4.1" - checksum: 10c0/14c6497b6f72843986d7344175a1aa0e2c35b1e7f7475e55bc582cddb765fca7e6bf950f465dc7846f817776d9541b706f4b5b3fbedd8dfdeb5fce6f22864264 - languageName: node - linkType: hard - -"algoliasearch-helper@npm:^3.10.0, algoliasearch-helper@npm:^3.13.3": - version: 3.22.3 - resolution: "algoliasearch-helper@npm:3.22.3" - dependencies: - "@algolia/events": "npm:^4.0.1" - peerDependencies: - algoliasearch: ">= 3.1 < 6" - checksum: 10c0/c522eedd6cef022cd5c23ad3ec24691ce555ea1401cdd8c1cd650070b083dbd10bb6e859436d3a22659cc7a3ec9c056accbc6c02f957e1e316c2f5b3ec387f92 - languageName: node - linkType: hard - -"algoliasearch@npm:^4.18.0, algoliasearch@npm:^4.19.1": - version: 4.24.0 - resolution: "algoliasearch@npm:4.24.0" - dependencies: - "@algolia/cache-browser-local-storage": "npm:4.24.0" - "@algolia/cache-common": "npm:4.24.0" - "@algolia/cache-in-memory": "npm:4.24.0" - "@algolia/client-account": "npm:4.24.0" - "@algolia/client-analytics": "npm:4.24.0" - "@algolia/client-common": "npm:4.24.0" - "@algolia/client-personalization": "npm:4.24.0" - "@algolia/client-search": "npm:4.24.0" - "@algolia/logger-common": "npm:4.24.0" - "@algolia/logger-console": "npm:4.24.0" - "@algolia/recommend": "npm:4.24.0" - "@algolia/requester-browser-xhr": "npm:4.24.0" - "@algolia/requester-common": "npm:4.24.0" - "@algolia/requester-node-http": "npm:4.24.0" - "@algolia/transporter": "npm:4.24.0" - checksum: 10c0/ef09096619191181f3ea3376ed46b5bb2de1cd7d97a8d016f7cfe8e93c89d34f38cac8db5835314f8d97c939ad007c3dde716c1609953540258352edb25d12c2 - languageName: node - linkType: hard - -"ansi-align@npm:^3.0.1": - version: 3.0.1 - resolution: "ansi-align@npm:3.0.1" - dependencies: - string-width: "npm:^4.1.0" - checksum: 10c0/ad8b755a253a1bc8234eb341e0cec68a857ab18bf97ba2bda529e86f6e30460416523e0ec58c32e5c21f0ca470d779503244892873a5895dbd0c39c788e82467 - languageName: node - linkType: hard - -"ansi-colors@npm:^4.1.1": - version: 4.1.3 - resolution: "ansi-colors@npm:4.1.3" - checksum: 10c0/ec87a2f59902f74e61eada7f6e6fe20094a628dab765cfdbd03c3477599368768cffccdb5d3bb19a1b6c99126783a143b1fee31aab729b31ffe5836c7e5e28b9 - languageName: node - linkType: hard - -"ansi-escapes@npm:^4.2.1": - version: 4.3.2 - resolution: "ansi-escapes@npm:4.3.2" - dependencies: - type-fest: "npm:^0.21.3" - checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 - languageName: node - linkType: hard - -"ansi-html-community@npm:^0.0.8": - version: 0.0.8 - resolution: "ansi-html-community@npm:0.0.8" - bin: - ansi-html: bin/ansi-html - checksum: 10c0/45d3a6f0b4f10b04fdd44bef62972e2470bfd917bf00439471fa7473d92d7cbe31369c73db863cc45dda115cb42527f39e232e9256115534b8ee5806b0caeed4 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: "npm:^2.0.1" - checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 - languageName: node - linkType: hard - -"ansi-styles@npm:^5.0.0": - version: 5.2.0 - resolution: "ansi-styles@npm:5.2.0" - checksum: 10c0/9c4ca80eb3c2fb7b33841c210d2f20807f40865d27008d7c3f707b7f95cab7d67462a565e2388ac3285b71cb3d9bb2173de8da37c57692a362885ec34d6e27df - languageName: node - linkType: hard - -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c - languageName: node - linkType: hard - -"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: "npm:^3.0.0" - picomatch: "npm:^2.0.4" - checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac - languageName: node - linkType: hard - -"are-docs-informative@npm:^0.0.2": - version: 0.0.2 - resolution: "are-docs-informative@npm:0.0.2" - checksum: 10c0/f0326981bd699c372d268b526b170a28f2e1aec2cf99d7de0686083528427ecdf6ae41fef5d9988e224a5616298af747ad8a76e7306b0a7c97cc085a99636d60 - languageName: node - linkType: hard - -"arg@npm:^5.0.0": - version: 5.0.2 - resolution: "arg@npm:5.0.2" - checksum: 10c0/ccaf86f4e05d342af6666c569f844bec426595c567d32a8289715087825c2ca7edd8a3d204e4d2fb2aa4602e09a57d0c13ea8c9eea75aac3dbb4af5514e6800e - languageName: node - linkType: hard - -"argparse@npm:^1.0.7, argparse@npm:~1.0.9": - version: 1.0.10 - resolution: "argparse@npm:1.0.10" - dependencies: - sprintf-js: "npm:~1.0.2" - checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e - languageName: node - linkType: hard - -"array-flatten@npm:1.1.1": - version: 1.1.1 - resolution: "array-flatten@npm:1.1.1" - checksum: 10c0/806966c8abb2f858b08f5324d9d18d7737480610f3bd5d3498aaae6eb5efdc501a884ba019c9b4a8f02ff67002058749d05548fd42fa8643f02c9c7f22198b91 - languageName: node - linkType: hard - -"array-timsort@npm:^1.0.3": - version: 1.0.3 - resolution: "array-timsort@npm:1.0.3" - checksum: 10c0/bd3a1707b621947265c89867e67c9102b9b9f4c50f5b3974220112290d8b60d26ce60595edec5deed3325207b759d70b758bed3cd310b5ddadb835657ffb6d12 - languageName: node - linkType: hard - -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 10c0/429897e68110374f39b771ec47a7161fc6a8fc33e196857c0a396dc75df0b5f65e4d046674db764330b6bb66b39ef48dd7c53b6a2ee75cfb0681e0c1a7033962 - languageName: node - linkType: hard - -"astring@npm:^1.8.0": - version: 1.8.6 - resolution: "astring@npm:1.8.6" - bin: - astring: bin/astring - checksum: 10c0/31f09144597048c11072417959a412f208f8f95ba8dce408dfbc3367acb929f31fbcc00ed5eb61ccbf7c2f1173b9ac8bfcaaa37134a9455050c669b2b036ed88 - languageName: node - linkType: hard - -"async@npm:3.2.3": - version: 3.2.3 - resolution: "async@npm:3.2.3" - checksum: 10c0/109780c846f05109dde14412d916ae4ed6daf6f9aad0c4aa1dcf0d4da775a3a9e35e0e06e4e06ad9fed66f99ca15549da16f2f243c56103b346e9d3bcd9c943f - languageName: node - linkType: hard - -"async@npm:^2.6.4": - version: 2.6.4 - resolution: "async@npm:2.6.4" - dependencies: - lodash: "npm:^4.17.14" - checksum: 10c0/0ebb3273ef96513389520adc88e0d3c45e523d03653cc9b66f5c46f4239444294899bfd13d2b569e7dbfde7da2235c35cf5fd3ece9524f935d41bbe4efccdad0 - languageName: node - linkType: hard - -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d - languageName: node - linkType: hard - -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 10c0/4c058baf6df1bc5a1697cf182e2029c58cd99975288a13f9e70068ef5d6f4e1f1fd7c4d2c3c4912eae44797d1725be9700995736deca441b39f3e66d8dee97ef - languageName: node - linkType: hard - -"autoprefixer@npm:^10.4.14, autoprefixer@npm:^10.4.19": - version: 10.4.20 - resolution: "autoprefixer@npm:10.4.20" - dependencies: - browserslist: "npm:^4.23.3" - caniuse-lite: "npm:^1.0.30001646" - fraction.js: "npm:^4.3.7" - normalize-range: "npm:^0.1.2" - picocolors: "npm:^1.0.1" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.1.0 - bin: - autoprefixer: bin/autoprefixer - checksum: 10c0/e1f00978a26e7c5b54ab12036d8c13833fad7222828fc90914771b1263f51b28c7ddb5803049de4e77696cbd02bb25cfc3634e80533025bb26c26aacdf938940 - languageName: node - linkType: hard - -"axios@npm:^1.6.0": - version: 1.7.4 - resolution: "axios@npm:1.7.4" - dependencies: - follow-redirects: "npm:^1.15.6" - form-data: "npm:^4.0.0" - proxy-from-env: "npm:^1.1.0" - checksum: 10c0/5ea1a93140ca1d49db25ef8e1bd8cfc59da6f9220159a944168860ad15a2743ea21c5df2967795acb15cbe81362f5b157fdebbea39d53117ca27658bab9f7f17 - languageName: node - linkType: hard - -"babel-jest@npm:^29.7.0": - version: 29.7.0 - resolution: "babel-jest@npm:29.7.0" - dependencies: - "@jest/transform": "npm:^29.7.0" - "@types/babel__core": "npm:^7.1.14" - babel-plugin-istanbul: "npm:^6.1.1" - babel-preset-jest: "npm:^29.6.3" - chalk: "npm:^4.0.0" - graceful-fs: "npm:^4.2.9" - slash: "npm:^3.0.0" - peerDependencies: - "@babel/core": ^7.8.0 - checksum: 10c0/2eda9c1391e51936ca573dd1aedfee07b14c59b33dbe16ef347873ddd777bcf6e2fc739681e9e9661ab54ef84a3109a03725be2ac32cd2124c07ea4401cbe8c1 - languageName: node - linkType: hard - -"babel-loader@npm:^9.1.3": - version: 9.1.3 - resolution: "babel-loader@npm:9.1.3" - dependencies: - find-cache-dir: "npm:^4.0.0" - schema-utils: "npm:^4.0.0" - peerDependencies: - "@babel/core": ^7.12.0 - webpack: ">=5" - checksum: 10c0/e3fc3c9e02bd908b37e8e8cd4f3d7280cf6ac45e33fc203aedbb615135a0fecc33bf92573b71a166a827af029d302c0b060354985cd91d510320bd70a2f949eb - languageName: node - linkType: hard - -"babel-plugin-dynamic-import-node@npm:^2.3.3": - version: 2.3.3 - resolution: "babel-plugin-dynamic-import-node@npm:2.3.3" - dependencies: - object.assign: "npm:^4.1.0" - checksum: 10c0/1bd80df981e1fc1aff0cd4e390cf27aaa34f95f7620cd14dff07ba3bad56d168c098233a7d2deb2c9b1dc13643e596a6b94fc608a3412ee3c56e74a25cd2167e - languageName: node - linkType: hard - -"babel-plugin-istanbul@npm:^6.1.1": - version: 6.1.1 - resolution: "babel-plugin-istanbul@npm:6.1.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.0.0" - "@istanbuljs/load-nyc-config": "npm:^1.0.0" - "@istanbuljs/schema": "npm:^0.1.2" - istanbul-lib-instrument: "npm:^5.0.4" - test-exclude: "npm:^6.0.0" - checksum: 10c0/1075657feb705e00fd9463b329921856d3775d9867c5054b449317d39153f8fbcebd3e02ebf00432824e647faff3683a9ca0a941325ef1afe9b3c4dd51b24beb - languageName: node - linkType: hard - -"babel-plugin-jest-hoist@npm:^29.6.3": - version: 29.6.3 - resolution: "babel-plugin-jest-hoist@npm:29.6.3" - dependencies: - "@babel/template": "npm:^7.3.3" - "@babel/types": "npm:^7.3.3" - "@types/babel__core": "npm:^7.1.14" - "@types/babel__traverse": "npm:^7.0.6" - checksum: 10c0/7e6451caaf7dce33d010b8aafb970e62f1b0c0b57f4978c37b0d457bbcf0874d75a395a102daf0bae0bd14eafb9f6e9a165ee5e899c0a4f1f3bb2e07b304ed2e - languageName: node - linkType: hard - -"babel-plugin-polyfill-corejs2@npm:^0.4.10": - version: 0.4.11 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" - dependencies: - "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/b2217bc8d5976cf8142453ed44daabf0b2e0e75518f24eac83b54a8892e87a88f1bd9089daa92fd25df979ecd0acfd29b6bc28c4182c1c46344cee15ef9bce84 - languageName: node - linkType: hard - -"babel-plugin-polyfill-corejs3@npm:^0.10.1, babel-plugin-polyfill-corejs3@npm:^0.10.4": - version: 0.10.6 - resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" - core-js-compat: "npm:^3.38.0" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/3a69220471b07722c2ae6537310bf26b772514e12b601398082965459c838be70a0ca70b0662f0737070654ff6207673391221d48599abb4a2b27765206d9f79 - languageName: node - linkType: hard - -"babel-plugin-polyfill-regenerator@npm:^0.6.1": - version: 0.6.2 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/bc541037cf7620bc84ddb75a1c0ce3288f90e7d2799c070a53f8a495c8c8ae0316447becb06f958dd25dcce2a2fce855d318ecfa48036a1ddb218d55aa38a744 - languageName: node - linkType: hard - -"babel-preset-current-node-syntax@npm:^1.0.0": - version: 1.1.0 - resolution: "babel-preset-current-node-syntax@npm:1.1.0" - dependencies: - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - "@babel/plugin-syntax-bigint": "npm:^7.8.3" - "@babel/plugin-syntax-class-properties": "npm:^7.12.13" - "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" - "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" - "@babel/plugin-syntax-import-meta": "npm:^7.10.4" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" - "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/0b838d4412e3322cb4436f246e24e9c00bebcedfd8f00a2f51489db683bd35406bbd55a700759c28d26959c6e03f84dd6a1426f576f440267c1d7a73c5717281 - languageName: node - linkType: hard - -"babel-preset-jest@npm:^29.6.3": - version: 29.6.3 - resolution: "babel-preset-jest@npm:29.6.3" - dependencies: - babel-plugin-jest-hoist: "npm:^29.6.3" - babel-preset-current-node-syntax: "npm:^1.0.0" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/ec5fd0276b5630b05f0c14bb97cc3815c6b31600c683ebb51372e54dcb776cff790bdeeabd5b8d01ede375a040337ccbf6a3ccd68d3a34219125945e167ad943 - languageName: node - linkType: hard - -"bail@npm:^2.0.0": - version: 2.0.2 - resolution: "bail@npm:2.0.2" - checksum: 10c0/25cbea309ef6a1f56214187004e8f34014eb015713ea01fa5b9b7e9e776ca88d0fdffd64143ac42dc91966c915a4b7b683411b56e14929fad16153fc026ffb8b - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee - languageName: node - linkType: hard - -"batch@npm:0.6.1": - version: 0.6.1 - resolution: "batch@npm:0.6.1" - checksum: 10c0/925a13897b4db80d4211082fe287bcf96d297af38e26448c857cee3e095c9792e3b8f26b37d268812e7f38a589f694609de8534a018b1937d7dc9f84e6b387c5 - languageName: node - linkType: hard - -"big.js@npm:^5.2.2": - version: 5.2.2 - resolution: "big.js@npm:5.2.2" - checksum: 10c0/230520f1ff920b2d2ce3e372d77a33faa4fa60d802fe01ca4ffbc321ee06023fe9a741ac02793ee778040a16b7e497f7d60c504d1c402b8fdab6f03bb785a25f - languageName: node - linkType: hard - -"binary-extensions@npm:^2.0.0": - version: 2.3.0 - resolution: "binary-extensions@npm:2.3.0" - checksum: 10c0/75a59cafc10fb12a11d510e77110c6c7ae3f4ca22463d52487709ca7f18f69d886aa387557cc9864fbdb10153d0bdb4caacabf11541f55e89ed6e18d12ece2b5 - languageName: node - linkType: hard - -"body-parser@npm:1.20.2": - version: 1.20.2 - resolution: "body-parser@npm:1.20.2" - dependencies: - bytes: "npm:3.1.2" - content-type: "npm:~1.0.5" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - on-finished: "npm:2.4.1" - qs: "npm:6.11.0" - raw-body: "npm:2.5.2" - type-is: "npm:~1.6.18" - unpipe: "npm:1.0.0" - checksum: 10c0/06f1438fff388a2e2354c96aa3ea8147b79bfcb1262dfcc2aae68ec13723d01d5781680657b74e9f83c808266d5baf52804032fbde2b7382b89bd8cdb273ace9 - languageName: node - linkType: hard - -"bonjour-service@npm:^1.0.11": - version: 1.2.1 - resolution: "bonjour-service@npm:1.2.1" - dependencies: - fast-deep-equal: "npm:^3.1.3" - multicast-dns: "npm:^7.2.5" - checksum: 10c0/953cbfc27fc9e36e6f988012993ab2244817d82426603e0390d4715639031396c932b6657b1aa4ec30dbb5fa903d6b2c7f1be3af7a8ba24165c93e987c849730 - languageName: node - linkType: hard - -"boolbase@npm:^1.0.0": - version: 1.0.0 - resolution: "boolbase@npm:1.0.0" - checksum: 10c0/e4b53deb4f2b85c52be0e21a273f2045c7b6a6ea002b0e139c744cb6f95e9ec044439a52883b0d74dedd1ff3da55ed140cfdddfed7fb0cccbed373de5dce1bcf - languageName: node - linkType: hard - -"boxen@npm:^6.2.1": - version: 6.2.1 - resolution: "boxen@npm:6.2.1" - dependencies: - ansi-align: "npm:^3.0.1" - camelcase: "npm:^6.2.0" - chalk: "npm:^4.1.2" - cli-boxes: "npm:^3.0.0" - string-width: "npm:^5.0.1" - type-fest: "npm:^2.5.0" - widest-line: "npm:^4.0.1" - wrap-ansi: "npm:^8.0.1" - checksum: 10c0/2a50d059c950a50d9f3c873093702747740814ce8819225c4f8cbe92024c9f5a9219d2b7128f5cfa17c022644d929bbbc88b9591de67249c6ebe07f7486bdcfd - languageName: node - linkType: hard - -"boxen@npm:^7.0.0": - version: 7.1.1 - resolution: "boxen@npm:7.1.1" - dependencies: - ansi-align: "npm:^3.0.1" - camelcase: "npm:^7.0.1" - chalk: "npm:^5.2.0" - cli-boxes: "npm:^3.0.0" - string-width: "npm:^5.1.2" - type-fest: "npm:^2.13.0" - widest-line: "npm:^4.0.1" - wrap-ansi: "npm:^8.1.0" - checksum: 10c0/3a9891dc98ac40d582c9879e8165628258e2c70420c919e70fff0a53ccc7b42825e73cda6298199b2fbc1f41f5d5b93b492490ad2ae27623bed3897ddb4267f8 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: "npm:^1.0.0" - checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f - languageName: node - linkType: hard - -"braces@npm:^3.0.3, braces@npm:~3.0.2": - version: 3.0.3 - resolution: "braces@npm:3.0.3" - dependencies: - fill-range: "npm:^7.1.1" - checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 - languageName: node - linkType: hard - -"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.21.10, browserslist@npm:^4.23.0, browserslist@npm:^4.23.1, browserslist@npm:^4.23.3": - version: 4.23.3 - resolution: "browserslist@npm:4.23.3" - dependencies: - caniuse-lite: "npm:^1.0.30001646" - electron-to-chromium: "npm:^1.5.4" - node-releases: "npm:^2.0.18" - update-browserslist-db: "npm:^1.1.0" - bin: - browserslist: cli.js - checksum: 10c0/3063bfdf812815346447f4796c8f04601bf5d62003374305fd323c2a463e42776475bcc5309264e39bcf9a8605851e53560695991a623be988138b3ff8c66642 - languageName: node - linkType: hard - -"bser@npm:2.1.1": - version: 2.1.1 - resolution: "bser@npm:2.1.1" - dependencies: - node-int64: "npm:^0.4.0" - checksum: 10c0/24d8dfb7b6d457d73f32744e678a60cc553e4ec0e9e1a01cf614b44d85c3c87e188d3cc78ef0442ce5032ee6818de20a0162ba1074725c0d08908f62ea979227 - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 - languageName: node - linkType: hard - -"builtin-modules@npm:^3.3.0": - version: 3.3.0 - resolution: "builtin-modules@npm:3.3.0" - checksum: 10c0/2cb3448b4f7306dc853632a4fcddc95e8d4e4b9868c139400027b71938fc6806d4ff44007deffb362ac85724bd40c2c6452fb6a0aa4531650eeddb98d8e5ee8a - languageName: node - linkType: hard - -"bytes@npm:3.0.0": - version: 3.0.0 - resolution: "bytes@npm:3.0.0" - checksum: 10c0/91d42c38601c76460519ffef88371caacaea483a354c8e4b8808e7b027574436a5713337c003ea3de63ee4991c2a9a637884fdfe7f761760d746929d9e8fec60 - languageName: node - linkType: hard - -"bytes@npm:3.1.2": - version: 3.1.2 - resolution: "bytes@npm:3.1.2" - checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e - languageName: node - linkType: hard - -"cacache@npm:^18.0.0": - version: 18.0.4 - resolution: "cacache@npm:18.0.4" - dependencies: - "@npmcli/fs": "npm:^3.1.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^4.0.0" - ssri: "npm:^10.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^3.0.0" - checksum: 10c0/6c055bafed9de4f3dcc64ac3dc7dd24e863210902b7c470eb9ce55a806309b3efff78033e3d8b4f7dcc5d467f2db43c6a2857aaaf26f0094b8a351d44c42179f - languageName: node - linkType: hard - -"cacheable-lookup@npm:^7.0.0": - version: 7.0.0 - resolution: "cacheable-lookup@npm:7.0.0" - checksum: 10c0/63a9c144c5b45cb5549251e3ea774c04d63063b29e469f7584171d059d3a88f650f47869a974e2d07de62116463d742c287a81a625e791539d987115cb081635 - languageName: node - linkType: hard - -"cacheable-request@npm:^10.2.8": - version: 10.2.14 - resolution: "cacheable-request@npm:10.2.14" - dependencies: - "@types/http-cache-semantics": "npm:^4.0.2" - get-stream: "npm:^6.0.1" - http-cache-semantics: "npm:^4.1.1" - keyv: "npm:^4.5.3" - mimic-response: "npm:^4.0.0" - normalize-url: "npm:^8.0.0" - responselike: "npm:^3.0.0" - checksum: 10c0/41b6658db369f20c03128227ecd219ca7ac52a9d24fc0f499cc9aa5d40c097b48b73553504cebd137024d957c0ddb5b67cf3ac1439b136667f3586257763f88d - languageName: node - linkType: hard - -"call-bind@npm:^1.0.5, call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - set-function-length: "npm:^1.2.1" - checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d - languageName: node - linkType: hard - -"call-me-maybe@npm:^1.0.1": - version: 1.0.2 - resolution: "call-me-maybe@npm:1.0.2" - checksum: 10c0/8eff5dbb61141ebb236ed71b4e9549e488bcb5451c48c11e5667d5c75b0532303788a1101e6978cafa2d0c8c1a727805599c2741e3e0982855c9f1d78cd06c9f - languageName: node - linkType: hard - -"callsites@npm:^3.0.0, callsites@npm:^3.1.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 - languageName: node - linkType: hard - -"camel-case@npm:^4.1.2": - version: 4.1.2 - resolution: "camel-case@npm:4.1.2" - dependencies: - pascal-case: "npm:^3.1.2" - tslib: "npm:^2.0.3" - checksum: 10c0/bf9eefaee1f20edbed2e9a442a226793bc72336e2b99e5e48c6b7252b6f70b080fc46d8246ab91939e2af91c36cdd422e0af35161e58dd089590f302f8f64c8a - languageName: node - linkType: hard - -"camelcase@npm:^5.3.1": - version: 5.3.1 - resolution: "camelcase@npm:5.3.1" - checksum: 10c0/92ff9b443bfe8abb15f2b1513ca182d16126359ad4f955ebc83dc4ddcc4ef3fdd2c078bc223f2673dc223488e75c99b16cc4d056624374b799e6a1555cf61b23 - languageName: node - linkType: hard - -"camelcase@npm:^6.2.0": - version: 6.3.0 - resolution: "camelcase@npm:6.3.0" - checksum: 10c0/0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710 - languageName: node - linkType: hard - -"camelcase@npm:^7.0.1": - version: 7.0.1 - resolution: "camelcase@npm:7.0.1" - checksum: 10c0/3adfc9a0e96d51b3a2f4efe90a84dad3e206aaa81dfc664f1bd568270e1bf3b010aad31f01db16345b4ffe1910e16ab411c7273a19a859addd1b98ef7cf4cfbd - languageName: node - linkType: hard - -"caniuse-api@npm:^3.0.0": - version: 3.0.0 - resolution: "caniuse-api@npm:3.0.0" - dependencies: - browserslist: "npm:^4.0.0" - caniuse-lite: "npm:^1.0.0" - lodash.memoize: "npm:^4.1.2" - lodash.uniq: "npm:^4.5.0" - checksum: 10c0/60f9e85a3331e6d761b1b03eec71ca38ef7d74146bece34694853033292156b815696573ed734b65583acf493e88163618eda915c6c826d46a024c71a9572b4c - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001646": - version: 1.0.30001651 - resolution: "caniuse-lite@npm:1.0.30001651" - checksum: 10c0/7821278952a6dbd17358e5d08083d258f092e2a530f5bc1840657cb140fbbc5ec44293bc888258c44a18a9570cde149ed05819ac8320b9710cf22f699891e6ad - languageName: node - linkType: hard - -"ccount@npm:^2.0.0": - version: 2.0.1 - resolution: "ccount@npm:2.0.1" - checksum: 10c0/3939b1664390174484322bc3f45b798462e6c07ee6384cb3d645e0aa2f318502d174845198c1561930e1d431087f74cf1fe291ae9a4722821a9f4ba67e574350 - languageName: node - linkType: hard - -"chalk-template@npm:1.1.0, chalk-template@npm:^1.1.0": - version: 1.1.0 - resolution: "chalk-template@npm:1.1.0" - dependencies: - chalk: "npm:^5.2.0" - checksum: 10c0/bb6eda6115a33d06828caf8c44f786c26e0d392c74c2bd6bb0f7526588b15664e3e7c0305858531cdd9b266fc54a31fe71fe3844afcd47a3e67445313f149437 - languageName: node - linkType: hard - -"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 - languageName: node - linkType: hard - -"chalk@npm:5.3.0, chalk@npm:^5.0.1, chalk@npm:^5.2.0, chalk@npm:^5.3.0": - version: 5.3.0 - resolution: "chalk@npm:5.3.0" - checksum: 10c0/8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 - languageName: node - linkType: hard - -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 - languageName: node - linkType: hard - -"char-regex@npm:^1.0.2": - version: 1.0.2 - resolution: "char-regex@npm:1.0.2" - checksum: 10c0/57a09a86371331e0be35d9083ba429e86c4f4648ecbe27455dbfb343037c16ee6fdc7f6b61f433a57cc5ded5561d71c56a150e018f40c2ffb7bc93a26dae341e - languageName: node - linkType: hard - -"character-entities-html4@npm:^2.0.0": - version: 2.1.0 - resolution: "character-entities-html4@npm:2.1.0" - checksum: 10c0/fe61b553f083400c20c0b0fd65095df30a0b445d960f3bbf271536ae6c3ba676f39cb7af0b4bf2755812f08ab9b88f2feed68f9aebb73bb153f7a115fe5c6e40 - languageName: node - linkType: hard - -"character-entities-legacy@npm:^3.0.0": - version: 3.0.0 - resolution: "character-entities-legacy@npm:3.0.0" - checksum: 10c0/ec4b430af873661aa754a896a2b55af089b4e938d3d010fad5219299a6b6d32ab175142699ee250640678cd64bdecd6db3c9af0b8759ab7b155d970d84c4c7d1 - languageName: node - linkType: hard - -"character-entities@npm:^2.0.0": - version: 2.0.2 - resolution: "character-entities@npm:2.0.2" - checksum: 10c0/b0c645a45bcc90ff24f0e0140f4875a8436b8ef13b6bcd31ec02cfb2ca502b680362aa95386f7815bdc04b6464d48cf191210b3840d7c04241a149ede591a308 - languageName: node - linkType: hard - -"character-reference-invalid@npm:^2.0.0": - version: 2.0.1 - resolution: "character-reference-invalid@npm:2.0.1" - checksum: 10c0/2ae0dec770cd8659d7e8b0ce24392d83b4c2f0eb4a3395c955dce5528edd4cc030a794cfa06600fcdd700b3f2de2f9b8e40e309c0011c4180e3be64a0b42e6a1 - languageName: node - linkType: hard - -"cheerio-select@npm:^2.1.0": - version: 2.1.0 - resolution: "cheerio-select@npm:2.1.0" - dependencies: - boolbase: "npm:^1.0.0" - css-select: "npm:^5.1.0" - css-what: "npm:^6.1.0" - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - domutils: "npm:^3.0.1" - checksum: 10c0/2242097e593919dba4aacb97d7b8275def8b9ec70b00aa1f43335456870cfc9e284eae2080bdc832ed232dabb9eefcf56c722d152da4a154813fb8814a55d282 - languageName: node - linkType: hard - -"cheerio@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "cheerio@npm:1.0.0-rc.12" - dependencies: - cheerio-select: "npm:^2.1.0" - dom-serializer: "npm:^2.0.0" - domhandler: "npm:^5.0.3" - domutils: "npm:^3.0.1" - htmlparser2: "npm:^8.0.1" - parse5: "npm:^7.0.0" - parse5-htmlparser2-tree-adapter: "npm:^7.0.0" - checksum: 10c0/c85d2f2461e3f024345b78e0bb16ad8e41492356210470dd1e7d5a91391da9fcf6c0a7cb48a9ba8820330153f0cedb4d0a60c7af15d96ecdb3092299b9d9c0cc - languageName: node - linkType: hard - -"chevrotain@npm:7.1.1": - version: 7.1.1 - resolution: "chevrotain@npm:7.1.1" - dependencies: - regexp-to-ast: "npm:0.5.0" - checksum: 10c0/3fbbb7a30fb87a4cd141a28bdfa2851f54fde4099aa92071442b47605dfc5974eee0388ec25a517087fcea4dcc1f0ce6b371bc975591346327829aa83b3c843d - languageName: node - linkType: hard - -"chokidar@npm:^3.3.1, chokidar@npm:^3.4.2, chokidar@npm:^3.5.3": - version: 3.6.0 - resolution: "chokidar@npm:3.6.0" - dependencies: - anymatch: "npm:~3.1.2" - braces: "npm:~3.0.2" - fsevents: "npm:~2.3.2" - glob-parent: "npm:~5.1.2" - is-binary-path: "npm:~2.1.0" - is-glob: "npm:~4.0.1" - normalize-path: "npm:~3.0.0" - readdirp: "npm:~3.6.0" - dependenciesMeta: - fsevents: - optional: true - checksum: 10c0/8361dcd013f2ddbe260eacb1f3cb2f2c6f2b0ad118708a343a5ed8158941a39cb8fb1d272e0f389712e74ee90ce8ba864eece9e0e62b9705cb468a2f6d917462 - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 - languageName: node - linkType: hard - -"chrome-trace-event@npm:^1.0.2": - version: 1.0.4 - resolution: "chrome-trace-event@npm:1.0.4" - checksum: 10c0/3058da7a5f4934b87cf6a90ef5fb68ebc5f7d06f143ed5a4650208e5d7acae47bc03ec844b29fbf5ba7e46e8daa6acecc878f7983a4f4bb7271593da91e61ff5 - languageName: node - linkType: hard - -"ci-info@npm:^3.2.0": - version: 3.9.0 - resolution: "ci-info@npm:3.9.0" - checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a - languageName: node - linkType: hard - -"ci-info@npm:^4.0.0": - version: 4.0.0 - resolution: "ci-info@npm:4.0.0" - checksum: 10c0/ecc003e5b60580bd081d83dd61d398ddb8607537f916313e40af4667f9c92a1243bd8e8a591a5aa78e418afec245dbe8e90a0e26e39ca0825129a99b978dd3f9 - languageName: node - linkType: hard - -"citty@npm:^0.1.2, citty@npm:^0.1.6": - version: 0.1.6 - resolution: "citty@npm:0.1.6" - dependencies: - consola: "npm:^3.2.3" - checksum: 10c0/d26ad82a9a4a8858c7e149d90b878a3eceecd4cfd3e2ed3cd5f9a06212e451fb4f8cbe0fa39a3acb1b3e8f18e22db8ee5def5829384bad50e823d4b301609b48 - languageName: node - linkType: hard - -"cjs-module-lexer@npm:^1.0.0": - version: 1.3.1 - resolution: "cjs-module-lexer@npm:1.3.1" - checksum: 10c0/cd98fbf3c7f4272fb0ebf71d08d0c54bc75ce0e30b9d186114e15b4ba791f3d310af65a339eea2a0318599af2818cdd8886d353b43dfab94468f72987397ad16 - languageName: node - linkType: hard - -"clean-css@npm:^5.2.2, clean-css@npm:^5.3.2, clean-css@npm:~5.3.2": - version: 5.3.3 - resolution: "clean-css@npm:5.3.3" - dependencies: - source-map: "npm:~0.6.0" - checksum: 10c0/381de7523e23f3762eb180e327dcc0cedafaf8cb1cd8c26b7cc1fc56e0829a92e734729c4f955394d65ed72fb62f82d8baf78af34b33b8a7d41ebad2accdd6fb - languageName: node - linkType: hard - -"clean-regexp@npm:^1.0.0": - version: 1.0.0 - resolution: "clean-regexp@npm:1.0.0" - dependencies: - escape-string-regexp: "npm:^1.0.5" - checksum: 10c0/fd9c7446551b8fc536f95e8a286d431017cd4ba1ec2e53997ec9159385e9c317672f6dfc4d49fdb97449fdb53b0bacd0a8bab9343b8fdd2e46c7ddf6173d0db7 - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 - languageName: node - linkType: hard - -"clear-module@npm:^4.1.2": - version: 4.1.2 - resolution: "clear-module@npm:4.1.2" - dependencies: - parent-module: "npm:^2.0.0" - resolve-from: "npm:^5.0.0" - checksum: 10c0/73207f06af256e3c8901ceaa74f7e4468a777aa68dedc7f745db4116861a7f8e69c558e16dbdf7b3d2295675d5896f916ba55b5dc737dda81792dbeee1488127 - languageName: node - linkType: hard - -"cli-boxes@npm:^3.0.0": - version: 3.0.0 - resolution: "cli-boxes@npm:3.0.0" - checksum: 10c0/4db3e8fbfaf1aac4fb3a6cbe5a2d3fa048bee741a45371b906439b9ffc821c6e626b0f108bdcd3ddf126a4a319409aedcf39a0730573ff050fdd7b6731e99fb9 - languageName: node - linkType: hard - -"cli-cursor@npm:^4.0.0": - version: 4.0.0 - resolution: "cli-cursor@npm:4.0.0" - dependencies: - restore-cursor: "npm:^4.0.0" - checksum: 10c0/e776e8c3c6727300d0539b0d25160b2bb56aed1a63942753ba1826b012f337a6f4b7ace3548402e4f2f13b5e16bfd751be672c44b203205e7eca8be94afec42c - languageName: node - linkType: hard - -"cli-spinners@npm:^2.9.2": - version: 2.9.2 - resolution: "cli-spinners@npm:2.9.2" - checksum: 10c0/907a1c227ddf0d7a101e7ab8b300affc742ead4b4ebe920a5bf1bc6d45dce2958fcd195eb28fa25275062fe6fa9b109b93b63bc8033396ed3bcb50297008b3a3 - languageName: node - linkType: hard - -"cli-table3@npm:^0.6.3": - version: 0.6.5 - resolution: "cli-table3@npm:0.6.5" - dependencies: - "@colors/colors": "npm:1.5.0" - string-width: "npm:^4.2.0" - dependenciesMeta: - "@colors/colors": - optional: true - checksum: 10c0/d7cc9ed12212ae68241cc7a3133c52b844113b17856e11f4f81308acc3febcea7cc9fd298e70933e294dd642866b29fd5d113c2c098948701d0c35f09455de78 - languageName: node - linkType: hard - -"cliui@npm:^8.0.1": - version: 8.0.1 - resolution: "cliui@npm:8.0.1" - dependencies: - string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.1" - wrap-ansi: "npm:^7.0.0" - checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 - languageName: node - linkType: hard - -"cloc@npm:^2.2.0-cloc": - version: 2.11.0 - resolution: "cloc@npm:2.11.0" - bin: - cloc: lib/cloc - checksum: 10c0/9f08ab6db81f015f725271522b8af074d06abe7425f4d44d3499b5635b87b3160962b4c7a68e0dcb7a5f54234e5ef89ecc6a979697e0b567633a2e45c42eaee9 - languageName: node - linkType: hard - -"clone-deep@npm:^4.0.1": - version: 4.0.1 - resolution: "clone-deep@npm:4.0.1" - dependencies: - is-plain-object: "npm:^2.0.4" - kind-of: "npm:^6.0.2" - shallow-clone: "npm:^3.0.0" - checksum: 10c0/637753615aa24adf0f2d505947a1bb75e63964309034a1cf56ba4b1f30af155201edd38d26ffe26911adaae267a3c138b344a4947d39f5fc1b6d6108125aa758 - languageName: node - linkType: hard - -"clone@npm:^1.0.2": - version: 1.0.4 - resolution: "clone@npm:1.0.4" - checksum: 10c0/2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b - languageName: node - linkType: hard - -"clsx@npm:^1.2.1": - version: 1.2.1 - resolution: "clsx@npm:1.2.1" - checksum: 10c0/34dead8bee24f5e96f6e7937d711978380647e936a22e76380290e35486afd8634966ce300fc4b74a32f3762c7d4c0303f442c3e259f4ce02374eb0c82834f27 - languageName: node - linkType: hard - -"clsx@npm:^2.0.0, clsx@npm:^2.1.1": - version: 2.1.1 - resolution: "clsx@npm:2.1.1" - checksum: 10c0/c4c8eb865f8c82baab07e71bfa8897c73454881c4f99d6bc81585aecd7c441746c1399d08363dc096c550cceaf97bd4ce1e8854e1771e9998d9f94c4fe075839 - languageName: node - linkType: hard - -"co@npm:^4.6.0": - version: 4.6.0 - resolution: "co@npm:4.6.0" - checksum: 10c0/c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28 - languageName: node - linkType: hard - -"code-block-writer@npm:^11.0.3": - version: 11.0.3 - resolution: "code-block-writer@npm:11.0.3" - checksum: 10c0/12fe4c02152a2b607e8913b39dcc31dcb5240f7c8933a3335d4e42a5418af409bf7ed454c80d6d8c12f9c59bb685dd88f9467874b46be62236dfbed446d03fd6 - languageName: node - linkType: hard - -"collapse-white-space@npm:^2.0.0": - version: 2.1.0 - resolution: "collapse-white-space@npm:2.1.0" - checksum: 10c0/b2e2800f4ab261e62eb27a1fbe853378296e3a726d6695117ed033e82d61fb6abeae4ffc1465d5454499e237005de9cfc52c9562dc7ca4ac759b9a222ef14453 - languageName: node - linkType: hard - -"collect-v8-coverage@npm:^1.0.0": - version: 1.0.2 - resolution: "collect-v8-coverage@npm:1.0.2" - checksum: 10c0/ed7008e2e8b6852c5483b444a3ae6e976e088d4335a85aa0a9db2861c5f1d31bd2d7ff97a60469b3388deeba661a619753afbe201279fb159b4b9548ab8269a1 - languageName: node - linkType: hard - -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: "npm:1.1.3" - checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: "npm:~1.1.4" - checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 - languageName: node - linkType: hard - -"colord@npm:^2.9.3": - version: 2.9.3 - resolution: "colord@npm:2.9.3" - checksum: 10c0/9699e956894d8996b28c686afe8988720785f476f59335c80ce852ded76ab3ebe252703aec53d9bef54f6219aea6b960fb3d9a8300058a1d0c0d4026460cd110 - languageName: node - linkType: hard - -"colorette@npm:^2.0.10": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 - languageName: node - linkType: hard - -"colors@npm:1.0.x": - version: 1.0.3 - resolution: "colors@npm:1.0.3" - checksum: 10c0/f9e40dd8b3e1a65378a7ced3fced15ddfd60aaf38e99a7521a7fdb25056b15e092f651cd0f5aa1e9b04fa8ce3616d094e07fc6c2bb261e24098db1ddd3d09a1d - languageName: node - linkType: hard - -"combine-promises@npm:^1.1.0": - version: 1.2.0 - resolution: "combine-promises@npm:1.2.0" - checksum: 10c0/906ebf056006eff93c11548df0415053b6756145dae1f5a89579e743cb15fceeb0604555791321db4fba5072aa39bb4de6547e9cdf14589fe949b33d1613422c - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.8": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: "npm:~1.0.0" - checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 - languageName: node - linkType: hard - -"comma-separated-tokens@npm:^2.0.0": - version: 2.0.3 - resolution: "comma-separated-tokens@npm:2.0.3" - checksum: 10c0/91f90f1aae320f1755d6957ef0b864fe4f54737f3313bd95e0802686ee2ca38bff1dd381964d00ae5db42912dd1f4ae5c2709644e82706ffc6f6842a813cdd67 - languageName: node - linkType: hard - -"command-exists@npm:^1.2.9": - version: 1.2.9 - resolution: "command-exists@npm:1.2.9" - checksum: 10c0/75040240062de46cd6cd43e6b3032a8b0494525c89d3962e280dde665103f8cc304a8b313a5aa541b91da2f5a9af75c5959dc3a77893a2726407a5e9a0234c16 - languageName: node - linkType: hard - -"commander@npm:12.1.0, commander@npm:^12.0.0, commander@npm:^12.1.0, commander@npm:~12.1.0": - version: 12.1.0 - resolution: "commander@npm:12.1.0" - checksum: 10c0/6e1996680c083b3b897bfc1cfe1c58dfbcd9842fd43e1aaf8a795fbc237f65efcc860a3ef457b318e73f29a4f4a28f6403c3d653d021d960e4632dd45bde54a9 - languageName: node - linkType: hard - -"commander@npm:^10.0.0": - version: 10.0.1 - resolution: "commander@npm:10.0.1" - checksum: 10c0/53f33d8927758a911094adadda4b2cbac111a5b377d8706700587650fd8f45b0bbe336de4b5c3fe47fd61f420a3d9bd452b6e0e6e5600a7e74d7bf0174f6efe3 - languageName: node - linkType: hard - -"commander@npm:^2.20.0": - version: 2.20.3 - resolution: "commander@npm:2.20.3" - checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 - languageName: node - linkType: hard - -"commander@npm:^4.1.1": - version: 4.1.1 - resolution: "commander@npm:4.1.1" - checksum: 10c0/84a76c08fe6cc08c9c93f62ac573d2907d8e79138999312c92d4155bc2325d487d64d13f669b2000c9f8caf70493c1be2dac74fec3c51d5a04f8bc3ae1830bab - languageName: node - linkType: hard - -"commander@npm:^5.1.0": - version: 5.1.0 - resolution: "commander@npm:5.1.0" - checksum: 10c0/da9d71dbe4ce039faf1fe9eac3771dca8c11d66963341f62602f7b66e36d2a3f8883407af4f9a37b1db1a55c59c0c1325f186425764c2e963dc1d67aec2a4b6d - languageName: node - linkType: hard - -"commander@npm:^6.2.0, commander@npm:^6.2.1": - version: 6.2.1 - resolution: "commander@npm:6.2.1" - checksum: 10c0/85748abd9d18c8bc88febed58b98f66b7c591d9b5017cad459565761d7b29ca13b7783ea2ee5ce84bf235897333706c4ce29adf1ce15c8252780e7000e2ce9ea - languageName: node - linkType: hard - -"commander@npm:^7.2.0": - version: 7.2.0 - resolution: "commander@npm:7.2.0" - checksum: 10c0/8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a - languageName: node - linkType: hard - -"commander@npm:^8.3.0": - version: 8.3.0 - resolution: "commander@npm:8.3.0" - checksum: 10c0/8b043bb8322ea1c39664a1598a95e0495bfe4ca2fad0d84a92d7d1d8d213e2a155b441d2470c8e08de7c4a28cf2bc6e169211c49e1b21d9f7edc6ae4d9356060 - languageName: node - linkType: hard - -"comment-json@npm:^4.2.5": - version: 4.2.5 - resolution: "comment-json@npm:4.2.5" - dependencies: - array-timsort: "npm:^1.0.3" - core-util-is: "npm:^1.0.3" - esprima: "npm:^4.0.1" - has-own-prop: "npm:^2.0.0" - repeat-string: "npm:^1.6.1" - checksum: 10c0/e22f13f18fcc484ac33c8bc02a3d69c3f9467ae5063fdfb3df7735f83a8d9a2cab6a32b7d4a0c53123413a9577de8e17c8cc88369c433326799558febb34ef9c - languageName: node - linkType: hard - -"comment-parser@npm:1.4.1": - version: 1.4.1 - resolution: "comment-parser@npm:1.4.1" - checksum: 10c0/d6c4be3f5be058f98b24f2d557f745d8fe1cc9eb75bebbdccabd404a0e1ed41563171b16285f593011f8b6a5ec81f564fb1f2121418ac5cbf0f49255bf0840dd - languageName: node - linkType: hard - -"common-path-prefix@npm:^3.0.0": - version: 3.0.0 - resolution: "common-path-prefix@npm:3.0.0" - checksum: 10c0/c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb - languageName: node - linkType: hard - -"commondir@npm:^1.0.1": - version: 1.0.1 - resolution: "commondir@npm:1.0.1" - checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 - languageName: node - linkType: hard - -"compressible@npm:~2.0.16": - version: 2.0.18 - resolution: "compressible@npm:2.0.18" - dependencies: - mime-db: "npm:>= 1.43.0 < 2" - checksum: 10c0/8a03712bc9f5b9fe530cc5a79e164e665550d5171a64575d7dcf3e0395d7b4afa2d79ab176c61b5b596e28228b350dd07c1a2a6ead12fd81d1b6cd632af2fef7 - languageName: node - linkType: hard - -"compression@npm:^1.7.4": - version: 1.7.4 - resolution: "compression@npm:1.7.4" - dependencies: - accepts: "npm:~1.3.5" - bytes: "npm:3.0.0" - compressible: "npm:~2.0.16" - debug: "npm:2.6.9" - on-headers: "npm:~1.0.2" - safe-buffer: "npm:5.1.2" - vary: "npm:~1.1.2" - checksum: 10c0/138db836202a406d8a14156a5564fb1700632a76b6e7d1546939472895a5304f2b23c80d7a22bf44c767e87a26e070dbc342ea63bb45ee9c863354fa5556bbbc - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f - languageName: node - linkType: hard - -"confbox@npm:^0.1.7": - version: 0.1.7 - resolution: "confbox@npm:0.1.7" - checksum: 10c0/18b40c2f652196a833f3f1a5db2326a8a579cd14eacabfe637e4fc8cb9b68d7cf296139a38c5e7c688ce5041bf46f9adce05932d43fde44cf7e012840b5da111 - languageName: node - linkType: hard - -"config-chain@npm:^1.1.11": - version: 1.1.13 - resolution: "config-chain@npm:1.1.13" - dependencies: - ini: "npm:^1.3.4" - proto-list: "npm:~1.2.1" - checksum: 10c0/39d1df18739d7088736cc75695e98d7087aea43646351b028dfabd5508d79cf6ef4c5bcd90471f52cd87ae470d1c5490c0a8c1a292fbe6ee9ff688061ea0963e - languageName: node - linkType: hard - -"configstore@npm:^6.0.0": - version: 6.0.0 - resolution: "configstore@npm:6.0.0" - dependencies: - dot-prop: "npm:^6.0.1" - graceful-fs: "npm:^4.2.6" - unique-string: "npm:^3.0.0" - write-file-atomic: "npm:^3.0.3" - xdg-basedir: "npm:^5.0.1" - checksum: 10c0/6681a96038ab3e0397cbdf55e6e1624ac3dfa3afe955e219f683df060188a418bda043c9114a59a337e7aec9562b0a0c838ed7db24289e6d0c266bc8313b9580 - languageName: node - linkType: hard - -"confusing-browser-globals@npm:^1.0.11": - version: 1.0.11 - resolution: "confusing-browser-globals@npm:1.0.11" - checksum: 10c0/475d0a284fa964a5182b519af5738b5b64bf7e413cfd703c1b3496bf6f4df9f827893a9b221c0ea5873c1476835beb1e0df569ba643eff0734010c1eb780589e - languageName: node - linkType: hard - -"connect-history-api-fallback@npm:^2.0.0": - version: 2.0.0 - resolution: "connect-history-api-fallback@npm:2.0.0" - checksum: 10c0/90fa8b16ab76e9531646cc70b010b1dbd078153730c510d3142f6cf07479ae8a812c5a3c0e40a28528dd1681a62395d0cfdef67da9e914c4772ac85d69a3ed87 - languageName: node - linkType: hard - -"consola@npm:^2.15.3": - version: 2.15.3 - resolution: "consola@npm:2.15.3" - checksum: 10c0/34a337e6b4a1349ee4d7b4c568484344418da8fdb829d7d71bfefcd724f608f273987633b6eef465e8de510929907a092e13cb7a28a5d3acb3be446fcc79fd5e - languageName: node - linkType: hard - -"consola@npm:^3.2.3": - version: 3.2.3 - resolution: "consola@npm:3.2.3" - checksum: 10c0/c606220524ec88a05bb1baf557e9e0e04a0c08a9c35d7a08652d99de195c4ddcb6572040a7df57a18ff38bbc13ce9880ad032d56630cef27bef72768ef0ac078 - languageName: node - linkType: hard - -"content-disposition@npm:0.5.2": - version: 0.5.2 - resolution: "content-disposition@npm:0.5.2" - checksum: 10c0/49eebaa0da1f9609b192e99d7fec31d1178cb57baa9d01f5b63b29787ac31e9d18b5a1033e854c68c9b6cce790e700a6f7fa60e43f95e2e416404e114a8f2f49 - languageName: node - linkType: hard - -"content-disposition@npm:0.5.4": - version: 0.5.4 - resolution: "content-disposition@npm:0.5.4" - dependencies: - safe-buffer: "npm:5.2.1" - checksum: 10c0/bac0316ebfeacb8f381b38285dc691c9939bf0a78b0b7c2d5758acadad242d04783cee5337ba7d12a565a19075af1b3c11c728e1e4946de73c6ff7ce45f3f1bb - languageName: node - linkType: hard - -"content-type@npm:~1.0.4, content-type@npm:~1.0.5": - version: 1.0.5 - resolution: "content-type@npm:1.0.5" - checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af - languageName: node - linkType: hard - -"convert-source-map@npm:^2.0.0": - version: 2.0.0 - resolution: "convert-source-map@npm:2.0.0" - checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b - languageName: node - linkType: hard - -"cookie-signature@npm:1.0.6": - version: 1.0.6 - resolution: "cookie-signature@npm:1.0.6" - checksum: 10c0/b36fd0d4e3fef8456915fcf7742e58fbfcc12a17a018e0eb9501c9d5ef6893b596466f03b0564b81af29ff2538fd0aa4b9d54fe5ccbfb4c90ea50ad29fe2d221 - languageName: node - linkType: hard - -"cookie@npm:0.6.0": - version: 0.6.0 - resolution: "cookie@npm:0.6.0" - checksum: 10c0/f2318b31af7a31b4ddb4a678d024514df5e705f9be5909a192d7f116cfb6d45cbacf96a473fa733faa95050e7cff26e7832bb3ef94751592f1387b71c8956686 - languageName: node - linkType: hard - -"copy-text-to-clipboard@npm:^3.2.0": - version: 3.2.0 - resolution: "copy-text-to-clipboard@npm:3.2.0" - checksum: 10c0/d60fdadc59d526e19d56ad23cec2b292d33c771a5091621bd322d138804edd3c10eb2367d46ec71b39f5f7f7116a2910b332281aeb36a5b679199d746a8a5381 - languageName: node - linkType: hard - -"copy-webpack-plugin@npm:^11.0.0": - version: 11.0.0 - resolution: "copy-webpack-plugin@npm:11.0.0" - dependencies: - fast-glob: "npm:^3.2.11" - glob-parent: "npm:^6.0.1" - globby: "npm:^13.1.1" - normalize-path: "npm:^3.0.0" - schema-utils: "npm:^4.0.0" - serialize-javascript: "npm:^6.0.0" - peerDependencies: - webpack: ^5.1.0 - checksum: 10c0/a667dd226b26f148584a35fb705f5af926d872584912cf9fd203c14f2b3a68f473a1f5cf768ec1dd5da23820823b850e5d50458b685c468e4a224b25c12a15b4 - languageName: node - linkType: hard - -"core-js-compat@npm:^3.37.0, core-js-compat@npm:^3.37.1, core-js-compat@npm:^3.38.0": - version: 3.38.0 - resolution: "core-js-compat@npm:3.38.0" - dependencies: - browserslist: "npm:^4.23.3" - checksum: 10c0/9d653a448b8a491034358d2f052e63dda86f75fb65646e2d313a938212470ba1c2f5a83bf31cc583d6c87a9e8d7b0d49458447cab2ff36c4caa097ae381de336 - languageName: node - linkType: hard - -"core-js-pure@npm:^3.30.2": - version: 3.38.0 - resolution: "core-js-pure@npm:3.38.0" - checksum: 10c0/331937ef8c29fd6dc2f87e14a125d7e959881abfced84670cdd289949c85dd992013f9a8f85e9a234b55f912d3638a5873499f672b473a483d2750b22fafe8ac - languageName: node - linkType: hard - -"core-js@npm:^3.31.1": - version: 3.38.0 - resolution: "core-js@npm:3.38.0" - checksum: 10c0/3218ae19bfe0c6560663012cbd3e7f3dc1b36d50fc71e8c365f3b119185e8a35ac4e8bb9698ae510b3c201ef93f40bdc29f9215716ccf31aca28f77969bb4ed0 - languageName: node - linkType: hard - -"core-util-is@npm:^1.0.3, core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 - languageName: node - linkType: hard - -"cosmiconfig@npm:9.0.0": - version: 9.0.0 - resolution: "cosmiconfig@npm:9.0.0" - dependencies: - env-paths: "npm:^2.2.1" - import-fresh: "npm:^3.3.0" - js-yaml: "npm:^4.1.0" - parse-json: "npm:^5.2.0" - peerDependencies: - typescript: ">=4.9.5" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/1c1703be4f02a250b1d6ca3267e408ce16abfe8364193891afc94c2d5c060b69611fdc8d97af74b7e6d5d1aac0ab2fb94d6b079573146bc2d756c2484ce5f0ee - languageName: node - linkType: hard - -"cosmiconfig@npm:^6.0.0": - version: 6.0.0 - resolution: "cosmiconfig@npm:6.0.0" - dependencies: - "@types/parse-json": "npm:^4.0.0" - import-fresh: "npm:^3.1.0" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - yaml: "npm:^1.7.2" - checksum: 10c0/666ed8732d0bf7d7fe6f8516c8ee6041e0622032e8fa26201577b883d2767ad105d03f38b34b93d1f02f26b22a89e7bab4443b9d2e7f931f48d0e944ffa038b5 - languageName: node - linkType: hard - -"cosmiconfig@npm:^7.0.1": - version: 7.1.0 - resolution: "cosmiconfig@npm:7.1.0" - dependencies: - "@types/parse-json": "npm:^4.0.0" - import-fresh: "npm:^3.2.1" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - yaml: "npm:^1.10.0" - checksum: 10c0/b923ff6af581638128e5f074a5450ba12c0300b71302398ea38dbeabd33bbcaa0245ca9adbedfcf284a07da50f99ede5658c80bb3e39e2ce770a99d28a21ef03 - languageName: node - linkType: hard - -"cosmiconfig@npm:^8.1.3, cosmiconfig@npm:^8.3.5": - version: 8.3.6 - resolution: "cosmiconfig@npm:8.3.6" - dependencies: - import-fresh: "npm:^3.3.0" - js-yaml: "npm:^4.1.0" - parse-json: "npm:^5.2.0" - path-type: "npm:^4.0.0" - peerDependencies: - typescript: ">=4.9.5" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/0382a9ed13208f8bfc22ca2f62b364855207dffdb73dc26e150ade78c3093f1cf56172df2dd460c8caf2afa91c0ed4ec8a88c62f8f9cd1cf423d26506aa8797a - languageName: node - linkType: hard - -"create-jest@npm:^29.7.0": - version: 29.7.0 - resolution: "create-jest@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - chalk: "npm:^4.0.0" - exit: "npm:^0.1.2" - graceful-fs: "npm:^4.2.9" - jest-config: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - prompts: "npm:^2.0.1" - bin: - create-jest: bin/create-jest.js - checksum: 10c0/e7e54c280692470d3398f62a6238fd396327e01c6a0757002833f06d00afc62dd7bfe04ff2b9cd145264460e6b4d1eb8386f2925b7e567f97939843b7b0e812f - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 - languageName: node - linkType: hard - -"crypto-random-string@npm:^4.0.0": - version: 4.0.0 - resolution: "crypto-random-string@npm:4.0.0" - dependencies: - type-fest: "npm:^1.0.1" - checksum: 10c0/16e11a3c8140398f5408b7fded35a961b9423c5dac39a60cbbd08bd3f0e07d7de130e87262adea7db03ec1a7a4b7551054e0db07ee5408b012bac5400cfc07a5 - languageName: node - linkType: hard - -"cspell-check-unused-words@npm:^1.2.1": - version: 1.2.1 - resolution: "cspell-check-unused-words@npm:1.2.1" - dependencies: - "@commander-js/extra-typings": "npm:^12.1.0" - chalk: "npm:^5.3.0" - commander: "npm:^12.1.0" - execa: "npm:^9.3.1" - jsonc-parser: "npm:^3.3.1" - bin: - cspell-check-unused-words: dist/main.js - checksum: 10c0/2c460db927f26feccf8668a14f874bcba49e3a0aedcda83735c431bf881be7b1b755699a13097fa94049d2c593b14fdb76009130332b30b2b931c3b42627455d - languageName: node - linkType: hard - -"cspell-config-lib@npm:8.14.1": - version: 8.14.1 - resolution: "cspell-config-lib@npm:8.14.1" - dependencies: - "@cspell/cspell-types": "npm:8.14.1" - comment-json: "npm:^4.2.5" - yaml: "npm:^2.5.0" - checksum: 10c0/d1162e439aadb6404717b28cea775ed8a1eb1742d1afd7c58506fc09d700592fae4b241582ca9ad6069cb898bf6f89c3ba6482a79265eabd047454dfe44354a1 - languageName: node - linkType: hard - -"cspell-dictionary@npm:8.14.1": - version: 8.14.1 - resolution: "cspell-dictionary@npm:8.14.1" - dependencies: - "@cspell/cspell-pipe": "npm:8.14.1" - "@cspell/cspell-types": "npm:8.14.1" - cspell-trie-lib: "npm:8.14.1" - fast-equals: "npm:^5.0.1" - checksum: 10c0/bf52375dc2450468ef9528dcf3d17f7eda77fa5a44eea85297ce27b9de5652cfa9613da6bc6c64c9a5c06c52d572cab76fce844d0c2e776f023ac230d8913f68 - languageName: node - linkType: hard - -"cspell-gitignore@npm:8.14.1": - version: 8.14.1 - resolution: "cspell-gitignore@npm:8.14.1" - dependencies: - "@cspell/url": "npm:8.14.1" - cspell-glob: "npm:8.14.1" - cspell-io: "npm:8.14.1" - find-up-simple: "npm:^1.0.0" - bin: - cspell-gitignore: bin.mjs - checksum: 10c0/3f40861b08b24cee417ee0a5775001c6f93a40f73166503f5c9a7e7970f61065a239bd82ffcbe5f205ef5f6201bfc5b1c35f41e06252d4492fe52f0e2ca2b450 - languageName: node - linkType: hard - -"cspell-glob@npm:8.14.1": - version: 8.14.1 - resolution: "cspell-glob@npm:8.14.1" - dependencies: - "@cspell/url": "npm:8.14.1" - micromatch: "npm:^4.0.7" - checksum: 10c0/3bcb0485f65edf2f86b5cd60b4908aad3e58f8fade88af0dffecb7da7719846b918f7c1e3e2d02de96fa43d1db752277ffe922efdee4fa624f2ae2afc1eafa1e - languageName: node - linkType: hard - -"cspell-grammar@npm:8.14.1": - version: 8.14.1 - resolution: "cspell-grammar@npm:8.14.1" - dependencies: - "@cspell/cspell-pipe": "npm:8.14.1" - "@cspell/cspell-types": "npm:8.14.1" - bin: - cspell-grammar: bin.mjs - checksum: 10c0/a4cea54ecbffcc94be93e720907bc1c8a3588e268e37e02c64bed1fee137c586a3ae33a2e069de46c1f6a016983da81987b204763d14673c9dd2011352d052e8 - languageName: node - linkType: hard - -"cspell-io@npm:8.14.1": - version: 8.14.1 - resolution: "cspell-io@npm:8.14.1" - dependencies: - "@cspell/cspell-service-bus": "npm:8.14.1" - "@cspell/url": "npm:8.14.1" - checksum: 10c0/e07e72d4d0f43ce133d3af91191364b9fa093749c8b3b32f7e7b0f304c5dacdd1003ca7a0b173010fe58f5a3d08a8495096632e5abade91e0b0904816ffaa07f - languageName: node - linkType: hard - -"cspell-lib@npm:8.14.1": - version: 8.14.1 - resolution: "cspell-lib@npm:8.14.1" - dependencies: - "@cspell/cspell-bundled-dicts": "npm:8.14.1" - "@cspell/cspell-pipe": "npm:8.14.1" - "@cspell/cspell-resolver": "npm:8.14.1" - "@cspell/cspell-types": "npm:8.14.1" - "@cspell/dynamic-import": "npm:8.14.1" - "@cspell/filetypes": "npm:8.14.1" - "@cspell/strong-weak-map": "npm:8.14.1" - "@cspell/url": "npm:8.14.1" - clear-module: "npm:^4.1.2" - comment-json: "npm:^4.2.5" - cspell-config-lib: "npm:8.14.1" - cspell-dictionary: "npm:8.14.1" - cspell-glob: "npm:8.14.1" - cspell-grammar: "npm:8.14.1" - cspell-io: "npm:8.14.1" - cspell-trie-lib: "npm:8.14.1" - env-paths: "npm:^3.0.0" - fast-equals: "npm:^5.0.1" - gensequence: "npm:^7.0.0" - import-fresh: "npm:^3.3.0" - resolve-from: "npm:^5.0.0" - vscode-languageserver-textdocument: "npm:^1.0.12" - vscode-uri: "npm:^3.0.8" - xdg-basedir: "npm:^5.1.0" - checksum: 10c0/073d0ffc12d6f745bdd0d05cd7dd8934bfcd409f20864186b472872fd1dbb4a4684be6957d3db5966db615db34cde2f5448c1fe3e7b359463f4cc5a2270fe782 - languageName: node - linkType: hard - -"cspell-trie-lib@npm:8.14.1": - version: 8.14.1 - resolution: "cspell-trie-lib@npm:8.14.1" - dependencies: - "@cspell/cspell-pipe": "npm:8.14.1" - "@cspell/cspell-types": "npm:8.14.1" - gensequence: "npm:^7.0.0" - checksum: 10c0/1158f7eb396b70872afb5e8db6d8eec8d7db03a8894d04b4fa37e0ee97eecd01e69cc88130f538c2bbf2d12343cb804070d83546cb9c524e7c470779881bfa3e - languageName: node - linkType: hard - -"cspell@npm:^8.14.1": - version: 8.14.1 - resolution: "cspell@npm:8.14.1" - dependencies: - "@cspell/cspell-json-reporter": "npm:8.14.1" - "@cspell/cspell-pipe": "npm:8.14.1" - "@cspell/cspell-types": "npm:8.14.1" - "@cspell/dynamic-import": "npm:8.14.1" - "@cspell/url": "npm:8.14.1" - chalk: "npm:^5.3.0" - chalk-template: "npm:^1.1.0" - commander: "npm:^12.1.0" - cspell-dictionary: "npm:8.14.1" - cspell-gitignore: "npm:8.14.1" - cspell-glob: "npm:8.14.1" - cspell-io: "npm:8.14.1" - cspell-lib: "npm:8.14.1" - fast-glob: "npm:^3.3.2" - fast-json-stable-stringify: "npm:^2.1.0" - file-entry-cache: "npm:^9.0.0" - get-stdin: "npm:^9.0.0" - semver: "npm:^7.6.3" - strip-ansi: "npm:^7.1.0" - bin: - cspell: bin.mjs - cspell-esm: bin.mjs - checksum: 10c0/12df874df8061138a09d8072bef5b6ea36a54d8d97951df788db0f0e4ef8d260cd2855684e07a766ac6011b9eeaed3868664d91777c9963af0c13528700976c2 - languageName: node - linkType: hard - -"css-declaration-sorter@npm:^7.2.0": - version: 7.2.0 - resolution: "css-declaration-sorter@npm:7.2.0" - peerDependencies: - postcss: ^8.0.9 - checksum: 10c0/d8516be94f8f2daa233ef021688b965c08161624cbf830a4d7ee1099429437c0ee124d35c91b1c659cfd891a68e8888aa941726dab12279bc114aaed60a94606 - languageName: node - linkType: hard - -"css-loader@npm:^6.8.1": - version: 6.11.0 - resolution: "css-loader@npm:6.11.0" - dependencies: - icss-utils: "npm:^5.1.0" - postcss: "npm:^8.4.33" - postcss-modules-extract-imports: "npm:^3.1.0" - postcss-modules-local-by-default: "npm:^4.0.5" - postcss-modules-scope: "npm:^3.2.0" - postcss-modules-values: "npm:^4.0.0" - postcss-value-parser: "npm:^4.2.0" - semver: "npm:^7.5.4" - peerDependencies: - "@rspack/core": 0.x || 1.x - webpack: ^5.0.0 - peerDependenciesMeta: - "@rspack/core": - optional: true - webpack: - optional: true - checksum: 10c0/bb52434138085fed06a33e2ffbdae9ee9014ad23bf60f59d6b7ee67f28f26c6b1764024d3030bd19fd884d6ee6ee2224eaed64ad19eb18fbbb23d148d353a965 - languageName: node - linkType: hard - -"css-minimizer-webpack-plugin@npm:^5.0.1": - version: 5.0.1 - resolution: "css-minimizer-webpack-plugin@npm:5.0.1" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.18" - cssnano: "npm:^6.0.1" - jest-worker: "npm:^29.4.3" - postcss: "npm:^8.4.24" - schema-utils: "npm:^4.0.1" - serialize-javascript: "npm:^6.0.1" - peerDependencies: - webpack: ^5.0.0 - peerDependenciesMeta: - "@parcel/css": - optional: true - "@swc/css": - optional: true - clean-css: - optional: true - csso: - optional: true - esbuild: - optional: true - lightningcss: - optional: true - checksum: 10c0/1792259e18f7c5ee25b6bbf60b38b64201747add83d1f751c8c654159b46ebacd0d1103d35f17d97197033e21e02d2ba4a4e9aa14c9c0d067b7c7653c721814e - languageName: node - linkType: hard - -"css-select@npm:^4.1.3": - version: 4.3.0 - resolution: "css-select@npm:4.3.0" - dependencies: - boolbase: "npm:^1.0.0" - css-what: "npm:^6.0.1" - domhandler: "npm:^4.3.1" - domutils: "npm:^2.8.0" - nth-check: "npm:^2.0.1" - checksum: 10c0/a489d8e5628e61063d5a8fe0fa1cc7ae2478cb334a388a354e91cf2908154be97eac9fa7ed4dffe87a3e06cf6fcaa6016553115335c4fd3377e13dac7bd5a8e1 - languageName: node - linkType: hard - -"css-select@npm:^5.1.0": - version: 5.1.0 - resolution: "css-select@npm:5.1.0" - dependencies: - boolbase: "npm:^1.0.0" - css-what: "npm:^6.1.0" - domhandler: "npm:^5.0.2" - domutils: "npm:^3.0.1" - nth-check: "npm:^2.0.1" - checksum: 10c0/551c60dba5b54054741032c1793b5734f6ba45e23ae9e82761a3c0ed1acbb8cfedfa443aaba3a3c1a54cac12b456d2012a09d2cd5f0e82e430454c1b9d84d500 - languageName: node - linkType: hard - -"css-tree@npm:^2.3.1": - version: 2.3.1 - resolution: "css-tree@npm:2.3.1" - dependencies: - mdn-data: "npm:2.0.30" - source-map-js: "npm:^1.0.1" - checksum: 10c0/6f8c1a11d5e9b14bf02d10717fc0351b66ba12594166f65abfbd8eb8b5b490dd367f5c7721db241a3c792d935fc6751fbc09f7e1598d421477ad9fadc30f4f24 - languageName: node - linkType: hard - -"css-tree@npm:~2.2.0": - version: 2.2.1 - resolution: "css-tree@npm:2.2.1" - dependencies: - mdn-data: "npm:2.0.28" - source-map-js: "npm:^1.0.1" - checksum: 10c0/47e87b0f02f8ac22f57eceb65c58011dd142d2158128882a0bf963cf2eabb81a4ebbc2e3790c8289be7919fa8b83750c7b69272bd66772c708143b772ba3c186 - languageName: node - linkType: hard - -"css-what@npm:^6.0.1, css-what@npm:^6.1.0": - version: 6.1.0 - resolution: "css-what@npm:6.1.0" - checksum: 10c0/a09f5a6b14ba8dcf57ae9a59474722e80f20406c53a61e9aedb0eedc693b135113ffe2983f4efc4b5065ae639442e9ae88df24941ef159c218b231011d733746 - languageName: node - linkType: hard - -"cssesc@npm:^3.0.0": - version: 3.0.0 - resolution: "cssesc@npm:3.0.0" - bin: - cssesc: bin/cssesc - checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 - languageName: node - linkType: hard - -"cssnano-preset-advanced@npm:^6.1.2": - version: 6.1.2 - resolution: "cssnano-preset-advanced@npm:6.1.2" - dependencies: - autoprefixer: "npm:^10.4.19" - browserslist: "npm:^4.23.0" - cssnano-preset-default: "npm:^6.1.2" - postcss-discard-unused: "npm:^6.0.5" - postcss-merge-idents: "npm:^6.0.3" - postcss-reduce-idents: "npm:^6.0.3" - postcss-zindex: "npm:^6.0.2" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/22d3ddab258e6b31e7e2e7c48712f023b60fadb2813929752dace0326e28cd250830b5420a33f81b01df52d2460cb5f999fff5907f58508809efe1a8a739a707 - languageName: node - linkType: hard - -"cssnano-preset-default@npm:^6.1.2": - version: 6.1.2 - resolution: "cssnano-preset-default@npm:6.1.2" - dependencies: - browserslist: "npm:^4.23.0" - css-declaration-sorter: "npm:^7.2.0" - cssnano-utils: "npm:^4.0.2" - postcss-calc: "npm:^9.0.1" - postcss-colormin: "npm:^6.1.0" - postcss-convert-values: "npm:^6.1.0" - postcss-discard-comments: "npm:^6.0.2" - postcss-discard-duplicates: "npm:^6.0.3" - postcss-discard-empty: "npm:^6.0.3" - postcss-discard-overridden: "npm:^6.0.2" - postcss-merge-longhand: "npm:^6.0.5" - postcss-merge-rules: "npm:^6.1.1" - postcss-minify-font-values: "npm:^6.1.0" - postcss-minify-gradients: "npm:^6.0.3" - postcss-minify-params: "npm:^6.1.0" - postcss-minify-selectors: "npm:^6.0.4" - postcss-normalize-charset: "npm:^6.0.2" - postcss-normalize-display-values: "npm:^6.0.2" - postcss-normalize-positions: "npm:^6.0.2" - postcss-normalize-repeat-style: "npm:^6.0.2" - postcss-normalize-string: "npm:^6.0.2" - postcss-normalize-timing-functions: "npm:^6.0.2" - postcss-normalize-unicode: "npm:^6.1.0" - postcss-normalize-url: "npm:^6.0.2" - postcss-normalize-whitespace: "npm:^6.0.2" - postcss-ordered-values: "npm:^6.0.2" - postcss-reduce-initial: "npm:^6.1.0" - postcss-reduce-transforms: "npm:^6.0.2" - postcss-svgo: "npm:^6.0.3" - postcss-unique-selectors: "npm:^6.0.4" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/af99021f936763850f5f35dc9e6a9dfb0da30856dea36e0420b011da2a447099471db2a5f3d1f5f52c0489da186caf9a439d8f048a80f82617077efb018333fa - languageName: node - linkType: hard - -"cssnano-preset-default@npm:^7.0.5": - version: 7.0.5 - resolution: "cssnano-preset-default@npm:7.0.5" - dependencies: - browserslist: "npm:^4.23.3" - css-declaration-sorter: "npm:^7.2.0" - cssnano-utils: "npm:^5.0.0" - postcss-calc: "npm:^10.0.1" - postcss-colormin: "npm:^7.0.2" - postcss-convert-values: "npm:^7.0.3" - postcss-discard-comments: "npm:^7.0.2" - postcss-discard-duplicates: "npm:^7.0.1" - postcss-discard-empty: "npm:^7.0.0" - postcss-discard-overridden: "npm:^7.0.0" - postcss-merge-longhand: "npm:^7.0.3" - postcss-merge-rules: "npm:^7.0.3" - postcss-minify-font-values: "npm:^7.0.0" - postcss-minify-gradients: "npm:^7.0.0" - postcss-minify-params: "npm:^7.0.2" - postcss-minify-selectors: "npm:^7.0.3" - postcss-normalize-charset: "npm:^7.0.0" - postcss-normalize-display-values: "npm:^7.0.0" - postcss-normalize-positions: "npm:^7.0.0" - postcss-normalize-repeat-style: "npm:^7.0.0" - postcss-normalize-string: "npm:^7.0.0" - postcss-normalize-timing-functions: "npm:^7.0.0" - postcss-normalize-unicode: "npm:^7.0.2" - postcss-normalize-url: "npm:^7.0.0" - postcss-normalize-whitespace: "npm:^7.0.0" - postcss-ordered-values: "npm:^7.0.1" - postcss-reduce-initial: "npm:^7.0.2" - postcss-reduce-transforms: "npm:^7.0.0" - postcss-svgo: "npm:^7.0.1" - postcss-unique-selectors: "npm:^7.0.2" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/ffa7c6fa16c6ad98b7732fc563de74d492e6ad6d243a9f00431c0cbdbc576bcd49226d2695d881465d32dea0a2916add40ac10e7560dd7b5de9fd0fa25ee081b - languageName: node - linkType: hard - -"cssnano-utils@npm:^4.0.2": - version: 4.0.2 - resolution: "cssnano-utils@npm:4.0.2" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/260b8c8ffa48b908aa77ef129f9b8648ecd92aed405b20e7fe6b8370779dd603530344fc9d96683d53533246e48b36ac9d2aa5a476b4f81c547bbad86d187f35 - languageName: node - linkType: hard - -"cssnano-utils@npm:^5.0.0": - version: 5.0.0 - resolution: "cssnano-utils@npm:5.0.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/492593fb45151e8622357bb958d0d80475372de38523ef0587d77e9c5f386beb55c30b41f2f3c735a374a230bc61404eb7ae9c2beeab0666afb499442c62ecba - languageName: node - linkType: hard - -"cssnano@npm:^6.0.1, cssnano@npm:^6.1.2": - version: 6.1.2 - resolution: "cssnano@npm:6.1.2" - dependencies: - cssnano-preset-default: "npm:^6.1.2" - lilconfig: "npm:^3.1.1" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/4df0dc0389b34b38acb09b7cfb07267b0eda95349c6d5e9b7666acc7200bb33359650869a60168e9d878298b05f4ad2c7f070815c90551720a3f4e1037f79691 - languageName: node - linkType: hard - -"cssnano@npm:^7.0.4": - version: 7.0.5 - resolution: "cssnano@npm:7.0.5" - dependencies: - cssnano-preset-default: "npm:^7.0.5" - lilconfig: "npm:^3.1.2" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/cb43ed964787dca33efb44d8f4fea8a49c495db44d1d12940493f0dd5d63db78e01c5b140fe42b480b332733602a25f4c85186d00977eb3070b29f7422761985 - languageName: node - linkType: hard - -"csso@npm:^5.0.5": - version: 5.0.5 - resolution: "csso@npm:5.0.5" - dependencies: - css-tree: "npm:~2.2.0" - checksum: 10c0/ab4beb1e97dd7e207c10e9925405b45f15a6cd1b4880a8686ad573aa6d476aed28b4121a666cffd26c37a26179f7b54741f7c257543003bfb244d06a62ad569b - languageName: node - linkType: hard - -"csstype@npm:^3.0.2": - version: 3.1.3 - resolution: "csstype@npm:3.1.3" - checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 - languageName: node - linkType: hard - -"cycle@npm:1.0.x": - version: 1.0.3 - resolution: "cycle@npm:1.0.3" - checksum: 10c0/f38aae412cea9e895e963e0ff8d4d19852e53b630e7fc1dd078da551f3a4c0a98c5f026d4626dfc0b42648b804dabf13a56faace60b09cf6f3cc706c0819f119 - languageName: node - linkType: hard - -"debounce@npm:^1.2.1": - version: 1.2.1 - resolution: "debounce@npm:1.2.1" - checksum: 10c0/6c9320aa0973fc42050814621a7a8a78146c1975799b5b3cc1becf1f77ba9a5aa583987884230da0842a03f385def452fad5d60db97c3d1c8b824e38a8edf500 - languageName: node - linkType: hard - -"debug@npm:2.6.9, debug@npm:^2.6.0": - version: 2.6.9 - resolution: "debug@npm:2.6.9" - dependencies: - ms: "npm:2.0.0" - checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6": - version: 4.3.6 - resolution: "debug@npm:4.3.6" - dependencies: - ms: "npm:2.1.2" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/3293416bff072389c101697d4611c402a6bacd1900ac20c0492f61a9cdd6b3b29750fc7f5e299f8058469ef60ff8fb79b86395a30374fbd2490113c1c7112285 - languageName: node - linkType: hard - -"debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: "npm:^2.1.1" - checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a - languageName: node - linkType: hard - -"decode-named-character-reference@npm:^1.0.0": - version: 1.0.2 - resolution: "decode-named-character-reference@npm:1.0.2" - dependencies: - character-entities: "npm:^2.0.0" - checksum: 10c0/66a9fc5d9b5385a2b3675c69ba0d8e893393d64057f7dbbb585265bb4fc05ec513d76943b8e5aac7d8016d20eea4499322cbf4cd6d54b466976b78f3a7587a4c - languageName: node - linkType: hard - -"decompress-response@npm:^6.0.0": - version: 6.0.0 - resolution: "decompress-response@npm:6.0.0" - dependencies: - mimic-response: "npm:^3.1.0" - checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e - languageName: node - linkType: hard - -"dedent@npm:^1.0.0": - version: 1.5.3 - resolution: "dedent@npm:1.5.3" - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - checksum: 10c0/d94bde6e6f780be4da4fd760288fcf755ec368872f4ac5218197200d86430aeb8d90a003a840bff1c20221188e3f23adced0119cb811c6873c70d0ac66d12832 - languageName: node - linkType: hard - -"deep-extend@npm:^0.6.0": - version: 0.6.0 - resolution: "deep-extend@npm:0.6.0" - checksum: 10c0/1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566 - languageName: node - linkType: hard - -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c - languageName: node - linkType: hard - -"deepmerge@npm:^4.2.2, deepmerge@npm:^4.3.1": - version: 4.3.1 - resolution: "deepmerge@npm:4.3.1" - checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 - languageName: node - linkType: hard - -"default-gateway@npm:^6.0.3": - version: 6.0.3 - resolution: "default-gateway@npm:6.0.3" - dependencies: - execa: "npm:^5.0.0" - checksum: 10c0/5184f9e6e105d24fb44ade9e8741efa54bb75e84625c1ea78c4ef8b81dff09ca52d6dbdd1185cf0dc655bb6b282a64fffaf7ed2dd561b8d9ad6f322b1f039aba - languageName: node - linkType: hard - -"defaults@npm:^1.0.3": - version: 1.0.4 - resolution: "defaults@npm:1.0.4" - dependencies: - clone: "npm:^1.0.2" - checksum: 10c0/9cfbe498f5c8ed733775db62dfd585780387d93c17477949e1670bfcfb9346e0281ce8c4bf9f4ac1fc0f9b851113bd6dc9e41182ea1644ccd97de639fa13c35a - languageName: node - linkType: hard - -"defer-to-connect@npm:^2.0.1": - version: 2.0.1 - resolution: "defer-to-connect@npm:2.0.1" - checksum: 10c0/625ce28e1b5ad10cf77057b9a6a727bf84780c17660f6644dab61dd34c23de3001f03cedc401f7d30a4ed9965c2e8a7336e220a329146f2cf85d4eddea429782 - languageName: node - linkType: hard - -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": - version: 1.1.4 - resolution: "define-data-property@npm:1.1.4" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.0.1" - checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 - languageName: node - linkType: hard - -"define-lazy-prop@npm:^2.0.0": - version: 2.0.0 - resolution: "define-lazy-prop@npm:2.0.0" - checksum: 10c0/db6c63864a9d3b7dc9def55d52764968a5af296de87c1b2cc71d8be8142e445208071953649e0386a8cc37cfcf9a2067a47207f1eb9ff250c2a269658fdae422 - languageName: node - linkType: hard - -"define-properties@npm:^1.2.1": - version: 1.2.1 - resolution: "define-properties@npm:1.2.1" - dependencies: - define-data-property: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - object-keys: "npm:^1.1.1" - checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 - languageName: node - linkType: hard - -"defu@npm:^6.1.2, defu@npm:^6.1.4": - version: 6.1.4 - resolution: "defu@npm:6.1.4" - checksum: 10c0/2d6cc366262dc0cb8096e429368e44052fdf43ed48e53ad84cc7c9407f890301aa5fcb80d0995abaaf842b3949f154d060be4160f7a46cb2bc2f7726c81526f5 - languageName: node - linkType: hard - -"del@npm:^6.1.1": - version: 6.1.1 - resolution: "del@npm:6.1.1" - dependencies: - globby: "npm:^11.0.1" - graceful-fs: "npm:^4.2.4" - is-glob: "npm:^4.0.1" - is-path-cwd: "npm:^2.2.0" - is-path-inside: "npm:^3.0.2" - p-map: "npm:^4.0.0" - rimraf: "npm:^3.0.2" - slash: "npm:^3.0.0" - checksum: 10c0/8a095c5ccade42c867a60252914ae485ec90da243d735d1f63ec1e64c1cfbc2b8810ad69a29ab6326d159d4fddaa2f5bad067808c42072351ec458efff86708f - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 - languageName: node - linkType: hard - -"depd@npm:2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c - languageName: node - linkType: hard - -"depd@npm:~1.1.2": - version: 1.1.2 - resolution: "depd@npm:1.1.2" - checksum: 10c0/acb24aaf936ef9a227b6be6d495f0d2eb20108a9a6ad40585c5bda1a897031512fef6484e4fdbb80bd249fdaa82841fa1039f416ece03188e677ba11bcfda249 - languageName: node - linkType: hard - -"dequal@npm:^2.0.0": - version: 2.0.3 - resolution: "dequal@npm:2.0.3" - checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 - languageName: node - linkType: hard - -"destroy@npm:1.2.0": - version: 1.2.0 - resolution: "destroy@npm:1.2.0" - checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 - languageName: node - linkType: hard - -"detect-indent@npm:^7.0.1": - version: 7.0.1 - resolution: "detect-indent@npm:7.0.1" - checksum: 10c0/47b6e3e3dda603c386e73b129f3e84844ae59bc2615f5072becf3cc02eab400bed5a4e6379c49d0b18cf630e80c2b07e87e0038b777addbc6ef793ad77dd05bc - languageName: node - linkType: hard - -"detect-newline@npm:^3.0.0": - version: 3.1.0 - resolution: "detect-newline@npm:3.1.0" - checksum: 10c0/c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d - languageName: node - linkType: hard - -"detect-newline@npm:^4.0.0": - version: 4.0.1 - resolution: "detect-newline@npm:4.0.1" - checksum: 10c0/1cc1082e88ad477f30703ae9f23bd3e33816ea2db6a35333057e087d72d466f5a777809b71f560118ecff935d2c712f5b59e1008a8b56a900909d8fd4621c603 - languageName: node - linkType: hard - -"detect-node@npm:^2.0.4": - version: 2.1.0 - resolution: "detect-node@npm:2.1.0" - checksum: 10c0/f039f601790f2e9d4654e499913259a798b1f5246ae24f86ab5e8bd4aaf3bce50484234c494f11fb00aecb0c6e2733aa7b1cf3f530865640b65fbbd65b2c4e09 - languageName: node - linkType: hard - -"detect-port-alt@npm:^1.1.6": - version: 1.1.6 - resolution: "detect-port-alt@npm:1.1.6" - dependencies: - address: "npm:^1.0.1" - debug: "npm:^2.6.0" - bin: - detect: ./bin/detect-port - detect-port: ./bin/detect-port - checksum: 10c0/7269e6aef7b782d98c77505c07a7a0f5e2ee98a9607dc791035fc0192fc58aa03cc833fae605e10eaf239a2a5a55cd938e0bb141dea764ac6180ca082fd62b23 - languageName: node - linkType: hard - -"detect-port@npm:^1.5.1": - version: 1.6.1 - resolution: "detect-port@npm:1.6.1" - dependencies: - address: "npm:^1.0.1" - debug: "npm:4" - bin: - detect: bin/detect-port.js - detect-port: bin/detect-port.js - checksum: 10c0/4ea9eb46a637cb21220dd0a62b6074792894fc77b2cacbc9de533d1908b2eedafa7bfd7547baaa2ac1e9c7ba7c289b34b17db896dca6da142f4fc6e2060eee17 - languageName: node - linkType: hard - -"devlop@npm:^1.0.0, devlop@npm:^1.1.0": - version: 1.1.0 - resolution: "devlop@npm:1.1.0" - dependencies: - dequal: "npm:^2.0.0" - checksum: 10c0/e0928ab8f94c59417a2b8389c45c55ce0a02d9ac7fd74ef62d01ba48060129e1d594501b77de01f3eeafc7cb00773819b0df74d96251cf20b31c5b3071f45c0e - languageName: node - linkType: hard - -"diff-sequences@npm:^29.6.3": - version: 29.6.3 - resolution: "diff-sequences@npm:29.6.3" - checksum: 10c0/32e27ac7dbffdf2fb0eb5a84efd98a9ad084fbabd5ac9abb8757c6770d5320d2acd172830b28c4add29bb873d59420601dfc805ac4064330ce59b1adfd0593b2 - languageName: node - linkType: hard - -"diff@npm:^5.2.0": - version: 5.2.0 - resolution: "diff@npm:5.2.0" - checksum: 10c0/aed0941f206fe261ecb258dc8d0ceea8abbde3ace5827518ff8d302f0fc9cc81ce116c4d8f379151171336caf0516b79e01abdc1ed1201b6440d895a66689eb4 - languageName: node - linkType: hard - -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: "npm:^4.0.0" - checksum: 10c0/dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c - languageName: node - linkType: hard - -"dns-packet@npm:^5.2.2": - version: 5.6.1 - resolution: "dns-packet@npm:5.6.1" - dependencies: - "@leichtgewicht/ip-codec": "npm:^2.0.1" - checksum: 10c0/8948d3d03063fb68e04a1e386875f8c3bcc398fc375f535f2b438fad8f41bf1afa6f5e70893ba44f4ae884c089247e0a31045722fa6ff0f01d228da103f1811d - languageName: node - linkType: hard - -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: "npm:^2.0.2" - checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 - languageName: node - linkType: hard - -"docusaurus-theme-search-typesense@npm:^0.20.0": - version: 0.20.0 - resolution: "docusaurus-theme-search-typesense@npm:0.20.0" - dependencies: - "@docusaurus/logger": "npm:3.4.0" - "@docusaurus/plugin-content-docs": "npm:3.4.0" - "@docusaurus/theme-translations": "npm:3.4.0" - "@docusaurus/utils": "npm:3.4.0" - "@docusaurus/utils-validation": "npm:3.4.0" - algoliasearch-helper: "npm:^3.10.0" - clsx: "npm:^1.2.1" - eta: "npm:^2.0.0" - fs-extra: "npm:^10.1.0" - lodash: "npm:^4.17.21" - tslib: "npm:^2.4.0" - typesense-docsearch-react: "npm:^3.4.1" - typesense-instantsearch-adapter: "npm:^2.7.1" - utility-types: "npm:^3.10.0" - peerDependencies: - "@docusaurus/core": 3.4.0 - "@docusaurus/theme-common": 3.4.0 - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/15d259a1f99256cdae8cf962e56baf66096d852f25e9c4824b3ee1bcac5c33b905f6fd03dc1971a76197ff371cb76c3f4b802894f348cd4d57b6499f1f273354 - languageName: node - linkType: hard - -"dom-converter@npm:^0.2.0": - version: 0.2.0 - resolution: "dom-converter@npm:0.2.0" - dependencies: - utila: "npm:~0.4" - checksum: 10c0/e96aa63bd8c6ee3cd9ce19c3aecfc2c42e50a460e8087114794d4f5ecf3a4f052b34ea3bf2d73b5d80b4da619073b49905e6d7d788ceb7814ca4c29be5354a11 - languageName: node - linkType: hard - -"dom-serializer@npm:^1.0.1": - version: 1.4.1 - resolution: "dom-serializer@npm:1.4.1" - dependencies: - domelementtype: "npm:^2.0.1" - domhandler: "npm:^4.2.0" - entities: "npm:^2.0.0" - checksum: 10c0/67d775fa1ea3de52035c98168ddcd59418356943b5eccb80e3c8b3da53adb8e37edb2cc2f885802b7b1765bf5022aec21dfc32910d7f9e6de4c3148f095ab5e0 - languageName: node - linkType: hard - -"dom-serializer@npm:^2.0.0": - version: 2.0.0 - resolution: "dom-serializer@npm:2.0.0" - dependencies: - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.2" - entities: "npm:^4.2.0" - checksum: 10c0/d5ae2b7110ca3746b3643d3ef60ef823f5f078667baf530cec096433f1627ec4b6fa8c072f09d079d7cda915fd2c7bc1b7b935681e9b09e591e1e15f4040b8e2 - languageName: node - linkType: hard - -"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0, domelementtype@npm:^2.3.0": - version: 2.3.0 - resolution: "domelementtype@npm:2.3.0" - checksum: 10c0/686f5a9ef0fff078c1412c05db73a0dce096190036f33e400a07e2a4518e9f56b1e324f5c576a0a747ef0e75b5d985c040b0d51945ce780c0dd3c625a18cd8c9 - languageName: node - linkType: hard - -"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.3.1": - version: 4.3.1 - resolution: "domhandler@npm:4.3.1" - dependencies: - domelementtype: "npm:^2.2.0" - checksum: 10c0/5c199c7468cb052a8b5ab80b13528f0db3d794c64fc050ba793b574e158e67c93f8336e87fd81e9d5ee43b0e04aea4d8b93ed7be4899cb726a1601b3ba18538b - languageName: node - linkType: hard - -"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": - version: 5.0.3 - resolution: "domhandler@npm:5.0.3" - dependencies: - domelementtype: "npm:^2.3.0" - checksum: 10c0/bba1e5932b3e196ad6862286d76adc89a0dbf0c773e5ced1eb01f9af930c50093a084eff14b8de5ea60b895c56a04d5de8bbc4930c5543d029091916770b2d2a - languageName: node - linkType: hard - -"domutils@npm:^2.5.2, domutils@npm:^2.8.0": - version: 2.8.0 - resolution: "domutils@npm:2.8.0" - dependencies: - dom-serializer: "npm:^1.0.1" - domelementtype: "npm:^2.2.0" - domhandler: "npm:^4.2.0" - checksum: 10c0/d58e2ae01922f0dd55894e61d18119924d88091837887bf1438f2327f32c65eb76426bd9384f81e7d6dcfb048e0f83c19b222ad7101176ad68cdc9c695b563db - languageName: node - linkType: hard - -"domutils@npm:^3.0.1": - version: 3.1.0 - resolution: "domutils@npm:3.1.0" - dependencies: - dom-serializer: "npm:^2.0.0" - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - checksum: 10c0/342d64cf4d07b8a0573fb51e0a6312a88fb520c7fefd751870bf72fa5fc0f2e0cb9a3958a573610b1d608c6e2a69b8e9b4b40f0bfb8f87a71bce4f180cca1887 - languageName: node - linkType: hard - -"dot-case@npm:^3.0.4": - version: 3.0.4 - resolution: "dot-case@npm:3.0.4" - dependencies: - no-case: "npm:^3.0.4" - tslib: "npm:^2.0.3" - checksum: 10c0/5b859ea65097a7ea870e2c91b5768b72ddf7fa947223fd29e167bcdff58fe731d941c48e47a38ec8aa8e43044c8fbd15cd8fa21689a526bc34b6548197cd5b05 - languageName: node - linkType: hard - -"dot-prop@npm:^6.0.1": - version: 6.0.1 - resolution: "dot-prop@npm:6.0.1" - dependencies: - is-obj: "npm:^2.0.0" - checksum: 10c0/30e51ec6408978a6951b21e7bc4938aad01a86f2fdf779efe52330205c6bb8a8ea12f35925c2029d6dc9d1df22f916f32f828ce1e9b259b1371c580541c22b5a - languageName: node - linkType: hard - -"dotenv@npm:^16.4.5": - version: 16.4.5 - resolution: "dotenv@npm:16.4.5" - checksum: 10c0/48d92870076832af0418b13acd6e5a5a3e83bb00df690d9812e94b24aff62b88ade955ac99a05501305b8dc8f1b0ee7638b18493deb6fe93d680e5220936292f - languageName: node - linkType: hard - -"duplexer@npm:^0.1.2": - version: 0.1.2 - resolution: "duplexer@npm:0.1.2" - checksum: 10c0/c57bcd4bdf7e623abab2df43a7b5b23d18152154529d166c1e0da6bee341d84c432d157d7e97b32fecb1bf3a8b8857dd85ed81a915789f550637ed25b8e64fc2 - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 - languageName: node - linkType: hard - -"easy-table@npm:1.2.0": - version: 1.2.0 - resolution: "easy-table@npm:1.2.0" - dependencies: - ansi-regex: "npm:^5.0.1" - wcwidth: "npm:^1.0.1" - dependenciesMeta: - wcwidth: - optional: true - checksum: 10c0/2d37937cd608586ba02e1ec479f90ccec581d366b3b0d1bb26b99ee6005f8d724e32a07a873759893461ca45b99e2d08c30326529d967ce9eedc1e9b68d4aa63 - languageName: node - linkType: hard - -"ee-first@npm:1.1.1": - version: 1.1.1 - resolution: "ee-first@npm:1.1.1" - checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 - languageName: node - linkType: hard - -"effect@npm:3.5.7": - version: 3.5.7 - resolution: "effect@npm:3.5.7" - checksum: 10c0/f6ca0434e3935d0bb0a3c162dcfce5d759e732812d5af8c486ba2d2c41a9c6bac19c973a26d4b2d10f38d34ef35d308fe32d745a0ead31d56ba22942f22ad920 - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.5.4": - version: 1.5.11 - resolution: "electron-to-chromium@npm:1.5.11" - checksum: 10c0/87b4c0c959009d3fa1120c73eb277c3fced527e4348c798384daf044b15cfb30bbaa5004e772ef016c5b2a70ee06bb8f756fb85fe3986d66c12d9f702c1fc5bc - languageName: node - linkType: hard - -"emittery@npm:^0.13.1": - version: 0.13.1 - resolution: "emittery@npm:0.13.1" - checksum: 10c0/1573d0ae29ab34661b6c63251ff8f5facd24ccf6a823f19417ae8ba8c88ea450325788c67f16c99edec8de4b52ce93a10fe441ece389fd156e88ee7dab9bfa35 - languageName: node - linkType: hard - -"emoji-regex@npm:^10.3.0": - version: 10.3.0 - resolution: "emoji-regex@npm:10.3.0" - checksum: 10c0/b4838e8dcdceb44cf47f59abe352c25ff4fe7857acaf5fb51097c427f6f75b44d052eb907a7a3b86f86bc4eae3a93f5c2b7460abe79c407307e6212d65c91163 - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 - languageName: node - linkType: hard - -"emojilib@npm:^2.4.0": - version: 2.4.0 - resolution: "emojilib@npm:2.4.0" - checksum: 10c0/6e66ba8921175842193f974e18af448bb6adb0cf7aeea75e08b9d4ea8e9baba0e4a5347b46ed901491dcaba277485891c33a8d70b0560ca5cc9672a94c21ab8f - languageName: node - linkType: hard - -"emojis-list@npm:^3.0.0": - version: 3.0.0 - resolution: "emojis-list@npm:3.0.0" - checksum: 10c0/7dc4394b7b910444910ad64b812392159a21e1a7ecc637c775a440227dcb4f80eff7fe61f4453a7d7603fa23d23d30cc93fe9e4b5ed985b88d6441cd4a35117b - languageName: node - linkType: hard - -"emoticon@npm:^4.0.1": - version: 4.1.0 - resolution: "emoticon@npm:4.1.0" - checksum: 10c0/b3bc0a9b370445ac1e980ccba7baea614b4648199cc6fa0a51696a6d2393733e8f985edc4f1af381a1903f625789483dd155de427ec9fa2ea415fac116adc06d - languageName: node - linkType: hard - -"encodeurl@npm:~1.0.2": - version: 1.0.2 - resolution: "encodeurl@npm:1.0.2" - checksum: 10c0/f6c2387379a9e7c1156c1c3d4f9cb7bb11cf16dd4c1682e1f6746512564b053df5781029b6061296832b59fb22f459dbe250386d217c2f6e203601abb2ee0bec - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: "npm:^0.6.2" - checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 - languageName: node - linkType: hard - -"enhanced-resolve@npm:^5.12.0, enhanced-resolve@npm:^5.17.0, enhanced-resolve@npm:^5.17.1, enhanced-resolve@npm:^5.8.2": - version: 5.17.1 - resolution: "enhanced-resolve@npm:5.17.1" - dependencies: - graceful-fs: "npm:^4.2.4" - tapable: "npm:^2.2.0" - checksum: 10c0/81a0515675eca17efdba2cf5bad87abc91a528fc1191aad50e275e74f045b41506167d420099022da7181c8d787170ea41e4a11a0b10b7a16f6237daecb15370 - languageName: node - linkType: hard - -"enquirer@npm:2.4.1": - version: 2.4.1 - resolution: "enquirer@npm:2.4.1" - dependencies: - ansi-colors: "npm:^4.1.1" - strip-ansi: "npm:^6.0.1" - checksum: 10c0/43850479d7a51d36a9c924b518dcdc6373b5a8ae3401097d336b7b7e258324749d0ad37a1fcaa5706f04799baa05585cd7af19ebdf7667673e7694435fcea918 - languageName: node - linkType: hard - -"entities@npm:^2.0.0": - version: 2.2.0 - resolution: "entities@npm:2.2.0" - checksum: 10c0/7fba6af1f116300d2ba1c5673fc218af1961b20908638391b4e1e6d5850314ee2ac3ec22d741b3a8060479911c99305164aed19b6254bde75e7e6b1b2c3f3aa3 - languageName: node - linkType: hard - -"entities@npm:^4.2.0, entities@npm:^4.4.0": - version: 4.5.0 - resolution: "entities@npm:4.5.0" - checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 - languageName: node - linkType: hard - -"env-paths@npm:^3.0.0": - version: 3.0.0 - resolution: "env-paths@npm:3.0.0" - checksum: 10c0/76dec878cee47f841103bacd7fae03283af16f0702dad65102ef0a556f310b98a377885e0f32943831eb08b5ab37842a323d02529f3dfd5d0a40ca71b01b435f - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 - languageName: node - linkType: hard - -"error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: "npm:^0.2.1" - checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 - languageName: node - linkType: hard - -"es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 - languageName: node - linkType: hard - -"es-module-lexer@npm:^1.2.1, es-module-lexer@npm:^1.5.3": - version: 1.5.4 - resolution: "es-module-lexer@npm:1.5.4" - checksum: 10c0/300a469488c2f22081df1e4c8398c78db92358496e639b0df7f89ac6455462aaf5d8893939087c1a1cbcbf20eed4610c70e0bcb8f3e4b0d80a5d2611c539408c - languageName: node - linkType: hard - -"es6-promise@npm:^4.1.0": - version: 4.2.8 - resolution: "es6-promise@npm:4.2.8" - checksum: 10c0/2373d9c5e9a93bdd9f9ed32ff5cb6dd3dd785368d1c21e9bbbfd07d16345b3774ae260f2bd24c8f836a6903f432b4151e7816a7fa8891ccb4e1a55a028ec42c3 - languageName: node - linkType: hard - -"esbuild@npm:^0.19.2": - version: 0.19.12 - resolution: "esbuild@npm:0.19.12" - dependencies: - "@esbuild/aix-ppc64": "npm:0.19.12" - "@esbuild/android-arm": "npm:0.19.12" - "@esbuild/android-arm64": "npm:0.19.12" - "@esbuild/android-x64": "npm:0.19.12" - "@esbuild/darwin-arm64": "npm:0.19.12" - "@esbuild/darwin-x64": "npm:0.19.12" - "@esbuild/freebsd-arm64": "npm:0.19.12" - "@esbuild/freebsd-x64": "npm:0.19.12" - "@esbuild/linux-arm": "npm:0.19.12" - "@esbuild/linux-arm64": "npm:0.19.12" - "@esbuild/linux-ia32": "npm:0.19.12" - "@esbuild/linux-loong64": "npm:0.19.12" - "@esbuild/linux-mips64el": "npm:0.19.12" - "@esbuild/linux-ppc64": "npm:0.19.12" - "@esbuild/linux-riscv64": "npm:0.19.12" - "@esbuild/linux-s390x": "npm:0.19.12" - "@esbuild/linux-x64": "npm:0.19.12" - "@esbuild/netbsd-x64": "npm:0.19.12" - "@esbuild/openbsd-x64": "npm:0.19.12" - "@esbuild/sunos-x64": "npm:0.19.12" - "@esbuild/win32-arm64": "npm:0.19.12" - "@esbuild/win32-ia32": "npm:0.19.12" - "@esbuild/win32-x64": "npm:0.19.12" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10c0/0f2d21ffe24ebead64843f87c3aebe2e703a5ed9feb086a0728b24907fac2eb9923e4a79857d3df9059c915739bd7a870dd667972eae325c67f478b592b8582d - languageName: node - linkType: hard - -"esbuild@npm:^0.23.0, esbuild@npm:~0.23.0": - version: 0.23.1 - resolution: "esbuild@npm:0.23.1" - dependencies: - "@esbuild/aix-ppc64": "npm:0.23.1" - "@esbuild/android-arm": "npm:0.23.1" - "@esbuild/android-arm64": "npm:0.23.1" - "@esbuild/android-x64": "npm:0.23.1" - "@esbuild/darwin-arm64": "npm:0.23.1" - "@esbuild/darwin-x64": "npm:0.23.1" - "@esbuild/freebsd-arm64": "npm:0.23.1" - "@esbuild/freebsd-x64": "npm:0.23.1" - "@esbuild/linux-arm": "npm:0.23.1" - "@esbuild/linux-arm64": "npm:0.23.1" - "@esbuild/linux-ia32": "npm:0.23.1" - "@esbuild/linux-loong64": "npm:0.23.1" - "@esbuild/linux-mips64el": "npm:0.23.1" - "@esbuild/linux-ppc64": "npm:0.23.1" - "@esbuild/linux-riscv64": "npm:0.23.1" - "@esbuild/linux-s390x": "npm:0.23.1" - "@esbuild/linux-x64": "npm:0.23.1" - "@esbuild/netbsd-x64": "npm:0.23.1" - "@esbuild/openbsd-arm64": "npm:0.23.1" - "@esbuild/openbsd-x64": "npm:0.23.1" - "@esbuild/sunos-x64": "npm:0.23.1" - "@esbuild/win32-arm64": "npm:0.23.1" - "@esbuild/win32-ia32": "npm:0.23.1" - "@esbuild/win32-x64": "npm:0.23.1" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-arm64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10c0/08c2ed1105cc3c5e3a24a771e35532fe6089dd24a39c10097899072cef4a99f20860e41e9294e000d86380f353b04d8c50af482483d7f69f5208481cce61eec7 - languageName: node - linkType: hard - -"escalade@npm:^3.1.1, escalade@npm:^3.1.2": - version: 3.1.2 - resolution: "escalade@npm:3.1.2" - checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 - languageName: node - linkType: hard - -"escape-goat@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-goat@npm:4.0.0" - checksum: 10c0/9d2a8314e2370f2dd9436d177f6b3b1773525df8f895c8f3e1acb716f5fd6b10b336cb1cd9862d4709b36eb207dbe33664838deca9c6d55b8371be4eebb972f6 - languageName: node - linkType: hard - -"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": - version: 1.0.3 - resolution: "escape-html@npm:1.0.3" - checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^2.0.0": - version: 2.0.0 - resolution: "escape-string-regexp@npm:2.0.0" - checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^5.0.0": - version: 5.0.0 - resolution: "escape-string-regexp@npm:5.0.0" - checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 - languageName: node - linkType: hard - -"eslint-compat-utils@npm:^0.5.1": - version: 0.5.1 - resolution: "eslint-compat-utils@npm:0.5.1" - dependencies: - semver: "npm:^7.5.4" - peerDependencies: - eslint: ">=6.0.0" - checksum: 10c0/325e815205fab70ebcd379f6d4b5d44c7d791bb8dfe0c9888233f30ebabd9418422595b53a781b946c768d9244d858540e5e6129a6b3dd6d606f467d599edc6c - languageName: node - linkType: hard - -"eslint-config-prettier@npm:^9.1.0": - version: 9.1.0 - resolution: "eslint-config-prettier@npm:9.1.0" - peerDependencies: - eslint: ">=7.0.0" - bin: - eslint-config-prettier: bin/cli.js - checksum: 10c0/6d332694b36bc9ac6fdb18d3ca2f6ac42afa2ad61f0493e89226950a7091e38981b66bac2b47ba39d15b73fff2cd32c78b850a9cf9eed9ca9a96bfb2f3a2f10d - languageName: node - linkType: hard - -"eslint-import-resolver-node@npm:^0.3.9": - version: 0.3.9 - resolution: "eslint-import-resolver-node@npm:0.3.9" - dependencies: - debug: "npm:^3.2.7" - is-core-module: "npm:^2.13.0" - resolve: "npm:^1.22.4" - checksum: 10c0/0ea8a24a72328a51fd95aa8f660dcca74c1429806737cf10261ab90cfcaaf62fd1eff664b76a44270868e0a932711a81b250053942595bcd00a93b1c1575dd61 - languageName: node - linkType: hard - -"eslint-import-resolver-typescript@npm:^3.6.1": - version: 3.6.1 - resolution: "eslint-import-resolver-typescript@npm:3.6.1" - dependencies: - debug: "npm:^4.3.4" - enhanced-resolve: "npm:^5.12.0" - eslint-module-utils: "npm:^2.7.4" - fast-glob: "npm:^3.3.1" - get-tsconfig: "npm:^4.5.0" - is-core-module: "npm:^2.11.0" - is-glob: "npm:^4.0.3" - peerDependencies: - eslint: "*" - eslint-plugin-import: "*" - checksum: 10c0/cb1cb4389916fe78bf8c8567aae2f69243dbfe624bfe21078c56ad46fa1ebf0634fa7239dd3b2055ab5c27359e4b4c28b69b11fcb3a5df8a9e6f7add8e034d86 - languageName: node - linkType: hard - -"eslint-module-utils@npm:^2.7.4": - version: 2.8.1 - resolution: "eslint-module-utils@npm:2.8.1" - dependencies: - debug: "npm:^3.2.7" - peerDependenciesMeta: - eslint: - optional: true - checksum: 10c0/1aeeb97bf4b688d28de136ee57c824480c37691b40fa825c711a4caf85954e94b99c06ac639d7f1f6c1d69223bd21bcb991155b3e589488e958d5b83dfd0f882 - languageName: node - linkType: hard - -"eslint-plugin-deprecation@npm:^3.0.0": - version: 3.0.0 - resolution: "eslint-plugin-deprecation@npm:3.0.0" - dependencies: - "@typescript-eslint/utils": "npm:^7.0.0" - ts-api-utils: "npm:^1.3.0" - tslib: "npm:^2.3.1" - peerDependencies: - eslint: ^8.0.0 - typescript: ^4.2.4 || ^5.0.0 - checksum: 10c0/f8bfe812cdd95f60b159bf79565c8bf1451b71b06040b96a44861a6534aa8c8311bb324b6c0ca837e9418938ac210f6d84a7c97a4f0fe0a35e56403cd5a57b98 - languageName: node - linkType: hard - -"eslint-plugin-es-x@npm:^7.5.0": - version: 7.8.0 - resolution: "eslint-plugin-es-x@npm:7.8.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.1.2" - "@eslint-community/regexpp": "npm:^4.11.0" - eslint-compat-utils: "npm:^0.5.1" - peerDependencies: - eslint: ">=8" - checksum: 10c0/002fda8c029bc5da41e24e7ac11654062831d675fc4f5f20d0de460e24bf1e05cd559000678ef3e46c48641190f4fc07ae3d57aa5e8b085ef5f67e5f63742614 - languageName: node - linkType: hard - -"eslint-plugin-eslint-plugin@npm:^6.2.0": - version: 6.2.0 - resolution: "eslint-plugin-eslint-plugin@npm:6.2.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - estraverse: "npm:^5.3.0" - peerDependencies: - eslint: ">=8.23.0" - checksum: 10c0/33f27062aaa93ec61eb1f80daf7d967fe4e63ace44abb3954f1c893fe416019e6e267cc4b748bf93afc44b705d6c36597a4c7d20da4251cebf872c24d1cc700d - languageName: node - linkType: hard - -"eslint-plugin-import-x@npm:^3.1.0": - version: 3.1.0 - resolution: "eslint-plugin-import-x@npm:3.1.0" - dependencies: - "@typescript-eslint/utils": "npm:^7.4.0" - debug: "npm:^4.3.4" - doctrine: "npm:^3.0.0" - eslint-import-resolver-node: "npm:^0.3.9" - get-tsconfig: "npm:^4.7.3" - is-glob: "npm:^4.0.3" - minimatch: "npm:^9.0.3" - semver: "npm:^7.6.0" - stable-hash: "npm:^0.0.4" - tslib: "npm:^2.6.2" - peerDependencies: - eslint: ^8.56.0 || ^9.0.0-0 - checksum: 10c0/7da1010fa8313778c5144e3cf5e4e6393ea7392a3b54a31c5f3314b4f9e2d05635e2c8ed23c9175e1b2a0542b64ac37e0c16e014ec518d88fd87af42342d5dee - languageName: node - linkType: hard - -"eslint-plugin-jsdoc@npm:^50.2.2": - version: 50.2.2 - resolution: "eslint-plugin-jsdoc@npm:50.2.2" - dependencies: - "@es-joy/jsdoccomment": "npm:~0.48.0" - are-docs-informative: "npm:^0.0.2" - comment-parser: "npm:1.4.1" - debug: "npm:^4.3.6" - escape-string-regexp: "npm:^4.0.0" - espree: "npm:^10.1.0" - esquery: "npm:^1.6.0" - parse-imports: "npm:^2.1.1" - semver: "npm:^7.6.3" - spdx-expression-parse: "npm:^4.0.0" - synckit: "npm:^0.9.1" - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/f41d30246f6a4b6acb55e8cd75cf4fc256315e141ab25f7740fa6fa58cdd24e08cb672b4a350da93aeb126d210bd25981310a50f97cfb108f6a7ce8668b6b90a - languageName: node - linkType: hard - -"eslint-plugin-n@npm:^17.10.2": - version: 17.10.2 - resolution: "eslint-plugin-n@npm:17.10.2" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - enhanced-resolve: "npm:^5.17.0" - eslint-plugin-es-x: "npm:^7.5.0" - get-tsconfig: "npm:^4.7.0" - globals: "npm:^15.8.0" - ignore: "npm:^5.2.4" - minimatch: "npm:^9.0.5" - semver: "npm:^7.5.3" - peerDependencies: - eslint: ">=8.23.0" - checksum: 10c0/cd1e089a5243e923a0f79f688b69d27c8a6513deb7c4b2e687e8c476893e512f6a97ecf5ed595e489b583675002126065e3864c0102a606b857ec93c69f6da6a - languageName: node - linkType: hard - -"eslint-plugin-sort-exports@npm:^0.9.1": - version: 0.9.1 - resolution: "eslint-plugin-sort-exports@npm:0.9.1" - dependencies: - minimatch: "npm:^9.0.3" - peerDependencies: - eslint: ">=5.0.0" - checksum: 10c0/f1ef9f51bcf17848b863fd6948e186361d298f7b5fabdb0b324008e0f7a1df67370df7cafd956d573e2888033afb3f190bae56c5698a600e372d2fb0f92ea7d5 - languageName: node - linkType: hard - -"eslint-plugin-unicorn@npm:^55.0.0": - version: 55.0.0 - resolution: "eslint-plugin-unicorn@npm:55.0.0" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.24.5" - "@eslint-community/eslint-utils": "npm:^4.4.0" - ci-info: "npm:^4.0.0" - clean-regexp: "npm:^1.0.0" - core-js-compat: "npm:^3.37.0" - esquery: "npm:^1.5.0" - globals: "npm:^15.7.0" - indent-string: "npm:^4.0.0" - is-builtin-module: "npm:^3.2.1" - jsesc: "npm:^3.0.2" - pluralize: "npm:^8.0.0" - read-pkg-up: "npm:^7.0.1" - regexp-tree: "npm:^0.1.27" - regjsparser: "npm:^0.10.0" - semver: "npm:^7.6.1" - strip-indent: "npm:^3.0.0" - peerDependencies: - eslint: ">=8.56.0" - checksum: 10c0/31620da5c823abc791a3f4c9a0ab19baf21820bd38f018eafbc862ea0bbc3e4baedbdaaaf48f2dc1b2a59dfc7b341e654f2126c394f5d62fb5216e632d8a2c03 - languageName: node - linkType: hard - -"eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^4.1.1" - checksum: 10c0/d30ef9dc1c1cbdece34db1539a4933fe3f9b14e1ffb27ecc85987902ee663ad7c9473bbd49a9a03195a373741e62e2f807c4938992e019b511993d163450e70a - languageName: node - linkType: hard - -"eslint-scope@npm:^8.0.2": - version: 8.0.2 - resolution: "eslint-scope@npm:8.0.2" - dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^5.2.0" - checksum: 10c0/477f820647c8755229da913025b4567347fd1f0bf7cbdf3a256efff26a7e2e130433df052bd9e3d014025423dc00489bea47eb341002b15553673379c1a7dc36 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^4.0.0": - version: 4.0.0 - resolution: "eslint-visitor-keys@npm:4.0.0" - checksum: 10c0/76619f42cf162705a1515a6868e6fc7567e185c7063a05621a8ac4c3b850d022661262c21d9f1fc1d144ecf0d5d64d70a3f43c15c3fc969a61ace0fb25698cf5 - languageName: node - linkType: hard - -"eslint@npm:^9.9.0": - version: 9.9.0 - resolution: "eslint@npm:9.9.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.11.0" - "@eslint/config-array": "npm:^0.17.1" - "@eslint/eslintrc": "npm:^3.1.0" - "@eslint/js": "npm:9.9.0" - "@humanwhocodes/module-importer": "npm:^1.0.1" - "@humanwhocodes/retry": "npm:^0.3.0" - "@nodelib/fs.walk": "npm:^1.2.8" - ajv: "npm:^6.12.4" - chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" - debug: "npm:^4.3.2" - escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^8.0.2" - eslint-visitor-keys: "npm:^4.0.0" - espree: "npm:^10.1.0" - esquery: "npm:^1.5.0" - esutils: "npm:^2.0.2" - fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^8.0.0" - find-up: "npm:^5.0.0" - glob-parent: "npm:^6.0.2" - ignore: "npm:^5.2.0" - imurmurhash: "npm:^0.1.4" - is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" - lodash.merge: "npm:^4.6.2" - minimatch: "npm:^3.1.2" - natural-compare: "npm:^1.4.0" - optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" - peerDependencies: - jiti: "*" - peerDependenciesMeta: - jiti: - optional: true - bin: - eslint: bin/eslint.js - checksum: 10c0/3a22f68c99d75dcbafe6e2fef18d2b5bbcc960c2437f48a414ccf9ca214254733a18e6b79d07bbd374a2369a648413e421aabd07b11be3de5a44d5a4b9997877 - languageName: node - linkType: hard - -"espree@npm:^10.0.1, espree@npm:^10.1.0": - version: 10.1.0 - resolution: "espree@npm:10.1.0" - dependencies: - acorn: "npm:^8.12.0" - acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^4.0.0" - checksum: 10c0/52e6feaa77a31a6038f0c0e3fce93010a4625701925b0715cd54a2ae190b3275053a0717db698697b32653788ac04845e489d6773b508d6c2e8752f3c57470a0 - languageName: node - linkType: hard - -"esprima-extract-comments@npm:^1.1.0": - version: 1.1.0 - resolution: "esprima-extract-comments@npm:1.1.0" - dependencies: - esprima: "npm:^4.0.0" - checksum: 10c0/1fbb18188051668bee7406dd81d36fff30c818816c7c8bcf63931b8636ff159c6c95d5c62c6a752efaf54b9385ebcf86c7cbf847998e1ab85143dd4ee0b80ee0 - languageName: node - linkType: hard - -"esprima@npm:^4.0.0, esprima@npm:^4.0.1": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 - languageName: node - linkType: hard - -"esquery@npm:^1.5.0, esquery@npm:^1.6.0": - version: 1.6.0 - resolution: "esquery@npm:1.6.0" - dependencies: - estraverse: "npm:^5.1.0" - checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: "npm:^5.2.0" - checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 - languageName: node - linkType: hard - -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 - languageName: node - linkType: hard - -"estree-util-attach-comments@npm:^3.0.0": - version: 3.0.0 - resolution: "estree-util-attach-comments@npm:3.0.0" - dependencies: - "@types/estree": "npm:^1.0.0" - checksum: 10c0/ee69bb5c45e2ad074725b90ed181c1c934b29d81bce4b0c7761431e83c4c6ab1b223a6a3d6a4fbeb92128bc5d5ee201d5dd36cf1770aa5e16a40b0cf36e8a1f1 - languageName: node - linkType: hard - -"estree-util-build-jsx@npm:^3.0.0": - version: 3.0.1 - resolution: "estree-util-build-jsx@npm:3.0.1" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - devlop: "npm:^1.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - estree-walker: "npm:^3.0.0" - checksum: 10c0/274c119817b8e7caa14a9778f1e497fea56cdd2b01df1a1ed037f843178992d3afe85e0d364d485e1e2e239255763553d1b647b15e4a7ba50851bcb43dc6bf80 - languageName: node - linkType: hard - -"estree-util-is-identifier-name@npm:^3.0.0": - version: 3.0.0 - resolution: "estree-util-is-identifier-name@npm:3.0.0" - checksum: 10c0/d1881c6ed14bd588ebd508fc90bf2a541811dbb9ca04dec2f39d27dcaa635f85b5ed9bbbe7fc6fb1ddfca68744a5f7c70456b4b7108b6c4c52780631cc787c5b - languageName: node - linkType: hard - -"estree-util-to-js@npm:^2.0.0": - version: 2.0.0 - resolution: "estree-util-to-js@npm:2.0.0" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - astring: "npm:^1.8.0" - source-map: "npm:^0.7.0" - checksum: 10c0/ac88cb831401ef99e365f92f4af903755d56ae1ce0e0f0fb8ff66e678141f3d529194f0fb15f6c78cd7554c16fda36854df851d58f9e05cfab15bddf7a97cea0 - languageName: node - linkType: hard - -"estree-util-value-to-estree@npm:^3.0.1": - version: 3.1.2 - resolution: "estree-util-value-to-estree@npm:3.1.2" - dependencies: - "@types/estree": "npm:^1.0.0" - checksum: 10c0/fb0fa42f44488eeb2357b60dc3fd5581422b0a36144fd90639fd3963c7396f225e7d7efeee0144b0a7293ea00e4ec9647b8302d057d48f894e8d5775c3c72eb7 - languageName: node - linkType: hard - -"estree-util-visit@npm:^2.0.0": - version: 2.0.0 - resolution: "estree-util-visit@npm:2.0.0" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - "@types/unist": "npm:^3.0.0" - checksum: 10c0/acda8b03cc8f890d79c7c7361f6c95331ba84b7ccc0c32b49f447fc30206b20002b37ffdfc97b6ad16e6fe065c63ecbae1622492e2b6b4775c15966606217f39 - languageName: node - linkType: hard - -"estree-walker@npm:^2.0.2": - version: 2.0.2 - resolution: "estree-walker@npm:2.0.2" - checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af - languageName: node - linkType: hard - -"estree-walker@npm:^3.0.0": - version: 3.0.3 - resolution: "estree-walker@npm:3.0.3" - dependencies: - "@types/estree": "npm:^1.0.0" - checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 - languageName: node - linkType: hard - -"eta@npm:^2.0.0, eta@npm:^2.2.0": - version: 2.2.0 - resolution: "eta@npm:2.2.0" - checksum: 10c0/643b54d9539d2761bf6c5f4f48df1a5ea2d46c7f5a5fdc47a7d4802a8aa2b6262d4d61f724452e226c18cf82db02d48e65293fcc548f26a3f9d75a5ba7c3b859 - languageName: node - linkType: hard - -"etag@npm:~1.8.1": - version: 1.8.1 - resolution: "etag@npm:1.8.1" - checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 - languageName: node - linkType: hard - -"eval@npm:^0.1.8": - version: 0.1.8 - resolution: "eval@npm:0.1.8" - dependencies: - "@types/node": "npm:*" - require-like: "npm:>= 0.1.1" - checksum: 10c0/258e700bff09e3ce3344273d5b6691b8ec5b043538d84f738f14d8b0aded33d64c00c15b380de725b1401b15f428ab35a9e7ca19a7d25f162c4f877c71586be9 - languageName: node - linkType: hard - -"eventemitter3@npm:^4.0.0": - version: 4.0.7 - resolution: "eventemitter3@npm:4.0.7" - checksum: 10c0/5f6d97cbcbac47be798e6355e3a7639a84ee1f7d9b199a07017f1d2f1e2fe236004d14fa5dfaeba661f94ea57805385e326236a6debbc7145c8877fbc0297c6b - languageName: node - linkType: hard - -"events@npm:^3.2.0": - version: 3.3.0 - resolution: "events@npm:3.3.0" - checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 - languageName: node - linkType: hard - -"execa@npm:^5.0.0": - version: 5.1.1 - resolution: "execa@npm:5.1.1" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^6.0.0" - human-signals: "npm:^2.1.0" - is-stream: "npm:^2.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^4.0.1" - onetime: "npm:^5.1.2" - signal-exit: "npm:^3.0.3" - strip-final-newline: "npm:^2.0.0" - checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f - languageName: node - linkType: hard - -"execa@npm:^9.3.1": - version: 9.3.1 - resolution: "execa@npm:9.3.1" - dependencies: - "@sindresorhus/merge-streams": "npm:^4.0.0" - cross-spawn: "npm:^7.0.3" - figures: "npm:^6.1.0" - get-stream: "npm:^9.0.0" - human-signals: "npm:^8.0.0" - is-plain-obj: "npm:^4.1.0" - is-stream: "npm:^4.0.1" - npm-run-path: "npm:^5.2.0" - pretty-ms: "npm:^9.0.0" - signal-exit: "npm:^4.1.0" - strip-final-newline: "npm:^4.0.0" - yoctocolors: "npm:^2.0.0" - checksum: 10c0/113979ff56575f6cb69fd021eb3894a674fb59b264f5e8c2b9b30e301629abc4f44cee881e680f9fb3b7d4956645df76a2d8c0006869dea985f96ec65f07b226 - languageName: node - linkType: hard - -"exit@npm:^0.1.2": - version: 0.1.2 - resolution: "exit@npm:0.1.2" - checksum: 10c0/71d2ad9b36bc25bb8b104b17e830b40a08989be7f7d100b13269aaae7c3784c3e6e1e88a797e9e87523993a25ba27c8958959a554535370672cfb4d824af8989 - languageName: node - linkType: hard - -"expect@npm:^29.0.0, expect@npm:^29.7.0": - version: 29.7.0 - resolution: "expect@npm:29.7.0" - dependencies: - "@jest/expect-utils": "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - jest-matcher-utils: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - checksum: 10c0/2eddeace66e68b8d8ee5f7be57f3014b19770caaf6815c7a08d131821da527fb8c8cb7b3dcd7c883d2d3d8d184206a4268984618032d1e4b16dc8d6596475d41 - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 - languageName: node - linkType: hard - -"express@npm:^4.17.3": - version: 4.19.2 - resolution: "express@npm:4.19.2" - dependencies: - accepts: "npm:~1.3.8" - array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.2" - content-disposition: "npm:0.5.4" - content-type: "npm:~1.0.4" - cookie: "npm:0.6.0" - cookie-signature: "npm:1.0.6" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - finalhandler: "npm:1.2.0" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" - merge-descriptors: "npm:1.0.1" - methods: "npm:~1.1.2" - on-finished: "npm:2.4.1" - parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.7" - proxy-addr: "npm:~2.0.7" - qs: "npm:6.11.0" - range-parser: "npm:~1.2.1" - safe-buffer: "npm:5.2.1" - send: "npm:0.18.0" - serve-static: "npm:1.15.0" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - type-is: "npm:~1.6.18" - utils-merge: "npm:1.0.1" - vary: "npm:~1.1.2" - checksum: 10c0/e82e2662ea9971c1407aea9fc3c16d6b963e55e3830cd0ef5e00b533feda8b770af4e3be630488ef8a752d7c75c4fcefb15892868eeaafe7353cb9e3e269fdcb - languageName: node - linkType: hard - -"extend-shallow@npm:^2.0.1": - version: 2.0.1 - resolution: "extend-shallow@npm:2.0.1" - dependencies: - is-extendable: "npm:^0.1.0" - checksum: 10c0/ee1cb0a18c9faddb42d791b2d64867bd6cfd0f3affb711782eb6e894dd193e2934a7f529426aac7c8ddb31ac5d38000a00aa2caf08aa3dfc3e1c8ff6ba340bd9 - languageName: node - linkType: hard - -"extend@npm:^3.0.0": - version: 3.0.2 - resolution: "extend@npm:3.0.2" - checksum: 10c0/73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 - languageName: node - linkType: hard - -"extract-comments@npm:^1.1.0": - version: 1.1.0 - resolution: "extract-comments@npm:1.1.0" - dependencies: - esprima-extract-comments: "npm:^1.1.0" - parse-code-context: "npm:^1.0.0" - checksum: 10c0/de3f9824f6d07ec995379dfd09e659fa56991bb5d72fd1f6ec3084dffc7993170b3548f3af3710182df43ec69317a872cd82623702a4cdbe6f8ec4c089a1f0d1 - languageName: node - linkType: hard - -"eyes@npm:0.1.x": - version: 0.1.8 - resolution: "eyes@npm:0.1.8" - checksum: 10c0/4c79a9cbf45746d8c9f48cc957e35ad8ea336add1c7b8d5a0e002efc791a7a62b27b2188184ef1a1eea7bc3cd06b161791421e0e6c5fe78309705a162c53eea8 - languageName: node - linkType: hard - -"fast-check@npm:3.20.0": - version: 3.20.0 - resolution: "fast-check@npm:3.20.0" - dependencies: - pure-rand: "npm:^6.1.0" - checksum: 10c0/860daef1337c96077ba7f2d0238391eb7de24aced5b0f43c699ad4ba683a1a61044dd8d17b86f914be728b97cbb5bbaf2625c2be4e1c0bf685f09432c29624c9 - languageName: node - linkType: hard - -"fast-check@npm:^3.20.0": - version: 3.21.0 - resolution: "fast-check@npm:3.21.0" - dependencies: - pure-rand: "npm:^6.1.0" - checksum: 10c0/69c31cf27503f19e383fb72e03bdc22c9bc669b55e8e243b3f7ec328ff956787ee49d06239b7ba75250c964c815ff33ff03dfe441bbbf67d97e0f65761efb046 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 - languageName: node - linkType: hard - -"fast-equals@npm:^5.0.1": - version: 5.0.1 - resolution: "fast-equals@npm:5.0.1" - checksum: 10c0/d7077b8b681036c2840ed9860a3048e44fc268fad2b525b8f25b43458be0c8ad976152eb4b475de9617170423c5b802121ebb61ed6641c3ac035fadaf805c8c0 - languageName: node - linkType: hard - -"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1, fast-glob@npm:^3.3.2": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" - dependencies: - "@nodelib/fs.stat": "npm:^2.0.2" - "@nodelib/fs.walk": "npm:^1.2.3" - glob-parent: "npm:^5.1.2" - merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 10c0/42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b - languageName: node - linkType: hard - -"fast-levenshtein@npm:^2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 - languageName: node - linkType: hard - -"fast-uri@npm:^3.0.1": - version: 3.0.1 - resolution: "fast-uri@npm:3.0.1" - checksum: 10c0/3cd46d6006083b14ca61ffe9a05b8eef75ef87e9574b6f68f2e17ecf4daa7aaadeff44e3f0f7a0ef4e0f7e7c20fc07beec49ff14dc72d0b500f00386592f2d10 - languageName: node - linkType: hard - -"fast-url-parser@npm:1.1.3": - version: 1.1.3 - resolution: "fast-url-parser@npm:1.1.3" - dependencies: - punycode: "npm:^1.3.2" - checksum: 10c0/d85c5c409cf0215417380f98a2d29c23a95004d93ff0d8bdf1af5f1a9d1fc608ac89ac6ffe863783d2c73efb3850dd35390feb1de3296f49877bfee0392eb5d3 - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.17.1 - resolution: "fastq@npm:1.17.1" - dependencies: - reusify: "npm:^1.0.4" - checksum: 10c0/1095f16cea45fb3beff558bb3afa74ca7a9250f5a670b65db7ed585f92b4b48381445cd328b3d87323da81e43232b5d5978a8201bde84e0cd514310f1ea6da34 - languageName: node - linkType: hard - -"fault@npm:^2.0.0": - version: 2.0.1 - resolution: "fault@npm:2.0.1" - dependencies: - format: "npm:^0.2.0" - checksum: 10c0/b80fbf1019b9ce8b08ee09ce86e02b028563e13a32ac3be34e42bfac00a97b96d8dee6d31e26578ffc16224eb6729e01ff1f97ddfeee00494f4f56c0aeed4bdd - languageName: node - linkType: hard - -"faye-websocket@npm:^0.11.3": - version: 0.11.4 - resolution: "faye-websocket@npm:0.11.4" - dependencies: - websocket-driver: "npm:>=0.5.1" - checksum: 10c0/c6052a0bb322778ce9f89af92890f6f4ce00d5ec92418a35e5f4c6864a4fe736fec0bcebd47eac7c0f0e979b01530746b1c85c83cb04bae789271abf19737420 - languageName: node - linkType: hard - -"fb-watchman@npm:^2.0.0": - version: 2.0.2 - resolution: "fb-watchman@npm:2.0.2" - dependencies: - bser: "npm:2.1.1" - checksum: 10c0/feae89ac148adb8f6ae8ccd87632e62b13563e6fb114cacb5265c51f585b17e2e268084519fb2edd133872f1d47a18e6bfd7e5e08625c0d41b93149694187581 - languageName: node - linkType: hard - -"feed@npm:^4.2.2": - version: 4.2.2 - resolution: "feed@npm:4.2.2" - dependencies: - xml-js: "npm:^1.6.11" - checksum: 10c0/c0849bde569da94493224525db00614fd1855a5d7c2e990f6e8637bd0298e85c3d329efe476cba77e711e438c3fb48af60cd5ef0c409da5bcd1f479790b0a372 - languageName: node - linkType: hard - -"figlet@npm:^1.7.0": - version: 1.7.0 - resolution: "figlet@npm:1.7.0" - bin: - figlet: bin/index.js - checksum: 10c0/bedd97fe5fa604002ae8c6bc0b08dea6f9701e0b268f42e601668956f50ff377ef592e24e182a6174a775abde9e2aa77697e324b8681619ae23bc85078439393 - languageName: node - linkType: hard - -"figures@npm:^6.1.0": - version: 6.1.0 - resolution: "figures@npm:6.1.0" - dependencies: - is-unicode-supported: "npm:^2.0.0" - checksum: 10c0/9159df4264d62ef447a3931537de92f5012210cf5135c35c010df50a2169377581378149abfe1eb238bd6acbba1c0d547b1f18e0af6eee49e30363cedaffcfe4 - languageName: node - linkType: hard - -"file-entry-cache@npm:^8.0.0": - version: 8.0.0 - resolution: "file-entry-cache@npm:8.0.0" - dependencies: - flat-cache: "npm:^4.0.0" - checksum: 10c0/9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 - languageName: node - linkType: hard - -"file-entry-cache@npm:^9.0.0": - version: 9.0.0 - resolution: "file-entry-cache@npm:9.0.0" - dependencies: - flat-cache: "npm:^5.0.0" - checksum: 10c0/07b0a4f062dc0aa258f3e1b06ac083ea25313f5e289943e146fafdaf3315dcc031635545eea7fe98fe5598b91d6c7f48dba7a251dd7ac20108a6ebf7d00b0b1c - languageName: node - linkType: hard - -"file-loader@npm:^6.2.0": - version: 6.2.0 - resolution: "file-loader@npm:6.2.0" - dependencies: - loader-utils: "npm:^2.0.0" - schema-utils: "npm:^3.0.0" - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - checksum: 10c0/e176a57c2037ab0f78e5755dbf293a6b7f0f8392350a120bd03cc2ce2525bea017458ba28fea14ca535ff1848055e86d1a3a216bdb2561ef33395b27260a1dd3 - languageName: node - linkType: hard - -"filesize@npm:^8.0.6": - version: 8.0.7 - resolution: "filesize@npm:8.0.7" - checksum: 10c0/82072d94816484df5365d4d5acbb2327a65dc49704c64e403e8c40d8acb7364de1cf1e65cb512c77a15d353870f73e4fed46dad5c6153d0618d9ce7a64d09cfc - languageName: node - linkType: hard - -"fill-range@npm:^7.1.1": - version: 7.1.1 - resolution: "fill-range@npm:7.1.1" - dependencies: - to-regex-range: "npm:^5.0.1" - checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 - languageName: node - linkType: hard - -"finalhandler@npm:1.2.0": - version: 1.2.0 - resolution: "finalhandler@npm:1.2.0" - dependencies: - debug: "npm:2.6.9" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - on-finished: "npm:2.4.1" - parseurl: "npm:~1.3.3" - statuses: "npm:2.0.1" - unpipe: "npm:~1.0.0" - checksum: 10c0/64b7e5ff2ad1fcb14931cd012651631b721ce657da24aedb5650ddde9378bf8e95daa451da43398123f5de161a81e79ff5affe4f9f2a6d2df4a813d6d3e254b7 - languageName: node - linkType: hard - -"find-cache-dir@npm:^4.0.0": - version: 4.0.0 - resolution: "find-cache-dir@npm:4.0.0" - dependencies: - common-path-prefix: "npm:^3.0.0" - pkg-dir: "npm:^7.0.0" - checksum: 10c0/0faa7956974726c8769671de696d24c643ca1e5b8f7a2401283caa9e07a5da093293e0a0f4bd18c920ec981d2ef945c7f5b946cde268dfc9077d833ad0293cff - languageName: node - linkType: hard - -"find-up-simple@npm:^1.0.0": - version: 1.0.0 - resolution: "find-up-simple@npm:1.0.0" - checksum: 10c0/de1ad5e55c8c162f5600fe3297bb55a3da5cd9cb8c6755e463ec1d52c4c15a84e312a68397fb5962d13263b3dbd4ea294668c465ccacc41291d7cc97588769f9 - languageName: node - linkType: hard - -"find-up@npm:^3.0.0": - version: 3.0.0 - resolution: "find-up@npm:3.0.0" - dependencies: - locate-path: "npm:^3.0.0" - checksum: 10c0/2c2e7d0a26db858e2f624f39038c74739e38306dee42b45f404f770db357947be9d0d587f1cac72d20c114deb38aa57316e879eb0a78b17b46da7dab0a3bd6e3 - languageName: node - linkType: hard - -"find-up@npm:^4.0.0, find-up@npm:^4.1.0": - version: 4.1.0 - resolution: "find-up@npm:4.1.0" - dependencies: - locate-path: "npm:^5.0.0" - path-exists: "npm:^4.0.0" - checksum: 10c0/0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: "npm:^6.0.0" - path-exists: "npm:^4.0.0" - checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a - languageName: node - linkType: hard - -"find-up@npm:^6.3.0": - version: 6.3.0 - resolution: "find-up@npm:6.3.0" - dependencies: - locate-path: "npm:^7.1.0" - path-exists: "npm:^5.0.0" - checksum: 10c0/07e0314362d316b2b13f7f11ea4692d5191e718ca3f7264110127520f3347996349bf9e16805abae3e196805814bc66ef4bff2b8904dc4a6476085fc9b0eba07 - languageName: node - linkType: hard - -"flat-cache@npm:^4.0.0": - version: 4.0.1 - resolution: "flat-cache@npm:4.0.1" - dependencies: - flatted: "npm:^3.2.9" - keyv: "npm:^4.5.4" - checksum: 10c0/2c59d93e9faa2523e4fda6b4ada749bed432cfa28c8e251f33b25795e426a1c6dbada777afb1f74fcfff33934fdbdea921ee738fcc33e71adc9d6eca984a1cfc - languageName: node - linkType: hard - -"flat-cache@npm:^5.0.0": - version: 5.0.0 - resolution: "flat-cache@npm:5.0.0" - dependencies: - flatted: "npm:^3.3.1" - keyv: "npm:^4.5.4" - checksum: 10c0/847f25eefec5d6614fdce76dc6097ee98f63fd4dfbcb908718905ac56610f939f4c28b1f908d6e8857d49286fe73235095d2e7ac9df096c35a3e8a15204c361b - languageName: node - linkType: hard - -"flat@npm:^5.0.2": - version: 5.0.2 - resolution: "flat@npm:5.0.2" - bin: - flat: cli.js - checksum: 10c0/f178b13482f0cd80c7fede05f4d10585b1f2fdebf26e12edc138e32d3150c6ea6482b7f12813a1091143bad52bb6d3596bca51a162257a21163c0ff438baa5fe - languageName: node - linkType: hard - -"flatted@npm:^3.2.9, flatted@npm:^3.3.1": - version: 3.3.1 - resolution: "flatted@npm:3.3.1" - checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf - languageName: node - linkType: hard - -"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" - peerDependenciesMeta: - debug: - optional: true - checksum: 10c0/9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071 - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.3.0 - resolution: "foreground-child@npm:3.3.0" - dependencies: - cross-spawn: "npm:^7.0.0" - signal-exit: "npm:^4.0.1" - checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 - languageName: node - linkType: hard - -"fork-ts-checker-webpack-plugin@npm:^6.5.0": - version: 6.5.3 - resolution: "fork-ts-checker-webpack-plugin@npm:6.5.3" - dependencies: - "@babel/code-frame": "npm:^7.8.3" - "@types/json-schema": "npm:^7.0.5" - chalk: "npm:^4.1.0" - chokidar: "npm:^3.4.2" - cosmiconfig: "npm:^6.0.0" - deepmerge: "npm:^4.2.2" - fs-extra: "npm:^9.0.0" - glob: "npm:^7.1.6" - memfs: "npm:^3.1.2" - minimatch: "npm:^3.0.4" - schema-utils: "npm:2.7.0" - semver: "npm:^7.3.2" - tapable: "npm:^1.0.0" - peerDependencies: - eslint: ">= 6" - typescript: ">= 2.7" - vue-template-compiler: "*" - webpack: ">= 4" - peerDependenciesMeta: - eslint: - optional: true - vue-template-compiler: - optional: true - checksum: 10c0/0885ea75474de011d4068ca3e2d3ca6e4cd318f5cfa018e28ff8fef23ef3a1f1c130160ef192d3e5d31ef7b6fe9f8fb1d920eab5e9e449fb30ce5cc96647245c - languageName: node - linkType: hard - -"form-data-encoder@npm:^2.1.2": - version: 2.1.4 - resolution: "form-data-encoder@npm:2.1.4" - checksum: 10c0/4c06ae2b79ad693a59938dc49ebd020ecb58e4584860a90a230f80a68b026483b022ba5e4143cff06ae5ac8fd446a0b500fabc87bbac3d1f62f2757f8dabcaf7 - languageName: node - linkType: hard - -"form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" - dependencies: - asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.8" - mime-types: "npm:^2.1.12" - checksum: 10c0/cb6f3ac49180be03ff07ba3ff125f9eba2ff0b277fb33c7fc47569fc5e616882c5b1c69b9904c4c4187e97dd0419dd03b134174756f296dec62041e6527e2c6e - languageName: node - linkType: hard - -"format@npm:^0.2.0": - version: 0.2.2 - resolution: "format@npm:0.2.2" - checksum: 10c0/6032ba747541a43abf3e37b402b2f72ee08ebcb58bf84d816443dd228959837f1cddf1e8775b29fa27ff133f4bd146d041bfca5f9cf27f048edf3d493cf8fee6 - languageName: node - linkType: hard - -"forwarded@npm:0.2.0": - version: 0.2.0 - resolution: "forwarded@npm:0.2.0" - checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 - languageName: node - linkType: hard - -"fraction.js@npm:^4.3.7": - version: 4.3.7 - resolution: "fraction.js@npm:4.3.7" - checksum: 10c0/df291391beea9ab4c263487ffd9d17fed162dbb736982dee1379b2a8cc94e4e24e46ed508c6d278aded9080ba51872f1bc5f3a5fd8d7c74e5f105b508ac28711 - languageName: node - linkType: hard - -"fresh@npm:0.5.2": - version: 0.5.2 - resolution: "fresh@npm:0.5.2" - checksum: 10c0/c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a - languageName: node - linkType: hard - -"fs-extra@npm:^10.1.0": - version: 10.1.0 - resolution: "fs-extra@npm:10.1.0" - dependencies: - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10c0/5f579466e7109719d162a9249abbeffe7f426eb133ea486e020b89bc6d67a741134076bf439983f2eb79276ceaf6bd7b7c1e43c3fd67fe889863e69072fb0a5e - languageName: node - linkType: hard - -"fs-extra@npm:^11.1.1, fs-extra@npm:^11.2.0": - version: 11.2.0 - resolution: "fs-extra@npm:11.2.0" - dependencies: - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10c0/d77a9a9efe60532d2e790e938c81a02c1b24904ef7a3efb3990b835514465ba720e99a6ea56fd5e2db53b4695319b644d76d5a0e9988a2beef80aa7b1da63398 - languageName: node - linkType: hard - -"fs-extra@npm:^7.0.1, fs-extra@npm:~7.0.1": - version: 7.0.1 - resolution: "fs-extra@npm:7.0.1" - dependencies: - graceful-fs: "npm:^4.1.2" - jsonfile: "npm:^4.0.0" - universalify: "npm:^0.1.0" - checksum: 10c0/1943bb2150007e3739921b8d13d4109abdc3cc481e53b97b7ea7f77eda1c3c642e27ae49eac3af074e3496ea02fde30f411ef410c760c70a38b92e656e5da784 - languageName: node - linkType: hard - -"fs-extra@npm:^9.0.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: "npm:^1.0.0" - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10c0/9b808bd884beff5cb940773018179a6b94a966381d005479f00adda6b44e5e3d4abf765135773d849cc27efe68c349e4a7b86acd7d3306d5932c14f3a4b17a92 - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 - languageName: node - linkType: hard - -"fs-monkey@npm:^1.0.4": - version: 1.0.6 - resolution: "fs-monkey@npm:1.0.6" - checksum: 10c0/6f2508e792a47e37b7eabd5afc79459c1ea72bce2a46007d2b7ed0bfc3a4d64af38975c6eb7e93edb69ac98bbb907c13ff1b1579b2cf52d3d02dbc0303fca79f - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 - languageName: node - linkType: hard - -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: "npm:latest" - checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" - dependencies: - node-gyp: "npm:latest" - conditions: os=darwin - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 - languageName: node - linkType: hard - -"gensequence@npm:^7.0.0": - version: 7.0.0 - resolution: "gensequence@npm:7.0.0" - checksum: 10c0/d446772a795d8a50d70d87e87b827591ccd599c267acce9c2e1f17e4df6c04e6d47661b2ddf5d0144d026c1e3ac71eca917c171e594c3daf6a87aeabbe1d7a3d - languageName: node - linkType: hard - -"gensync@npm:^1.0.0-beta.2": - version: 1.0.0-beta.2 - resolution: "gensync@npm:1.0.0-beta.2" - checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde - languageName: node - linkType: hard - -"get-east-asian-width@npm:^1.0.0": - version: 1.2.0 - resolution: "get-east-asian-width@npm:1.2.0" - checksum: 10c0/914b1e217cf38436c24b4c60b4c45289e39a45bf9e65ef9fd343c2815a1a02b8a0215aeec8bf9c07c516089004b6e3826332481f40a09529fcadbf6e579f286b - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" - dependencies: - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.0" - checksum: 10c0/0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 - languageName: node - linkType: hard - -"get-own-enumerable-property-symbols@npm:^3.0.0": - version: 3.0.2 - resolution: "get-own-enumerable-property-symbols@npm:3.0.2" - checksum: 10c0/103999855f3d1718c631472437161d76962cbddcd95cc642a34c07bfb661ed41b6c09a9c669ccdff89ee965beb7126b80eec7b2101e20e31e9cc6c4725305e10 - languageName: node - linkType: hard - -"get-package-type@npm:^0.1.0": - version: 0.1.0 - resolution: "get-package-type@npm:0.1.0" - checksum: 10c0/e34cdf447fdf1902a1f6d5af737eaadf606d2ee3518287abde8910e04159368c268568174b2e71102b87b26c2020486f126bfca9c4fb1ceb986ff99b52ecd1be - languageName: node - linkType: hard - -"get-stdin@npm:^9.0.0, get-stdin@npm:~9.0.0": - version: 9.0.0 - resolution: "get-stdin@npm:9.0.0" - checksum: 10c0/7ef2edc0c81a0644ca9f051aad8a96ae9373d901485abafaabe59fd347a1c378689d8a3d8825fb3067415d1d09dfcaa43cb9b9516ecac6b74b3138b65a8ccc6b - languageName: node - linkType: hard - -"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 - languageName: node - linkType: hard - -"get-stream@npm:^9.0.0": - version: 9.0.1 - resolution: "get-stream@npm:9.0.1" - dependencies: - "@sec-ant/readable-stream": "npm:^0.4.1" - is-stream: "npm:^4.0.1" - checksum: 10c0/d70e73857f2eea1826ac570c3a912757dcfbe8a718a033fa0c23e12ac8e7d633195b01710e0559af574cbb5af101009b42df7b6f6b29ceec8dbdf7291931b948 - languageName: node - linkType: hard - -"get-tsconfig@npm:^4.5.0, get-tsconfig@npm:^4.7.0, get-tsconfig@npm:^4.7.3, get-tsconfig@npm:^4.7.5": - version: 4.7.6 - resolution: "get-tsconfig@npm:4.7.6" - dependencies: - resolve-pkg-maps: "npm:^1.0.0" - checksum: 10c0/2240e1b13e996dfbb947d177f422f83d09d1f93c9ce16959ebb3c2bdf8bdf4f04f98eba043859172da1685f9c7071091f0acfa964ebbe4780394d83b7dc3f58a - languageName: node - linkType: hard - -"git-hooks-list@npm:^3.0.0": - version: 3.1.0 - resolution: "git-hooks-list@npm:3.1.0" - checksum: 10c0/f1b93dd11b80b2a687b99a8bb553c0d07f344532d475b3ac2a5ff044d40fa71567ddcfa5cb39fae0b4e43a670a33f02f71ec3b24b7263233f3a3df89deddfb5a - languageName: node - linkType: hard - -"github-slugger@npm:^1.5.0": - version: 1.5.0 - resolution: "github-slugger@npm:1.5.0" - checksum: 10c0/116f99732925f939cbfd6f2e57db1aa7e111a460db0d103e3b3f2fce6909d44311663d4542350706cad806345b9892358cc3b153674f88eeae77f43380b3bfca - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: "npm:^4.0.1" - checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee - languageName: node - linkType: hard - -"glob-parent@npm:^6.0.1, glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: "npm:^4.0.3" - checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 - languageName: node - linkType: hard - -"glob-to-regexp@npm:^0.3.0": - version: 0.3.0 - resolution: "glob-to-regexp@npm:0.3.0" - checksum: 10c0/f7e8091288d88b397b715281560d86ba4998246c300cb0d51db483db0a4c68cb48b489af8da9c03262745e8aa5337ba596d82dee61ff9467c5d7c27d70b676aa - languageName: node - linkType: hard - -"glob-to-regexp@npm:^0.4.1": - version: 0.4.1 - resolution: "glob-to-regexp@npm:0.4.1" - checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 - languageName: node - linkType: hard - -"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.12, glob@npm:~10.4.1": - version: 10.4.5 - resolution: "glob@npm:10.4.5" - dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^3.1.2" - minimatch: "npm:^9.0.4" - minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^1.11.1" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e - languageName: node - linkType: hard - -"glob@npm:^11.0.0": - version: 11.0.0 - resolution: "glob@npm:11.0.0" - dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^4.0.1" - minimatch: "npm:^10.0.0" - minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^2.0.0" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/419866015d8795258a8ac51de5b9d1a99c72634fc3ead93338e4da388e89773ab21681e494eac0fbc4250b003451ca3110bb4f1c9393d15d14466270094fdb4e - languageName: node - linkType: hard - -"glob@npm:^7.0.0, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.1.1" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe - languageName: node - linkType: hard - -"glob@npm:^8.0.3": - version: 8.1.0 - resolution: "glob@npm:8.1.0" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^5.0.1" - once: "npm:^1.3.0" - checksum: 10c0/cb0b5cab17a59c57299376abe5646c7070f8acb89df5595b492dba3bfb43d301a46c01e5695f01154e6553168207cb60d4eaf07d3be4bc3eb9b0457c5c561d0f - languageName: node - linkType: hard - -"global-directory@npm:^4.0.1": - version: 4.0.1 - resolution: "global-directory@npm:4.0.1" - dependencies: - ini: "npm:4.1.1" - checksum: 10c0/f9cbeef41db4876f94dd0bac1c1b4282a7de9c16350ecaaf83e7b2dd777b32704cc25beeb1170b5a63c42a2c9abfade74d46357fe0133e933218bc89e613d4b2 - languageName: node - linkType: hard - -"global-dirs@npm:^3.0.0": - version: 3.0.1 - resolution: "global-dirs@npm:3.0.1" - dependencies: - ini: "npm:2.0.0" - checksum: 10c0/ef65e2241a47ff978f7006a641302bc7f4c03dfb98783d42bf7224c136e3a06df046e70ee3a010cf30214114755e46c9eb5eb1513838812fbbe0d92b14c25080 - languageName: node - linkType: hard - -"global-modules@npm:^2.0.0": - version: 2.0.0 - resolution: "global-modules@npm:2.0.0" - dependencies: - global-prefix: "npm:^3.0.0" - checksum: 10c0/43b770fe24aa6028f4b9770ea583a47f39750be15cf6e2578f851e4ccc9e4fa674b8541928c0b09c21461ca0763f0d36e4068cec86c914b07fd6e388e66ba5b9 - languageName: node - linkType: hard - -"global-prefix@npm:^3.0.0": - version: 3.0.0 - resolution: "global-prefix@npm:3.0.0" - dependencies: - ini: "npm:^1.3.5" - kind-of: "npm:^6.0.2" - which: "npm:^1.3.1" - checksum: 10c0/510f489fb68d1cc7060f276541709a0ee6d41356ef852de48f7906c648ac223082a1cc8fce86725ca6c0e032bcdc1189ae77b4744a624b29c34a9d0ece498269 - languageName: node - linkType: hard - -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 - languageName: node - linkType: hard - -"globals@npm:^14.0.0": - version: 14.0.0 - resolution: "globals@npm:14.0.0" - checksum: 10c0/b96ff42620c9231ad468d4c58ff42afee7777ee1c963013ff8aabe095a451d0ceeb8dcd8ef4cbd64d2538cef45f787a78ba3a9574f4a634438963e334471302d - languageName: node - linkType: hard - -"globals@npm:^15.7.0, globals@npm:^15.8.0": - version: 15.9.0 - resolution: "globals@npm:15.9.0" - checksum: 10c0/de4b553e412e7e830998578d51b605c492256fb2a9273eaeec6ec9ee519f1c5aa50de57e3979911607fd7593a4066420e01d8c3d551e7a6a236e96c521aee36c - languageName: node - linkType: hard - -"globby@npm:14.0.2": - version: 14.0.2 - resolution: "globby@npm:14.0.2" - dependencies: - "@sindresorhus/merge-streams": "npm:^2.1.0" - fast-glob: "npm:^3.3.2" - ignore: "npm:^5.2.4" - path-type: "npm:^5.0.0" - slash: "npm:^5.1.0" - unicorn-magic: "npm:^0.1.0" - checksum: 10c0/3f771cd683b8794db1e7ebc8b6b888d43496d93a82aad4e9d974620f578581210b6c5a6e75ea29573ed16a1345222fab6e9b877a8d1ed56eeb147e09f69c6f78 - languageName: node - linkType: hard - -"globby@npm:^11.0.1, globby@npm:^11.0.4, globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - dependencies: - array-union: "npm:^2.1.0" - dir-glob: "npm:^3.0.1" - fast-glob: "npm:^3.2.9" - ignore: "npm:^5.2.0" - merge2: "npm:^1.4.1" - slash: "npm:^3.0.0" - checksum: 10c0/b39511b4afe4bd8a7aead3a27c4ade2b9968649abab0a6c28b1a90141b96ca68ca5db1302f7c7bd29eab66bf51e13916b8e0a3d0ac08f75e1e84a39b35691189 - languageName: node - linkType: hard - -"globby@npm:^13.1.1, globby@npm:^13.1.2, globby@npm:^13.2.2": - version: 13.2.2 - resolution: "globby@npm:13.2.2" - dependencies: - dir-glob: "npm:^3.0.1" - fast-glob: "npm:^3.3.0" - ignore: "npm:^5.2.4" - merge2: "npm:^1.4.1" - slash: "npm:^4.0.0" - checksum: 10c0/a8d7cc7cbe5e1b2d0f81d467bbc5bc2eac35f74eaded3a6c85fc26d7acc8e6de22d396159db8a2fc340b8a342e74cac58de8f4aee74146d3d146921a76062664 - languageName: node - linkType: hard - -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: "npm:^1.1.3" - checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 - languageName: node - linkType: hard - -"got@npm:^12.1.0": - version: 12.6.1 - resolution: "got@npm:12.6.1" - dependencies: - "@sindresorhus/is": "npm:^5.2.0" - "@szmarczak/http-timer": "npm:^5.0.1" - cacheable-lookup: "npm:^7.0.0" - cacheable-request: "npm:^10.2.8" - decompress-response: "npm:^6.0.0" - form-data-encoder: "npm:^2.1.2" - get-stream: "npm:^6.0.1" - http2-wrapper: "npm:^2.1.10" - lowercase-keys: "npm:^3.0.0" - p-cancelable: "npm:^3.0.0" - responselike: "npm:^3.0.0" - checksum: 10c0/2fe97fcbd7a9ffc7c2d0ecf59aca0a0562e73a7749cadada9770eeb18efbdca3086262625fb65590594edc220a1eca58fab0d26b0c93c2f9a008234da71ca66b - languageName: node - linkType: hard - -"graceful-fs@npm:4.2.10": - version: 4.2.10 - resolution: "graceful-fs@npm:4.2.10" - checksum: 10c0/4223a833e38e1d0d2aea630c2433cfb94ddc07dfc11d511dbd6be1d16688c5be848acc31f9a5d0d0ddbfb56d2ee5a6ae0278aceeb0ca6a13f27e06b9956fb952 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 - languageName: node - linkType: hard - -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 - languageName: node - linkType: hard - -"gray-matter@npm:^4.0.3": - version: 4.0.3 - resolution: "gray-matter@npm:4.0.3" - dependencies: - js-yaml: "npm:^3.13.1" - kind-of: "npm:^6.0.2" - section-matter: "npm:^1.0.0" - strip-bom-string: "npm:^1.0.0" - checksum: 10c0/e38489906dad4f162ca01e0dcbdbed96d1a53740cef446b9bf76d80bec66fa799af07776a18077aee642346c5e1365ed95e4c91854a12bf40ba0d4fb43a625a6 - languageName: node - linkType: hard - -"gzip-size@npm:^6.0.0": - version: 6.0.0 - resolution: "gzip-size@npm:6.0.0" - dependencies: - duplexer: "npm:^0.1.2" - checksum: 10c0/4ccb924626c82125897a997d1c84f2377846a6ef57fbee38f7c0e6b41387fba4d00422274440747b58008b5d60114bac2349c2908e9aba55188345281af40a3f - languageName: node - linkType: hard - -"handle-thing@npm:^2.0.0": - version: 2.0.1 - resolution: "handle-thing@npm:2.0.1" - checksum: 10c0/7ae34ba286a3434f1993ebd1cc9c9e6b6d8ea672182db28b1afc0a7119229552fa7031e3e5f3cd32a76430ece4e94b7da6f12af2eb39d6239a7693e4bd63a998 - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 - languageName: node - linkType: hard - -"has-own-prop@npm:^2.0.0": - version: 2.0.0 - resolution: "has-own-prop@npm:2.0.0" - checksum: 10c0/2745497283d80228b5c5fbb8c63ab1029e604bce7db8d4b36255e427b3695b2153dc978b176674d0dd2a23f132809e04d7ef41fefc0ab85870a5caa918c5c0d9 - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": - version: 1.0.2 - resolution: "has-property-descriptors@npm:1.0.2" - dependencies: - es-define-property: "npm:^1.0.0" - checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 - languageName: node - linkType: hard - -"has-proto@npm:^1.0.1": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 - languageName: node - linkType: hard - -"has-yarn@npm:^3.0.0": - version: 3.0.0 - resolution: "has-yarn@npm:3.0.0" - checksum: 10c0/38c76618cb764e4a98ea114a3938e0bed6ceafb6bacab2ffb32e7c7d1e18b5e09cd03387d507ee87072388e1f20b1f80947fee62c41fc450edfbbdc02a665787 - languageName: node - linkType: hard - -"hasown@npm:^2.0.0, hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: "npm:^1.1.2" - checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 - languageName: node - linkType: hard - -"hast-util-from-parse5@npm:^8.0.0": - version: 8.0.1 - resolution: "hast-util-from-parse5@npm:8.0.1" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - devlop: "npm:^1.0.0" - hastscript: "npm:^8.0.0" - property-information: "npm:^6.0.0" - vfile: "npm:^6.0.0" - vfile-location: "npm:^5.0.0" - web-namespaces: "npm:^2.0.0" - checksum: 10c0/4a30bb885cff1f0e023c429ae3ece73fe4b03386f07234bf23f5555ca087c2573ff4e551035b417ed7615bde559f394cdaf1db2b91c3b7f0575f3563cd238969 - languageName: node - linkType: hard - -"hast-util-parse-selector@npm:^4.0.0": - version: 4.0.0 - resolution: "hast-util-parse-selector@npm:4.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - checksum: 10c0/5e98168cb44470dc274aabf1a28317e4feb09b1eaf7a48bbaa8c1de1b43a89cd195cb1284e535698e658e3ec26ad91bc5e52c9563c36feb75abbc68aaf68fb9f - languageName: node - linkType: hard - -"hast-util-raw@npm:^9.0.0": - version: 9.0.4 - resolution: "hast-util-raw@npm:9.0.4" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - "@ungap/structured-clone": "npm:^1.0.0" - hast-util-from-parse5: "npm:^8.0.0" - hast-util-to-parse5: "npm:^8.0.0" - html-void-elements: "npm:^3.0.0" - mdast-util-to-hast: "npm:^13.0.0" - parse5: "npm:^7.0.0" - unist-util-position: "npm:^5.0.0" - unist-util-visit: "npm:^5.0.0" - vfile: "npm:^6.0.0" - web-namespaces: "npm:^2.0.0" - zwitch: "npm:^2.0.0" - checksum: 10c0/03d0fe7ba8bd75c9ce81f829650b19b78917bbe31db70d36bf6f136842496c3474e3bb1841f2d30dafe1f6b561a89a524185492b9a93d40b131000743c0d7998 - languageName: node - linkType: hard - -"hast-util-to-estree@npm:^3.0.0": - version: 3.1.0 - resolution: "hast-util-to-estree@npm:3.1.0" - dependencies: - "@types/estree": "npm:^1.0.0" - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - comma-separated-tokens: "npm:^2.0.0" - devlop: "npm:^1.0.0" - estree-util-attach-comments: "npm:^3.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - hast-util-whitespace: "npm:^3.0.0" - mdast-util-mdx-expression: "npm:^2.0.0" - mdast-util-mdx-jsx: "npm:^3.0.0" - mdast-util-mdxjs-esm: "npm:^2.0.0" - property-information: "npm:^6.0.0" - space-separated-tokens: "npm:^2.0.0" - style-to-object: "npm:^0.4.0" - unist-util-position: "npm:^5.0.0" - zwitch: "npm:^2.0.0" - checksum: 10c0/9003a8bac26a4580d5fc9f2a271d17330dd653266425e9f5539feecd2f7538868d6630a18f70698b8b804bf14c306418a3f4ab3119bb4692aca78b0c08b1291e - languageName: node - linkType: hard - -"hast-util-to-jsx-runtime@npm:^2.0.0": - version: 2.3.0 - resolution: "hast-util-to-jsx-runtime@npm:2.3.0" - dependencies: - "@types/estree": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - comma-separated-tokens: "npm:^2.0.0" - devlop: "npm:^1.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - hast-util-whitespace: "npm:^3.0.0" - mdast-util-mdx-expression: "npm:^2.0.0" - mdast-util-mdx-jsx: "npm:^3.0.0" - mdast-util-mdxjs-esm: "npm:^2.0.0" - property-information: "npm:^6.0.0" - space-separated-tokens: "npm:^2.0.0" - style-to-object: "npm:^1.0.0" - unist-util-position: "npm:^5.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/df7a36dcc792df7667a54438f044b721753d5e09692606d23bf7336bf4651670111fe7728eebbf9f0e4f96ab3346a05bb23037fa1b1d115482b3bc5bde8b6912 - languageName: node - linkType: hard - -"hast-util-to-parse5@npm:^8.0.0": - version: 8.0.0 - resolution: "hast-util-to-parse5@npm:8.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - comma-separated-tokens: "npm:^2.0.0" - devlop: "npm:^1.0.0" - property-information: "npm:^6.0.0" - space-separated-tokens: "npm:^2.0.0" - web-namespaces: "npm:^2.0.0" - zwitch: "npm:^2.0.0" - checksum: 10c0/3c0c7fba026e0c4be4675daf7277f9ff22ae6da801435f1b7104f7740de5422576f1c025023c7b3df1d0a161e13a04c6ab8f98ada96eb50adb287b537849a2bd - languageName: node - linkType: hard - -"hast-util-whitespace@npm:^3.0.0": - version: 3.0.0 - resolution: "hast-util-whitespace@npm:3.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - checksum: 10c0/b898bc9fe27884b272580d15260b6bbdabe239973a147e97fa98c45fa0ffec967a481aaa42291ec34fb56530dc2d484d473d7e2bae79f39c83f3762307edfea8 - languageName: node - linkType: hard - -"hastscript@npm:^8.0.0": - version: 8.0.0 - resolution: "hastscript@npm:8.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - comma-separated-tokens: "npm:^2.0.0" - hast-util-parse-selector: "npm:^4.0.0" - property-information: "npm:^6.0.0" - space-separated-tokens: "npm:^2.0.0" - checksum: 10c0/f0b54bbdd710854b71c0f044612db0fe1b5e4d74fa2001633dc8c535c26033269f04f536f9fd5b03f234de1111808f9e230e9d19493bf919432bb24d541719e0 - languageName: node - linkType: hard - -"he@npm:^1.2.0": - version: 1.2.0 - resolution: "he@npm:1.2.0" - bin: - he: bin/he - checksum: 10c0/a27d478befe3c8192f006cdd0639a66798979dfa6e2125c6ac582a19a5ebfec62ad83e8382e6036170d873f46e4536a7e795bf8b95bf7c247f4cc0825ccc8c17 - languageName: node - linkType: hard - -"history@npm:^4.9.0": - version: 4.10.1 - resolution: "history@npm:4.10.1" - dependencies: - "@babel/runtime": "npm:^7.1.2" - loose-envify: "npm:^1.2.0" - resolve-pathname: "npm:^3.0.0" - tiny-invariant: "npm:^1.0.2" - tiny-warning: "npm:^1.0.0" - value-equal: "npm:^1.0.1" - checksum: 10c0/35377694e4f10f2cf056a9cb1a8ee083e04e4b4717a63baeee4afd565658a62c7e73700bf9e82aa53dbe1ec94e0a25a83c080d63bad8ee6b274a98d2fbc5ed4c - languageName: node - linkType: hard - -"hoist-non-react-statics@npm:^3.1.0": - version: 3.3.2 - resolution: "hoist-non-react-statics@npm:3.3.2" - dependencies: - react-is: "npm:^16.7.0" - checksum: 10c0/fe0889169e845d738b59b64badf5e55fa3cf20454f9203d1eb088df322d49d4318df774828e789898dcb280e8a5521bb59b3203385662ca5e9218a6ca5820e74 - languageName: node - linkType: hard - -"hookable@npm:^5.5.3": - version: 5.5.3 - resolution: "hookable@npm:5.5.3" - checksum: 10c0/275f4cc84d27f8d48c5a5cd5685b6c0fea9291be9deea5bff0cfa72856ed566abde1dcd8cb1da0f9a70b4da3d7ec0d60dc3554c4edbba647058cc38816eced3d - languageName: node - linkType: hard - -"hosted-git-info@npm:^2.1.4": - version: 2.8.9 - resolution: "hosted-git-info@npm:2.8.9" - checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 - languageName: node - linkType: hard - -"hosted-git-info@npm:^7.0.0": - version: 7.0.2 - resolution: "hosted-git-info@npm:7.0.2" - dependencies: - lru-cache: "npm:^10.0.1" - checksum: 10c0/b19dbd92d3c0b4b0f1513cf79b0fc189f54d6af2129eeb201de2e9baaa711f1936929c848b866d9c8667a0f956f34bf4f07418c12be1ee9ca74fd9246335ca1f - languageName: node - linkType: hard - -"hpack.js@npm:^2.1.6": - version: 2.1.6 - resolution: "hpack.js@npm:2.1.6" - dependencies: - inherits: "npm:^2.0.1" - obuf: "npm:^1.0.0" - readable-stream: "npm:^2.0.1" - wbuf: "npm:^1.1.0" - checksum: 10c0/55b9e824430bab82a19d079cb6e33042d7d0640325678c9917fcc020c61d8a08ca671b6c942c7f0aae9bb6e4b67ffb50734a72f9e21d66407c3138c1983b70f0 - languageName: node - linkType: hard - -"html-entities@npm:^2.3.2": - version: 2.5.2 - resolution: "html-entities@npm:2.5.2" - checksum: 10c0/f20ffb4326606245c439c231de40a7c560607f639bf40ffbfb36b4c70729fd95d7964209045f1a4e62fe17f2364cef3d6e49b02ea09016f207fde51c2211e481 - languageName: node - linkType: hard - -"html-escaper@npm:^2.0.0, html-escaper@npm:^2.0.2": - version: 2.0.2 - resolution: "html-escaper@npm:2.0.2" - checksum: 10c0/208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0 - languageName: node - linkType: hard - -"html-minifier-terser@npm:^6.0.2": - version: 6.1.0 - resolution: "html-minifier-terser@npm:6.1.0" - dependencies: - camel-case: "npm:^4.1.2" - clean-css: "npm:^5.2.2" - commander: "npm:^8.3.0" - he: "npm:^1.2.0" - param-case: "npm:^3.0.4" - relateurl: "npm:^0.2.7" - terser: "npm:^5.10.0" - bin: - html-minifier-terser: cli.js - checksum: 10c0/1aa4e4f01cf7149e3ac5ea84fb7a1adab86da40d38d77a6fff42852b5ee3daccb78b615df97264e3a6a5c33e57f0c77f471d607ca1e1debd1dab9b58286f4b5a - languageName: node - linkType: hard - -"html-minifier-terser@npm:^7.2.0": - version: 7.2.0 - resolution: "html-minifier-terser@npm:7.2.0" - dependencies: - camel-case: "npm:^4.1.2" - clean-css: "npm:~5.3.2" - commander: "npm:^10.0.0" - entities: "npm:^4.4.0" - param-case: "npm:^3.0.4" - relateurl: "npm:^0.2.7" - terser: "npm:^5.15.1" - bin: - html-minifier-terser: cli.js - checksum: 10c0/ffc97c17299d9ec30e17269781b816ea2fc411a9206fc9e768be8f2decb1ea1470892809babb23bb4e3ab1f64d606d97e1803bf526ae3af71edc0fd3070b94b9 - languageName: node - linkType: hard - -"html-tags@npm:^3.3.1": - version: 3.3.1 - resolution: "html-tags@npm:3.3.1" - checksum: 10c0/680165e12baa51bad7397452d247dbcc5a5c29dac0e6754b1187eee3bf26f514bc1907a431dd2f7eb56207611ae595ee76a0acc8eaa0d931e72c791dd6463d79 - languageName: node - linkType: hard - -"html-void-elements@npm:^3.0.0": - version: 3.0.0 - resolution: "html-void-elements@npm:3.0.0" - checksum: 10c0/a8b9ec5db23b7c8053876dad73a0336183e6162bf6d2677376d8b38d654fdc59ba74fdd12f8812688f7db6fad451210c91b300e472afc0909224e0a44c8610d2 - languageName: node - linkType: hard - -"html-webpack-plugin@npm:^5.5.3": - version: 5.6.0 - resolution: "html-webpack-plugin@npm:5.6.0" - dependencies: - "@types/html-minifier-terser": "npm:^6.0.0" - html-minifier-terser: "npm:^6.0.2" - lodash: "npm:^4.17.21" - pretty-error: "npm:^4.0.0" - tapable: "npm:^2.0.0" - peerDependencies: - "@rspack/core": 0.x || 1.x - webpack: ^5.20.0 - peerDependenciesMeta: - "@rspack/core": - optional: true - webpack: - optional: true - checksum: 10c0/50d1a0f90d512463ea8d798985d91a7ccc9d5e461713dedb240125b2ff0671f58135dd9355f7969af341ff4725e73b2defbc0984cfdce930887a48506d970002 - languageName: node - linkType: hard - -"htmlparser2@npm:^6.1.0": - version: 6.1.0 - resolution: "htmlparser2@npm:6.1.0" - dependencies: - domelementtype: "npm:^2.0.1" - domhandler: "npm:^4.0.0" - domutils: "npm:^2.5.2" - entities: "npm:^2.0.0" - checksum: 10c0/3058499c95634f04dc66be8c2e0927cd86799413b2d6989d8ae542ca4dbf5fa948695d02c27d573acf44843af977aec6d9a7bdd0f6faa6b2d99e2a729b2a31b6 - languageName: node - linkType: hard - -"htmlparser2@npm:^8.0.1": - version: 8.0.2 - resolution: "htmlparser2@npm:8.0.2" - dependencies: - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - domutils: "npm:^3.0.1" - entities: "npm:^4.4.0" - checksum: 10c0/609cca85886d0bf2c9a5db8c6926a89f3764596877492e2caa7a25a789af4065bc6ee2cdc81807fe6b1d03a87bf8a373b5a754528a4cc05146b713c20575aab4 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc - languageName: node - linkType: hard - -"http-deceiver@npm:^1.2.7": - version: 1.2.7 - resolution: "http-deceiver@npm:1.2.7" - checksum: 10c0/8bb9b716f5fc55f54a451da7f49b9c695c3e45498a789634daec26b61e4add7c85613a4a9e53726c39d09de7a163891ecd6eb5809adb64500a840fd86fe81d03 - languageName: node - linkType: hard - -"http-errors@npm:2.0.0": - version: 2.0.0 - resolution: "http-errors@npm:2.0.0" - dependencies: - depd: "npm:2.0.0" - inherits: "npm:2.0.4" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - toidentifier: "npm:1.0.1" - checksum: 10c0/fc6f2715fe188d091274b5ffc8b3657bd85c63e969daa68ccb77afb05b071a4b62841acb7a21e417b5539014dff2ebf9550f0b14a9ff126f2734a7c1387f8e19 - languageName: node - linkType: hard - -"http-errors@npm:~1.6.2": - version: 1.6.3 - resolution: "http-errors@npm:1.6.3" - dependencies: - depd: "npm:~1.1.2" - inherits: "npm:2.0.3" - setprototypeof: "npm:1.1.0" - statuses: "npm:>= 1.4.0 < 2" - checksum: 10c0/17ec4046ee974477778bfdd525936c254b872054703ec2caa4d6f099566b8adade636ae6aeeacb39302c5cd6e28fb407ebd937f500f5010d0b6850750414ff78 - languageName: node - linkType: hard - -"http-parser-js@npm:>=0.5.1": - version: 0.5.8 - resolution: "http-parser-js@npm:0.5.8" - checksum: 10c0/4ed89f812c44f84c4ae5d43dd3a0c47942b875b63be0ed2ccecbe6b0018af867d806495fc6e12474aff868721163699c49246585bddea4f0ecc6d2b02e19faf1 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 - languageName: node - linkType: hard - -"http-proxy-middleware@npm:^2.0.3": - version: 2.0.6 - resolution: "http-proxy-middleware@npm:2.0.6" - dependencies: - "@types/http-proxy": "npm:^1.17.8" - http-proxy: "npm:^1.18.1" - is-glob: "npm:^4.0.1" - is-plain-obj: "npm:^3.0.0" - micromatch: "npm:^4.0.2" - peerDependencies: - "@types/express": ^4.17.13 - peerDependenciesMeta: - "@types/express": - optional: true - checksum: 10c0/25a0e550dd1900ee5048a692e0e9b2b6339d06d487a705d90c47e359e9c6561d648cd7862d001d090e651c9efffa1b6e5160fcf1f299b5fa4935f76e9754eb11 - languageName: node - linkType: hard - -"http-proxy@npm:^1.18.1": - version: 1.18.1 - resolution: "http-proxy@npm:1.18.1" - dependencies: - eventemitter3: "npm:^4.0.0" - follow-redirects: "npm:^1.0.0" - requires-port: "npm:^1.0.0" - checksum: 10c0/148dfa700a03fb421e383aaaf88ac1d94521dfc34072f6c59770528c65250983c2e4ec996f2f03aa9f3fe46cd1270a593126068319311e3e8d9e610a37533e94 - languageName: node - linkType: hard - -"http2-wrapper@npm:^2.1.10": - version: 2.2.1 - resolution: "http2-wrapper@npm:2.2.1" - dependencies: - quick-lru: "npm:^5.1.1" - resolve-alpn: "npm:^1.2.0" - checksum: 10c0/7207201d3c6e53e72e510c9b8912e4f3e468d3ecc0cf3bf52682f2aac9cd99358b896d1da4467380adc151cf97c412bedc59dc13dae90c523f42053a7449eedb - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1": - version: 7.0.5 - resolution: "https-proxy-agent@npm:7.0.5" - dependencies: - agent-base: "npm:^7.0.2" - debug: "npm:4" - checksum: 10c0/2490e3acec397abeb88807db52cac59102d5ed758feee6df6112ab3ccd8325e8a1ce8bce6f4b66e5470eca102d31e425ace904242e4fa28dbe0c59c4bafa7b2c - languageName: node - linkType: hard - -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a - languageName: node - linkType: hard - -"human-signals@npm:^8.0.0": - version: 8.0.0 - resolution: "human-signals@npm:8.0.0" - checksum: 10c0/e4dac4f7d3eb791ed04129fc6a85bd454a9102d3e3b76c911d0db7057ebd60b2956b435b5b5712aec18960488ede3c21ef7c56e42cdd70760c0d84d3c05cd92e - languageName: node - linkType: hard - -"iconv-lite@npm:0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3" - checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 - languageName: node - linkType: hard - -"icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": - version: 5.1.0 - resolution: "icss-utils@npm:5.1.0" - peerDependencies: - postcss: ^8.1.0 - checksum: 10c0/39c92936fabd23169c8611d2b5cc39e39d10b19b0d223352f20a7579f75b39d5f786114a6b8fc62bee8c5fed59ba9e0d38f7219a4db383e324fb3061664b043d - languageName: node - linkType: hard - -"ignore@npm:^5.1.8, ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1, ignore@npm:~5.3.1": - version: 5.3.2 - resolution: "ignore@npm:5.3.2" - checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 - languageName: node - linkType: hard - -"image-size@npm:^1.0.2": - version: 1.1.1 - resolution: "image-size@npm:1.1.1" - dependencies: - queue: "npm:6.0.2" - bin: - image-size: bin/image-size.js - checksum: 10c0/2660470096d12be82195f7e80fe03274689fbd14184afb78eaf66ade7cd06352518325814f88af4bde4b26647889fe49e573129f6e7ba8f5ff5b85cc7f559000 - languageName: node - linkType: hard - -"immer@npm:^9.0.7": - version: 9.0.21 - resolution: "immer@npm:9.0.21" - checksum: 10c0/03ea3ed5d4d72e8bd428df4a38ad7e483ea8308e9a113d3b42e0ea2cc0cc38340eb0a6aca69592abbbf047c685dbda04e3d34bf2ff438ab57339ed0a34cc0a05 - languageName: node - linkType: hard - -"import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" - dependencies: - parent-module: "npm:^1.0.0" - resolve-from: "npm:^4.0.0" - checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 - languageName: node - linkType: hard - -"import-lazy@npm:^4.0.0, import-lazy@npm:~4.0.0": - version: 4.0.0 - resolution: "import-lazy@npm:4.0.0" - checksum: 10c0/a3520313e2c31f25c0b06aa66d167f329832b68a4f957d7c9daf6e0fa41822b6e84948191648b9b9d8ca82f94740cdf15eecf2401a5b42cd1c33fd84f2225cca - languageName: node - linkType: hard - -"import-local@npm:^3.0.2": - version: 3.2.0 - resolution: "import-local@npm:3.2.0" - dependencies: - pkg-dir: "npm:^4.2.0" - resolve-cwd: "npm:^3.0.0" - bin: - import-local-fixture: fixtures/cli.js - checksum: 10c0/94cd6367a672b7e0cb026970c85b76902d2710a64896fa6de93bd5c571dd03b228c5759308959de205083e3b1c61e799f019c9e36ee8e9c523b993e1057f0433 - languageName: node - linkType: hard - -"import-meta-resolve@npm:^4.1.0": - version: 4.1.0 - resolution: "import-meta-resolve@npm:4.1.0" - checksum: 10c0/42f3284b0460635ddf105c4ad99c6716099c3ce76702602290ad5cbbcd295700cbc04e4bdf47bacf9e3f1a4cec2e1ff887dabc20458bef398f9de22ddff45ef5 - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f - languageName: node - linkType: hard - -"infima@npm:0.2.0-alpha.44": - version: 0.2.0-alpha.44 - resolution: "infima@npm:0.2.0-alpha.44" - checksum: 10c0/0fe2b7882e09187ee62e5192673c542513fe4743f727f887e195de4f26eb792ddf81577ca98c34a69ab7eb39251f60531b9ad6d2f454553bac326b1afc9d68b5 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 - languageName: node - linkType: hard - -"inherits@npm:2.0.3": - version: 2.0.3 - resolution: "inherits@npm:2.0.3" - checksum: 10c0/6e56402373149ea076a434072671f9982f5fad030c7662be0332122fe6c0fa490acb3cc1010d90b6eff8d640b1167d77674add52dfd1bb85d545cf29e80e73e7 - languageName: node - linkType: hard - -"ini@npm:2.0.0": - version: 2.0.0 - resolution: "ini@npm:2.0.0" - checksum: 10c0/2e0c8f386369139029da87819438b20a1ff3fe58372d93fb1a86e9d9344125ace3a806b8ec4eb160a46e64cbc422fe68251869441676af49b7fc441af2389c25 - languageName: node - linkType: hard - -"ini@npm:4.1.1": - version: 4.1.1 - resolution: "ini@npm:4.1.1" - checksum: 10c0/7fddc8dfd3e63567d4fdd5d999d1bf8a8487f1479d0b34a1d01f28d391a9228d261e19abc38e1a6a1ceb3400c727204fce05725d5eb598dfcf2077a1e3afe211 - languageName: node - linkType: hard - -"ini@npm:^1.3.4, ini@npm:^1.3.5, ini@npm:~1.3.0": - version: 1.3.8 - resolution: "ini@npm:1.3.8" - checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a - languageName: node - linkType: hard - -"ini@npm:~4.1.0": - version: 4.1.3 - resolution: "ini@npm:4.1.3" - checksum: 10c0/0d27eff094d5f3899dd7c00d0c04ea733ca03a8eb6f9406ce15daac1a81de022cb417d6eaff7e4342451ffa663389c565ffc68d6825eaf686bf003280b945764 - languageName: node - linkType: hard - -"inline-style-parser@npm:0.1.1": - version: 0.1.1 - resolution: "inline-style-parser@npm:0.1.1" - checksum: 10c0/08832a533f51a1e17619f2eabf2f5ec5e956d6dcba1896351285c65df022c9420de61d73256e1dca8015a52abf96cc84ddc3b73b898b22de6589d3962b5e501b - languageName: node - linkType: hard - -"inline-style-parser@npm:0.2.3": - version: 0.2.3 - resolution: "inline-style-parser@npm:0.2.3" - checksum: 10c0/21b46d39a39c8aeaa738346650469388e8a412dd276ab75aa3d85b1883311e89c86a1fdbb8c2f1958f4c979bae74067f6ba0385455b125faf4fa77e1dbb94799 - languageName: node - linkType: hard - -"interpret@npm:^1.0.0": - version: 1.4.0 - resolution: "interpret@npm:1.4.0" - checksum: 10c0/08c5ad30032edeec638485bc3f6db7d0094d9b3e85e0f950866600af3c52e9fd69715416d29564731c479d9f4d43ff3e4d302a178196bdc0e6837ec147640450 - languageName: node - linkType: hard - -"invariant@npm:^2.2.4": - version: 2.2.4 - resolution: "invariant@npm:2.2.4" - dependencies: - loose-envify: "npm:^1.0.0" - checksum: 10c0/5af133a917c0bcf65e84e7f23e779e7abc1cd49cb7fdc62d00d1de74b0d8c1b5ee74ac7766099fb3be1b05b26dfc67bab76a17030d2fe7ea2eef867434362dfc - languageName: node - linkType: hard - -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc - languageName: node - linkType: hard - -"ipaddr.js@npm:1.9.1": - version: 1.9.1 - resolution: "ipaddr.js@npm:1.9.1" - checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a - languageName: node - linkType: hard - -"ipaddr.js@npm:^2.0.1": - version: 2.2.0 - resolution: "ipaddr.js@npm:2.2.0" - checksum: 10c0/e4ee875dc1bd92ac9d27e06cfd87cdb63ca786ff9fd7718f1d4f7a8ef27db6e5d516128f52d2c560408cbb75796ac2f83ead669e73507c86282d45f84c5abbb6 - languageName: node - linkType: hard - -"is-absolute@npm:^1.0.0": - version: 1.0.0 - resolution: "is-absolute@npm:1.0.0" - dependencies: - is-relative: "npm:^1.0.0" - is-windows: "npm:^1.0.1" - checksum: 10c0/422302ce879d4f3ca6848499b6f3ddcc8fd2dc9f3e9cad3f6bcedff58cdfbbbd7f4c28600fffa7c59a858f1b15c27fb6cfe1d5275e58a36d2bf098a44ef5abc4 - languageName: node - linkType: hard - -"is-alphabetical@npm:^2.0.0": - version: 2.0.1 - resolution: "is-alphabetical@npm:2.0.1" - checksum: 10c0/932367456f17237533fd1fc9fe179df77957271020b83ea31da50e5cc472d35ef6b5fb8147453274ffd251134472ce24eb6f8d8398d96dee98237cdb81a6c9a7 - languageName: node - linkType: hard - -"is-alphanumerical@npm:^2.0.0": - version: 2.0.1 - resolution: "is-alphanumerical@npm:2.0.1" - dependencies: - is-alphabetical: "npm:^2.0.0" - is-decimal: "npm:^2.0.0" - checksum: 10c0/4b35c42b18e40d41378293f82a3ecd9de77049b476f748db5697c297f686e1e05b072a6aaae2d16f54d2a57f85b00cbbe755c75f6d583d1c77d6657bd0feb5a2 - languageName: node - linkType: hard - -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 - languageName: node - linkType: hard - -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: "npm:^2.0.0" - checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 - languageName: node - linkType: hard - -"is-builtin-module@npm:^3.2.1": - version: 3.2.1 - resolution: "is-builtin-module@npm:3.2.1" - dependencies: - builtin-modules: "npm:^3.3.0" - checksum: 10c0/5a66937a03f3b18803381518f0ef679752ac18cdb7dd53b5e23ee8df8d440558737bd8dcc04d2aae555909d2ecb4a81b5c0d334d119402584b61e6a003e31af1 - languageName: node - linkType: hard - -"is-ci@npm:^3.0.1": - version: 3.0.1 - resolution: "is-ci@npm:3.0.1" - dependencies: - ci-info: "npm:^3.2.0" - bin: - is-ci: bin.js - checksum: 10c0/0e81caa62f4520d4088a5bef6d6337d773828a88610346c4b1119fb50c842587ed8bef1e5d9a656835a599e7209405b5761ddf2339668f2d0f4e889a92fe6051 - languageName: node - linkType: hard - -"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0": - version: 2.15.0 - resolution: "is-core-module@npm:2.15.0" - dependencies: - hasown: "npm:^2.0.2" - checksum: 10c0/da161f3d9906f459486da65609b2f1a2dfdc60887c689c234d04e88a062cb7920fa5be5fb7ab08dc43b732929653c4135ef05bf77888ae2a9040ce76815eb7b1 - languageName: node - linkType: hard - -"is-decimal@npm:^2.0.0": - version: 2.0.1 - resolution: "is-decimal@npm:2.0.1" - checksum: 10c0/8085dd66f7d82f9de818fba48b9e9c0429cb4291824e6c5f2622e96b9680b54a07a624cfc663b24148b8e853c62a1c987cfe8b0b5a13f5156991afaf6736e334 - languageName: node - linkType: hard - -"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": - version: 2.2.1 - resolution: "is-docker@npm:2.2.1" - bin: - is-docker: cli.js - checksum: 10c0/e828365958d155f90c409cdbe958f64051d99e8aedc2c8c4cd7c89dcf35329daed42f7b99346f7828df013e27deb8f721cf9408ba878c76eb9e8290235fbcdcc - languageName: node - linkType: hard - -"is-extendable@npm:^0.1.0": - version: 0.1.1 - resolution: "is-extendable@npm:0.1.1" - checksum: 10c0/dd5ca3994a28e1740d1e25192e66eed128e0b2ff161a7ea348e87ae4f616554b486854de423877a2a2c171d5f7cd6e8093b91f54533bc88a59ee1c9838c43879 - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc - languageName: node - linkType: hard - -"is-generator-fn@npm:^2.0.0": - version: 2.1.0 - resolution: "is-generator-fn@npm:2.1.0" - checksum: 10c0/2957cab387997a466cd0bf5c1b6047bd21ecb32bdcfd8996b15747aa01002c1c88731802f1b3d34ac99f4f6874b626418bd118658cf39380fe5fff32a3af9c4d - languageName: node - linkType: hard - -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: "npm:^2.1.1" - checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a - languageName: node - linkType: hard - -"is-hexadecimal@npm:^2.0.0": - version: 2.0.1 - resolution: "is-hexadecimal@npm:2.0.1" - checksum: 10c0/3eb60fe2f1e2bbc760b927dcad4d51eaa0c60138cf7fc671803f66353ad90c301605b502c7ea4c6bb0548e1c7e79dfd37b73b632652e3b76030bba603a7e9626 - languageName: node - linkType: hard - -"is-installed-globally@npm:^0.4.0": - version: 0.4.0 - resolution: "is-installed-globally@npm:0.4.0" - dependencies: - global-dirs: "npm:^3.0.0" - is-path-inside: "npm:^3.0.2" - checksum: 10c0/f3e6220ee5824b845c9ed0d4b42c24272701f1f9926936e30c0e676254ca5b34d1b92c6205cae11b283776f9529212c0cdabb20ec280a6451677d6493ca9c22d - languageName: node - linkType: hard - -"is-interactive@npm:^2.0.0": - version: 2.0.0 - resolution: "is-interactive@npm:2.0.0" - checksum: 10c0/801c8f6064f85199dc6bf99b5dd98db3282e930c3bc197b32f2c5b89313bb578a07d1b8a01365c4348c2927229234f3681eb861b9c2c92bee72ff397390fa600 - languageName: node - linkType: hard - -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d - languageName: node - linkType: hard - -"is-module@npm:^1.0.0": - version: 1.0.0 - resolution: "is-module@npm:1.0.0" - checksum: 10c0/795a3914bcae7c26a1c23a1e5574c42eac13429625045737bf3e324ce865c0601d61aee7a5afbca1bee8cb300c7d9647e7dc98860c9bdbc3b7fdc51d8ac0bffc - languageName: node - linkType: hard - -"is-npm@npm:^6.0.0": - version: 6.0.0 - resolution: "is-npm@npm:6.0.0" - checksum: 10c0/1f064c66325cba6e494783bee4e635caa2655aad7f853a0e045d086e0bb7d83d2d6cdf1745dc9a7c7c93dacbf816fbee1f8d9179b02d5d01674d4f92541dc0d9 - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 - languageName: node - linkType: hard - -"is-obj@npm:^1.0.1": - version: 1.0.1 - resolution: "is-obj@npm:1.0.1" - checksum: 10c0/5003acba0af7aa47dfe0760e545a89bbac89af37c12092c3efadc755372cdaec034f130e7a3653a59eb3c1843cfc72ca71eaf1a6c3bafe5a0bab3611a47f9945 - languageName: node - linkType: hard - -"is-obj@npm:^2.0.0": - version: 2.0.0 - resolution: "is-obj@npm:2.0.0" - checksum: 10c0/85044ed7ba8bd169e2c2af3a178cacb92a97aa75de9569d02efef7f443a824b5e153eba72b9ae3aca6f8ce81955271aa2dc7da67a8b720575d3e38104208cb4e - languageName: node - linkType: hard - -"is-path-cwd@npm:^2.2.0": - version: 2.2.0 - resolution: "is-path-cwd@npm:2.2.0" - checksum: 10c0/afce71533a427a759cd0329301c18950333d7589533c2c90205bd3fdcf7b91eb92d1940493190567a433134d2128ec9325de2fd281e05be1920fbee9edd22e0a - languageName: node - linkType: hard - -"is-path-inside@npm:^3.0.2, is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 - languageName: node - linkType: hard - -"is-plain-obj@npm:^3.0.0": - version: 3.0.0 - resolution: "is-plain-obj@npm:3.0.0" - checksum: 10c0/8e6483bfb051d42ec9c704c0ede051a821c6b6f9a6c7a3e3b55aa855e00981b0580c8f3b1f5e2e62649b39179b1abfee35d6f8086d999bfaa32c1908d29b07bc - languageName: node - linkType: hard - -"is-plain-obj@npm:^4.0.0, is-plain-obj@npm:^4.1.0": - version: 4.1.0 - resolution: "is-plain-obj@npm:4.1.0" - checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e - languageName: node - linkType: hard - -"is-plain-object@npm:^2.0.4": - version: 2.0.4 - resolution: "is-plain-object@npm:2.0.4" - dependencies: - isobject: "npm:^3.0.1" - checksum: 10c0/f050fdd5203d9c81e8c4df1b3ff461c4bc64e8b5ca383bcdde46131361d0a678e80bcf00b5257646f6c636197629644d53bd8e2375aea633de09a82d57e942f4 - languageName: node - linkType: hard - -"is-reference@npm:1.2.1": - version: 1.2.1 - resolution: "is-reference@npm:1.2.1" - dependencies: - "@types/estree": "npm:*" - checksum: 10c0/7dc819fc8de7790264a0a5d531164f9f5b9ef5aa1cd05f35322d14db39c8a2ec78fd5d4bf57f9789f3ddd2b3abeea7728432b759636157a42db12a9e8c3b549b - languageName: node - linkType: hard - -"is-reference@npm:^3.0.0": - version: 3.0.2 - resolution: "is-reference@npm:3.0.2" - dependencies: - "@types/estree": "npm:*" - checksum: 10c0/652d31b405e8e8269071cee78fe874b072745012eba202c6dc86880fd603a65ae043e3160990ab4a0a4b33567cbf662eecf3bc6b3c2c1550e6c2b6cf885ce5aa - languageName: node - linkType: hard - -"is-regexp@npm:^1.0.0": - version: 1.0.0 - resolution: "is-regexp@npm:1.0.0" - checksum: 10c0/34cacda1901e00f6e44879378f1d2fa96320ea956c1bec27713130aaf1d44f6e7bd963eed28945bfe37e600cb27df1cf5207302680dad8bdd27b9baff8ecf611 - languageName: node - linkType: hard - -"is-relative@npm:^1.0.0": - version: 1.0.0 - resolution: "is-relative@npm:1.0.0" - dependencies: - is-unc-path: "npm:^1.0.0" - checksum: 10c0/61157c4be8594dd25ac6f0ef29b1218c36667259ea26698367a4d9f39ff9018368bc365c490b3c79be92dfb1e389e43c4b865c95709e7b3bc72c5932f751fb60 - languageName: node - linkType: hard - -"is-root@npm:^2.1.0": - version: 2.1.0 - resolution: "is-root@npm:2.1.0" - checksum: 10c0/83d3f5b052c3f28fbdbdf0d564bdd34fa14933f5694c78704f85cd1871255bc017fbe3fe2bc2fff2d227c6be5927ad2149b135c0a7c0060e7ac4e610d81a4f01 - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 - languageName: node - linkType: hard - -"is-stream@npm:^4.0.1": - version: 4.0.1 - resolution: "is-stream@npm:4.0.1" - checksum: 10c0/2706c7f19b851327ba374687bc4a3940805e14ca496dc672b9629e744d143b1ad9c6f1b162dece81c7bfbc0f83b32b61ccc19ad2e05aad2dd7af347408f60c7f - languageName: node - linkType: hard - -"is-typedarray@npm:^1.0.0": - version: 1.0.0 - resolution: "is-typedarray@npm:1.0.0" - checksum: 10c0/4c096275ba041a17a13cca33ac21c16bc4fd2d7d7eb94525e7cd2c2f2c1a3ab956e37622290642501ff4310601e413b675cf399ad6db49855527d2163b3eeeec - languageName: node - linkType: hard - -"is-unc-path@npm:^1.0.0": - version: 1.0.0 - resolution: "is-unc-path@npm:1.0.0" - dependencies: - unc-path-regex: "npm:^0.1.2" - checksum: 10c0/ac1b78f9b748196e3be3d0e722cd4b0f98639247a130a8f2473a58b29baf63fdb1b1c5a12c830660c5ee6ef0279c5418ca8e346f98cbe1a29e433d7ae531d42e - languageName: node - linkType: hard - -"is-unicode-supported@npm:^1.3.0": - version: 1.3.0 - resolution: "is-unicode-supported@npm:1.3.0" - checksum: 10c0/b8674ea95d869f6faabddc6a484767207058b91aea0250803cbf1221345cb0c56f466d4ecea375dc77f6633d248d33c47bd296fb8f4cdba0b4edba8917e83d8a - languageName: node - linkType: hard - -"is-unicode-supported@npm:^2.0.0": - version: 2.0.0 - resolution: "is-unicode-supported@npm:2.0.0" - checksum: 10c0/3013dfb8265fe9f9a0d1e9433fc4e766595631a8d85d60876c457b4bedc066768dab1477c553d02e2f626d88a4e019162706e04263c94d74994ef636a33b5f94 - languageName: node - linkType: hard - -"is-windows@npm:^1.0.1": - version: 1.0.2 - resolution: "is-windows@npm:1.0.2" - checksum: 10c0/b32f418ab3385604a66f1b7a3ce39d25e8881dee0bd30816dc8344ef6ff9df473a732bcc1ec4e84fe99b2f229ae474f7133e8e93f9241686cfcf7eebe53ba7a5 - languageName: node - linkType: hard - -"is-wsl@npm:^2.2.0": - version: 2.2.0 - resolution: "is-wsl@npm:2.2.0" - dependencies: - is-docker: "npm:^2.0.0" - checksum: 10c0/a6fa2d370d21be487c0165c7a440d567274fbba1a817f2f0bfa41cc5e3af25041d84267baa22df66696956038a43973e72fca117918c91431920bdef490fa25e - languageName: node - linkType: hard - -"is-yarn-global@npm:^0.4.0": - version: 0.4.1 - resolution: "is-yarn-global@npm:0.4.1" - checksum: 10c0/8ff66f33454614f8e913ad91cc4de0d88d519a46c1ed41b3f589da79504ed0fcfa304064fe3096dda9360c5f35aa210cb8e978fd36798f3118cb66a4de64d365 - languageName: node - linkType: hard - -"isaac-typescript-definitions@npm:^42.2.0": - version: 42.2.0 - resolution: "isaac-typescript-definitions@npm:42.2.0" - dependencies: - lua-types: "npm:^2.13.1" - checksum: 10c0/1c9ba9bb4fcb07f099ef6e2e6b970576c1a8eb9b796307980712ac5268bc67dd77bad53570a383676ff9f640ab39a1e0a2f4f379a3765befb24385b4c135a0c5 - languageName: node - linkType: hard - -"isaacscript-monorepo@workspace:.": - version: 0.0.0-use.local - resolution: "isaacscript-monorepo@workspace:." - dependencies: - "@algolia/client-search": "npm:^5.0.0" - "@arktype/fs": "npm:^0.2.1" - "@babel/core": "npm:^7.25.2" - "@babel/preset-env": "npm:^7.25.3" - "@babel/preset-typescript": "npm:^7.24.7" - "@commander-js/extra-typings": "npm:^12.1.0" - "@docusaurus/core": "npm:^3.5.2" - "@docusaurus/eslint-plugin": "npm:^3.5.2" - "@docusaurus/module-type-aliases": "npm:^3.5.2" - "@docusaurus/preset-classic": "npm:^3.5.2" - "@docusaurus/theme-classic": "npm:^3.5.2" - "@docusaurus/theme-common": "npm:^3.5.2" - "@docusaurus/tsconfig": "npm:^3.5.2" - "@eslint/compat": "npm:^1.1.1" - "@eslint/eslintrc": "npm:^3.1.0" - "@eslint/js": "npm:^9.9.0" - "@mdx-js/react": "npm:^3.0.1" - "@microsoft/api-extractor": "npm:^7.47.6" - "@prettier/plugin-xml": "npm:^3.4.1" - "@stylistic/eslint-plugin": "npm:^2.6.4" - "@svgr/webpack": "npm:^8.1.0" - "@tsconfig/node-lts": "npm:^20.1.3" - "@tsconfig/strictest": "npm:^2.0.5" - "@types/command-exists": "npm:^1.2.3" - "@types/confusing-browser-globals": "npm:^1.0.3" - "@types/diff": "npm:^5.2.1" - "@types/eslint-config-prettier": "npm:^6.11.3" - "@types/eslint__eslintrc": "npm:^2.1.2" - "@types/eslint__js": "npm:^8.42.3" - "@types/figlet": "npm:^1.5.8" - "@types/glob": "npm:^8.1.0" - "@types/jest": "npm:^29.5.12" - "@types/klaw-sync": "npm:^6.0.5" - "@types/node": "npm:^22.4.0" - "@types/prompt": "npm:^1.1.8" - "@types/react": "npm:^18.3.3" - "@types/source-map-support": "npm:^0.5.10" - "@types/touch": "npm:^3.1.5" - "@types/unidecode": "npm:^0.1.3" - "@types/xml2js": "npm:^0.4.14" - "@typescript-eslint/rule-tester": "npm:^8.1.0" - "@typescript-eslint/type-utils": "npm:^8.1.0" - "@typescript-eslint/utils": "npm:^8.1.0" - "@zamiell/sync-directory": "npm:^6.0.5" - "@zamiell/typedoc-plugin-not-exported": "npm:^0.3.0" - ajv: "npm:^8.17.1" - chalk: "npm:^5.3.0" - cloc: "npm:^2.2.0-cloc" - clsx: "npm:^2.1.1" - command-exists: "npm:^1.2.9" - commander: "npm:^12.1.0" - confusing-browser-globals: "npm:^1.0.11" - cspell: "npm:^8.14.1" - cspell-check-unused-words: "npm:^1.2.1" - diff: "npm:^5.2.0" - docusaurus-theme-search-typesense: "npm:^0.20.0" - dotenv: "npm:^16.4.5" - eslint: "npm:^9.9.0" - eslint-config-prettier: "npm:^9.1.0" - eslint-import-resolver-typescript: "npm:^3.6.1" - eslint-plugin-deprecation: "npm:^3.0.0" - eslint-plugin-eslint-plugin: "npm:^6.2.0" - eslint-plugin-import-x: "npm:^3.1.0" - eslint-plugin-jsdoc: "npm:^50.2.2" - eslint-plugin-n: "npm:^17.10.2" - eslint-plugin-sort-exports: "npm:^0.9.1" - eslint-plugin-unicorn: "npm:^55.0.0" - execa: "npm:^9.3.1" - extract-comments: "npm:^1.1.0" - figlet: "npm:^1.7.0" - glob: "npm:^11.0.0" - isaac-typescript-definitions: "npm:^42.2.0" - jest: "npm:^29.7.0" - jest-summarizing-reporter: "npm:^1.1.4" - jsonc-parser: "npm:^3.3.1" - klaw-sync: "npm:^6.0.0" - knip: "npm:^5.27.2" - lua-types: "npm:^2.13.1" - markdownlint: "npm:^0.34.0" - markdownlint-cli: "npm:^0.41.0" - moment: "npm:^2.30.1" - npm-check-updates: "npm:^17.0.6" - prettier: "npm:^3.3.3" - prettier-plugin-organize-imports: "npm:^4.0.0" - prettier-plugin-packagejson: "npm:^2.5.1" - prism-react-renderer: "npm:^2.3.1" - prompt: "npm:^1.3.0" - react: "npm:^18.3.1" - react-dom: "npm:^18.3.1" - source-map: "npm:^0.7.4" - source-map-support: "npm:^0.5.21" - syncpack: "npm:^12.4.0" - ts-json-schema-generator: "npm:^2.3.0" - ts-prune-2: "npm:^0.10.7" - tsconfck: "npm:^3.1.1" - tsconfig-paths: "npm:^4.2.0" - tsx: "npm:^4.17.0" - typedoc: "npm:^0.26.5" - typedoc-plugin-markdown: "npm:^4.2.5" - typedoc-plugin-rename: "npm:^1.1.1" - typescript: "npm:^5.5.4" - typescript-eslint: "npm:^8.1.0" - typescript-to-lua: "npm:^1.26.2" - unbuild: "npm:^2.0.0" - unidecode: "npm:^1.1.0" - unified: "npm:^11.0.5" - xml2js: "npm:^0.6.2" - yaml: "npm:^2.5.0" - zod: "npm:^3.23.8" - languageName: unknown - linkType: soft - -"isarray@npm:0.0.1": - version: 0.0.1 - resolution: "isarray@npm:0.0.1" - checksum: 10c0/ed1e62da617f71fe348907c71743b5ed550448b455f8d269f89a7c7ddb8ae6e962de3dab6a74a237b06f5eb7f6ece7a45ada8ce96d87fe972926530f91ae3311 - languageName: node - linkType: hard - -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d - languageName: node - linkType: hard - -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 - languageName: node - linkType: hard - -"isobject@npm:^3.0.1": - version: 3.0.1 - resolution: "isobject@npm:3.0.1" - checksum: 10c0/03344f5064a82f099a0cd1a8a407f4c0d20b7b8485e8e816c39f249e9416b06c322e8dec5b842b6bb8a06de0af9cb48e7bc1b5352f0fadc2f0abac033db3d4db - languageName: node - linkType: hard - -"isstream@npm:0.1.x": - version: 0.1.2 - resolution: "isstream@npm:0.1.2" - checksum: 10c0/a6686a878735ca0a48e0d674dd6d8ad31aedfaf70f07920da16ceadc7577b46d67179a60b313f2e6860cb097a2c2eb3cbd0b89e921ae89199a59a17c3273d66f - languageName: node - linkType: hard - -"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": - version: 3.2.2 - resolution: "istanbul-lib-coverage@npm:3.2.2" - checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b - languageName: node - linkType: hard - -"istanbul-lib-instrument@npm:^5.0.4": - version: 5.2.1 - resolution: "istanbul-lib-instrument@npm:5.2.1" - dependencies: - "@babel/core": "npm:^7.12.3" - "@babel/parser": "npm:^7.14.7" - "@istanbuljs/schema": "npm:^0.1.2" - istanbul-lib-coverage: "npm:^3.2.0" - semver: "npm:^6.3.0" - checksum: 10c0/8a1bdf3e377dcc0d33ec32fe2b6ecacdb1e4358fd0eb923d4326bb11c67622c0ceb99600a680f3dad5d29c66fc1991306081e339b4d43d0b8a2ab2e1d910a6ee - languageName: node - linkType: hard - -"istanbul-lib-instrument@npm:^6.0.0": - version: 6.0.3 - resolution: "istanbul-lib-instrument@npm:6.0.3" - dependencies: - "@babel/core": "npm:^7.23.9" - "@babel/parser": "npm:^7.23.9" - "@istanbuljs/schema": "npm:^0.1.3" - istanbul-lib-coverage: "npm:^3.2.0" - semver: "npm:^7.5.4" - checksum: 10c0/a1894e060dd2a3b9f046ffdc87b44c00a35516f5e6b7baf4910369acca79e506fc5323a816f811ae23d82334b38e3ddeb8b3b331bd2c860540793b59a8689128 - languageName: node - linkType: hard - -"istanbul-lib-report@npm:^3.0.0": - version: 3.0.1 - resolution: "istanbul-lib-report@npm:3.0.1" - dependencies: - istanbul-lib-coverage: "npm:^3.0.0" - make-dir: "npm:^4.0.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/84323afb14392de8b6a5714bd7e9af845cfbd56cfe71ed276cda2f5f1201aea673c7111901227ee33e68e4364e288d73861eb2ed48f6679d1e69a43b6d9b3ba7 - languageName: node - linkType: hard - -"istanbul-lib-source-maps@npm:^4.0.0": - version: 4.0.1 - resolution: "istanbul-lib-source-maps@npm:4.0.1" - dependencies: - debug: "npm:^4.1.1" - istanbul-lib-coverage: "npm:^3.0.0" - source-map: "npm:^0.6.1" - checksum: 10c0/19e4cc405016f2c906dff271a76715b3e881fa9faeb3f09a86cb99b8512b3a5ed19cadfe0b54c17ca0e54c1142c9c6de9330d65506e35873994e06634eebeb66 - languageName: node - linkType: hard - -"istanbul-reports@npm:^3.1.3": - version: 3.1.7 - resolution: "istanbul-reports@npm:3.1.7" - dependencies: - html-escaper: "npm:^2.0.0" - istanbul-lib-report: "npm:^3.0.0" - checksum: 10c0/a379fadf9cf8dc5dfe25568115721d4a7eb82fbd50b005a6672aff9c6989b20cc9312d7865814e0859cd8df58cbf664482e1d3604be0afde1f7fc3ccc1394a51 - languageName: node - linkType: hard - -"jackspeak@npm:^3.1.2": - version: 3.4.3 - resolution: "jackspeak@npm:3.4.3" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 - languageName: node - linkType: hard - -"jackspeak@npm:^4.0.1": - version: 4.0.1 - resolution: "jackspeak@npm:4.0.1" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 10c0/c87997d9c9c5b7366259b1f2a444ef148692f8eedad5307caca939babbb60af2b47d306e5c63bf9d5fefbab2ab48d4da275188c3de525d0e716cc21b784bbccb - languageName: node - linkType: hard - -"jest-changed-files@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-changed-files@npm:29.7.0" - dependencies: - execa: "npm:^5.0.0" - jest-util: "npm:^29.7.0" - p-limit: "npm:^3.1.0" - checksum: 10c0/e071384d9e2f6bb462231ac53f29bff86f0e12394c1b49ccafbad225ce2ab7da226279a8a94f421949920bef9be7ef574fd86aee22e8adfa149be73554ab828b - languageName: node - linkType: hard - -"jest-circus@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-circus@npm:29.7.0" - dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/expect": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - co: "npm:^4.6.0" - dedent: "npm:^1.0.0" - is-generator-fn: "npm:^2.0.0" - jest-each: "npm:^29.7.0" - jest-matcher-utils: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-runtime: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - p-limit: "npm:^3.1.0" - pretty-format: "npm:^29.7.0" - pure-rand: "npm:^6.0.0" - slash: "npm:^3.0.0" - stack-utils: "npm:^2.0.3" - checksum: 10c0/8d15344cf7a9f14e926f0deed64ed190c7a4fa1ed1acfcd81e4cc094d3cc5bf7902ebb7b874edc98ada4185688f90c91e1747e0dfd7ac12463b097968ae74b5e - languageName: node - linkType: hard - -"jest-cli@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-cli@npm:29.7.0" - dependencies: - "@jest/core": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - chalk: "npm:^4.0.0" - create-jest: "npm:^29.7.0" - exit: "npm:^0.1.2" - import-local: "npm:^3.0.2" - jest-config: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - yargs: "npm:^17.3.1" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: 10c0/a658fd55050d4075d65c1066364595962ead7661711495cfa1dfeecf3d6d0a8ffec532f3dbd8afbb3e172dd5fd2fb2e813c5e10256e7cf2fea766314942fb43a - languageName: node - linkType: hard - -"jest-config@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-config@npm:29.7.0" - dependencies: - "@babel/core": "npm:^7.11.6" - "@jest/test-sequencer": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - babel-jest: "npm:^29.7.0" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - deepmerge: "npm:^4.2.2" - glob: "npm:^7.1.3" - graceful-fs: "npm:^4.2.9" - jest-circus: "npm:^29.7.0" - jest-environment-node: "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - jest-regex-util: "npm:^29.6.3" - jest-resolve: "npm:^29.7.0" - jest-runner: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - parse-json: "npm:^5.2.0" - pretty-format: "npm:^29.7.0" - slash: "npm:^3.0.0" - strip-json-comments: "npm:^3.1.1" - peerDependencies: - "@types/node": "*" - ts-node: ">=9.0.0" - peerDependenciesMeta: - "@types/node": - optional: true - ts-node: - optional: true - checksum: 10c0/bab23c2eda1fff06e0d104b00d6adfb1d1aabb7128441899c9bff2247bd26710b050a5364281ce8d52b46b499153bf7e3ee88b19831a8f3451f1477a0246a0f1 - languageName: node - linkType: hard - -"jest-diff@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-diff@npm:29.7.0" - dependencies: - chalk: "npm:^4.0.0" - diff-sequences: "npm:^29.6.3" - jest-get-type: "npm:^29.6.3" - pretty-format: "npm:^29.7.0" - checksum: 10c0/89a4a7f182590f56f526443dde69acefb1f2f0c9e59253c61d319569856c4931eae66b8a3790c443f529267a0ddba5ba80431c585deed81827032b2b2a1fc999 - languageName: node - linkType: hard - -"jest-docblock@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-docblock@npm:29.7.0" - dependencies: - detect-newline: "npm:^3.0.0" - checksum: 10c0/d932a8272345cf6b6142bb70a2bb63e0856cc0093f082821577ea5bdf4643916a98744dfc992189d2b1417c38a11fa42466f6111526bc1fb81366f56410f3be9 - languageName: node - linkType: hard - -"jest-each@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-each@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - chalk: "npm:^4.0.0" - jest-get-type: "npm:^29.6.3" - jest-util: "npm:^29.7.0" - pretty-format: "npm:^29.7.0" - checksum: 10c0/f7f9a90ebee80cc688e825feceb2613627826ac41ea76a366fa58e669c3b2403d364c7c0a74d862d469b103c843154f8456d3b1c02b487509a12afa8b59edbb4 - languageName: node - linkType: hard - -"jest-environment-node@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-environment-node@npm:29.7.0" - dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/fake-timers": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - jest-mock: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - checksum: 10c0/61f04fec077f8b1b5c1a633e3612fc0c9aa79a0ab7b05600683428f1e01a4d35346c474bde6f439f9fcc1a4aa9a2861ff852d079a43ab64b02105d1004b2592b - languageName: node - linkType: hard - -"jest-get-type@npm:^29.6.3": - version: 29.6.3 - resolution: "jest-get-type@npm:29.6.3" - checksum: 10c0/552e7a97a983d3c2d4e412a44eb7de0430ff773dd99f7500962c268d6dfbfa431d7d08f919c9d960530e5f7f78eb47f267ad9b318265e5092b3ff9ede0db7c2b - languageName: node - linkType: hard - -"jest-haste-map@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-haste-map@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - "@types/graceful-fs": "npm:^4.1.3" - "@types/node": "npm:*" - anymatch: "npm:^3.0.3" - fb-watchman: "npm:^2.0.0" - fsevents: "npm:^2.3.2" - graceful-fs: "npm:^4.2.9" - jest-regex-util: "npm:^29.6.3" - jest-util: "npm:^29.7.0" - jest-worker: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - walker: "npm:^1.0.8" - dependenciesMeta: - fsevents: - optional: true - checksum: 10c0/2683a8f29793c75a4728787662972fedd9267704c8f7ef9d84f2beed9a977f1cf5e998c07b6f36ba5603f53cb010c911fe8cd0ac9886e073fe28ca66beefd30c - languageName: node - linkType: hard - -"jest-leak-detector@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-leak-detector@npm:29.7.0" - dependencies: - jest-get-type: "npm:^29.6.3" - pretty-format: "npm:^29.7.0" - checksum: 10c0/71bb9f77fc489acb842a5c7be030f2b9acb18574dc9fb98b3100fc57d422b1abc55f08040884bd6e6dbf455047a62f7eaff12aa4058f7cbdc11558718ca6a395 - languageName: node - linkType: hard - -"jest-matcher-utils@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-matcher-utils@npm:29.7.0" - dependencies: - chalk: "npm:^4.0.0" - jest-diff: "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - pretty-format: "npm:^29.7.0" - checksum: 10c0/0d0e70b28fa5c7d4dce701dc1f46ae0922102aadc24ed45d594dd9b7ae0a8a6ef8b216718d1ab79e451291217e05d4d49a82666e1a3cc2b428b75cd9c933244e - languageName: node - linkType: hard - -"jest-message-util@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-message-util@npm:29.7.0" - dependencies: - "@babel/code-frame": "npm:^7.12.13" - "@jest/types": "npm:^29.6.3" - "@types/stack-utils": "npm:^2.0.0" - chalk: "npm:^4.0.0" - graceful-fs: "npm:^4.2.9" - micromatch: "npm:^4.0.4" - pretty-format: "npm:^29.7.0" - slash: "npm:^3.0.0" - stack-utils: "npm:^2.0.3" - checksum: 10c0/850ae35477f59f3e6f27efac5215f706296e2104af39232bb14e5403e067992afb5c015e87a9243ec4d9df38525ef1ca663af9f2f4766aa116f127247008bd22 - languageName: node - linkType: hard - -"jest-mock@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-mock@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - jest-util: "npm:^29.7.0" - checksum: 10c0/7b9f8349ee87695a309fe15c46a74ab04c853369e5c40952d68061d9dc3159a0f0ed73e215f81b07ee97a9faaf10aebe5877a9d6255068a0977eae6a9ff1d5ac - languageName: node - linkType: hard - -"jest-pnp-resolver@npm:^1.2.2": - version: 1.2.3 - resolution: "jest-pnp-resolver@npm:1.2.3" - peerDependencies: - jest-resolve: "*" - peerDependenciesMeta: - jest-resolve: - optional: true - checksum: 10c0/86eec0c78449a2de733a6d3e316d49461af6a858070e113c97f75fb742a48c2396ea94150cbca44159ffd4a959f743a47a8b37a792ef6fdad2cf0a5cba973fac - languageName: node - linkType: hard - -"jest-regex-util@npm:^29.6.3": - version: 29.6.3 - resolution: "jest-regex-util@npm:29.6.3" - checksum: 10c0/4e33fb16c4f42111159cafe26397118dcfc4cf08bc178a67149fb05f45546a91928b820894572679d62559839d0992e21080a1527faad65daaae8743a5705a3b - languageName: node - linkType: hard - -"jest-resolve-dependencies@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-resolve-dependencies@npm:29.7.0" - dependencies: - jest-regex-util: "npm:^29.6.3" - jest-snapshot: "npm:^29.7.0" - checksum: 10c0/b6e9ad8ae5b6049474118ea6441dfddd385b6d1fc471db0136f7c8fbcfe97137a9665e4f837a9f49f15a29a1deb95a14439b7aec812f3f99d08f228464930f0d - languageName: node - linkType: hard - -"jest-resolve@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-resolve@npm:29.7.0" - dependencies: - chalk: "npm:^4.0.0" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" - jest-pnp-resolver: "npm:^1.2.2" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - resolve: "npm:^1.20.0" - resolve.exports: "npm:^2.0.0" - slash: "npm:^3.0.0" - checksum: 10c0/59da5c9c5b50563e959a45e09e2eace783d7f9ac0b5dcc6375dea4c0db938d2ebda97124c8161310082760e8ebbeff9f6b177c15ca2f57fb424f637a5d2adb47 - languageName: node - linkType: hard - -"jest-runner@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-runner@npm:29.7.0" - dependencies: - "@jest/console": "npm:^29.7.0" - "@jest/environment": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - emittery: "npm:^0.13.1" - graceful-fs: "npm:^4.2.9" - jest-docblock: "npm:^29.7.0" - jest-environment-node: "npm:^29.7.0" - jest-haste-map: "npm:^29.7.0" - jest-leak-detector: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-resolve: "npm:^29.7.0" - jest-runtime: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-watcher: "npm:^29.7.0" - jest-worker: "npm:^29.7.0" - p-limit: "npm:^3.1.0" - source-map-support: "npm:0.5.13" - checksum: 10c0/2194b4531068d939f14c8d3274fe5938b77fa73126aedf9c09ec9dec57d13f22c72a3b5af01ac04f5c1cf2e28d0ac0b4a54212a61b05f10b5d6b47f2a1097bb4 - languageName: node - linkType: hard - -"jest-runtime@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-runtime@npm:29.7.0" - dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/fake-timers": "npm:^29.7.0" - "@jest/globals": "npm:^29.7.0" - "@jest/source-map": "npm:^29.6.3" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - cjs-module-lexer: "npm:^1.0.0" - collect-v8-coverage: "npm:^1.0.0" - glob: "npm:^7.1.3" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-mock: "npm:^29.7.0" - jest-regex-util: "npm:^29.6.3" - jest-resolve: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - slash: "npm:^3.0.0" - strip-bom: "npm:^4.0.0" - checksum: 10c0/7cd89a1deda0bda7d0941835434e44f9d6b7bd50b5c5d9b0fc9a6c990b2d4d2cab59685ab3cb2850ed4cc37059f6de903af5a50565d7f7f1192a77d3fd6dd2a6 - languageName: node - linkType: hard - -"jest-snapshot@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-snapshot@npm:29.7.0" - dependencies: - "@babel/core": "npm:^7.11.6" - "@babel/generator": "npm:^7.7.2" - "@babel/plugin-syntax-jsx": "npm:^7.7.2" - "@babel/plugin-syntax-typescript": "npm:^7.7.2" - "@babel/types": "npm:^7.3.3" - "@jest/expect-utils": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - babel-preset-current-node-syntax: "npm:^1.0.0" - chalk: "npm:^4.0.0" - expect: "npm:^29.7.0" - graceful-fs: "npm:^4.2.9" - jest-diff: "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - jest-matcher-utils: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - natural-compare: "npm:^1.4.0" - pretty-format: "npm:^29.7.0" - semver: "npm:^7.5.3" - checksum: 10c0/6e9003c94ec58172b4a62864a91c0146513207bedf4e0a06e1e2ac70a4484088a2683e3a0538d8ea913bcfd53dc54a9b98a98cdfa562e7fe1d1339aeae1da570 - languageName: node - linkType: hard - -"jest-summarizing-reporter@npm:^1.1.4": - version: 1.1.4 - resolution: "jest-summarizing-reporter@npm:1.1.4" - checksum: 10c0/260b9f3249e8314c70545bce619477963084203848cc58a7ec1881a382ef5b1c7b00269f707a970371ddb5b411cd5da7f4b4208d73a849bc0f312d43084c8fec - languageName: node - linkType: hard - -"jest-util@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-util@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - graceful-fs: "npm:^4.2.9" - picomatch: "npm:^2.2.3" - checksum: 10c0/bc55a8f49fdbb8f51baf31d2a4f312fb66c9db1483b82f602c9c990e659cdd7ec529c8e916d5a89452ecbcfae4949b21b40a7a59d4ffc0cd813a973ab08c8150 - languageName: node - linkType: hard - -"jest-validate@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-validate@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - camelcase: "npm:^6.2.0" - chalk: "npm:^4.0.0" - jest-get-type: "npm:^29.6.3" - leven: "npm:^3.1.0" - pretty-format: "npm:^29.7.0" - checksum: 10c0/a20b930480c1ed68778c739f4739dce39423131bc070cd2505ddede762a5570a256212e9c2401b7ae9ba4d7b7c0803f03c5b8f1561c62348213aba18d9dbece2 - languageName: node - linkType: hard - -"jest-watcher@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-watcher@npm:29.7.0" - dependencies: - "@jest/test-result": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - ansi-escapes: "npm:^4.2.1" - chalk: "npm:^4.0.0" - emittery: "npm:^0.13.1" - jest-util: "npm:^29.7.0" - string-length: "npm:^4.0.1" - checksum: 10c0/ec6c75030562fc8f8c727cb8f3b94e75d831fc718785abfc196e1f2a2ebc9a2e38744a15147170039628a853d77a3b695561ce850375ede3a4ee6037a2574567 - languageName: node - linkType: hard - -"jest-worker@npm:^27.4.5": - version: 27.5.1 - resolution: "jest-worker@npm:27.5.1" - dependencies: - "@types/node": "npm:*" - merge-stream: "npm:^2.0.0" - supports-color: "npm:^8.0.0" - checksum: 10c0/8c4737ffd03887b3c6768e4cc3ca0269c0336c1e4b1b120943958ddb035ed2a0fc6acab6dc99631720a3720af4e708ff84fb45382ad1e83c27946adf3623969b - languageName: node - linkType: hard - -"jest-worker@npm:^29.4.3, jest-worker@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-worker@npm:29.7.0" - dependencies: - "@types/node": "npm:*" - jest-util: "npm:^29.7.0" - merge-stream: "npm:^2.0.0" - supports-color: "npm:^8.0.0" - checksum: 10c0/5570a3a005b16f46c131968b8a5b56d291f9bbb85ff4217e31c80bd8a02e7de799e59a54b95ca28d5c302f248b54cbffde2d177c2f0f52ffcee7504c6eabf660 - languageName: node - linkType: hard - -"jest@npm:^29.7.0": - version: 29.7.0 - resolution: "jest@npm:29.7.0" - dependencies: - "@jest/core": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - import-local: "npm:^3.0.2" - jest-cli: "npm:^29.7.0" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: 10c0/f40eb8171cf147c617cc6ada49d062fbb03b4da666cb8d39cdbfb739a7d75eea4c3ca150fb072d0d273dce0c753db4d0467d54906ad0293f59c54f9db4a09d8b - languageName: node - linkType: hard - -"jiti@npm:^1.19.3, jiti@npm:^1.20.0, jiti@npm:^1.21.0, jiti@npm:^1.21.6": - version: 1.21.6 - resolution: "jiti@npm:1.21.6" - bin: - jiti: bin/jiti.js - checksum: 10c0/05b9ed58cd30d0c3ccd3c98209339e74f50abd9a17e716f65db46b6a35812103f6bde6e134be7124d01745586bca8cc5dae1d0d952267c3ebe55171949c32e56 - languageName: node - linkType: hard - -"jju@npm:~1.4.0": - version: 1.4.0 - resolution: "jju@npm:1.4.0" - checksum: 10c0/f3f444557e4364cfc06b1abf8331bf3778b26c0c8552ca54429bc0092652172fdea26cbffe33e1017b303d5aa506f7ede8571857400efe459cb7439180e2acad - languageName: node - linkType: hard - -"joi@npm:^17.9.2": - version: 17.13.3 - resolution: "joi@npm:17.13.3" - dependencies: - "@hapi/hoek": "npm:^9.3.0" - "@hapi/topo": "npm:^5.1.0" - "@sideway/address": "npm:^4.1.5" - "@sideway/formula": "npm:^3.0.1" - "@sideway/pinpoint": "npm:^2.0.0" - checksum: 10c0/9262aef1da3f1bec5b03caf50c46368899fe03b8ff26cbe3d53af4584dd1049079fc97230bbf1500b6149db7cc765b9ee45f0deb24bb6fc3fa06229d7148c17f - languageName: node - linkType: hard - -"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed - languageName: node - linkType: hard - -"js-yaml@npm:^3.13.1": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" - dependencies: - argparse: "npm:^1.0.7" - esprima: "npm:^4.0.0" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b - languageName: node - linkType: hard - -"js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: "npm:^2.0.1" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f - languageName: node - linkType: hard - -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 - languageName: node - linkType: hard - -"jsdoc-type-pratt-parser@npm:~4.1.0": - version: 4.1.0 - resolution: "jsdoc-type-pratt-parser@npm:4.1.0" - checksum: 10c0/7700372d2e733a32f7ea0a1df9cec6752321a5345c11a91b2ab478a031a426e934f16d5c1f15c8566c7b2c10af9f27892a29c2c789039f595470e929a4aa60ea - languageName: node - linkType: hard - -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 - languageName: node - linkType: hard - -"jsesc@npm:^3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" - bin: - jsesc: bin/jsesc - checksum: 10c0/ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1 - languageName: node - linkType: hard - -"jsesc@npm:~0.5.0": - version: 0.5.0 - resolution: "jsesc@npm:0.5.0" - bin: - jsesc: bin/jsesc - checksum: 10c0/f93792440ae1d80f091b65f8ceddf8e55c4bb7f1a09dee5dcbdb0db5612c55c0f6045625aa6b7e8edb2e0a4feabd80ee48616dbe2d37055573a84db3d24f96d9 - languageName: node - linkType: hard - -"json-buffer@npm:3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 - languageName: node - linkType: hard - -"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": - version: 2.3.1 - resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce - languageName: node - linkType: hard - -"json-schema-traverse@npm:^1.0.0": - version: 1.0.0 - resolution: "json-schema-traverse@npm:1.0.0" - checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 - languageName: node - linkType: hard - -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 - languageName: node - linkType: hard - -"json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.2, json5@npm:^2.2.3": - version: 2.2.3 - resolution: "json5@npm:2.2.3" - bin: - json5: lib/cli.js - checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c - languageName: node - linkType: hard - -"jsonc-parser@npm:^3.3.1": - version: 3.3.1 - resolution: "jsonc-parser@npm:3.3.1" - checksum: 10c0/269c3ae0a0e4f907a914bf334306c384aabb9929bd8c99f909275ebd5c2d3bc70b9bcd119ad794f339dec9f24b6a4ee9cd5a8ab2e6435e730ad4075388fc2ab6 - languageName: node - linkType: hard - -"jsonc-parser@npm:~3.2.1": - version: 3.2.1 - resolution: "jsonc-parser@npm:3.2.1" - checksum: 10c0/ada66dec143d7f9cb0e2d0d29c69e9ce40d20f3a4cb96b0c6efb745025ac7f9ba647d7ac0990d0adfc37a2d2ae084a12009a9c833dbdbeadf648879a99b9df89 - languageName: node - linkType: hard - -"jsonfile@npm:^4.0.0": - version: 4.0.0 - resolution: "jsonfile@npm:4.0.0" - dependencies: - graceful-fs: "npm:^4.1.6" - dependenciesMeta: - graceful-fs: - optional: true - checksum: 10c0/7dc94b628d57a66b71fb1b79510d460d662eb975b5f876d723f81549c2e9cd316d58a2ddf742b2b93a4fa6b17b2accaf1a738a0e2ea114bdfb13a32e5377e480 - languageName: node - linkType: hard - -"jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" - dependencies: - graceful-fs: "npm:^4.1.6" - universalify: "npm:^2.0.0" - dependenciesMeta: - graceful-fs: - optional: true - checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 - languageName: node - linkType: hard - -"jsonpointer@npm:5.0.1": - version: 5.0.1 - resolution: "jsonpointer@npm:5.0.1" - checksum: 10c0/89929e58b400fcb96928c0504fcf4fc3f919d81e9543ceb055df125538470ee25290bb4984251e172e6ef8fcc55761eb998c118da763a82051ad89d4cb073fe7 - languageName: node - linkType: hard - -"keyv@npm:^4.5.3, keyv@npm:^4.5.4": - version: 4.5.4 - resolution: "keyv@npm:4.5.4" - dependencies: - json-buffer: "npm:3.0.1" - checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e - languageName: node - linkType: hard - -"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2": - version: 6.0.3 - resolution: "kind-of@npm:6.0.3" - checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 - languageName: node - linkType: hard - -"klaw-sync@npm:^6.0.0": - version: 6.0.0 - resolution: "klaw-sync@npm:6.0.0" - dependencies: - graceful-fs: "npm:^4.1.11" - checksum: 10c0/00d8e4c48d0d699b743b3b028e807295ea0b225caf6179f51029e19783a93ad8bb9bccde617d169659fbe99559d73fb35f796214de031d0023c26b906cecd70a - languageName: node - linkType: hard - -"kleur@npm:^3.0.3": - version: 3.0.3 - resolution: "kleur@npm:3.0.3" - checksum: 10c0/cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b - languageName: node - linkType: hard - -"knip@npm:^5.27.2": - version: 5.27.2 - resolution: "knip@npm:5.27.2" - dependencies: - "@nodelib/fs.walk": "npm:1.2.8" - "@snyk/github-codeowners": "npm:1.1.0" - easy-table: "npm:1.2.0" - enhanced-resolve: "npm:^5.17.1" - fast-glob: "npm:^3.3.2" - jiti: "npm:^1.21.6" - js-yaml: "npm:^4.1.0" - minimist: "npm:^1.2.8" - picocolors: "npm:^1.0.0" - picomatch: "npm:^4.0.1" - pretty-ms: "npm:^9.0.0" - smol-toml: "npm:^1.1.4" - strip-json-comments: "npm:5.0.1" - summary: "npm:2.1.0" - zod: "npm:^3.22.4" - zod-validation-error: "npm:^3.0.3" - peerDependencies: - "@types/node": ">=18" - typescript: ">=5.0.4" - bin: - knip: bin/knip.js - knip-bun: bin/knip-bun.js - checksum: 10c0/24bc334edbd705cfd0d78dc66517d806161974b45f707555ddc88887772022bc949dca84b06f42573a8fd49ede206f7611e6753349a9f98086fe29ee15ca3f5e - languageName: node - linkType: hard - -"latest-version@npm:^7.0.0": - version: 7.0.0 - resolution: "latest-version@npm:7.0.0" - dependencies: - package-json: "npm:^8.1.0" - checksum: 10c0/68045f5e419e005c12e595ae19687dd88317dd0108b83a8773197876622c7e9d164fe43aacca4f434b2cba105c92848b89277f658eabc5d50e81fb743bbcddb1 - languageName: node - linkType: hard - -"launch-editor@npm:^2.6.0": - version: 2.8.1 - resolution: "launch-editor@npm:2.8.1" - dependencies: - picocolors: "npm:^1.0.0" - shell-quote: "npm:^1.8.1" - checksum: 10c0/e18fcda6617a995306602871c7a71ddcfdd82d88a57508ae970be86bfb6685f131cf9ddb8896df4e8e4cde6d0e2d14318d2b41314eaae6abf03ca205948daa27 - languageName: node - linkType: hard - -"leven@npm:^3.1.0": - version: 3.1.0 - resolution: "leven@npm:3.1.0" - checksum: 10c0/cd778ba3fbab0f4d0500b7e87d1f6e1f041507c56fdcd47e8256a3012c98aaee371d4c15e0a76e0386107af2d42e2b7466160a2d80688aaa03e66e49949f42df - languageName: node - linkType: hard - -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" - dependencies: - prelude-ls: "npm:^1.2.1" - type-check: "npm:~0.4.0" - checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e - languageName: node - linkType: hard - -"lilconfig@npm:^3.1.1, lilconfig@npm:^3.1.2": - version: 3.1.2 - resolution: "lilconfig@npm:3.1.2" - checksum: 10c0/f059630b1a9bddaeba83059db00c672b64dc14074e9f232adce32b38ca1b5686ab737eb665c5ba3c32f147f0002b4bee7311ad0386a9b98547b5623e87071fbe - languageName: node - linkType: hard - -"lines-and-columns@npm:^1.1.6": - version: 1.2.4 - resolution: "lines-and-columns@npm:1.2.4" - checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d - languageName: node - linkType: hard - -"linkify-it@npm:^5.0.0": - version: 5.0.0 - resolution: "linkify-it@npm:5.0.0" - dependencies: - uc.micro: "npm:^2.0.0" - checksum: 10c0/ff4abbcdfa2003472fc3eb4b8e60905ec97718e11e33cca52059919a4c80cc0e0c2a14d23e23d8c00e5402bc5a885cdba8ca053a11483ab3cc8b3c7a52f88e2d - languageName: node - linkType: hard - -"loader-runner@npm:^4.2.0": - version: 4.3.0 - resolution: "loader-runner@npm:4.3.0" - checksum: 10c0/a44d78aae0907a72f73966fe8b82d1439c8c485238bd5a864b1b9a2a3257832effa858790241e6b37876b5446a78889adf2fcc8dd897ce54c089ecc0a0ce0bf0 - languageName: node - linkType: hard - -"loader-utils@npm:^2.0.0": - version: 2.0.4 - resolution: "loader-utils@npm:2.0.4" - dependencies: - big.js: "npm:^5.2.2" - emojis-list: "npm:^3.0.0" - json5: "npm:^2.1.2" - checksum: 10c0/d5654a77f9d339ec2a03d88221a5a695f337bf71eb8dea031b3223420bb818964ba8ed0069145c19b095f6c8b8fd386e602a3fc7ca987042bd8bb1dcc90d7100 - languageName: node - linkType: hard - -"loader-utils@npm:^3.2.0": - version: 3.3.1 - resolution: "loader-utils@npm:3.3.1" - checksum: 10c0/f2af4eb185ac5bf7e56e1337b666f90744e9f443861ac521b48f093fb9e8347f191c8960b4388a3365147d218913bc23421234e7788db69f385bacfefa0b4758 - languageName: node - linkType: hard - -"locate-path@npm:^3.0.0": - version: 3.0.0 - resolution: "locate-path@npm:3.0.0" - dependencies: - p-locate: "npm:^3.0.0" - path-exists: "npm:^3.0.0" - checksum: 10c0/3db394b7829a7fe2f4fbdd25d3c4689b85f003c318c5da4052c7e56eed697da8f1bce5294f685c69ff76e32cba7a33629d94396976f6d05fb7f4c755c5e2ae8b - languageName: node - linkType: hard - -"locate-path@npm:^5.0.0": - version: 5.0.0 - resolution: "locate-path@npm:5.0.0" - dependencies: - p-locate: "npm:^4.1.0" - checksum: 10c0/33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: "npm:^5.0.0" - checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 - languageName: node - linkType: hard - -"locate-path@npm:^7.1.0": - version: 7.2.0 - resolution: "locate-path@npm:7.2.0" - dependencies: - p-locate: "npm:^6.0.0" - checksum: 10c0/139e8a7fe11cfbd7f20db03923cacfa5db9e14fa14887ea121345597472b4a63c1a42a8a5187defeeff6acf98fd568da7382aa39682d38f0af27433953a97751 - languageName: node - linkType: hard - -"lodash.debounce@npm:^4.0.8": - version: 4.0.8 - resolution: "lodash.debounce@npm:4.0.8" - checksum: 10c0/762998a63e095412b6099b8290903e0a8ddcb353ac6e2e0f2d7e7d03abd4275fe3c689d88960eb90b0dde4f177554d51a690f22a343932ecbc50a5d111849987 - languageName: node - linkType: hard - -"lodash.memoize@npm:^4.1.2": - version: 4.1.2 - resolution: "lodash.memoize@npm:4.1.2" - checksum: 10c0/c8713e51eccc650422716a14cece1809cfe34bc5ab5e242b7f8b4e2241c2483697b971a604252807689b9dd69bfe3a98852e19a5b89d506b000b4187a1285df8 - languageName: node - linkType: hard - -"lodash.merge@npm:4.6.2, lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 - languageName: node - linkType: hard - -"lodash.uniq@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.uniq@npm:4.5.0" - checksum: 10c0/262d400bb0952f112162a320cc4a75dea4f66078b9e7e3075ffbc9c6aa30b3e9df3cf20e7da7d566105e1ccf7804e4fbd7d804eee0b53de05d83f16ffbf41c5e - languageName: node - linkType: hard - -"lodash@npm:^4.17.14, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.15": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c - languageName: node - linkType: hard - -"log-symbols@npm:^6.0.0": - version: 6.0.0 - resolution: "log-symbols@npm:6.0.0" - dependencies: - chalk: "npm:^5.3.0" - is-unicode-supported: "npm:^1.3.0" - checksum: 10c0/36636cacedba8f067d2deb4aad44e91a89d9efb3ead27e1846e7b82c9a10ea2e3a7bd6ce28a7ca616bebc60954ff25c67b0f92d20a6a746bb3cc52c3701891f6 - languageName: node - linkType: hard - -"loglevel@npm:^1.8.1": - version: 1.9.1 - resolution: "loglevel@npm:1.9.1" - checksum: 10c0/152f0501cea367cf998c844a38b19f0b5af555756ad7d8650214a1f8c6a5b045e31b8cf5dae27d28339a061624ce3f618aadb333aed386cac041d6ddc5101a39 - languageName: node - linkType: hard - -"longest-streak@npm:^3.0.0": - version: 3.1.0 - resolution: "longest-streak@npm:3.1.0" - checksum: 10c0/7c2f02d0454b52834d1bcedef79c557bd295ee71fdabb02d041ff3aa9da48a90b5df7c0409156dedbc4df9b65da18742652aaea4759d6ece01f08971af6a7eaa - languageName: node - linkType: hard - -"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.2.0, loose-envify@npm:^1.3.1, loose-envify@npm:^1.4.0": - version: 1.4.0 - resolution: "loose-envify@npm:1.4.0" - dependencies: - js-tokens: "npm:^3.0.0 || ^4.0.0" - bin: - loose-envify: cli.js - checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e - languageName: node - linkType: hard - -"lower-case@npm:^2.0.2": - version: 2.0.2 - resolution: "lower-case@npm:2.0.2" - dependencies: - tslib: "npm:^2.0.3" - checksum: 10c0/3d925e090315cf7dc1caa358e0477e186ffa23947740e4314a7429b6e62d72742e0bbe7536a5ae56d19d7618ce998aba05caca53c2902bd5742fdca5fc57fd7b - languageName: node - linkType: hard - -"lowercase-keys@npm:^3.0.0": - version: 3.0.0 - resolution: "lowercase-keys@npm:3.0.0" - checksum: 10c0/ef62b9fa5690ab0a6e4ef40c94efce68e3ed124f583cc3be38b26ff871da0178a28b9a84ce0c209653bb25ca135520ab87fea7cd411a54ac4899cb2f30501430 - languageName: node - linkType: hard - -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.4.3 - resolution: "lru-cache@npm:10.4.3" - checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb - languageName: node - linkType: hard - -"lru-cache@npm:^11.0.0": - version: 11.0.0 - resolution: "lru-cache@npm:11.0.0" - checksum: 10c0/827ff0e0739f9b0f30f92f5a5fc97c6a2bd3ae32c0452bc58cb7411d6c589d49536073027293f2d1f02d0c2e72b63b162f238df7e9ff6f4cc0345f92afec4d1d - languageName: node - linkType: hard - -"lru-cache@npm:^5.1.1": - version: 5.1.1 - resolution: "lru-cache@npm:5.1.1" - dependencies: - yallist: "npm:^3.0.2" - checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 - languageName: node - linkType: hard - -"lua-types@npm:^2.13.1": - version: 2.13.1 - resolution: "lua-types@npm:2.13.1" - checksum: 10c0/c39e0800f35422dcc878c030fe3c320de4dd57486162b30ccbf7006e44606dc0f7e6fc986695c9329170f02feb1b56daf80e9fc15e63c2dc3f9959f3460e7c1a - languageName: node - linkType: hard - -"lunr@npm:^2.3.9": - version: 2.3.9 - resolution: "lunr@npm:2.3.9" - checksum: 10c0/77d7dbb4fbd602aac161e2b50887d8eda28c0fa3b799159cee380fbb311f1e614219126ecbbd2c3a9c685f1720a8109b3c1ca85cc893c39b6c9cc6a62a1d8a8b - languageName: node - linkType: hard - -"magic-string@npm:^0.30.10, magic-string@npm:^0.30.3": - version: 0.30.11 - resolution: "magic-string@npm:0.30.11" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: 10c0/b9eb370773d0bd90ca11a848753409d8e5309b1ad56d2a1aa49d6649da710a6d2fe7237ad1a643c5a5d3800de2b9946ed9690acdfc00e6cc1aeafff3ab1752c4 - languageName: node - linkType: hard - -"make-dir@npm:^4.0.0": - version: 4.0.0 - resolution: "make-dir@npm:4.0.0" - dependencies: - semver: "npm:^7.5.3" - checksum: 10c0/69b98a6c0b8e5c4fe9acb61608a9fbcfca1756d910f51e5dbe7a9e5cfb74fca9b8a0c8a0ffdf1294a740826c1ab4871d5bf3f62f72a3049e5eac6541ddffed68 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^13.0.0": - version: 13.0.1 - resolution: "make-fetch-happen@npm:13.0.1" - dependencies: - "@npmcli/agent": "npm:^2.0.0" - cacache: "npm:^18.0.0" - http-cache-semantics: "npm:^4.1.1" - is-lambda: "npm:^1.0.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^3.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" - proc-log: "npm:^4.2.0" - promise-retry: "npm:^2.0.1" - ssri: "npm:^10.0.0" - checksum: 10c0/df5f4dbb6d98153b751bccf4dc4cc500de85a96a9331db9805596c46aa9f99d9555983954e6c1266d9f981ae37a9e4647f42b9a4bb5466f867f4012e582c9e7e - languageName: node - linkType: hard - -"makeerror@npm:1.0.12": - version: 1.0.12 - resolution: "makeerror@npm:1.0.12" - dependencies: - tmpl: "npm:1.0.5" - checksum: 10c0/b0e6e599780ce6bab49cc413eba822f7d1f0dfebd1c103eaa3785c59e43e22c59018323cf9e1708f0ef5329e94a745d163fcbb6bff8e4c6742f9be9e86f3500c - languageName: node - linkType: hard - -"markdown-extensions@npm:^2.0.0": - version: 2.0.0 - resolution: "markdown-extensions@npm:2.0.0" - checksum: 10c0/406139da2aa0d5ebad86195c8e8c02412f873c452b4c087ae7bc767af37956141be449998223bb379eea179b5fd38dfa610602b6f29c22ddab5d51e627a7e41d - languageName: node - linkType: hard - -"markdown-it@npm:14.1.0, markdown-it@npm:^14.1.0": - version: 14.1.0 - resolution: "markdown-it@npm:14.1.0" - dependencies: - argparse: "npm:^2.0.1" - entities: "npm:^4.4.0" - linkify-it: "npm:^5.0.0" - mdurl: "npm:^2.0.0" - punycode.js: "npm:^2.3.1" - uc.micro: "npm:^2.1.0" - bin: - markdown-it: bin/markdown-it.mjs - checksum: 10c0/9a6bb444181d2db7016a4173ae56a95a62c84d4cbfb6916a399b11d3e6581bf1cc2e4e1d07a2f022ae72c25f56db90fbe1e529fca16fbf9541659dc53480d4b4 - languageName: node - linkType: hard - -"markdown-table@npm:^3.0.0": - version: 3.0.3 - resolution: "markdown-table@npm:3.0.3" - checksum: 10c0/47433a3f31e4637a184e38e873ab1d2fadfb0106a683d466fec329e99a2d8dfa09f091fa42202c6f13ec94aef0199f449a684b28042c636f2edbc1b7e1811dcd - languageName: node - linkType: hard - -"markdownlint-cli@npm:^0.41.0": - version: 0.41.0 - resolution: "markdownlint-cli@npm:0.41.0" - dependencies: - commander: "npm:~12.1.0" - get-stdin: "npm:~9.0.0" - glob: "npm:~10.4.1" - ignore: "npm:~5.3.1" - js-yaml: "npm:^4.1.0" - jsonc-parser: "npm:~3.2.1" - jsonpointer: "npm:5.0.1" - markdownlint: "npm:~0.34.0" - minimatch: "npm:~9.0.4" - run-con: "npm:~1.3.2" - smol-toml: "npm:~1.2.0" - bin: - markdownlint: markdownlint.js - checksum: 10c0/87cf926cd7144a303095b678766965344bd5c7f9ff263565a195002e32a43ca000e47feb89236ea3cd76d2f10cc3735980d80dd348196b6f312fdd430d298231 - languageName: node - linkType: hard - -"markdownlint-micromark@npm:0.1.9": - version: 0.1.9 - resolution: "markdownlint-micromark@npm:0.1.9" - checksum: 10c0/97daaf14d0d8c6568d33be18c92a0cfbf1b9111e2967d44e6785052ea10aebe547dd80a3288c96818228d08213f2e2345dc1e237f6a2bc3b86a37bd316eca5cf - languageName: node - linkType: hard - -"markdownlint@npm:^0.34.0, markdownlint@npm:~0.34.0": - version: 0.34.0 - resolution: "markdownlint@npm:0.34.0" - dependencies: - markdown-it: "npm:14.1.0" - markdownlint-micromark: "npm:0.1.9" - checksum: 10c0/9dc3ee3b43b8a061b15e5c3631a963deb62397d0fa555dfb0dd3fc28c54ffa1a884938a21a34ae69399e030b9ccae10734275aac6888d661024c98ad2c3de43e - languageName: node - linkType: hard - -"mdast-util-directive@npm:^3.0.0": - version: 3.0.0 - resolution: "mdast-util-directive@npm:3.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - devlop: "npm:^1.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - parse-entities: "npm:^4.0.0" - stringify-entities: "npm:^4.0.0" - unist-util-visit-parents: "npm:^6.0.0" - checksum: 10c0/4a71b27f5f0c4ead5293a12d4118d4d832951ac0efdeba4af2dd78f5679f9cabee80feb3619f219a33674c12df3780def1bd3150d7298aaf0ef734f0dfbab999 - languageName: node - linkType: hard - -"mdast-util-find-and-replace@npm:^3.0.0, mdast-util-find-and-replace@npm:^3.0.1": - version: 3.0.1 - resolution: "mdast-util-find-and-replace@npm:3.0.1" - dependencies: - "@types/mdast": "npm:^4.0.0" - escape-string-regexp: "npm:^5.0.0" - unist-util-is: "npm:^6.0.0" - unist-util-visit-parents: "npm:^6.0.0" - checksum: 10c0/1faca98c4ee10a919f23b8cc6d818e5bb6953216a71dfd35f51066ed5d51ef86e5063b43dcfdc6061cd946e016a9f0d44a1dccadd58452cf4ed14e39377f00cb - languageName: node - linkType: hard - -"mdast-util-from-markdown@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-from-markdown@npm:2.0.1" - dependencies: - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - decode-named-character-reference: "npm:^1.0.0" - devlop: "npm:^1.0.0" - mdast-util-to-string: "npm:^4.0.0" - micromark: "npm:^4.0.0" - micromark-util-decode-numeric-character-reference: "npm:^2.0.0" - micromark-util-decode-string: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - unist-util-stringify-position: "npm:^4.0.0" - checksum: 10c0/496596bc6419200ff6258531a0ebcaee576a5c169695f5aa296a79a85f2a221bb9247d565827c709a7c2acfb56ae3c3754bf483d86206617bd299a9658c8121c - languageName: node - linkType: hard - -"mdast-util-frontmatter@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-frontmatter@npm:2.0.1" - dependencies: - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - escape-string-regexp: "npm:^5.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - micromark-extension-frontmatter: "npm:^2.0.0" - checksum: 10c0/d9b0b70dd9c574cc0220d4e05dd8e9d86ac972a6a5af9e0c49c839b31cb750d4313445cfbbdf9264a7fbe3f8c8d920b45358b8500f4286e6b9dc830095b25b9a - languageName: node - linkType: hard - -"mdast-util-gfm-autolink-literal@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-autolink-literal@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - ccount: "npm:^2.0.0" - devlop: "npm:^1.0.0" - mdast-util-find-and-replace: "npm:^3.0.0" - micromark-util-character: "npm:^2.0.0" - checksum: 10c0/821ef91db108f05b321c54fdf4436df9d6badb33e18f714d8d52c0e70f988f5b6b118cdd4d607b4cb3bef1718304ce7e9fb25fa580622c3d20d68c1489c64875 - languageName: node - linkType: hard - -"mdast-util-gfm-footnote@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-footnote@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.1.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - checksum: 10c0/c673b22bea24740235e74cfd66765b41a2fa540334f7043fa934b94938b06b7d3c93f2d3b33671910c5492b922c0cc98be833be3b04cfed540e0679650a6d2de - languageName: node - linkType: hard - -"mdast-util-gfm-strikethrough@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-strikethrough@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/b053e93d62c7545019bd914271ea9e5667ad3b3b57d16dbf68e56fea39a7e19b4a345e781312714eb3d43fdd069ff7ee22a3ca7f6149dfa774554f19ce3ac056 - languageName: node - linkType: hard - -"mdast-util-gfm-table@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-table@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - markdown-table: "npm:^3.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/128af47c503a53bd1c79f20642561e54a510ad5e2db1e418d28fefaf1294ab839e6c838e341aef5d7e404f9170b9ca3d1d89605f234efafde93ee51174a6e31e - languageName: node - linkType: hard - -"mdast-util-gfm-task-list-item@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-task-list-item@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/258d725288482b636c0a376c296431390c14b4f29588675297cb6580a8598ed311fc73ebc312acfca12cc8546f07a3a285a53a3b082712e2cbf5c190d677d834 - languageName: node - linkType: hard - -"mdast-util-gfm@npm:^3.0.0": - version: 3.0.0 - resolution: "mdast-util-gfm@npm:3.0.0" - dependencies: - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-gfm-autolink-literal: "npm:^2.0.0" - mdast-util-gfm-footnote: "npm:^2.0.0" - mdast-util-gfm-strikethrough: "npm:^2.0.0" - mdast-util-gfm-table: "npm:^2.0.0" - mdast-util-gfm-task-list-item: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/91596fe9bf3e4a0c546d0c57f88106c17956d9afbe88ceb08308e4da2388aff64489d649ddad599caecfdf755fc3ae4c9b82c219b85281bc0586b67599881fca - languageName: node - linkType: hard - -"mdast-util-mdx-expression@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-mdx-expression@npm:2.0.0" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/512848cbc44b9dc7cffc1bb3f95f7e67f0d6562870e56a67d25647f475d411e136b915ba417c8069fb36eac1839d0209fb05fb323d377f35626a82fcb0879363 - languageName: node - linkType: hard - -"mdast-util-mdx-jsx@npm:^3.0.0": - version: 3.1.2 - resolution: "mdast-util-mdx-jsx@npm:3.1.2" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - ccount: "npm:^2.0.0" - devlop: "npm:^1.1.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - parse-entities: "npm:^4.0.0" - stringify-entities: "npm:^4.0.0" - unist-util-remove-position: "npm:^5.0.0" - unist-util-stringify-position: "npm:^4.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/855b60c3db9bde2fe142bd366597f7bd5892fc288428ba054e26ffcffc07bfe5648c0792d614ba6e08b1eab9784ffc3c1267cf29dfc6db92b419d68b5bcd487d - languageName: node - linkType: hard - -"mdast-util-mdx@npm:^3.0.0": - version: 3.0.0 - resolution: "mdast-util-mdx@npm:3.0.0" - dependencies: - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-mdx-expression: "npm:^2.0.0" - mdast-util-mdx-jsx: "npm:^3.0.0" - mdast-util-mdxjs-esm: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/4faea13f77d6bc9aa64ee41a5e4779110b73444a17fda363df6ebe880ecfa58b321155b71f8801c3faa6d70d6222a32a00cbd6dbf5fad8db417f4688bc9c74e1 - languageName: node - linkType: hard - -"mdast-util-mdxjs-esm@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-mdxjs-esm@npm:2.0.1" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/5bda92fc154141705af2b804a534d891f28dac6273186edf1a4c5e3f045d5b01dbcac7400d27aaf91b7e76e8dce007c7b2fdf136c11ea78206ad00bdf9db46bc - languageName: node - linkType: hard - -"mdast-util-phrasing@npm:^4.0.0": - version: 4.1.0 - resolution: "mdast-util-phrasing@npm:4.1.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - unist-util-is: "npm:^6.0.0" - checksum: 10c0/bf6c31d51349aa3d74603d5e5a312f59f3f65662ed16c58017169a5fb0f84ca98578f626c5ee9e4aa3e0a81c996db8717096705521bddb4a0185f98c12c9b42f - languageName: node - linkType: hard - -"mdast-util-to-hast@npm:^13.0.0": - version: 13.2.0 - resolution: "mdast-util-to-hast@npm:13.2.0" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - "@ungap/structured-clone": "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - trim-lines: "npm:^3.0.0" - unist-util-position: "npm:^5.0.0" - unist-util-visit: "npm:^5.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/9ee58def9287df8350cbb6f83ced90f9c088d72d4153780ad37854f87144cadc6f27b20347073b285173b1649b0723ddf0b9c78158608a804dcacb6bda6e1816 - languageName: node - linkType: hard - -"mdast-util-to-markdown@npm:^2.0.0": - version: 2.1.0 - resolution: "mdast-util-to-markdown@npm:2.1.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - longest-streak: "npm:^3.0.0" - mdast-util-phrasing: "npm:^4.0.0" - mdast-util-to-string: "npm:^4.0.0" - micromark-util-decode-string: "npm:^2.0.0" - unist-util-visit: "npm:^5.0.0" - zwitch: "npm:^2.0.0" - checksum: 10c0/8bd37a9627a438ef6418d6642661904d0cc03c5c732b8b018a8e238ef5cc82fe8aef1940b19c6f563245e58b9659f35e527209bd3fe145f3c723ba14d18fc3e6 - languageName: node - linkType: hard - -"mdast-util-to-string@npm:^4.0.0": - version: 4.0.0 - resolution: "mdast-util-to-string@npm:4.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - checksum: 10c0/2d3c1af29bf3fe9c20f552ee9685af308002488f3b04b12fa66652c9718f66f41a32f8362aa2d770c3ff464c034860b41715902ada2306bb0a055146cef064d7 - languageName: node - linkType: hard - -"mdn-data@npm:2.0.28": - version: 2.0.28 - resolution: "mdn-data@npm:2.0.28" - checksum: 10c0/20000932bc4cd1cde9cba4e23f08cc4f816398af4c15ec81040ed25421d6bf07b5cf6b17095972577fb498988f40f4cb589e3169b9357bb436a12d8e07e5ea7b - languageName: node - linkType: hard - -"mdn-data@npm:2.0.30": - version: 2.0.30 - resolution: "mdn-data@npm:2.0.30" - checksum: 10c0/a2c472ea16cee3911ae742593715aa4c634eb3d4b9f1e6ada0902aa90df13dcbb7285d19435f3ff213ebaa3b2e0c0265c1eb0e3fb278fda7f8919f046a410cd9 - languageName: node - linkType: hard - -"mdurl@npm:^2.0.0": - version: 2.0.0 - resolution: "mdurl@npm:2.0.0" - checksum: 10c0/633db522272f75ce4788440669137c77540d74a83e9015666a9557a152c02e245b192edc20bc90ae953bbab727503994a53b236b4d9c99bdaee594d0e7dd2ce0 - languageName: node - linkType: hard - -"media-typer@npm:0.3.0": - version: 0.3.0 - resolution: "media-typer@npm:0.3.0" - checksum: 10c0/d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 - languageName: node - linkType: hard - -"memfs@npm:^3.1.2, memfs@npm:^3.4.3": - version: 3.5.3 - resolution: "memfs@npm:3.5.3" - dependencies: - fs-monkey: "npm:^1.0.4" - checksum: 10c0/038fc81bce17ea92dde15aaa68fa0fdaf4960c721ce3ffc7c2cb87a259333f5159784ea48b3b72bf9e054254d9d0d0d5209d0fdc3d07d08653a09933b168fbd7 - languageName: node - linkType: hard - -"merge-descriptors@npm:1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: 10c0/b67d07bd44cfc45cebdec349bb6e1f7b077ee2fd5beb15d1f7af073849208cb6f144fe403e29a36571baf3f4e86469ac39acf13c318381e958e186b2766f54ec - languageName: node - linkType: hard - -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 - languageName: node - linkType: hard - -"merge2@npm:^1.3.0, merge2@npm:^1.4.1": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb - languageName: node - linkType: hard - -"methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 - languageName: node - linkType: hard - -"micromark-core-commonmark@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-core-commonmark@npm:2.0.1" - dependencies: - decode-named-character-reference: "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-factory-destination: "npm:^2.0.0" - micromark-factory-label: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-factory-title: "npm:^2.0.0" - micromark-factory-whitespace: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-classify-character: "npm:^2.0.0" - micromark-util-html-tag-name: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-resolve-all: "npm:^2.0.0" - micromark-util-subtokenize: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/a0b280b1b6132f600518e72cb29a4dd1b2175b85f5ed5b25d2c5695e42b876b045971370daacbcfc6b4ce8cf7acbf78dd3a0284528fb422b450144f4b3bebe19 - languageName: node - linkType: hard - -"micromark-extension-directive@npm:^3.0.0": - version: 3.0.1 - resolution: "micromark-extension-directive@npm:3.0.1" - dependencies: - devlop: "npm:^1.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-factory-whitespace: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - parse-entities: "npm:^4.0.0" - checksum: 10c0/9d226fba0ce18f326d2b28cf2b981c78f6c0c7c2f85e810bf4b12a788dfa4b694386589b081da165227da573ff547238f39c5258d09954b055f167bba1af4983 - languageName: node - linkType: hard - -"micromark-extension-frontmatter@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-frontmatter@npm:2.0.0" - dependencies: - fault: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/7d0d876e598917a67146d29f536d6fbbf9d1b2401a77e2f64a3f80f934a63ff26fa94b01759c9185c24b2a91e4e6abf908fa7aa246f00a7778a6b37a17464300 - languageName: node - linkType: hard - -"micromark-extension-gfm-autolink-literal@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-extension-gfm-autolink-literal@npm:2.1.0" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/84e6fbb84ea7c161dfa179665dc90d51116de4c28f3e958260c0423e5a745372b7dcbc87d3cde98213b532e6812f847eef5ae561c9397d7f7da1e59872ef3efe - languageName: node - linkType: hard - -"micromark-extension-gfm-footnote@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-extension-gfm-footnote@npm:2.1.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-core-commonmark: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/d172e4218968b7371b9321af5cde8c77423f73b233b2b0fcf3ff6fd6f61d2e0d52c49123a9b7910612478bf1f0d5e88c75a3990dd68f70f3933fe812b9f77edc - languageName: node - linkType: hard - -"micromark-extension-gfm-strikethrough@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-extension-gfm-strikethrough@npm:2.1.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-classify-character: "npm:^2.0.0" - micromark-util-resolve-all: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/ef4f248b865bdda71303b494671b7487808a340b25552b11ca6814dff3fcfaab9be8d294643060bbdb50f79313e4a686ab18b99cbe4d3ee8a4170fcd134234fb - languageName: node - linkType: hard - -"micromark-extension-gfm-table@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-extension-gfm-table@npm:2.1.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/c1b564ab68576406046d825b9574f5b4dbedbb5c44bede49b5babc4db92f015d9057dd79d8e0530f2fecc8970a695c40ac2e5e1d4435ccf3ef161038d0d1463b - languageName: node - linkType: hard - -"micromark-extension-gfm-tagfilter@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-gfm-tagfilter@npm:2.0.0" - dependencies: - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/995558843fff137ae4e46aecb878d8a4691cdf23527dcf1e2f0157d66786be9f7bea0109c52a8ef70e68e3f930af811828ba912239438e31a9cfb9981f44d34d - languageName: node - linkType: hard - -"micromark-extension-gfm-task-list-item@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-extension-gfm-task-list-item@npm:2.1.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/78aa537d929e9309f076ba41e5edc99f78d6decd754b6734519ccbbfca8abd52e1c62df68d41a6ae64d2a3fc1646cea955893c79680b0b4385ced4c52296181f - languageName: node - linkType: hard - -"micromark-extension-gfm@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-gfm@npm:3.0.0" - dependencies: - micromark-extension-gfm-autolink-literal: "npm:^2.0.0" - micromark-extension-gfm-footnote: "npm:^2.0.0" - micromark-extension-gfm-strikethrough: "npm:^2.0.0" - micromark-extension-gfm-table: "npm:^2.0.0" - micromark-extension-gfm-tagfilter: "npm:^2.0.0" - micromark-extension-gfm-task-list-item: "npm:^2.0.0" - micromark-util-combine-extensions: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/970e28df6ebdd7c7249f52a0dda56e0566fbfa9ae56c8eeeb2445d77b6b89d44096880cd57a1c01e7821b1f4e31009109fbaca4e89731bff7b83b8519690e5d9 - languageName: node - linkType: hard - -"micromark-extension-mdx-expression@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-mdx-expression@npm:3.0.0" - dependencies: - "@types/estree": "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-factory-mdx-expression: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-events-to-acorn: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/fa799c594d8ff9ecbbd28e226959c4928590cfcddb60a926d9d859d00fc7acd25684b6f78dbe6a7f0830879a402b4a3628efd40bb9df1f5846e6d2b7332715f7 - languageName: node - linkType: hard - -"micromark-extension-mdx-jsx@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-mdx-jsx@npm:3.0.0" - dependencies: - "@types/acorn": "npm:^4.0.0" - "@types/estree": "npm:^1.0.0" - devlop: "npm:^1.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - micromark-factory-mdx-expression: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/18a81c8def7f3a2088dc435bba19e649c19f679464b1a01e2c680f9518820e70fb0974b8403c790aee8f44205833a280b56ba157fe5a5b2903b476c5de5ba353 - languageName: node - linkType: hard - -"micromark-extension-mdx-md@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-mdx-md@npm:2.0.0" - dependencies: - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/bae91c61273de0e5ba80a980c03470e6cd9d7924aa936f46fbda15d780704d9386e945b99eda200e087b96254fbb4271a9545d5ce02676cd6ae67886a8bf82df - languageName: node - linkType: hard - -"micromark-extension-mdxjs-esm@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-mdxjs-esm@npm:3.0.0" - dependencies: - "@types/estree": "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-core-commonmark: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-events-to-acorn: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - unist-util-position-from-estree: "npm:^2.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/13e3f726495a960650cdedcba39198ace5bdc953ccb12c14d71fc9ed9bb88e40cc3ba9231e973f6984da3b3573e7ddb23ce409f7c16f52a8d57b608bf46c748d - languageName: node - linkType: hard - -"micromark-extension-mdxjs@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-mdxjs@npm:3.0.0" - dependencies: - acorn: "npm:^8.0.0" - acorn-jsx: "npm:^5.0.0" - micromark-extension-mdx-expression: "npm:^3.0.0" - micromark-extension-mdx-jsx: "npm:^3.0.0" - micromark-extension-mdx-md: "npm:^2.0.0" - micromark-extension-mdxjs-esm: "npm:^3.0.0" - micromark-util-combine-extensions: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/fd84f036ddad0aabbc12e7f1b3e9dcfe31573bbc413c5ae903779ef0366d7a4c08193547e7ba75718c9f45654e45f52e575cfc2f23a5f89205a8a70d9a506aea - languageName: node - linkType: hard - -"micromark-factory-destination@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-destination@npm:2.0.0" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/b73492f687d41a6a379159c2f3acbf813042346bcea523d9041d0cc6124e6715f0779dbb2a0b3422719e9764c3b09f9707880aa159557e3cb4aeb03b9d274915 - languageName: node - linkType: hard - -"micromark-factory-label@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-label@npm:2.0.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/8ffad00487a7891941b1d1f51d53a33c7a659dcf48617edb7a4008dad7aff67ec316baa16d55ca98ae3d75ce1d81628dbf72fedc7c6f108f740dec0d5d21c8ee - languageName: node - linkType: hard - -"micromark-factory-mdx-expression@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-factory-mdx-expression@npm:2.0.1" - dependencies: - "@types/estree": "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-events-to-acorn: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - unist-util-position-from-estree: "npm:^2.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/d9cf475a73a7fbfa09aba0d057e033d57e45b7adff78692be9efb4405c4a1717ece4594a632f92a4302e4f8f2ae96355785b616e3f5b2fe8599ec24cfdeee12d - languageName: node - linkType: hard - -"micromark-factory-space@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-factory-space@npm:1.1.0" - dependencies: - micromark-util-character: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: 10c0/3da81187ce003dd4178c7adc4674052fb8befc8f1a700ae4c8227755f38581a4ae963866dc4857488d62d1dc9837606c9f2f435fa1332f62a0f1c49b83c6a822 - languageName: node - linkType: hard - -"micromark-factory-space@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-space@npm:2.0.0" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/103ca954dade963d4ff1d2f27d397833fe855ddc72590205022832ef68b775acdea67949000cee221708e376530b1de78c745267b0bf8366740840783eb37122 - languageName: node - linkType: hard - -"micromark-factory-title@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-title@npm:2.0.0" - dependencies: - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/2b2188e7a011b1b001faf8c860286d246d5c3485ef8819270c60a5808f4c7613e49d4e481dbdff62600ef7acdba0f5100be2d125cbd2a15e236c26b3668a8ebd - languageName: node - linkType: hard - -"micromark-factory-whitespace@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-whitespace@npm:2.0.0" - dependencies: - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/4e91baab0cc71873095134bd0e225d01d9786cde352701402d71b72d317973954754e8f9f1849901f165530e6421202209f4d97c460a27bb0808ec5a3fc3148c - languageName: node - linkType: hard - -"micromark-util-character@npm:^1.0.0, micromark-util-character@npm:^1.1.0": - version: 1.2.0 - resolution: "micromark-util-character@npm:1.2.0" - dependencies: - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: 10c0/3390a675a50731b58a8e5493cd802e190427f10fa782079b455b00f6b54e406e36882df7d4a3bd32b709f7a2c3735b4912597ebc1c0a99566a8d8d0b816e2cd4 - languageName: node - linkType: hard - -"micromark-util-character@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-util-character@npm:2.1.0" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/fc37a76aaa5a5138191ba2bef1ac50c36b3bcb476522e98b1a42304ab4ec76f5b036a746ddf795d3de3e7004b2c09f21dd1bad42d161f39b8cfc0acd067e6373 - languageName: node - linkType: hard - -"micromark-util-chunked@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-chunked@npm:2.0.0" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/043b5f2abc8c13a1e2e4c378ead191d1a47ed9e0cd6d0fa5a0a430b2df9e17ada9d5de5a20688a000bbc5932507e746144acec60a9589d9a79fa60918e029203 - languageName: node - linkType: hard - -"micromark-util-classify-character@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-classify-character@npm:2.0.0" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/2bf5fa5050faa9b69f6c7e51dbaaf02329ab70fabad8229984381b356afbbf69db90f4617bec36d814a7d285fb7cad8e3c4e38d1daf4387dc9e240aa7f9a292a - languageName: node - linkType: hard - -"micromark-util-combine-extensions@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-combine-extensions@npm:2.0.0" - dependencies: - micromark-util-chunked: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/cd4c8d1a85255527facb419ff3b3cc3d7b7f27005c5ef5fa7ef2c4d0e57a9129534fc292a188ec2d467c2c458642d369c5f894bc8a9e142aed6696cc7989d3ea - languageName: node - linkType: hard - -"micromark-util-decode-numeric-character-reference@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.1" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/3f6d684ee8f317c67806e19b3e761956256cb936a2e0533aad6d49ac5604c6536b2041769c6febdd387ab7175b7b7e551851bf2c1f78da943e7a3671ca7635ac - languageName: node - linkType: hard - -"micromark-util-decode-string@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-decode-string@npm:2.0.0" - dependencies: - decode-named-character-reference: "npm:^1.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-decode-numeric-character-reference: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/f5413bebb21bdb686cfa1bcfa7e9c93093a523d1b42443ead303b062d2d680a94e5e8424549f57b8ba9d786a758e5a26a97f56068991bbdbca5d1885b3aa7227 - languageName: node - linkType: hard - -"micromark-util-encode@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-encode@npm:2.0.0" - checksum: 10c0/ebdaafff23100bbf4c74e63b4b1612a9ddf94cd7211d6a076bc6fb0bc32c1b48d6fb615aa0953e607c62c97d849f97f1042260d3eb135259d63d372f401bbbb2 - languageName: node - linkType: hard - -"micromark-util-events-to-acorn@npm:^2.0.0": - version: 2.0.2 - resolution: "micromark-util-events-to-acorn@npm:2.0.2" - dependencies: - "@types/acorn": "npm:^4.0.0" - "@types/estree": "npm:^1.0.0" - "@types/unist": "npm:^3.0.0" - devlop: "npm:^1.0.0" - estree-util-visit: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/2bd2660a49efddb625e6adcabdc3384ae4c50c7a04270737270f4aab53d09e8253e6d2607cd947c4c77f8a9900278915babb240e61fd143dc5bab51d9fd50709 - languageName: node - linkType: hard - -"micromark-util-html-tag-name@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-html-tag-name@npm:2.0.0" - checksum: 10c0/988aa26367449bd345b627ae32cf605076daabe2dc1db71b578a8a511a47123e14af466bcd6dcbdacec60142f07bc2723ec5f7a0eed0f5319ce83b5e04825429 - languageName: node - linkType: hard - -"micromark-util-normalize-identifier@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-normalize-identifier@npm:2.0.0" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/93bf8789b8449538f22cf82ac9b196363a5f3b2f26efd98aef87c4c1b1f8c05be3ef6391ff38316ff9b03c1a6fd077342567598019ddd12b9bd923dacc556333 - languageName: node - linkType: hard - -"micromark-util-resolve-all@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-resolve-all@npm:2.0.0" - dependencies: - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/3b912e88453dcefe728a9080c8934a75ac4732056d6576ceecbcaf97f42c5d6fa2df66db8abdc8427eb167c5ffddefe26713728cfe500bc0e314ed260d6e2746 - languageName: node - linkType: hard - -"micromark-util-sanitize-uri@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-sanitize-uri@npm:2.0.0" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-encode: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/74763ca1c927dd520d3ab8fd9856a19740acf76fc091f0a1f5d4e99c8cd5f1b81c5a0be3efb564941a071fb6d85fd951103f2760eb6cff77b5ab3abe08341309 - languageName: node - linkType: hard - -"micromark-util-subtokenize@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-subtokenize@npm:2.0.1" - dependencies: - devlop: "npm:^1.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/000cefde827db129f4ed92b8fbdeb4866c5f9c93068c0115485564b0426abcb9058080aa257df9035e12ca7fa92259d66623ea750b9eb3bcdd8325d3fb6fc237 - languageName: node - linkType: hard - -"micromark-util-symbol@npm:^1.0.0, micromark-util-symbol@npm:^1.0.1": - version: 1.1.0 - resolution: "micromark-util-symbol@npm:1.1.0" - checksum: 10c0/10ceaed33a90e6bfd3a5d57053dbb53f437d4809cc11430b5a09479c0ba601577059be9286df4a7eae6e350a60a2575dc9fa9d9872b5b8d058c875e075c33803 - languageName: node - linkType: hard - -"micromark-util-symbol@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-symbol@npm:2.0.0" - checksum: 10c0/4e76186c185ce4cefb9cea8584213d9ffacd77099d1da30c0beb09fa21f46f66f6de4c84c781d7e34ff763fe3a06b530e132fa9004882afab9e825238d0aa8b3 - languageName: node - linkType: hard - -"micromark-util-types@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-types@npm:1.1.0" - checksum: 10c0/a9749cb0a12a252ff536baabcb7012421b6fad4d91a5fdd80d7b33dc7b4c22e2d0c4637dfe5b902d00247fe6c9b01f4a24fce6b572b16ccaa4da90e6ce2a11e4 - languageName: node - linkType: hard - -"micromark-util-types@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-types@npm:2.0.0" - checksum: 10c0/d74e913b9b61268e0d6939f4209e3abe9dada640d1ee782419b04fd153711112cfaaa3c4d5f37225c9aee1e23c3bb91a1f5223e1e33ba92d33e83956a53e61de - languageName: node - linkType: hard - -"micromark@npm:^4.0.0": - version: 4.0.0 - resolution: "micromark@npm:4.0.0" - dependencies: - "@types/debug": "npm:^4.0.0" - debug: "npm:^4.0.0" - decode-named-character-reference: "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-core-commonmark: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-combine-extensions: "npm:^2.0.0" - micromark-util-decode-numeric-character-reference: "npm:^2.0.0" - micromark-util-encode: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-resolve-all: "npm:^2.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - micromark-util-subtokenize: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/7e91c8d19ff27bc52964100853f1b3b32bb5b2ece57470a34ba1b2f09f4e2a183d90106c4ae585c9f2046969ee088576fed79b2f7061cba60d16652ccc2c64fd - languageName: node - linkType: hard - -"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.7": - version: 4.0.7 - resolution: "micromatch@npm:4.0.7" - dependencies: - braces: "npm:^3.0.3" - picomatch: "npm:^2.3.1" - checksum: 10c0/58fa99bc5265edec206e9163a1d2cec5fabc46a5b473c45f4a700adce88c2520456ae35f2b301e4410fb3afb27e9521fb2813f6fc96be0a48a89430e0916a772 - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa - languageName: node - linkType: hard - -"mime-db@npm:>= 1.43.0 < 2": - version: 1.53.0 - resolution: "mime-db@npm:1.53.0" - checksum: 10c0/1dcc37ba8ed5d1c179f5c6f0837e8db19371d5f2ea3690c3c2f3fa8c3858f976851d3460b172b4dee78ebd606762cbb407aa398545fbacd539e519f858cd7bf4 - languageName: node - linkType: hard - -"mime-db@npm:~1.33.0": - version: 1.33.0 - resolution: "mime-db@npm:1.33.0" - checksum: 10c0/79172ce5468c8503b49dddfdddc18d3f5fe2599f9b5fe1bc321a8cbee14c96730fc6db22f907b23701b05b2936f865795f62ec3a78a7f3c8cb2450bb68c6763e - languageName: node - linkType: hard - -"mime-types@npm:2.1.18": - version: 2.1.18 - resolution: "mime-types@npm:2.1.18" - dependencies: - mime-db: "npm:~1.33.0" - checksum: 10c0/a96a8d12f4bb98bc7bfac6a8ccbd045f40368fc1030d9366050c3613825d3715d1c1f393e10a75a885d2cdc1a26cd6d5e11f3a2a0d5c4d361f00242139430a0f - languageName: node - linkType: hard - -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: "npm:1.52.0" - checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 - languageName: node - linkType: hard - -"mime@npm:1.6.0": - version: 1.6.0 - resolution: "mime@npm:1.6.0" - bin: - mime: cli.js - checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 - languageName: node - linkType: hard - -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 - languageName: node - linkType: hard - -"mimic-response@npm:^3.1.0": - version: 3.1.0 - resolution: "mimic-response@npm:3.1.0" - checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 - languageName: node - linkType: hard - -"mimic-response@npm:^4.0.0": - version: 4.0.0 - resolution: "mimic-response@npm:4.0.0" - checksum: 10c0/761d788d2668ae9292c489605ffd4fad220f442fbae6832adce5ebad086d691e906a6d5240c290293c7a11e99fbdbbef04abbbed498bf8699a4ee0f31315e3fb - languageName: node - linkType: hard - -"min-indent@npm:^1.0.0": - version: 1.0.1 - resolution: "min-indent@npm:1.0.1" - checksum: 10c0/7e207bd5c20401b292de291f02913230cb1163abca162044f7db1d951fa245b174dc00869d40dd9a9f32a885ad6a5f3e767ee104cf278f399cb4e92d3f582d5c - languageName: node - linkType: hard - -"mini-css-extract-plugin@npm:^2.7.6": - version: 2.9.0 - resolution: "mini-css-extract-plugin@npm:2.9.0" - dependencies: - schema-utils: "npm:^4.0.0" - tapable: "npm:^2.2.1" - peerDependencies: - webpack: ^5.0.0 - checksum: 10c0/46e20747ea250420db8a82801b9779299ce3cd5ec4d6dd75e00904c39cc80f0f01decaa534b8cb9658d7d3b656b919cb2cc84b1ba7e2394d2d6548578a5c2901 - languageName: node - linkType: hard - -"minimalistic-assert@npm:^1.0.0": - version: 1.0.1 - resolution: "minimalistic-assert@npm:1.0.1" - checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd - languageName: node - linkType: hard - -"minimatch@npm:10.0.1, minimatch@npm:^10.0.0": - version: 10.0.1 - resolution: "minimatch@npm:10.0.1" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/e6c29a81fe83e1877ad51348306be2e8aeca18c88fdee7a99df44322314279e15799e41d7cb274e4e8bb0b451a3bc622d6182e157dfa1717d6cda75e9cd8cd5d - languageName: node - linkType: hard - -"minimatch@npm:3.1.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 - languageName: node - linkType: hard - -"minimatch@npm:^5.0.1, minimatch@npm:^5.1.0": - version: 5.1.6 - resolution: "minimatch@npm:5.1.6" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/3defdfd230914f22a8da203747c42ee3c405c39d4d37ffda284dac5e45b7e1f6c49aa8be606509002898e73091ff2a3bbfc59c2c6c71d4660609f63aa92f98e3 - languageName: node - linkType: hard - -"minimatch@npm:^9.0.3, minimatch@npm:^9.0.4, minimatch@npm:^9.0.5, minimatch@npm:~9.0.4": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed - languageName: node - linkType: hard - -"minimatch@npm:~3.0.3": - version: 3.0.8 - resolution: "minimatch@npm:3.0.8" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/72b226f452dcfb5075255f53534cb83fc25565b909e79b9be4fad463d735cb1084827f7013ff41d050e77ee6e474408c6073473edd2fb72c2fd630cfb0acc6ad - languageName: node - linkType: hard - -"minimist@npm:^1.2.0, minimist@npm:^1.2.6, minimist@npm:^1.2.8": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 - languageName: node - linkType: hard - -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e - languageName: node - linkType: hard - -"minipass-fetch@npm:^3.0.0": - version: 3.0.5 - resolution: "minipass-fetch@npm:3.0.5" - dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^2.1.2" - dependenciesMeta: - encoding: - optional: true - checksum: 10c0/9d702d57f556274286fdd97e406fc38a2f5c8d15e158b498d7393b1105974b21249289ec571fa2b51e038a4872bfc82710111cf75fae98c662f3d6f95e72152b - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c - languageName: node - linkType: hard - -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 - languageName: node - linkType: hard - -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: "npm:^3.0.0" - yallist: "npm:^4.0.0" - checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 - languageName: node - linkType: hard - -"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf - languageName: node - linkType: hard - -"mkdist@npm:^1.3.0": - version: 1.5.4 - resolution: "mkdist@npm:1.5.4" - dependencies: - autoprefixer: "npm:^10.4.19" - citty: "npm:^0.1.6" - cssnano: "npm:^7.0.4" - defu: "npm:^6.1.4" - esbuild: "npm:^0.23.0" - fast-glob: "npm:^3.3.2" - jiti: "npm:^1.21.6" - mlly: "npm:^1.7.1" - pathe: "npm:^1.1.2" - pkg-types: "npm:^1.1.3" - postcss: "npm:^8.4.39" - postcss-nested: "npm:^6.0.1" - semver: "npm:^7.6.2" - peerDependencies: - sass: ^1.77.8 - typescript: ">=5.5.3" - vue-tsc: ^1.8.27 || ^2.0.21 - peerDependenciesMeta: - sass: - optional: true - typescript: - optional: true - vue-tsc: - optional: true - bin: - mkdist: dist/cli.cjs - checksum: 10c0/ac7eb02b39109e1691cc40cc94f7e27cc8d0a1e3b6d370b8c119d8446192b1dd7e9d1afd31380050ea9fce95838c49319608d06088f1308b6225fb9e3f7738e2 - languageName: node - linkType: hard - -"mlly@npm:^1.4.0, mlly@npm:^1.7.1": - version: 1.7.1 - resolution: "mlly@npm:1.7.1" - dependencies: - acorn: "npm:^8.11.3" - pathe: "npm:^1.1.2" - pkg-types: "npm:^1.1.1" - ufo: "npm:^1.5.3" - checksum: 10c0/d836a7b0adff4d118af41fb93ad4d9e57f80e694a681185280ba220a4607603c19e86c80f9a6c57512b04280567f2599e3386081705c5b5fd74c9ddfd571d0fa - languageName: node - linkType: hard - -"moment@npm:^2.30.1": - version: 2.30.1 - resolution: "moment@npm:2.30.1" - checksum: 10c0/865e4279418c6de666fca7786607705fd0189d8a7b7624e2e56be99290ac846f90878a6f602e34b4e0455c549b85385b1baf9966845962b313699e7cb847543a - languageName: node - linkType: hard - -"mri@npm:^1.2.0": - version: 1.2.0 - resolution: "mri@npm:1.2.0" - checksum: 10c0/a3d32379c2554cf7351db6237ddc18dc9e54e4214953f3da105b97dc3babe0deb3ffe99cf409b38ea47cc29f9430561ba6b53b24ab8f9ce97a4b50409e4a50e7 - languageName: node - linkType: hard - -"mrmime@npm:^2.0.0": - version: 2.0.0 - resolution: "mrmime@npm:2.0.0" - checksum: 10c0/312b35ed288986aec90955410b21ed7427fd1e4ee318cb5fc18765c8d029eeded9444faa46589e5b1ed6b35fb2054a802ac8dcb917ddf6b3e189cb3bf11a965c - languageName: node - linkType: hard - -"ms@npm:2.0.0": - version: 2.0.0 - resolution: "ms@npm:2.0.0" - checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc - languageName: node - linkType: hard - -"ms@npm:2.1.3, ms@npm:^2.1.1": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 - languageName: node - linkType: hard - -"multicast-dns@npm:^7.2.5": - version: 7.2.5 - resolution: "multicast-dns@npm:7.2.5" - dependencies: - dns-packet: "npm:^5.2.2" - thunky: "npm:^1.0.2" - bin: - multicast-dns: cli.js - checksum: 10c0/5120171d4bdb1577764c5afa96e413353bff530d1b37081cb29cccc747f989eb1baf40574fe8e27060fc1aef72b59c042f72b9b208413de33bcf411343c69057 - languageName: node - linkType: hard - -"mute-stream@npm:~0.0.4": - version: 0.0.8 - resolution: "mute-stream@npm:0.0.8" - checksum: 10c0/18d06d92e5d6d45e2b63c0e1b8f25376af71748ac36f53c059baa8b76ffac31c5ab225480494e7d35d30215ecdb18fed26ec23cafcd2f7733f2f14406bcd19e2 - languageName: node - linkType: hard - -"nanoid@npm:^3.3.7": - version: 3.3.7 - resolution: "nanoid@npm:3.3.7" - bin: - nanoid: bin/nanoid.cjs - checksum: 10c0/e3fb661aa083454f40500473bb69eedb85dc160e763150b9a2c567c7e9ff560ce028a9f833123b618a6ea742e311138b591910e795614a629029e86e180660f3 - languageName: node - linkType: hard - -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 - languageName: node - linkType: hard - -"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 - languageName: node - linkType: hard - -"neo-async@npm:^2.6.2": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: 10c0/c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d - languageName: node - linkType: hard - -"no-case@npm:^3.0.4": - version: 3.0.4 - resolution: "no-case@npm:3.0.4" - dependencies: - lower-case: "npm:^2.0.2" - tslib: "npm:^2.0.3" - checksum: 10c0/8ef545f0b3f8677c848f86ecbd42ca0ff3cd9dd71c158527b344c69ba14710d816d8489c746b6ca225e7b615108938a0bda0a54706f8c255933703ac1cf8e703 - languageName: node - linkType: hard - -"node-emoji@npm:^2.1.0": - version: 2.1.3 - resolution: "node-emoji@npm:2.1.3" - dependencies: - "@sindresorhus/is": "npm:^4.6.0" - char-regex: "npm:^1.0.2" - emojilib: "npm:^2.4.0" - skin-tone: "npm:^2.0.0" - checksum: 10c0/e688333373563aa8308df16111eee2b5837b53a51fb63bf8b7fbea2896327c5d24c9984eb0c8ca6ac155d4d9c194dcf1840d271033c1b588c7c45a3b65339ef7 - languageName: node - linkType: hard - -"node-forge@npm:^1": - version: 1.3.1 - resolution: "node-forge@npm:1.3.1" - checksum: 10c0/e882819b251a4321f9fc1d67c85d1501d3004b4ee889af822fd07f64de3d1a8e272ff00b689570af0465d65d6bf5074df9c76e900e0aff23e60b847f2a46fbe8 - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 10.2.0 - resolution: "node-gyp@npm:10.2.0" - dependencies: - env-paths: "npm:^2.2.0" - exponential-backoff: "npm:^3.1.1" - glob: "npm:^10.3.10" - graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^13.0.0" - nopt: "npm:^7.0.0" - proc-log: "npm:^4.1.0" - semver: "npm:^7.3.5" - tar: "npm:^6.2.1" - which: "npm:^4.0.0" - bin: - node-gyp: bin/node-gyp.js - checksum: 10c0/00630d67dbd09a45aee0a5d55c05e3916ca9e6d427ee4f7bc392d2d3dc5fad7449b21fc098dd38260a53d9dcc9c879b36704a1994235d4707e7271af7e9a835b - languageName: node - linkType: hard - -"node-int64@npm:^0.4.0": - version: 0.4.0 - resolution: "node-int64@npm:0.4.0" - checksum: 10c0/a6a4d8369e2f2720e9c645255ffde909c0fbd41c92ea92a5607fc17055955daac99c1ff589d421eee12a0d24e99f7bfc2aabfeb1a4c14742f6c099a51863f31a - languageName: node - linkType: hard - -"node-releases@npm:^2.0.18": - version: 2.0.18 - resolution: "node-releases@npm:2.0.18" - checksum: 10c0/786ac9db9d7226339e1dc84bbb42007cb054a346bd9257e6aa154d294f01bc6a6cddb1348fa099f079be6580acbb470e3c048effd5f719325abd0179e566fd27 - languageName: node - linkType: hard - -"nopt@npm:^7.0.0": - version: 7.2.1 - resolution: "nopt@npm:7.2.1" - dependencies: - abbrev: "npm:^2.0.0" - bin: - nopt: bin/nopt.js - checksum: 10c0/a069c7c736767121242037a22a788863accfa932ab285a1eb569eb8cd534b09d17206f68c37f096ae785647435e0c5a5a0a67b42ec743e481a455e5ae6a6df81 - languageName: node - linkType: hard - -"normalize-package-data@npm:^2.5.0": - version: 2.5.0 - resolution: "normalize-package-data@npm:2.5.0" - dependencies: - hosted-git-info: "npm:^2.1.4" - resolve: "npm:^1.10.0" - semver: "npm:2 || 3 || 4 || 5" - validate-npm-package-license: "npm:^3.0.1" - checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 - languageName: node - linkType: hard - -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 - languageName: node - linkType: hard - -"normalize-range@npm:^0.1.2": - version: 0.1.2 - resolution: "normalize-range@npm:0.1.2" - checksum: 10c0/bf39b73a63e0a42ad1a48c2bd1bda5a07ede64a7e2567307a407674e595bcff0fa0d57e8e5f1e7fa5e91000797c7615e13613227aaaa4d6d6e87f5bd5cc95de6 - languageName: node - linkType: hard - -"normalize-url@npm:^8.0.0": - version: 8.0.1 - resolution: "normalize-url@npm:8.0.1" - checksum: 10c0/eb439231c4b84430f187530e6fdac605c5048ef4ec556447a10c00a91fc69b52d8d8298d9d608e68d3e0f7dc2d812d3455edf425e0f215993667c3183bcab1ef - languageName: node - linkType: hard - -"npm-check-updates@npm:^17.0.6": - version: 17.0.6 - resolution: "npm-check-updates@npm:17.0.6" - bin: - ncu: build/cli.js - npm-check-updates: build/cli.js - checksum: 10c0/abf3dbb45e21d1364112ace62a7e1d1e6de30d02ee387bc63b8f392d8084db4ccdf77fb1e208f41abd67125f20251d7f224d04d46400ab01fddc31e05faf2f21 - languageName: node - linkType: hard - -"npm-package-arg@npm:11.0.3": - version: 11.0.3 - resolution: "npm-package-arg@npm:11.0.3" - dependencies: - hosted-git-info: "npm:^7.0.0" - proc-log: "npm:^4.0.0" - semver: "npm:^7.3.5" - validate-npm-package-name: "npm:^5.0.0" - checksum: 10c0/e18333485e05c3a8774f4b5701ef74f4799533e650b70a68ca8dd697666c9a8d46932cb765fc593edce299521033bd4025a40323d5240cea8a393c784c0c285a - languageName: node - linkType: hard - -"npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" - dependencies: - path-key: "npm:^3.0.0" - checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac - languageName: node - linkType: hard - -"npm-run-path@npm:^5.2.0": - version: 5.3.0 - resolution: "npm-run-path@npm:5.3.0" - dependencies: - path-key: "npm:^4.0.0" - checksum: 10c0/124df74820c40c2eb9a8612a254ea1d557ddfab1581c3e751f825e3e366d9f00b0d76a3c94ecd8398e7f3eee193018622677e95816e8491f0797b21e30b2deba - languageName: node - linkType: hard - -"nprogress@npm:^0.2.0": - version: 0.2.0 - resolution: "nprogress@npm:0.2.0" - checksum: 10c0/eab9a923a1ad1eed71a455ecfbc358442dd9bcd71b9fa3fa1c67eddf5159360b182c218f76fca320c97541a1b45e19ced04e6dcb044a662244c5419f8ae9e821 - languageName: node - linkType: hard - -"nth-check@npm:^2.0.1": - version: 2.1.1 - resolution: "nth-check@npm:2.1.1" - dependencies: - boolbase: "npm:^1.0.0" - checksum: 10c0/5fee7ff309727763689cfad844d979aedd2204a817fbaaf0e1603794a7c20db28548d7b024692f953557df6ce4a0ee4ae46cd8ebd9b36cfb300b9226b567c479 - languageName: node - linkType: hard - -"object-assign@npm:^4.1.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 - languageName: node - linkType: hard - -"object-inspect@npm:^1.13.1": - version: 1.13.2 - resolution: "object-inspect@npm:1.13.2" - checksum: 10c0/b97835b4c91ec37b5fd71add84f21c3f1047d1d155d00c0fcd6699516c256d4fcc6ff17a1aced873197fe447f91a3964178fd2a67a1ee2120cdaf60e81a050b4 - languageName: node - linkType: hard - -"object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d - languageName: node - linkType: hard - -"object.assign@npm:^4.1.0": - version: 4.1.5 - resolution: "object.assign@npm:4.1.5" - dependencies: - call-bind: "npm:^1.0.5" - define-properties: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" - object-keys: "npm:^1.1.1" - checksum: 10c0/60108e1fa2706f22554a4648299b0955236c62b3685c52abf4988d14fffb0e7731e00aa8c6448397e3eb63d087dcc124a9f21e1980f36d0b2667f3c18bacd469 - languageName: node - linkType: hard - -"obuf@npm:^1.0.0, obuf@npm:^1.1.2": - version: 1.1.2 - resolution: "obuf@npm:1.1.2" - checksum: 10c0/520aaac7ea701618eacf000fc96ae458e20e13b0569845800fc582f81b386731ab22d55354b4915d58171db00e79cfcd09c1638c02f89577ef092b38c65b7d81 - languageName: node - linkType: hard - -"on-finished@npm:2.4.1": - version: 2.4.1 - resolution: "on-finished@npm:2.4.1" - dependencies: - ee-first: "npm:1.1.1" - checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 - languageName: node - linkType: hard - -"on-headers@npm:~1.0.2": - version: 1.0.2 - resolution: "on-headers@npm:1.0.2" - checksum: 10c0/f649e65c197bf31505a4c0444875db0258e198292f34b884d73c2f751e91792ef96bb5cf89aa0f4fecc2e4dc662461dda606b1274b0e564f539cae5d2f5fc32f - languageName: node - linkType: hard - -"once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: "npm:1" - checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 - languageName: node - linkType: hard - -"onetime@npm:^5.1.0, onetime@npm:^5.1.2": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: "npm:^2.1.0" - checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f - languageName: node - linkType: hard - -"open@npm:^8.0.9, open@npm:^8.4.0": - version: 8.4.2 - resolution: "open@npm:8.4.2" - dependencies: - define-lazy-prop: "npm:^2.0.0" - is-docker: "npm:^2.1.1" - is-wsl: "npm:^2.2.0" - checksum: 10c0/bb6b3a58401dacdb0aad14360626faf3fb7fba4b77816b373495988b724fb48941cad80c1b65d62bb31a17609b2cd91c41a181602caea597ca80dfbcc27e84c9 - languageName: node - linkType: hard - -"opener@npm:^1.5.2": - version: 1.5.2 - resolution: "opener@npm:1.5.2" - bin: - opener: bin/opener-bin.js - checksum: 10c0/dd56256ab0cf796585617bc28e06e058adf09211781e70b264c76a1dbe16e90f868c974e5bf5309c93469157c7d14b89c35dc53fe7293b0e40b4d2f92073bc79 - languageName: node - linkType: hard - -"optionator@npm:^0.9.3": - version: 0.9.4 - resolution: "optionator@npm:0.9.4" - dependencies: - deep-is: "npm:^0.1.3" - fast-levenshtein: "npm:^2.0.6" - levn: "npm:^0.4.1" - prelude-ls: "npm:^1.2.1" - type-check: "npm:^0.4.0" - word-wrap: "npm:^1.2.5" - checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 - languageName: node - linkType: hard - -"ora@npm:8.0.1": - version: 8.0.1 - resolution: "ora@npm:8.0.1" - dependencies: - chalk: "npm:^5.3.0" - cli-cursor: "npm:^4.0.0" - cli-spinners: "npm:^2.9.2" - is-interactive: "npm:^2.0.0" - is-unicode-supported: "npm:^2.0.0" - log-symbols: "npm:^6.0.0" - stdin-discarder: "npm:^0.2.1" - string-width: "npm:^7.0.0" - strip-ansi: "npm:^7.1.0" - checksum: 10c0/7a94c075a7f182a6ace80c3505b945520ab16e05ebe536a714a3d61e51dd8f777c75c8be920e157e0c60ada6fe89bca37376897fb4d486bea5771229be992097 - languageName: node - linkType: hard - -"p-cancelable@npm:^3.0.0": - version: 3.0.0 - resolution: "p-cancelable@npm:3.0.0" - checksum: 10c0/948fd4f8e87b956d9afc2c6c7392de9113dac817cb1cecf4143f7a3d4c57ab5673614a80be3aba91ceec5e4b69fd8c869852d7e8048bc3d9273c4c36ce14b9aa - languageName: node - linkType: hard - -"p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" - dependencies: - p-try: "npm:^2.0.0" - checksum: 10c0/8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: "npm:^0.1.0" - checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a - languageName: node - linkType: hard - -"p-limit@npm:^4.0.0": - version: 4.0.0 - resolution: "p-limit@npm:4.0.0" - dependencies: - yocto-queue: "npm:^1.0.0" - checksum: 10c0/a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad - languageName: node - linkType: hard - -"p-locate@npm:^3.0.0": - version: 3.0.0 - resolution: "p-locate@npm:3.0.0" - dependencies: - p-limit: "npm:^2.0.0" - checksum: 10c0/7b7f06f718f19e989ce6280ed4396fb3c34dabdee0df948376483032f9d5ec22fdf7077ec942143a75827bb85b11da72016497fc10dac1106c837ed593969ee8 - languageName: node - linkType: hard - -"p-locate@npm:^4.1.0": - version: 4.1.0 - resolution: "p-locate@npm:4.1.0" - dependencies: - p-limit: "npm:^2.2.0" - checksum: 10c0/1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: "npm:^3.0.2" - checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a - languageName: node - linkType: hard - -"p-locate@npm:^6.0.0": - version: 6.0.0 - resolution: "p-locate@npm:6.0.0" - dependencies: - p-limit: "npm:^4.0.0" - checksum: 10c0/d72fa2f41adce59c198270aa4d3c832536c87a1806e0f69dffb7c1a7ca998fb053915ca833d90f166a8c082d3859eabfed95f01698a3214c20df6bb8de046312 - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: "npm:^3.0.0" - checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 - languageName: node - linkType: hard - -"p-retry@npm:^4.5.0": - version: 4.6.2 - resolution: "p-retry@npm:4.6.2" - dependencies: - "@types/retry": "npm:0.12.0" - retry: "npm:^0.13.1" - checksum: 10c0/d58512f120f1590cfedb4c2e0c42cb3fa66f3cea8a4646632fcb834c56055bb7a6f138aa57b20cc236fb207c9d694e362e0b5c2b14d9b062f67e8925580c73b0 - languageName: node - linkType: hard - -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: 10c0/c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f - languageName: node - linkType: hard - -"package-json-from-dist@npm:^1.0.0": - version: 1.0.0 - resolution: "package-json-from-dist@npm:1.0.0" - checksum: 10c0/e3ffaf6ac1040ab6082a658230c041ad14e72fabe99076a2081bb1d5d41210f11872403fc09082daf4387fc0baa6577f96c9c0e94c90c394fd57794b66aa4033 - languageName: node - linkType: hard - -"package-json@npm:^8.1.0": - version: 8.1.1 - resolution: "package-json@npm:8.1.1" - dependencies: - got: "npm:^12.1.0" - registry-auth-token: "npm:^5.0.1" - registry-url: "npm:^6.0.0" - semver: "npm:^7.3.7" - checksum: 10c0/83b057878bca229033aefad4ef51569b484e63a65831ddf164dc31f0486817e17ffcb58c819c7af3ef3396042297096b3ffc04e107fd66f8f48756f6d2071c8f - languageName: node - linkType: hard - -"param-case@npm:^3.0.4": - version: 3.0.4 - resolution: "param-case@npm:3.0.4" - dependencies: - dot-case: "npm:^3.0.4" - tslib: "npm:^2.0.3" - checksum: 10c0/ccc053f3019f878eca10e70ec546d92f51a592f762917dafab11c8b532715dcff58356118a6f350976e4ab109e321756f05739643ed0ca94298e82291e6f9e76 - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: "npm:^3.0.0" - checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 - languageName: node - linkType: hard - -"parent-module@npm:^2.0.0": - version: 2.0.0 - resolution: "parent-module@npm:2.0.0" - dependencies: - callsites: "npm:^3.1.0" - checksum: 10c0/e4c5e34102c709df1932e1065dee53764fbd869f5a673beb8c3b4bcbbd4a7be16e3595f8846b24f52a77b9e96d8d499e68736ec690b108e55d95a5315f41e073 - languageName: node - linkType: hard - -"parse-code-context@npm:^1.0.0": - version: 1.0.0 - resolution: "parse-code-context@npm:1.0.0" - checksum: 10c0/67aecc80e046489425a62ef997fbb8558c534120f4e11c416383cadf633a5c53c727091e7fe6dc9dc8486b36dd6db90807533223235584665867d5aacdfff9f3 - languageName: node - linkType: hard - -"parse-entities@npm:^4.0.0": - version: 4.0.1 - resolution: "parse-entities@npm:4.0.1" - dependencies: - "@types/unist": "npm:^2.0.0" - character-entities: "npm:^2.0.0" - character-entities-legacy: "npm:^3.0.0" - character-reference-invalid: "npm:^2.0.0" - decode-named-character-reference: "npm:^1.0.0" - is-alphanumerical: "npm:^2.0.0" - is-decimal: "npm:^2.0.0" - is-hexadecimal: "npm:^2.0.0" - checksum: 10c0/9dfa3b0dc43a913c2558c4bd625b1abcc2d6c6b38aa5724b141ed988471977248f7ad234eed57e1bc70b694dd15b0d710a04f66c2f7c096e35abd91962b7d926 - languageName: node - linkType: hard - -"parse-imports@npm:^2.1.1": - version: 2.1.1 - resolution: "parse-imports@npm:2.1.1" - dependencies: - es-module-lexer: "npm:^1.5.3" - slashes: "npm:^3.0.12" - checksum: 10c0/c9bb0b4e1823f84f034d2d7bd2b37415b1715a5c963fda14968c706186b48b02c10e97d04bce042b9dcd679b42f29c391ea120799ddf581c7f54786edd99e3a9 - languageName: node - linkType: hard - -"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": - version: 5.2.0 - resolution: "parse-json@npm:5.2.0" - dependencies: - "@babel/code-frame": "npm:^7.0.0" - error-ex: "npm:^1.3.1" - json-parse-even-better-errors: "npm:^2.3.0" - lines-and-columns: "npm:^1.1.6" - checksum: 10c0/77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 - languageName: node - linkType: hard - -"parse-ms@npm:^4.0.0": - version: 4.0.0 - resolution: "parse-ms@npm:4.0.0" - checksum: 10c0/a7900f4f1ebac24cbf5e9708c16fb2fd482517fad353aecd7aefb8c2ba2f85ce017913ccb8925d231770404780df46244ea6fec598b3bde6490882358b4d2d16 - languageName: node - linkType: hard - -"parse-numeric-range@npm:^1.3.0": - version: 1.3.0 - resolution: "parse-numeric-range@npm:1.3.0" - checksum: 10c0/53465afaa92111e86697281b684aa4574427360889cc23a1c215488c06b72441febdbf09f47ab0bef9a0c701e059629f3eebd2fe6fb241a254ad7a7a642aebe8 - languageName: node - linkType: hard - -"parse5-htmlparser2-tree-adapter@npm:^7.0.0": - version: 7.0.0 - resolution: "parse5-htmlparser2-tree-adapter@npm:7.0.0" - dependencies: - domhandler: "npm:^5.0.2" - parse5: "npm:^7.0.0" - checksum: 10c0/e820cacb8486e6f7ede403327d18480df086d70e32ede2f6654d8c3a8b4b8dc4a4d5c21c03c18a92ba2466c513b93ca63be4a138dd73cd0995f384eb3b9edf11 - languageName: node - linkType: hard - -"parse5@npm:^7.0.0": - version: 7.1.2 - resolution: "parse5@npm:7.1.2" - dependencies: - entities: "npm:^4.4.0" - checksum: 10c0/297d7af8224f4b5cb7f6617ecdae98eeaed7f8cbd78956c42785e230505d5a4f07cef352af10d3006fa5c1544b76b57784d3a22d861ae071bbc460c649482bf4 - languageName: node - linkType: hard - -"parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": - version: 1.3.3 - resolution: "parseurl@npm:1.3.3" - checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 - languageName: node - linkType: hard - -"pascal-case@npm:^3.1.2": - version: 3.1.2 - resolution: "pascal-case@npm:3.1.2" - dependencies: - no-case: "npm:^3.0.4" - tslib: "npm:^2.0.3" - checksum: 10c0/05ff7c344809fd272fc5030ae0ee3da8e4e63f36d47a1e0a4855ca59736254192c5a27b5822ed4bae96e54048eec5f6907713cfcfff7cdf7a464eaf7490786d8 - languageName: node - linkType: hard - -"path-browserify@npm:^1.0.1": - version: 1.0.1 - resolution: "path-browserify@npm:1.0.1" - checksum: 10c0/8b8c3fd5c66bd340272180590ae4ff139769e9ab79522e2eb82e3d571a89b8117c04147f65ad066dccfb42fcad902e5b7d794b3d35e0fd840491a8ddbedf8c66 - languageName: node - linkType: hard - -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 10c0/17d6a5664bc0a11d48e2b2127d28a0e58822c6740bde30403f08013da599182289c56518bec89407e3f31d3c2b6b296a4220bc3f867f0911fee6952208b04167 - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b - languageName: node - linkType: hard - -"path-exists@npm:^5.0.0": - version: 5.0.0 - resolution: "path-exists@npm:5.0.0" - checksum: 10c0/b170f3060b31604cde93eefdb7392b89d832dfbc1bed717c9718cbe0f230c1669b7e75f87e19901da2250b84d092989a0f9e44d2ef41deb09aa3ad28e691a40a - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 - languageName: node - linkType: hard - -"path-is-inside@npm:1.0.2": - version: 1.0.2 - resolution: "path-is-inside@npm:1.0.2" - checksum: 10c0/7fdd4b41672c70461cce734fc222b33e7b447fa489c7c4377c95e7e6852d83d69741f307d88ec0cc3b385b41cb4accc6efac3c7c511cd18512e95424f5fa980c - languageName: node - linkType: hard - -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c - languageName: node - linkType: hard - -"path-key@npm:^4.0.0": - version: 4.0.0 - resolution: "path-key@npm:4.0.0" - checksum: 10c0/794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 - languageName: node - linkType: hard - -"path-scurry@npm:^1.11.1": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" - dependencies: - lru-cache: "npm:^10.2.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d - languageName: node - linkType: hard - -"path-scurry@npm:^2.0.0": - version: 2.0.0 - resolution: "path-scurry@npm:2.0.0" - dependencies: - lru-cache: "npm:^11.0.0" - minipass: "npm:^7.1.2" - checksum: 10c0/3da4adedaa8e7ef8d6dc4f35a0ff8f05a9b4d8365f2b28047752b62d4c1ad73eec21e37b1579ef2d075920157856a3b52ae8309c480a6f1a8bbe06ff8e52b33c - languageName: node - linkType: hard - -"path-to-regexp@npm:0.1.7": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 10c0/50a1ddb1af41a9e68bd67ca8e331a705899d16fb720a1ea3a41e310480948387daf603abb14d7b0826c58f10146d49050a1291ba6a82b78a382d1c02c0b8f905 - languageName: node - linkType: hard - -"path-to-regexp@npm:2.2.1": - version: 2.2.1 - resolution: "path-to-regexp@npm:2.2.1" - checksum: 10c0/f4b51090a73dad5ce0720f13ce8528ac77914bc927d72cc4ba05ab32770ad3a8d2e431962734b688b9ed863d4098d858da6ff4746037e4e24259cbd3b2c32b79 - languageName: node - linkType: hard - -"path-to-regexp@npm:^1.7.0": - version: 1.8.0 - resolution: "path-to-regexp@npm:1.8.0" - dependencies: - isarray: "npm:0.0.1" - checksum: 10c0/7b25d6f27a8de03f49406d16195450f5ced694398adea1510b0f949d9660600d1769c5c6c83668583b7e6b503f3caf1ede8ffc08135dbe3e982f034f356fbb5c - languageName: node - linkType: hard - -"path-type@npm:^4.0.0": - version: 4.0.0 - resolution: "path-type@npm:4.0.0" - checksum: 10c0/666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c - languageName: node - linkType: hard - -"path-type@npm:^5.0.0": - version: 5.0.0 - resolution: "path-type@npm:5.0.0" - checksum: 10c0/e8f4b15111bf483900c75609e5e74e3fcb79f2ddb73e41470028fcd3e4b5162ec65da9907be077ee5012c18801ff7fffb35f9f37a077f3f81d85a0b7d6578efd - languageName: node - linkType: hard - -"pathe@npm:^1.1.1, pathe@npm:^1.1.2": - version: 1.1.2 - resolution: "pathe@npm:1.1.2" - checksum: 10c0/64ee0a4e587fb0f208d9777a6c56e4f9050039268faaaaecd50e959ef01bf847b7872785c36483fa5cdcdbdfdb31fef2ff222684d4fc21c330ab60395c681897 - languageName: node - linkType: hard - -"periscopic@npm:^3.0.0": - version: 3.1.0 - resolution: "periscopic@npm:3.1.0" - dependencies: - "@types/estree": "npm:^1.0.0" - estree-walker: "npm:^3.0.0" - is-reference: "npm:^3.0.0" - checksum: 10c0/fb5ce7cd810c49254cdf1cd3892811e6dd1a1dfbdf5f10a0a33fb7141baac36443c4cad4f0e2b30abd4eac613f6ab845c2bc1b7ce66ae9694c7321e6ada5bd96 - languageName: node - linkType: hard - -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": - version: 1.0.1 - resolution: "picocolors@npm:1.0.1" - checksum: 10c0/c63cdad2bf812ef0d66c8db29583802355d4ca67b9285d846f390cc15c2f6ccb94e8cb7eb6a6e97fc5990a6d3ad4ae42d86c84d3146e667c739a4234ed50d400 - languageName: node - linkType: hard - -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be - languageName: node - linkType: hard - -"picomatch@npm:^4.0.1, picomatch@npm:^4.0.2": - version: 4.0.2 - resolution: "picomatch@npm:4.0.2" - checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc - languageName: node - linkType: hard - -"pirates@npm:^4.0.4": - version: 4.0.6 - resolution: "pirates@npm:4.0.6" - checksum: 10c0/00d5fa51f8dded94d7429700fb91a0c1ead00ae2c7fd27089f0c5b63e6eca36197fe46384631872690a66f390c5e27198e99006ab77ae472692ab9c2ca903f36 - languageName: node - linkType: hard - -"pkg-dir@npm:^4.2.0": - version: 4.2.0 - resolution: "pkg-dir@npm:4.2.0" - dependencies: - find-up: "npm:^4.0.0" - checksum: 10c0/c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 - languageName: node - linkType: hard - -"pkg-dir@npm:^7.0.0": - version: 7.0.0 - resolution: "pkg-dir@npm:7.0.0" - dependencies: - find-up: "npm:^6.3.0" - checksum: 10c0/1afb23d2efb1ec9d8b2c4a0c37bf146822ad2774f074cb05b853be5dca1b40815c5960dd126df30ab8908349262a266f31b771e877235870a3b8fd313beebec5 - languageName: node - linkType: hard - -"pkg-types@npm:^1.0.3, pkg-types@npm:^1.1.1, pkg-types@npm:^1.1.3": - version: 1.1.3 - resolution: "pkg-types@npm:1.1.3" - dependencies: - confbox: "npm:^0.1.7" - mlly: "npm:^1.7.1" - pathe: "npm:^1.1.2" - checksum: 10c0/4cd2c9442dd5e4ae0c61cbd8fdaa92a273939749b081f78150ce9a3f4e625cca0375607386f49f103f0720b239d02369bf181c3ea6c80cf1028a633df03706ad - languageName: node - linkType: hard - -"pkg-up@npm:^3.1.0": - version: 3.1.0 - resolution: "pkg-up@npm:3.1.0" - dependencies: - find-up: "npm:^3.0.0" - checksum: 10c0/ecb60e1f8e1f611c0bdf1a0b6a474d6dfb51185567dc6f29cdef37c8d480ecba5362e006606bb290519bbb6f49526c403fabea93c3090c20368d98bb90c999ab - languageName: node - linkType: hard - -"pluralize@npm:^8.0.0": - version: 8.0.0 - resolution: "pluralize@npm:8.0.0" - checksum: 10c0/2044cfc34b2e8c88b73379ea4a36fc577db04f651c2909041b054c981cd863dd5373ebd030123ab058d194ae615d3a97cfdac653991e499d10caf592e8b3dc33 - languageName: node - linkType: hard - -"postcss-calc@npm:^10.0.1": - version: 10.0.2 - resolution: "postcss-calc@npm:10.0.2" - dependencies: - postcss-selector-parser: "npm:^6.1.2" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.38 - checksum: 10c0/f57c9db7a7a2f3a0cdf45990089c051248d995bb2b9d1bd1fcd1634507851e92ea85bbc71a3594e359e9e9287ba0a820c90d6d292126a4b735cda364a86ce9cf - languageName: node - linkType: hard - -"postcss-calc@npm:^9.0.1": - version: 9.0.1 - resolution: "postcss-calc@npm:9.0.1" - dependencies: - postcss-selector-parser: "npm:^6.0.11" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.2 - checksum: 10c0/e0df07337162dbcaac5d6e030c7fd289e21da8766a9daca5d6b2b3c8094bb524ae5d74c70048ea7fe5fe4960ce048c60ac97922d917c3bbff34f58e9d2b0eb0e - languageName: node - linkType: hard - -"postcss-colormin@npm:^6.1.0": - version: 6.1.0 - resolution: "postcss-colormin@npm:6.1.0" - dependencies: - browserslist: "npm:^4.23.0" - caniuse-api: "npm:^3.0.0" - colord: "npm:^2.9.3" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/0802963fa0d8f2fe408b2e088117670f5303c69a58c135f0ecf0e5ceff69e95e87111b22c4e29c9adb2f69aa8d3bc175f4e8e8708eeb99c9ffc36c17064de427 - languageName: node - linkType: hard - -"postcss-colormin@npm:^7.0.2": - version: 7.0.2 - resolution: "postcss-colormin@npm:7.0.2" - dependencies: - browserslist: "npm:^4.23.3" - caniuse-api: "npm:^3.0.0" - colord: "npm:^2.9.3" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/76d09fb7e0218698e622a7c2cfc9087985f48f3a7e44f2655d5eefac4ae9c04198ae9d408dc7ace15d3aa5bde80e7031e462b0cb9b5bd50cfa76bbb1503c755b - languageName: node - linkType: hard - -"postcss-convert-values@npm:^6.1.0": - version: 6.1.0 - resolution: "postcss-convert-values@npm:6.1.0" - dependencies: - browserslist: "npm:^4.23.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/a80066965cb58fe8fcaf79f306b32c83fc678e1f0678e43f4db3e9fee06eed6db92cf30631ad348a17492769d44757400493c91a33ee865ee8dedea9234a11f5 - languageName: node - linkType: hard - -"postcss-convert-values@npm:^7.0.3": - version: 7.0.3 - resolution: "postcss-convert-values@npm:7.0.3" - dependencies: - browserslist: "npm:^4.23.3" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/dbb6278bd8d8b11e448933d823426c883bff3f6abeaa23c7530cc4668b9da6f714e073840f280273f8a14022c3a99eb461ec732f7539e062b32f5281e1be6526 - languageName: node - linkType: hard - -"postcss-discard-comments@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-discard-comments@npm:6.0.2" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/338a1fcba7e2314d956e5e5b9bd1e12e6541991bf85ac72aed6e229a029bf60edb31f11576b677623576169aa7d9c75e1be259ac7b50d0b735b841b5518f9da9 - languageName: node - linkType: hard - -"postcss-discard-comments@npm:^7.0.2": - version: 7.0.2 - resolution: "postcss-discard-comments@npm:7.0.2" - dependencies: - postcss-selector-parser: "npm:^6.1.1" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/c01632e643b6ec1f61ad59efe06a9e8dfc7fcedeb1551ae48fc33fa801353f6222e31954286cd97171c694f34c2b4c7f7a2213fd0f913e37c34d0353258ed234 - languageName: node - linkType: hard - -"postcss-discard-duplicates@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-discard-duplicates@npm:6.0.3" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/24d2f00e54668f2837eb38a64b1751d7a4a73b2752f9749e61eb728f1fae837984bc2b339f7f5207aff5f66f72551253489114b59b9ba21782072677a81d7d1b - languageName: node - linkType: hard - -"postcss-discard-duplicates@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-discard-duplicates@npm:7.0.1" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/5cc2cac249f68004864865ea2ec38b7d5e28184f33e904e531ff57b533aacb73ec49e4a7d83219184001b8d167e5bcabc1673248134468d7ebaa0bfb9ff78f0a - languageName: node - linkType: hard - -"postcss-discard-empty@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-discard-empty@npm:6.0.3" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/1af08bb29f18eda41edf3602b257d89a4cf0a16f79fc773cfebd4a37251f8dbd9b77ac18efe55d0677d000b43a8adf2ef9328d31961c810e9433a38494a1fa65 - languageName: node - linkType: hard - -"postcss-discard-empty@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-discard-empty@npm:7.0.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/b54fc9ad59a6015f6b82b8c826717a4a2f82b272608f6ae37a0b568f4f6c503f5ac7d13d415853a946a0422cb37b9fe1d5ddcee91fe0c2086001138710600d8b - languageName: node - linkType: hard - -"postcss-discard-overridden@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-discard-overridden@npm:6.0.2" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/fda70ef3cd4cb508369c5bbbae44d7760c40ec9f2e65df1cd1b6e0314317fb1d25ae7f64987ca84e66889c1e9d1862487a6ce391c159dfe04d536597bfc5030d - languageName: node - linkType: hard - -"postcss-discard-overridden@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-discard-overridden@npm:7.0.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/ca00ed1d4e8793fc780039f235fa2caef123d3aa28cae47cc1472ca03b21386c39fae1f11fbf319dcb94c6bda923824067254c7e20e8b00354b47015dc754658 - languageName: node - linkType: hard - -"postcss-discard-unused@npm:^6.0.5": - version: 6.0.5 - resolution: "postcss-discard-unused@npm:6.0.5" - dependencies: - postcss-selector-parser: "npm:^6.0.16" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/fca82f17395a7fcc78eab4e03dfb05958beb240c10cacb3836b832c6ea99f5259980c70890a9b7d8b67adf8071b61f3fcf1b432c7a116397aaf67909366da5cc - languageName: node - linkType: hard - -"postcss-loader@npm:^7.3.3": - version: 7.3.4 - resolution: "postcss-loader@npm:7.3.4" - dependencies: - cosmiconfig: "npm:^8.3.5" - jiti: "npm:^1.20.0" - semver: "npm:^7.5.4" - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 - checksum: 10c0/1bf7614aeea9ad1f8ee6be3a5451576c059391688ea67f825aedc2674056369597faeae4e4a81fe10843884c9904a71403d9a54197e1f560e8fbb9e61f2a2680 - languageName: node - linkType: hard - -"postcss-merge-idents@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-merge-idents@npm:6.0.3" - dependencies: - cssnano-utils: "npm:^4.0.2" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/fdb51d971df33218bd5fdd9619e5a4d854e23affcea51f96bf4391260cb8d0bec937854582fa9a19bde1fa1b2a43fa5a2f179da23a3adeb8e8d292a4749a8ed7 - languageName: node - linkType: hard - -"postcss-merge-longhand@npm:^6.0.5": - version: 6.0.5 - resolution: "postcss-merge-longhand@npm:6.0.5" - dependencies: - postcss-value-parser: "npm:^4.2.0" - stylehacks: "npm:^6.1.1" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/5a223a7f698c05ab42e9997108a7ff27ea1e0c33a11a353d65a04fc89c3b5b750b9e749550d76b6406329117a055adfc79dde7fee48dca5c8e167a2854ae3fea - languageName: node - linkType: hard - -"postcss-merge-longhand@npm:^7.0.3": - version: 7.0.3 - resolution: "postcss-merge-longhand@npm:7.0.3" - dependencies: - postcss-value-parser: "npm:^4.2.0" - stylehacks: "npm:^7.0.3" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/b968c3d16f3edc6075b20219a1165c089dc454a6a42951dcdfc94adb932fb96ef7bcd465c6cd21b0e5b55ac08921355ddbbbc7cdcf87a345e4bef8b3cdd2e7e9 - languageName: node - linkType: hard - -"postcss-merge-rules@npm:^6.1.1": - version: 6.1.1 - resolution: "postcss-merge-rules@npm:6.1.1" - dependencies: - browserslist: "npm:^4.23.0" - caniuse-api: "npm:^3.0.0" - cssnano-utils: "npm:^4.0.2" - postcss-selector-parser: "npm:^6.0.16" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/6d8952dbb19b1e59bf5affe0871fa1be6515103466857cff5af879d6cf619659f8642ec7a931cabb7cdbd393d8c1e91748bf70bee70fa3edea010d4e25786d04 - languageName: node - linkType: hard - -"postcss-merge-rules@npm:^7.0.3": - version: 7.0.3 - resolution: "postcss-merge-rules@npm:7.0.3" - dependencies: - browserslist: "npm:^4.23.3" - caniuse-api: "npm:^3.0.0" - cssnano-utils: "npm:^5.0.0" - postcss-selector-parser: "npm:^6.1.1" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/3cd20484ab6d15c62eded408248d5eeaba52a573935943f933865680e070a0e75b3a7447802c575bc86e1fae667cf51d9d5766537835d9b8c090337b5adf928e - languageName: node - linkType: hard - -"postcss-minify-font-values@npm:^6.1.0": - version: 6.1.0 - resolution: "postcss-minify-font-values@npm:6.1.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/0d6567170c22a7db42096b5eac298f041614890fbe01759a9fa5ccda432f2bb09efd399d92c11bf6675ae13ccd259db4602fad3c358317dee421df5f7ab0a003 - languageName: node - linkType: hard - -"postcss-minify-font-values@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-minify-font-values@npm:7.0.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/f8be40099a6986d96b9cd2eb9c32a9c681efc6ecd6504c9ab7e01feb9e688c8b9656dfd7f35aa6de2585a86d607f62152ee81d0175e712e4658d184d25f63d58 - languageName: node - linkType: hard - -"postcss-minify-gradients@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-minify-gradients@npm:6.0.3" - dependencies: - colord: "npm:^2.9.3" - cssnano-utils: "npm:^4.0.2" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/7fcbcec94fe5455b89fe1b424a451198e60e0407c894bbacdc062d9fdef2f8571b483b5c3bb17f22d2f1249431251b2de22e1e4e8b0614d10624f8ee6e71afd2 - languageName: node - linkType: hard - -"postcss-minify-gradients@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-minify-gradients@npm:7.0.0" - dependencies: - colord: "npm:^2.9.3" - cssnano-utils: "npm:^5.0.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/15d162192b598242e14def81a62e30cf273ab14f1db702c391e6bdd442c570a1aa76fc326874253a2d67f75b4d4fe73ba4f664e85dbff883f24b7090c340bfad - languageName: node - linkType: hard - -"postcss-minify-params@npm:^6.1.0": - version: 6.1.0 - resolution: "postcss-minify-params@npm:6.1.0" - dependencies: - browserslist: "npm:^4.23.0" - cssnano-utils: "npm:^4.0.2" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/e5c38c3e5fb42e2ca165764f983716e57d854a63a477f7389ccc94cd2ab8123707006613bd7f29acc6eafd296fff513aa6d869c98ac52590f886d641cb21a59e - languageName: node - linkType: hard - -"postcss-minify-params@npm:^7.0.2": - version: 7.0.2 - resolution: "postcss-minify-params@npm:7.0.2" - dependencies: - browserslist: "npm:^4.23.3" - cssnano-utils: "npm:^5.0.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/0e041f70554bae9d4a66c8ab2f2f3ed8bf73862c9d5ff9972ac7f1a596badd1544f093fa2362dd33e96c038af9e10287cdbfec9f480c49bffdcbaca9fdcb1e4e - languageName: node - linkType: hard - -"postcss-minify-selectors@npm:^6.0.4": - version: 6.0.4 - resolution: "postcss-minify-selectors@npm:6.0.4" - dependencies: - postcss-selector-parser: "npm:^6.0.16" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/695ec2e1e3a7812b0cabe1105d0ed491760be3d8e9433914fb5af1fc30a84e6dc24089cd31b7e300de620b8e7adf806526c1acf8dd14077a7d1d2820c60a327c - languageName: node - linkType: hard - -"postcss-minify-selectors@npm:^7.0.3": - version: 7.0.3 - resolution: "postcss-minify-selectors@npm:7.0.3" - dependencies: - cssesc: "npm:^3.0.0" - postcss-selector-parser: "npm:^6.1.1" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/5211f63a1672f646a1bab57bd8eac0816d42adacb5e286ad5e6e342a795bb0d086bd6044a1b338311ca28f33f2c1833165ee611eaa671287379821ba3c5d68ad - languageName: node - linkType: hard - -"postcss-modules-extract-imports@npm:^3.1.0": - version: 3.1.0 - resolution: "postcss-modules-extract-imports@npm:3.1.0" - peerDependencies: - postcss: ^8.1.0 - checksum: 10c0/402084bcab376083c4b1b5111b48ec92974ef86066f366f0b2d5b2ac2b647d561066705ade4db89875a13cb175b33dd6af40d16d32b2ea5eaf8bac63bd2bf219 - languageName: node - linkType: hard - -"postcss-modules-local-by-default@npm:^4.0.5": - version: 4.0.5 - resolution: "postcss-modules-local-by-default@npm:4.0.5" - dependencies: - icss-utils: "npm:^5.0.0" - postcss-selector-parser: "npm:^6.0.2" - postcss-value-parser: "npm:^4.1.0" - peerDependencies: - postcss: ^8.1.0 - checksum: 10c0/f4ad35abeb685ecb25f80c93d9fe23c8b89ee45ac4185f3560e701b4d7372f9b798577e79c5ed03b6d9c80bc923b001210c127c04ced781f43cda9e32b202a5b - languageName: node - linkType: hard - -"postcss-modules-scope@npm:^3.2.0": - version: 3.2.0 - resolution: "postcss-modules-scope@npm:3.2.0" - dependencies: - postcss-selector-parser: "npm:^6.0.4" - peerDependencies: - postcss: ^8.1.0 - checksum: 10c0/a2f5ffe372169b3feb8628cd785eb748bf12e344cfa57bce9e5cdc4fa5adcdb40d36daa86bb35dad53427703b185772aad08825b5783f745fcb1b6039454a84b - languageName: node - linkType: hard - -"postcss-modules-values@npm:^4.0.0": - version: 4.0.0 - resolution: "postcss-modules-values@npm:4.0.0" - dependencies: - icss-utils: "npm:^5.0.0" - peerDependencies: - postcss: ^8.1.0 - checksum: 10c0/dd18d7631b5619fb9921b198c86847a2a075f32e0c162e0428d2647685e318c487a2566cc8cc669fc2077ef38115cde7a068e321f46fb38be3ad49646b639dbc - languageName: node - linkType: hard - -"postcss-nested@npm:^6.0.1": - version: 6.2.0 - resolution: "postcss-nested@npm:6.2.0" - dependencies: - postcss-selector-parser: "npm:^6.1.1" - peerDependencies: - postcss: ^8.2.14 - checksum: 10c0/7f9c3f2d764191a39364cbdcec350f26a312431a569c9ef17408021424726b0d67995ff5288405e3724bb7152a4c92f73c027e580ec91e798800ed3c52e2bc6e - languageName: node - linkType: hard - -"postcss-normalize-charset@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-normalize-charset@npm:6.0.2" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/af32a3b4cf94163d728b8aa935b2494c9f69fbc96a33b35f67ae15dbdef7fcc8732569df97cbaaf20ca6c0103c39adad0cfce2ba07ffed283796787f6c36f410 - languageName: node - linkType: hard - -"postcss-normalize-charset@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-normalize-charset@npm:7.0.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/06d9c4487a4b0e195133a1fb7a115db7014e49d2567cce73e24c59f473f0e65a1999850a726afb3bdb2d36017a3e5c92ac4fd2a7ecc427da4ff79522765fabdd - languageName: node - linkType: hard - -"postcss-normalize-display-values@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-normalize-display-values@npm:6.0.2" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/782761850c7e697fdb6c3ff53076de716a71b60f9e835efb2f7ef238de347c88b5d55f0d43cf5c608e1ee58de65360e3d9fccd5f20774bba08ded7c87d8a5651 - languageName: node - linkType: hard - -"postcss-normalize-display-values@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-normalize-display-values@npm:7.0.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/439524e1d3ed36d6265c05da10540e17aa8605e1b396f71ca4364ab3b8b98ca97763c58c211fb9492662429d43613a7fe7009a8638c84a8db327e572c382272a - languageName: node - linkType: hard - -"postcss-normalize-positions@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-normalize-positions@npm:6.0.2" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/9fdd42a47226bbda5f68774f3c4c3a90eb4fa708aef5a997c6a52fe6cac06585c9774038fe3bc1aa86a203c29223b8d8db6ebe7580c1aa293154f2b48db0b038 - languageName: node - linkType: hard - -"postcss-normalize-positions@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-normalize-positions@npm:7.0.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/428763c937cd178c8ee544cd93a9d1fef667dc9a8700ffe2e61b0beeea7f64f712492b9aeb8a1ef927ab752ec34be7ddeb23d2b50e4bc6eba02b0e58312b27a7 - languageName: node - linkType: hard - -"postcss-normalize-repeat-style@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-normalize-repeat-style@npm:6.0.2" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/9133ccbdf1286920c1cd0d01c1c5fa0bd3251b717f2f3e47d691dcc44978ac1dc419d20d9ae5428bd48ee542059e66b823ba699356f5968ccced5606c7c7ca34 - languageName: node - linkType: hard - -"postcss-normalize-repeat-style@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-normalize-repeat-style@npm:7.0.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/cf7cd9f355fd26f1c9b0c11a923029ac5ea3020520db5a9778dd19c5ee1f48a1f1f368b4ae75fc6b63cb5761eef72333e486ab0de1537b9cb62d213a8c5576d0 - languageName: node - linkType: hard - -"postcss-normalize-string@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-normalize-string@npm:6.0.2" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/fecc2d52c4029b24fecf2ca2fb45df5dbdf9f35012194ad4ea80bc7be3252cdcb21a0976400902320595aa6178f2cc625cc804c6b6740aef6efa42105973a205 - languageName: node - linkType: hard - -"postcss-normalize-string@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-normalize-string@npm:7.0.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/8857563f85841ce432bb9a5a9ba129847890b61693adff96d565b69dc2d5456f54dec33f4f6ce5b0abf0a484dbfb0145846d99f988959c5ac875a86a2a180576 - languageName: node - linkType: hard - -"postcss-normalize-timing-functions@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-normalize-timing-functions@npm:6.0.2" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/a22af0b3374704e59ae70bbbcc66b7029137e284f04e30a2ad548818d1540d6c1ed748dd8f689b9b6df5c1064085a00ad07b6f7e25ffaad49d4e661b616cdeae - languageName: node - linkType: hard - -"postcss-normalize-timing-functions@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-normalize-timing-functions@npm:7.0.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/bc5f6999b4c9e28e5be785ef90fe68fd48d44059ecc73ee194c2603260597d685b13a1e1751df9a2cee100fea7abb7e1b1cbcf1a7a428a576961705c9d426788 - languageName: node - linkType: hard - -"postcss-normalize-unicode@npm:^6.1.0": - version: 6.1.0 - resolution: "postcss-normalize-unicode@npm:6.1.0" - dependencies: - browserslist: "npm:^4.23.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/ff5746670d94dd97b49a0955c3c71ff516fb4f54bbae257f877d179bacc44a62e50a0fd6e7ddf959f2ca35c335de4266b0c275d880bb57ad7827189339ab1582 - languageName: node - linkType: hard - -"postcss-normalize-unicode@npm:^7.0.2": - version: 7.0.2 - resolution: "postcss-normalize-unicode@npm:7.0.2" - dependencies: - browserslist: "npm:^4.23.3" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/0df1aac932cc2340715178fd024e0f6d872ea5a4bee1bc8357317a75a7b2c904d885f754cc162af001aa2a9ded7c54fac7cbcd701e21e995c1ace92dc08f2b9d - languageName: node - linkType: hard - -"postcss-normalize-url@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-normalize-url@npm:6.0.2" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/4718f1c0657788d2c560b340ee8e0a4eb3eb053eba6fbbf489e9a6e739b4c5f9ce1957f54bd03497c50a1f39962bf6ab9ff6ba4976b69dd160f6afd1670d69b7 - languageName: node - linkType: hard - -"postcss-normalize-url@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-normalize-url@npm:7.0.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/3050e228be48fe0121d1316c267e629b232e8401a547128d142c3dea55eeae1e232c9beeea5c76439009188993b14925c5cf40e3a44856d076a7b8fcf4721f86 - languageName: node - linkType: hard - -"postcss-normalize-whitespace@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-normalize-whitespace@npm:6.0.2" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/d5275a88e29a894aeb83a2a833e816d2456dbf3f39961628df596ce205dcc4895186a023812ff691945e0804241ccc53e520d16591b5812288474b474bbaf652 - languageName: node - linkType: hard - -"postcss-normalize-whitespace@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-normalize-whitespace@npm:7.0.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/8d61234962a4850fc61292592171e1d13de2e90d96a2eaed8c85672a05caceda02a3bd1cb495cb72414741f99d50083362df14923efaca1b3e09657d24cea34b - languageName: node - linkType: hard - -"postcss-ordered-values@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-ordered-values@npm:6.0.2" - dependencies: - cssnano-utils: "npm:^4.0.2" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/aece23a289228aa804217a85f8da198d22b9123f02ca1310b81834af380d6fbe115e4300683599b4a2ab7f1c6a1dbd6789724c47c38e2b0a3774f2ea4b4f0963 - languageName: node - linkType: hard - -"postcss-ordered-values@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-ordered-values@npm:7.0.1" - dependencies: - cssnano-utils: "npm:^5.0.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/9fc62e9039c7d4fa417d165678b065fc577a7232aa41a94a4e9208ad7db2268e1ce003aaad7c6a569afdf890a43416b0bf21047461505b4e3a16eec311a6eb63 - languageName: node - linkType: hard - -"postcss-reduce-idents@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-reduce-idents@npm:6.0.3" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/d9f9209e52ebb3d1d7feefc0be24fc74792e064e0fdec99554f050c6b882c61073d5d40986c545061b30e5ead881615e92c965dc765d8d83b2dec10d6a664e1f - languageName: node - linkType: hard - -"postcss-reduce-initial@npm:^6.1.0": - version: 6.1.0 - resolution: "postcss-reduce-initial@npm:6.1.0" - dependencies: - browserslist: "npm:^4.23.0" - caniuse-api: "npm:^3.0.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/a8f28cf51ce9a1b9423cce1a01c1d7cbee90125930ec36435a0073e73aef402d90affe2fd3600c964b679cf738869fda447b95a9acce74414e9d67d5c6ba8646 - languageName: node - linkType: hard - -"postcss-reduce-initial@npm:^7.0.2": - version: 7.0.2 - resolution: "postcss-reduce-initial@npm:7.0.2" - dependencies: - browserslist: "npm:^4.23.3" - caniuse-api: "npm:^3.0.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/1e6fafaf5fac52b351c8de156ed62e4e1f48da7eb07f9ce90da54b45dca61da9af1e954b8a343271cb3e4ec99e0c5f18d7f9f96da0ca144511fca04498fac78c - languageName: node - linkType: hard - -"postcss-reduce-transforms@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-reduce-transforms@npm:6.0.2" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/755ef27b3d083f586ac831f0c611a66e76f504d27e2100dc7674f6b86afad597901b4520cb889fe58ca70e852aa7fd0c0acb69a63d39dfe6a95860b472394e7c - languageName: node - linkType: hard - -"postcss-reduce-transforms@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-reduce-transforms@npm:7.0.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/b2d4b65e71d38b604b41937850d1d64794964d6eced90f05891cfae8a78c7a9fed49911f51da9dcc5d715ac18e8bc7eacf691f2c5321dfe4d781f3e4442dfea9 - languageName: node - linkType: hard - -"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.1.1, postcss-selector-parser@npm:^6.1.2": - version: 6.1.2 - resolution: "postcss-selector-parser@npm:6.1.2" - dependencies: - cssesc: "npm:^3.0.0" - util-deprecate: "npm:^1.0.2" - checksum: 10c0/523196a6bd8cf660bdf537ad95abd79e546d54180f9afb165a4ab3e651ac705d0f8b8ce6b3164fb9e3279ce482c5f751a69eb2d3a1e8eb0fd5e82294fb3ef13e - languageName: node - linkType: hard - -"postcss-sort-media-queries@npm:^5.2.0": - version: 5.2.0 - resolution: "postcss-sort-media-queries@npm:5.2.0" - dependencies: - sort-css-media-queries: "npm:2.2.0" - peerDependencies: - postcss: ^8.4.23 - checksum: 10c0/5e7f265a21999bdbf6592f7e15b3e889dd93bc9b15fe048958e8f85603ac276e69ef50305e8b41b10f4eea68917c9c25c7956fa9c3ba7f8577c1149416d35c4e - languageName: node - linkType: hard - -"postcss-svgo@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-svgo@npm:6.0.3" - dependencies: - postcss-value-parser: "npm:^4.2.0" - svgo: "npm:^3.2.0" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/994b15a88cbb411f32cfa98957faa5623c76f2d75fede51f5f47238f06b367ebe59c204fecbdaf21ccb9e727239a4b290087e04c502392658a0c881ddfbd61f2 - languageName: node - linkType: hard - -"postcss-svgo@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-svgo@npm:7.0.1" - dependencies: - postcss-value-parser: "npm:^4.2.0" - svgo: "npm:^3.3.2" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/7c7b177e6f4e2a3e9ada76d53afa02e08d900c8ac15600ba9daa80480269d538405e544bd8091bc5eb7529173a476896fad885a72a247258265424b29a9195ed - languageName: node - linkType: hard - -"postcss-unique-selectors@npm:^6.0.4": - version: 6.0.4 - resolution: "postcss-unique-selectors@npm:6.0.4" - dependencies: - postcss-selector-parser: "npm:^6.0.16" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/bfb99d8a7c675c93f2e65c9d9d563477bfd46fdce9e2727d42d57982b31ccbaaf944e8034bfbefe48b3119e77fba7eb1b181c19b91cb3a5448058fa66a7c9ae9 - languageName: node - linkType: hard - -"postcss-unique-selectors@npm:^7.0.2": - version: 7.0.2 - resolution: "postcss-unique-selectors@npm:7.0.2" - dependencies: - postcss-selector-parser: "npm:^6.1.1" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/cc54c57cd1c5a6e3e166ec63cc036d9e2df80b05e508d9ce754ca4193bf8c1bfcc16b3c6f0d81b8352a3282201d249b90bb87abacfcfb9065c9e3705ea5d110e - languageName: node - linkType: hard - -"postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": - version: 4.2.0 - resolution: "postcss-value-parser@npm:4.2.0" - checksum: 10c0/f4142a4f56565f77c1831168e04e3effd9ffcc5aebaf0f538eee4b2d465adfd4b85a44257bb48418202a63806a7da7fe9f56c330aebb3cac898e46b4cbf49161 - languageName: node - linkType: hard - -"postcss-zindex@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-zindex@npm:6.0.2" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/346291703e1f2dd954144d2bb251713dad6ae10e8aa05c3873dee2fc7a30d72da7866bec060abd932b9b839bc1495f73d813dde5312750a69d7ad33c435ce7ea - languageName: node - linkType: hard - -"postcss@npm:^8.4.21, postcss@npm:^8.4.24, postcss@npm:^8.4.26, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.4.39": - version: 8.4.41 - resolution: "postcss@npm:8.4.41" - dependencies: - nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.1" - source-map-js: "npm:^1.2.0" - checksum: 10c0/c1828fc59e7ec1a3bf52b3a42f615dba53c67960ed82a81df6441b485fe43c20aba7f4e7c55425762fd99c594ecabbaaba8cf5b30fd79dfec5b52a9f63a2d690 - languageName: node - linkType: hard - -"prelude-ls@npm:^1.2.1": - version: 1.2.1 - resolution: "prelude-ls@npm:1.2.1" - checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd - languageName: node - linkType: hard - -"prettier-plugin-organize-imports@npm:^4.0.0": - version: 4.0.0 - resolution: "prettier-plugin-organize-imports@npm:4.0.0" - peerDependencies: - "@vue/language-plugin-pug": ^2.0.24 - prettier: ">=2.0" - typescript: ">=2.9" - vue-tsc: ^2.0.24 - peerDependenciesMeta: - "@vue/language-plugin-pug": - optional: true - vue-tsc: - optional: true - checksum: 10c0/6c3c2a0680540c2c27d8e0e47c7cb69d374e47534c467877a99031defa087d52a4fc972156321dadbadc10b2eb90d67398110a0be65f5b3c9db93b85a546d8f7 - languageName: node - linkType: hard - -"prettier-plugin-packagejson@npm:^2.5.1": - version: 2.5.1 - resolution: "prettier-plugin-packagejson@npm:2.5.1" - dependencies: - sort-package-json: "npm:2.10.0" - synckit: "npm:0.9.1" - peerDependencies: - prettier: ">= 1.16.0" - peerDependenciesMeta: - prettier: - optional: true - checksum: 10c0/eb1b9f5a78b56b95adfe0b57f3ee888aa7717262b96052984d728fe3ff66e7fd4757e24e2b67632ee72c461de22b236e61fcd9fc5f2738bfe952be9eae179aca - languageName: node - linkType: hard - -"prettier@npm:^3.3.3": - version: 3.3.3 - resolution: "prettier@npm:3.3.3" - bin: - prettier: bin/prettier.cjs - checksum: 10c0/b85828b08e7505716324e4245549b9205c0cacb25342a030ba8885aba2039a115dbcf75a0b7ca3b37bc9d101ee61fab8113fc69ca3359f2a226f1ecc07ad2e26 - languageName: node - linkType: hard - -"pretty-bytes@npm:^6.1.1": - version: 6.1.1 - resolution: "pretty-bytes@npm:6.1.1" - checksum: 10c0/c7a660b933355f3b4587ad3f001c266a8dd6afd17db9f89ebc50812354bb142df4b9600396ba5999bdb1f9717300387dc311df91895c5f0f2a1780e22495b5f8 - languageName: node - linkType: hard - -"pretty-error@npm:^4.0.0": - version: 4.0.0 - resolution: "pretty-error@npm:4.0.0" - dependencies: - lodash: "npm:^4.17.20" - renderkid: "npm:^3.0.0" - checksum: 10c0/dc292c087e2857b2e7592784ab31e37a40f3fa918caa11eba51f9fb2853e1d4d6e820b219917e35f5721d833cfd20fdf4f26ae931a90fd1ad0cae2125c345138 - languageName: node - linkType: hard - -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": - version: 29.7.0 - resolution: "pretty-format@npm:29.7.0" - dependencies: - "@jest/schemas": "npm:^29.6.3" - ansi-styles: "npm:^5.0.0" - react-is: "npm:^18.0.0" - checksum: 10c0/edc5ff89f51916f036c62ed433506b55446ff739358de77207e63e88a28ca2894caac6e73dcb68166a606e51c8087d32d400473e6a9fdd2dbe743f46c9c0276f - languageName: node - linkType: hard - -"pretty-ms@npm:^9.0.0": - version: 9.1.0 - resolution: "pretty-ms@npm:9.1.0" - dependencies: - parse-ms: "npm:^4.0.0" - checksum: 10c0/fd111aad8800a04dfd654e6016da69bdaa6fc6a4c280f8e727cffd8b5960558e94942f1a94d4aa6e4d179561a0fbb0366a9ebe0ccefbbb0f8ff853b129cdefb9 - languageName: node - linkType: hard - -"pretty-time@npm:^1.1.0": - version: 1.1.0 - resolution: "pretty-time@npm:1.1.0" - checksum: 10c0/ba9d7af19cd43838fb2b147654990949575e400dc2cc24bf71ec4a6c4033a38ba8172b1014b597680c6d4d3c075e94648b2c13a7206c5f0c90b711c7388726f3 - languageName: node - linkType: hard - -"prism-react-renderer@npm:^2.3.0, prism-react-renderer@npm:^2.3.1": - version: 2.3.1 - resolution: "prism-react-renderer@npm:2.3.1" - dependencies: - "@types/prismjs": "npm:^1.26.0" - clsx: "npm:^2.0.0" - peerDependencies: - react: ">=16.0.0" - checksum: 10c0/566932127ca18049a651aa038a8f8c7c1ca15950d21b659c2ce71fd95bd03bef2b5d40c489e7aa3453eaf15d984deef542a609d7842e423e6a13427dd90bd371 - languageName: node - linkType: hard - -"prismjs@npm:^1.29.0": - version: 1.29.0 - resolution: "prismjs@npm:1.29.0" - checksum: 10c0/d906c4c4d01b446db549b4f57f72d5d7e6ccaca04ecc670fb85cea4d4b1acc1283e945a9cbc3d81819084a699b382f970e02f9d1378e14af9808d366d9ed7ec6 - languageName: node - linkType: hard - -"proc-log@npm:^4.0.0, proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": - version: 4.2.0 - resolution: "proc-log@npm:4.2.0" - checksum: 10c0/17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9 - languageName: node - linkType: hard - -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: "npm:^2.0.2" - retry: "npm:^0.12.0" - checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 - languageName: node - linkType: hard - -"prompt@npm:^1.3.0": - version: 1.3.0 - resolution: "prompt@npm:1.3.0" - dependencies: - "@colors/colors": "npm:1.5.0" - async: "npm:3.2.3" - read: "npm:1.0.x" - revalidator: "npm:0.1.x" - winston: "npm:2.x" - checksum: 10c0/f2c67178ffd82563dff958b7d9502e6346464675539158e378bd10e236093cbed395099fcfaeb5df8492b06bfd218f46f2ae75796679a127fd6705ee608e72d9 - languageName: node - linkType: hard - -"prompts@npm:2.4.2, prompts@npm:^2.0.1, prompts@npm:^2.4.2": - version: 2.4.2 - resolution: "prompts@npm:2.4.2" - dependencies: - kleur: "npm:^3.0.3" - sisteransi: "npm:^1.0.5" - checksum: 10c0/16f1ac2977b19fe2cf53f8411cc98db7a3c8b115c479b2ca5c82b5527cd937aa405fa04f9a5960abeb9daef53191b53b4d13e35c1f5d50e8718c76917c5f1ea4 - languageName: node - linkType: hard - -"prop-types@npm:^15.6.2, prop-types@npm:^15.7.2": - version: 15.8.1 - resolution: "prop-types@npm:15.8.1" - dependencies: - loose-envify: "npm:^1.4.0" - object-assign: "npm:^4.1.1" - react-is: "npm:^16.13.1" - checksum: 10c0/59ece7ca2fb9838031d73a48d4becb9a7cc1ed10e610517c7d8f19a1e02fa47f7c27d557d8a5702bec3cfeccddc853579832b43f449e54635803f277b1c78077 - languageName: node - linkType: hard - -"property-information@npm:^6.0.0": - version: 6.5.0 - resolution: "property-information@npm:6.5.0" - checksum: 10c0/981e0f9cc2e5acdb414a6fd48a99dd0fd3a4079e7a91ab41cf97a8534cf43e0e0bc1ffada6602a1b3d047a33db8b5fc2ef46d863507eda712d5ceedac443f0ef - languageName: node - linkType: hard - -"proto-list@npm:~1.2.1": - version: 1.2.4 - resolution: "proto-list@npm:1.2.4" - checksum: 10c0/b9179f99394ec8a68b8afc817690185f3b03933f7b46ce2e22c1930dc84b60d09f5ad222beab4e59e58c6c039c7f7fcf620397235ef441a356f31f9744010e12 - languageName: node - linkType: hard - -"proxy-addr@npm:~2.0.7": - version: 2.0.7 - resolution: "proxy-addr@npm:2.0.7" - dependencies: - forwarded: "npm:0.2.0" - ipaddr.js: "npm:1.9.1" - checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 - languageName: node - linkType: hard - -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b - languageName: node - linkType: hard - -"punycode.js@npm:^2.3.1": - version: 2.3.1 - resolution: "punycode.js@npm:2.3.1" - checksum: 10c0/1d12c1c0e06127fa5db56bd7fdf698daf9a78104456a6b67326877afc21feaa821257b171539caedd2f0524027fa38e67b13dd094159c8d70b6d26d2bea4dfdb - languageName: node - linkType: hard - -"punycode@npm:^1.3.2": - version: 1.4.1 - resolution: "punycode@npm:1.4.1" - checksum: 10c0/354b743320518aef36f77013be6e15da4db24c2b4f62c5f1eb0529a6ed02fbaf1cb52925785f6ab85a962f2b590d9cd5ad730b70da72b5f180e2556b8bd3ca08 - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.3.1 - resolution: "punycode@npm:2.3.1" - checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 - languageName: node - linkType: hard - -"pupa@npm:^3.1.0": - version: 3.1.0 - resolution: "pupa@npm:3.1.0" - dependencies: - escape-goat: "npm:^4.0.0" - checksum: 10c0/02afa6e4547a733484206aaa8f8eb3fbfb12d3dd17d7ca4fa1ea390a7da2cb8f381e38868bbf68009c4d372f8f6059f553171b6a712d8f2802c7cd43d513f06c - languageName: node - linkType: hard - -"pure-rand@npm:^6.0.0, pure-rand@npm:^6.1.0": - version: 6.1.0 - resolution: "pure-rand@npm:6.1.0" - checksum: 10c0/1abe217897bf74dcb3a0c9aba3555fe975023147b48db540aa2faf507aee91c03bf54f6aef0eb2bf59cc259a16d06b28eca37f0dc426d94f4692aeff02fb0e65 - languageName: node - linkType: hard - -"qs@npm:6.11.0": - version: 6.11.0 - resolution: "qs@npm:6.11.0" - dependencies: - side-channel: "npm:^1.0.4" - checksum: 10c0/4e4875e4d7c7c31c233d07a448e7e4650f456178b9dd3766b7cfa13158fdb24ecb8c4f059fa91e820dc6ab9f2d243721d071c9c0378892dcdad86e9e9a27c68f - languageName: node - linkType: hard - -"queue-microtask@npm:^1.2.2": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 - languageName: node - linkType: hard - -"queue@npm:6.0.2": - version: 6.0.2 - resolution: "queue@npm:6.0.2" - dependencies: - inherits: "npm:~2.0.3" - checksum: 10c0/cf987476cc72e7d3aaabe23ccefaab1cd757a2b5e0c8d80b67c9575a6b5e1198807ffd4f0948a3f118b149d1111d810ee773473530b77a5c606673cac2c9c996 - languageName: node - linkType: hard - -"quick-lru@npm:^5.1.1": - version: 5.1.1 - resolution: "quick-lru@npm:5.1.1" - checksum: 10c0/a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da - languageName: node - linkType: hard - -"randombytes@npm:^2.1.0": - version: 2.1.0 - resolution: "randombytes@npm:2.1.0" - dependencies: - safe-buffer: "npm:^5.1.0" - checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 - languageName: node - linkType: hard - -"range-parser@npm:1.2.0": - version: 1.2.0 - resolution: "range-parser@npm:1.2.0" - checksum: 10c0/c7aef4f6588eb974c475649c157f197d07437d8c6c8ff7e36280a141463fb5ab7a45918417334ebd7b665c6b8321cf31c763f7631dd5f5db9372249261b8b02a - languageName: node - linkType: hard - -"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": - version: 1.2.1 - resolution: "range-parser@npm:1.2.1" - checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 - languageName: node - linkType: hard - -"raw-body@npm:2.5.2": - version: 2.5.2 - resolution: "raw-body@npm:2.5.2" - dependencies: - bytes: "npm:3.1.2" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - unpipe: "npm:1.0.0" - checksum: 10c0/b201c4b66049369a60e766318caff5cb3cc5a900efd89bdac431463822d976ad0670912c931fdbdcf5543207daf6f6833bca57aa116e1661d2ea91e12ca692c4 - languageName: node - linkType: hard - -"rc@npm:1.2.8": - version: 1.2.8 - resolution: "rc@npm:1.2.8" - dependencies: - deep-extend: "npm:^0.6.0" - ini: "npm:~1.3.0" - minimist: "npm:^1.2.0" - strip-json-comments: "npm:~2.0.1" - bin: - rc: ./cli.js - checksum: 10c0/24a07653150f0d9ac7168e52943cc3cb4b7a22c0e43c7dff3219977c2fdca5a2760a304a029c20811a0e79d351f57d46c9bde216193a0f73978496afc2b85b15 - languageName: node - linkType: hard - -"react-dev-utils@npm:^12.0.1": - version: 12.0.1 - resolution: "react-dev-utils@npm:12.0.1" - dependencies: - "@babel/code-frame": "npm:^7.16.0" - address: "npm:^1.1.2" - browserslist: "npm:^4.18.1" - chalk: "npm:^4.1.2" - cross-spawn: "npm:^7.0.3" - detect-port-alt: "npm:^1.1.6" - escape-string-regexp: "npm:^4.0.0" - filesize: "npm:^8.0.6" - find-up: "npm:^5.0.0" - fork-ts-checker-webpack-plugin: "npm:^6.5.0" - global-modules: "npm:^2.0.0" - globby: "npm:^11.0.4" - gzip-size: "npm:^6.0.0" - immer: "npm:^9.0.7" - is-root: "npm:^2.1.0" - loader-utils: "npm:^3.2.0" - open: "npm:^8.4.0" - pkg-up: "npm:^3.1.0" - prompts: "npm:^2.4.2" - react-error-overlay: "npm:^6.0.11" - recursive-readdir: "npm:^2.2.2" - shell-quote: "npm:^1.7.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" - checksum: 10c0/94bc4ee5014290ca47a025e53ab2205c5dc0299670724d46a0b1bacbdd48904827b5ae410842d0a3a92481509097ae032e4a9dc7ca70db437c726eaba6411e82 - languageName: node - linkType: hard - -"react-dom@npm:^18.3.1": - version: 18.3.1 - resolution: "react-dom@npm:18.3.1" - dependencies: - loose-envify: "npm:^1.1.0" - scheduler: "npm:^0.23.2" - peerDependencies: - react: ^18.3.1 - checksum: 10c0/a752496c1941f958f2e8ac56239172296fcddce1365ce45222d04a1947e0cc5547df3e8447f855a81d6d39f008d7c32eab43db3712077f09e3f67c4874973e85 - languageName: node - linkType: hard - -"react-error-overlay@npm:^6.0.11": - version: 6.0.11 - resolution: "react-error-overlay@npm:6.0.11" - checksum: 10c0/8fc93942976e0c704274aec87dbc8e21f62a2cc78d1c93f9bcfff9f7494b00c60f7a2f0bd48d832bcd3190627c0255a1df907373f61f820371373a65ec4b2d64 - languageName: node - linkType: hard - -"react-fast-compare@npm:^3.2.0, react-fast-compare@npm:^3.2.2": - version: 3.2.2 - resolution: "react-fast-compare@npm:3.2.2" - checksum: 10c0/0bbd2f3eb41ab2ff7380daaa55105db698d965c396df73e6874831dbafec8c4b5b08ba36ff09df01526caa3c61595247e3269558c284e37646241cba2b90a367 - languageName: node - linkType: hard - -"react-helmet-async@npm:*": - version: 2.0.5 - resolution: "react-helmet-async@npm:2.0.5" - dependencies: - invariant: "npm:^2.2.4" - react-fast-compare: "npm:^3.2.2" - shallowequal: "npm:^1.1.0" - peerDependencies: - react: ^16.6.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/f390ea8bf13c2681850e5f8eb5b73d8613f407c245a5fd23e9db9b2cc14a3700dd1ce992d3966632886d1d613083294c2aeee009193f49dfa7d145d9f13ea2b0 - languageName: node - linkType: hard - -"react-helmet-async@npm:^1.3.0": - version: 1.3.0 - resolution: "react-helmet-async@npm:1.3.0" - dependencies: - "@babel/runtime": "npm:^7.12.5" - invariant: "npm:^2.2.4" - prop-types: "npm:^15.7.2" - react-fast-compare: "npm:^3.2.0" - shallowequal: "npm:^1.1.0" - peerDependencies: - react: ^16.6.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/8f3e6d26beff61d2ed18f7b41561df3e4d83a7582914c7196aa65158c7f3cce939276547d7a0b8987952d9d44131406df74efba02d1f8fa8a3940b49e6ced70b - languageName: node - linkType: hard - -"react-is@npm:^16.13.1, react-is@npm:^16.6.0, react-is@npm:^16.7.0": - version: 16.13.1 - resolution: "react-is@npm:16.13.1" - checksum: 10c0/33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1 - languageName: node - linkType: hard - -"react-is@npm:^18.0.0": - version: 18.3.1 - resolution: "react-is@npm:18.3.1" - checksum: 10c0/f2f1e60010c683479e74c63f96b09fb41603527cd131a9959e2aee1e5a8b0caf270b365e5ca77d4a6b18aae659b60a86150bb3979073528877029b35aecd2072 - languageName: node - linkType: hard - -"react-json-view-lite@npm:^1.2.0": - version: 1.4.0 - resolution: "react-json-view-lite@npm:1.4.0" - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - checksum: 10c0/80dd21b14f9dcd93b2f473084aaa934594834a98ae2ed5725c98fae34486226d2eaa69a0bc4233f89b7bab4825e2d393efd6f7d39d59aa37a5bb44a61785f7e5 - languageName: node - linkType: hard - -"react-loadable-ssr-addon-v5-slorber@npm:^1.0.1": - version: 1.0.1 - resolution: "react-loadable-ssr-addon-v5-slorber@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.10.3" - peerDependencies: - react-loadable: "*" - webpack: ">=4.41.1 || 5.x" - checksum: 10c0/7b0645f66adec56646f985ba8094c66a1c0a4627d96ad80eea32431d773ef1f79aa47d3247a8f21db3b064a0c6091653c5b5d3483b7046722eb64e55bffe635c - languageName: node - linkType: hard - -"react-loadable@npm:@docusaurus/react-loadable@6.0.0": - version: 6.0.0 - resolution: "@docusaurus/react-loadable@npm:6.0.0" - dependencies: - "@types/react": "npm:*" - peerDependencies: - react: "*" - checksum: 10c0/6b145d1a8d2e7342ceef58dd154aa990322f72a6cb98955ab8ce8e3f0dc7f0c5d00f9c2e4efa8d356c5effed72a130b5588857332b11faba0398f5429b484b04 - languageName: node - linkType: hard - -"react-router-config@npm:^5.1.1": - version: 5.1.1 - resolution: "react-router-config@npm:5.1.1" - dependencies: - "@babel/runtime": "npm:^7.1.2" - peerDependencies: - react: ">=15" - react-router: ">=5" - checksum: 10c0/1f8f4e55ca68b7b012293e663eb0ee4d670a3df929b78928f713ef98cd9d62c7f5c30a098d6668e64bbb11c7d6bb24e9e6b9c985a8b82465a1858dc7ba663f2b - languageName: node - linkType: hard - -"react-router-dom@npm:^5.3.4": - version: 5.3.4 - resolution: "react-router-dom@npm:5.3.4" - dependencies: - "@babel/runtime": "npm:^7.12.13" - history: "npm:^4.9.0" - loose-envify: "npm:^1.3.1" - prop-types: "npm:^15.6.2" - react-router: "npm:5.3.4" - tiny-invariant: "npm:^1.0.2" - tiny-warning: "npm:^1.0.0" - peerDependencies: - react: ">=15" - checksum: 10c0/f04f727e2ed2e9d1d3830af02cc61690ff67b1524c0d18690582bfba0f4d14142ccc88fb6da6befad644fddf086f5ae4c2eb7048c67da8a0b0929c19426421b0 - languageName: node - linkType: hard - -"react-router@npm:5.3.4, react-router@npm:^5.3.4": - version: 5.3.4 - resolution: "react-router@npm:5.3.4" - dependencies: - "@babel/runtime": "npm:^7.12.13" - history: "npm:^4.9.0" - hoist-non-react-statics: "npm:^3.1.0" - loose-envify: "npm:^1.3.1" - path-to-regexp: "npm:^1.7.0" - prop-types: "npm:^15.6.2" - react-is: "npm:^16.6.0" - tiny-invariant: "npm:^1.0.2" - tiny-warning: "npm:^1.0.0" - peerDependencies: - react: ">=15" - checksum: 10c0/e15c00dfef199249b4c6e6d98e5e76cc352ce66f3270f13df37cc069ddf7c05e43281e8c308fc407e4435d72924373baef1d2890e0f6b0b1eb423cf47315a053 - languageName: node - linkType: hard - -"react@npm:^18.3.1": - version: 18.3.1 - resolution: "react@npm:18.3.1" - dependencies: - loose-envify: "npm:^1.1.0" - checksum: 10c0/283e8c5efcf37802c9d1ce767f302dd569dd97a70d9bb8c7be79a789b9902451e0d16334b05d73299b20f048cbc3c7d288bbbde10b701fa194e2089c237dbea3 - languageName: node - linkType: hard - -"read-pkg-up@npm:^7.0.1": - version: 7.0.1 - resolution: "read-pkg-up@npm:7.0.1" - dependencies: - find-up: "npm:^4.1.0" - read-pkg: "npm:^5.2.0" - type-fest: "npm:^0.8.1" - checksum: 10c0/82b3ac9fd7c6ca1bdc1d7253eb1091a98ff3d195ee0a45386582ce3e69f90266163c34121e6a0a02f1630073a6c0585f7880b3865efcae9c452fa667f02ca385 - languageName: node - linkType: hard - -"read-pkg@npm:^5.2.0": - version: 5.2.0 - resolution: "read-pkg@npm:5.2.0" - dependencies: - "@types/normalize-package-data": "npm:^2.4.0" - normalize-package-data: "npm:^2.5.0" - parse-json: "npm:^5.0.0" - type-fest: "npm:^0.6.0" - checksum: 10c0/b51a17d4b51418e777029e3a7694c9bd6c578a5ab99db544764a0b0f2c7c0f58f8a6bc101f86a6fceb8ba6d237d67c89acf6170f6b98695d0420ddc86cf109fb - languageName: node - linkType: hard - -"read-yaml-file@npm:2.1.0": - version: 2.1.0 - resolution: "read-yaml-file@npm:2.1.0" - dependencies: - js-yaml: "npm:^4.0.0" - strip-bom: "npm:^4.0.0" - checksum: 10c0/bad0673abe78a5bde7c53b22ee7cdd0dfe49ab7338a4ad8618be9fcd2fd25ab9ae60d395907fddbfb2e7fbbf494867aeec78295c2396bec2669fd7087d2734c1 - languageName: node - linkType: hard - -"read@npm:1.0.x": - version: 1.0.7 - resolution: "read@npm:1.0.7" - dependencies: - mute-stream: "npm:~0.0.4" - checksum: 10c0/443533f05d5bb11b36ef1c6d625aae4e2ced8967e93cf546f35aa77b4eb6bd157f4256619e446bae43467f8f6619c7bc5c76983348dffaf36afedf4224f46216 - languageName: node - linkType: hard - -"readable-stream@npm:^2.0.1": - version: 2.3.8 - resolution: "readable-stream@npm:2.3.8" - dependencies: - core-util-is: "npm:~1.0.0" - inherits: "npm:~2.0.3" - isarray: "npm:~1.0.0" - process-nextick-args: "npm:~2.0.0" - safe-buffer: "npm:~5.1.1" - string_decoder: "npm:~1.1.1" - util-deprecate: "npm:~1.0.1" - checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa - languageName: node - linkType: hard - -"readable-stream@npm:^3.0.6": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: "npm:^2.0.3" - string_decoder: "npm:^1.1.1" - util-deprecate: "npm:^1.0.1" - checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 - languageName: node - linkType: hard - -"readdir-enhanced@npm:^1.5.2": - version: 1.5.2 - resolution: "readdir-enhanced@npm:1.5.2" - dependencies: - call-me-maybe: "npm:^1.0.1" - es6-promise: "npm:^4.1.0" - glob-to-regexp: "npm:^0.3.0" - checksum: 10c0/b285f2913cea64955c7536701db049df265dc78f518a146282f6240e430566ce5e7051e9e65b085a73f24a4bd3e86a5af41f6b56db942e99721f2915ed1cbaf7 - languageName: node - linkType: hard - -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: "npm:^2.2.1" - checksum: 10c0/6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b - languageName: node - linkType: hard - -"reading-time@npm:^1.5.0": - version: 1.5.0 - resolution: "reading-time@npm:1.5.0" - checksum: 10c0/0f730852fd4fb99e5f78c5b0cf36ab8c3fa15db96f87d9563843f6fd07a47864273ade539ebb184b785b728cde81a70283aa2d9b80cba5ca03b81868be03cabc - languageName: node - linkType: hard - -"rechoir@npm:^0.6.2": - version: 0.6.2 - resolution: "rechoir@npm:0.6.2" - dependencies: - resolve: "npm:^1.1.6" - checksum: 10c0/22c4bb32f4934a9468468b608417194f7e3ceba9a508512125b16082c64f161915a28467562368eeb15dc16058eb5b7c13a20b9eb29ff9927d1ebb3b5aa83e84 - languageName: node - linkType: hard - -"recursive-readdir@npm:^2.2.2": - version: 2.2.3 - resolution: "recursive-readdir@npm:2.2.3" - dependencies: - minimatch: "npm:^3.0.5" - checksum: 10c0/d0238f137b03af9cd645e1e0b40ae78b6cda13846e3ca57f626fcb58a66c79ae018a10e926b13b3a460f1285acc946a4e512ea8daa2e35df4b76a105709930d1 - languageName: node - linkType: hard - -"regenerate-unicode-properties@npm:^10.1.0": - version: 10.1.1 - resolution: "regenerate-unicode-properties@npm:10.1.1" - dependencies: - regenerate: "npm:^1.4.2" - checksum: 10c0/89adb5ee5ba081380c78f9057c02e156a8181969f6fcca72451efc45612e0c3df767b4333f8d8479c274d9c6fe52ec4854f0d8a22ef95dccbe87da8e5f2ac77d - languageName: node - linkType: hard - -"regenerate@npm:^1.4.2": - version: 1.4.2 - resolution: "regenerate@npm:1.4.2" - checksum: 10c0/f73c9eba5d398c818edc71d1c6979eaa05af7a808682749dd079f8df2a6d91a9b913db216c2c9b03e0a8ba2bba8701244a93f45211afbff691c32c7b275db1b8 - languageName: node - linkType: hard - -"regenerator-runtime@npm:^0.14.0": - version: 0.14.1 - resolution: "regenerator-runtime@npm:0.14.1" - checksum: 10c0/1b16eb2c4bceb1665c89de70dcb64126a22bc8eb958feef3cd68fe11ac6d2a4899b5cd1b80b0774c7c03591dc57d16631a7f69d2daa2ec98100e2f29f7ec4cc4 - languageName: node - linkType: hard - -"regenerator-transform@npm:^0.15.2": - version: 0.15.2 - resolution: "regenerator-transform@npm:0.15.2" - dependencies: - "@babel/runtime": "npm:^7.8.4" - checksum: 10c0/7cfe6931ec793269701994a93bab89c0cc95379191fad866270a7fea2adfec67ea62bb5b374db77058b60ba4509319d9b608664d0d288bd9989ca8dbd08fae90 - languageName: node - linkType: hard - -"regexp-to-ast@npm:0.5.0": - version: 0.5.0 - resolution: "regexp-to-ast@npm:0.5.0" - checksum: 10c0/16d3c3905fb24866c3bff689ab177c1e63a7283a3cd1ba95987ef86020526f9827f5c60794197311f0e8a967889131142fe7a2e5ed3523ffe2ac9f55052e1566 - languageName: node - linkType: hard - -"regexp-tree@npm:^0.1.27": - version: 0.1.27 - resolution: "regexp-tree@npm:0.1.27" - bin: - regexp-tree: bin/regexp-tree - checksum: 10c0/f636f44b4a0d93d7d6926585ecd81f63e4ce2ac895bc417b2ead0874cd36b337dcc3d0fedc63f69bf5aaeaa4340f36ca7e750c9687cceaf8087374e5284e843c - languageName: node - linkType: hard - -"regexpu-core@npm:^5.3.1": - version: 5.3.2 - resolution: "regexpu-core@npm:5.3.2" - dependencies: - "@babel/regjsgen": "npm:^0.8.0" - regenerate: "npm:^1.4.2" - regenerate-unicode-properties: "npm:^10.1.0" - regjsparser: "npm:^0.9.1" - unicode-match-property-ecmascript: "npm:^2.0.0" - unicode-match-property-value-ecmascript: "npm:^2.1.0" - checksum: 10c0/7945d5ab10c8bbed3ca383d4274687ea825aee4ab93a9c51c6e31e1365edd5ea807f6908f800ba017b66c462944ba68011164e7055207747ab651f8111ef3770 - languageName: node - linkType: hard - -"registry-auth-token@npm:^5.0.1": - version: 5.0.2 - resolution: "registry-auth-token@npm:5.0.2" - dependencies: - "@pnpm/npm-conf": "npm:^2.1.0" - checksum: 10c0/20fc2225681cc54ae7304b31ebad5a708063b1949593f02dfe5fb402bc1fc28890cecec6497ea396ba86d6cca8a8480715926dfef8cf1f2f11e6f6cc0a1b4bde - languageName: node - linkType: hard - -"registry-url@npm:^6.0.0": - version: 6.0.1 - resolution: "registry-url@npm:6.0.1" - dependencies: - rc: "npm:1.2.8" - checksum: 10c0/66e2221c8113fc35ee9d23fe58cb516fc8d556a189fb8d6f1011a02efccc846c4c9b5075b4027b99a5d5c9ad1345ac37f297bea3c0ca30d607ec8084bf561b90 - languageName: node - linkType: hard - -"regjsparser@npm:^0.10.0": - version: 0.10.0 - resolution: "regjsparser@npm:0.10.0" - dependencies: - jsesc: "npm:~0.5.0" - bin: - regjsparser: bin/parser - checksum: 10c0/0f0508c142eddbceae55dab9715e714305c19e1e130db53168e8fa5f9f7ff9a4901f674cf6f71e04a0973b2f883882ba05808c80778b2d52b053d925050010f4 - languageName: node - linkType: hard - -"regjsparser@npm:^0.9.1": - version: 0.9.1 - resolution: "regjsparser@npm:0.9.1" - dependencies: - jsesc: "npm:~0.5.0" - bin: - regjsparser: bin/parser - checksum: 10c0/fe44fcf19a99fe4f92809b0b6179530e5ef313ff7f87df143b08ce9a2eb3c4b6189b43735d645be6e8f4033bfb015ed1ca54f0583bc7561bed53fd379feb8225 - languageName: node - linkType: hard - -"rehype-raw@npm:^7.0.0": - version: 7.0.0 - resolution: "rehype-raw@npm:7.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - hast-util-raw: "npm:^9.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/1435b4b6640a5bc3abe3b2133885c4dbff5ef2190ef9cfe09d6a63f74dd7d7ffd0cede70603278560ccf1acbfb9da9faae4b68065a28bc5aa88ad18e40f32d52 - languageName: node - linkType: hard - -"relateurl@npm:^0.2.7": - version: 0.2.7 - resolution: "relateurl@npm:0.2.7" - checksum: 10c0/c248b4e3b32474f116a804b537fa6343d731b80056fb506dffd91e737eef4cac6be47a65aae39b522b0db9d0b1011d1a12e288d82a109ecd94a5299d82f6573a - languageName: node - linkType: hard - -"remark-directive@npm:^3.0.0": - version: 3.0.0 - resolution: "remark-directive@npm:3.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-directive: "npm:^3.0.0" - micromark-extension-directive: "npm:^3.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/eeec4d70501c5bce55b2528fa0c8f1e2a5c713c9f72a7d4678dd3868c425620ec409a719bb2656663296bc476c63f5d7bcacd5a9059146bfc89d40e4ce13a7f6 - languageName: node - linkType: hard - -"remark-emoji@npm:^4.0.0": - version: 4.0.1 - resolution: "remark-emoji@npm:4.0.1" - dependencies: - "@types/mdast": "npm:^4.0.2" - emoticon: "npm:^4.0.1" - mdast-util-find-and-replace: "npm:^3.0.1" - node-emoji: "npm:^2.1.0" - unified: "npm:^11.0.4" - checksum: 10c0/27f88892215f3efe8f25c43f226a82d70144a1ae5906d36f6e09390b893b2d5524d5949bd8ca6a02be0e3cb5cba908b35c4221f4e07f34e93d13d6ff9347dbb8 - languageName: node - linkType: hard - -"remark-frontmatter@npm:^5.0.0": - version: 5.0.0 - resolution: "remark-frontmatter@npm:5.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-frontmatter: "npm:^2.0.0" - micromark-extension-frontmatter: "npm:^2.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/102325d5edbcf30eaf74de8a0a6e03096cc2370dfef19080fd2dd208f368fbb2323388751ac9931a1aa38a4f2828fa4bad6c52dc5249dcadcd34861693b52bf9 - languageName: node - linkType: hard - -"remark-gfm@npm:^4.0.0": - version: 4.0.0 - resolution: "remark-gfm@npm:4.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-gfm: "npm:^3.0.0" - micromark-extension-gfm: "npm:^3.0.0" - remark-parse: "npm:^11.0.0" - remark-stringify: "npm:^11.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/db0aa85ab718d475c2596e27c95be9255d3b0fc730a4eda9af076b919f7dd812f7be3ac020611a8dbe5253fd29671d7b12750b56e529fdc32dfebad6dbf77403 - languageName: node - linkType: hard - -"remark-mdx@npm:^3.0.0": - version: 3.0.1 - resolution: "remark-mdx@npm:3.0.1" - dependencies: - mdast-util-mdx: "npm:^3.0.0" - micromark-extension-mdxjs: "npm:^3.0.0" - checksum: 10c0/9e16cd5ff3b30620bd25351a2dd1701627fa5555785b35ee5fe07bd1e6793a9c825cc1f6af9e54a44351f74879f8b5ea2bce8e5a21379aeab58935e76a4d69ce - languageName: node - linkType: hard - -"remark-parse@npm:^11.0.0": - version: 11.0.0 - resolution: "remark-parse@npm:11.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/6eed15ddb8680eca93e04fcb2d1b8db65a743dcc0023f5007265dda558b09db595a087f622062ccad2630953cd5cddc1055ce491d25a81f3317c858348a8dd38 - languageName: node - linkType: hard - -"remark-rehype@npm:^11.0.0": - version: 11.1.0 - resolution: "remark-rehype@npm:11.1.0" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - mdast-util-to-hast: "npm:^13.0.0" - unified: "npm:^11.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/7a9534847ea70e78cf09227a4302af7e491f625fd092351a1b1ee27a2de0a369ac4acf069682e8a8ec0a55847b3e83f0be76b2028aa90e98e69e21420b9794c3 - languageName: node - linkType: hard - -"remark-stringify@npm:^11.0.0": - version: 11.0.0 - resolution: "remark-stringify@npm:11.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/0cdb37ce1217578f6f847c7ec9f50cbab35df5b9e3903d543e74b405404e67c07defcb23cd260a567b41b769400f6de03c2c3d9cd6ae7a6707d5c8d89ead489f - languageName: node - linkType: hard - -"renderkid@npm:^3.0.0": - version: 3.0.0 - resolution: "renderkid@npm:3.0.0" - dependencies: - css-select: "npm:^4.1.3" - dom-converter: "npm:^0.2.0" - htmlparser2: "npm:^6.1.0" - lodash: "npm:^4.17.21" - strip-ansi: "npm:^6.0.1" - checksum: 10c0/24a9fae4cc50e731d059742d1b3eec163dc9e3872b12010d120c3fcbd622765d9cda41f79a1bbb4bf63c1d3442f18a08f6e1642cb5d7ebf092a0ce3f7a3bd143 - languageName: node - linkType: hard - -"repeat-string@npm:^1.6.1": - version: 1.6.1 - resolution: "repeat-string@npm:1.6.1" - checksum: 10c0/87fa21bfdb2fbdedc44b9a5b118b7c1239bdd2c2c1e42742ef9119b7d412a5137a1d23f1a83dc6bb686f4f27429ac6f542e3d923090b44181bafa41e8ac0174d - languageName: node - linkType: hard - -"require-directory@npm:^2.1.1": - version: 2.1.1 - resolution: "require-directory@npm:2.1.1" - checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 - languageName: node - linkType: hard - -"require-from-string@npm:^2.0.2": - version: 2.0.2 - resolution: "require-from-string@npm:2.0.2" - checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 - languageName: node - linkType: hard - -"require-like@npm:>= 0.1.1": - version: 0.1.2 - resolution: "require-like@npm:0.1.2" - checksum: 10c0/9035ff6c4000a56ede6fc51dd5c56541fafa5a7dddc9b1c3a5f9148d95ee21c603c9bf5c6e37b19fc7de13d9294260842d8590b2ffd6c7c773e78603d1af8050 - languageName: node - linkType: hard - -"requires-port@npm:^1.0.0": - version: 1.0.0 - resolution: "requires-port@npm:1.0.0" - checksum: 10c0/b2bfdd09db16c082c4326e573a82c0771daaf7b53b9ce8ad60ea46aa6e30aaf475fe9b164800b89f93b748d2c234d8abff945d2551ba47bf5698e04cd7713267 - languageName: node - linkType: hard - -"resolve-alpn@npm:^1.2.0": - version: 1.2.1 - resolution: "resolve-alpn@npm:1.2.1" - checksum: 10c0/b70b29c1843bc39781ef946c8cd4482e6d425976599c0f9c138cec8209e4e0736161bf39319b01676a847000085dfdaf63583c6fb4427bf751a10635bd2aa0c4 - languageName: node - linkType: hard - -"resolve-cwd@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-cwd@npm:3.0.0" - dependencies: - resolve-from: "npm:^5.0.0" - checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 - languageName: node - linkType: hard - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 - languageName: node - linkType: hard - -"resolve-from@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-from@npm:5.0.0" - checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 - languageName: node - linkType: hard - -"resolve-pathname@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-pathname@npm:3.0.0" - checksum: 10c0/c6ec49b670dc35b9a303c47fa83ba9348a71e92d64a4c4bb85e1b659a29b407aa1ac1cb14a9b5b502982132ca77482bd80534bca147439d66880d35a137fe723 - languageName: node - linkType: hard - -"resolve-pkg-maps@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-pkg-maps@npm:1.0.0" - checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab - languageName: node - linkType: hard - -"resolve.exports@npm:^2.0.0": - version: 2.0.2 - resolution: "resolve.exports@npm:2.0.2" - checksum: 10c0/cc4cffdc25447cf34730f388dca5021156ba9302a3bad3d7f168e790dc74b2827dff603f1bc6ad3d299bac269828dca96dd77e036dc9fba6a2a1807c47ab5c98 - languageName: node - linkType: hard - -"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.15.1, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:~1.22.1, resolve@npm:~1.22.2": - version: 1.22.8 - resolution: "resolve@npm:1.22.8" - dependencies: - is-core-module: "npm:^2.13.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.15.1#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin, resolve@patch:resolve@npm%3A~1.22.2#optional!builtin": - version: 1.22.8 - resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.13.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 - languageName: node - linkType: hard - -"responselike@npm:^3.0.0": - version: 3.0.0 - resolution: "responselike@npm:3.0.0" - dependencies: - lowercase-keys: "npm:^3.0.0" - checksum: 10c0/8af27153f7e47aa2c07a5f2d538cb1e5872995f0e9ff77def858ecce5c3fe677d42b824a62cde502e56d275ab832b0a8bd350d5cd6b467ac0425214ac12ae658 - languageName: node - linkType: hard - -"restore-cursor@npm:^4.0.0": - version: 4.0.0 - resolution: "restore-cursor@npm:4.0.0" - dependencies: - onetime: "npm:^5.1.0" - signal-exit: "npm:^3.0.2" - checksum: 10c0/6f7da8c5e422ac26aa38354870b1afac09963572cf2879443540449068cb43476e9cbccf6f8de3e0171e0d6f7f533c2bc1a0a008003c9a525bbc098e89041318 - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe - languageName: node - linkType: hard - -"retry@npm:^0.13.1": - version: 0.13.1 - resolution: "retry@npm:0.13.1" - checksum: 10c0/9ae822ee19db2163497e074ea919780b1efa00431d197c7afdb950e42bf109196774b92a49fc9821f0b8b328a98eea6017410bfc5e8a0fc19c85c6d11adb3772 - languageName: node - linkType: hard - -"reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 - languageName: node - linkType: hard - -"revalidator@npm:0.1.x": - version: 0.1.8 - resolution: "revalidator@npm:0.1.8" - checksum: 10c0/bb324a169dfd7a6a8503861474c48da55244214391c5e3fd20e37802d9a24ea395ab57d218d26715110e6a834b3ad2dbd3db12bb35e8facaabb876093e9ade2b - languageName: node - linkType: hard - -"rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: bin.js - checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 - languageName: node - linkType: hard - -"rollup-plugin-dts@npm:^6.0.0": - version: 6.1.1 - resolution: "rollup-plugin-dts@npm:6.1.1" - dependencies: - "@babel/code-frame": "npm:^7.24.2" - magic-string: "npm:^0.30.10" - peerDependencies: - rollup: ^3.29.4 || ^4 - typescript: ^4.5 || ^5.0 - dependenciesMeta: - "@babel/code-frame": - optional: true - checksum: 10c0/2b042198ff00fb10c9c70087bbac9013f748dc34be0dbfcca82c6353884ead1467b4a8a37bafe9a8b9356479d43715c7cbc591eeb8e4112c583452431c1cb0a0 - languageName: node - linkType: hard - -"rollup@npm:^3.28.1": - version: 3.29.4 - resolution: "rollup@npm:3.29.4" - dependencies: - fsevents: "npm:~2.3.2" - dependenciesMeta: - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 10c0/65eddf84bf389ea8e4d4c1614b1c6a298d08f8ae785c0c087e723a879190c8aaddbab4aa3b8a0524551b9036750c9f8bfea27b377798accfd2ba5084ceff5aaa - languageName: node - linkType: hard - -"rtl-detect@npm:^1.0.4": - version: 1.1.2 - resolution: "rtl-detect@npm:1.1.2" - checksum: 10c0/1b92888aafca1593314f837e83fdf02eb208faae3e713ab87c176804728efd3b1980d53b64f65f1fa593348087e852c5cd729b7b9372950f6e9b7be489afc0ca - languageName: node - linkType: hard - -"rtlcss@npm:^4.1.0": - version: 4.2.0 - resolution: "rtlcss@npm:4.2.0" - dependencies: - escalade: "npm:^3.1.1" - picocolors: "npm:^1.0.0" - postcss: "npm:^8.4.21" - strip-json-comments: "npm:^3.1.1" - bin: - rtlcss: bin/rtlcss.js - checksum: 10c0/8d1512c36f426bc4f133bc14ab06f11f3f7880a88491ddab81733551465f72adace688653f13fbb6d343961c08503ede5b204bf224e8adf8941a045d5756f537 - languageName: node - linkType: hard - -"run-con@npm:~1.3.2": - version: 1.3.2 - resolution: "run-con@npm:1.3.2" - dependencies: - deep-extend: "npm:^0.6.0" - ini: "npm:~4.1.0" - minimist: "npm:^1.2.8" - strip-json-comments: "npm:~3.1.1" - bin: - run-con: cli.js - checksum: 10c0/b0bdd3083cf9f188e72df8905a1a40a1478e2a7437b0312ab1b824e058129388b811705ee7874e9a707e5de0e8fb8eb790da3aa0a23375323feecd1da97d5cf6 - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: "npm:^1.2.2" - checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 - languageName: node - linkType: hard - -"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 - languageName: node - linkType: hard - -"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 - languageName: node - linkType: hard - -"safe-stable-stringify@npm:^2.4.3": - version: 2.4.3 - resolution: "safe-stable-stringify@npm:2.4.3" - checksum: 10c0/81dede06b8f2ae794efd868b1e281e3c9000e57b39801c6c162267eb9efda17bd7a9eafa7379e1f1cacd528d4ced7c80d7460ad26f62ada7c9e01dec61b2e768 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 - languageName: node - linkType: hard - -"sax@npm:>=0.6.0, sax@npm:^1.2.4": - version: 1.4.1 - resolution: "sax@npm:1.4.1" - checksum: 10c0/6bf86318a254c5d898ede6bd3ded15daf68ae08a5495a2739564eb265cd13bcc64a07ab466fb204f67ce472bb534eb8612dac587435515169593f4fffa11de7c - languageName: node - linkType: hard - -"scheduler@npm:^0.23.2": - version: 0.23.2 - resolution: "scheduler@npm:0.23.2" - dependencies: - loose-envify: "npm:^1.1.0" - checksum: 10c0/26383305e249651d4c58e6705d5f8425f153211aef95f15161c151f7b8de885f24751b377e4a0b3dd42cce09aad3f87a61dab7636859c0d89b7daf1a1e2a5c78 - languageName: node - linkType: hard - -"schema-utils@npm:2.7.0": - version: 2.7.0 - resolution: "schema-utils@npm:2.7.0" - dependencies: - "@types/json-schema": "npm:^7.0.4" - ajv: "npm:^6.12.2" - ajv-keywords: "npm:^3.4.1" - checksum: 10c0/723c3c856a0313a89aa81c5fb2c93d4b11225f5cdd442665fddd55d3c285ae72e079f5286a3a9a1a973affe888f6c33554a2cf47b79b24cd8de2f1f756a6fb1b - languageName: node - linkType: hard - -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": - version: 3.3.0 - resolution: "schema-utils@npm:3.3.0" - dependencies: - "@types/json-schema": "npm:^7.0.8" - ajv: "npm:^6.12.5" - ajv-keywords: "npm:^3.5.2" - checksum: 10c0/fafdbde91ad8aa1316bc543d4b61e65ea86970aebbfb750bfb6d8a6c287a23e415e0e926c2498696b242f63af1aab8e585252637fabe811fd37b604351da6500 - languageName: node - linkType: hard - -"schema-utils@npm:^4.0.0, schema-utils@npm:^4.0.1": - version: 4.2.0 - resolution: "schema-utils@npm:4.2.0" - dependencies: - "@types/json-schema": "npm:^7.0.9" - ajv: "npm:^8.9.0" - ajv-formats: "npm:^2.1.1" - ajv-keywords: "npm:^5.1.0" - checksum: 10c0/8dab7e7800316387fd8569870b4b668cfcecf95ac551e369ea799bbcbfb63fb0365366d4b59f64822c9f7904d8c5afcfaf5a6124a4b08783e558cd25f299a6b4 - languageName: node - linkType: hard - -"scule@npm:^1.0.0, scule@npm:^1.2.0": - version: 1.3.0 - resolution: "scule@npm:1.3.0" - checksum: 10c0/5d1736daa10622c420f2aa74e60d3c722e756bfb139fa784ae5c66669fdfe92932d30ed5072e4ce3107f9c3053e35ad73b2461cb18de45b867e1d4dea63f8823 - languageName: node - linkType: hard - -"section-matter@npm:^1.0.0": - version: 1.0.0 - resolution: "section-matter@npm:1.0.0" - dependencies: - extend-shallow: "npm:^2.0.1" - kind-of: "npm:^6.0.0" - checksum: 10c0/8007f91780adc5aaa781a848eaae50b0f680bbf4043b90cf8a96778195b8fab690c87fe7a989e02394ce69890e330811ec8dab22397d384673ce59f7d750641d - languageName: node - linkType: hard - -"select-hose@npm:^2.0.0": - version: 2.0.0 - resolution: "select-hose@npm:2.0.0" - checksum: 10c0/01cc52edd29feddaf379efb4328aededa633f0ac43c64b11a8abd075ff34f05b0d280882c4fbcbdf1a0658202c9cd2ea8d5985174dcf9a2dac7e3a4996fa9b67 - languageName: node - linkType: hard - -"selfsigned@npm:^2.1.1": - version: 2.4.1 - resolution: "selfsigned@npm:2.4.1" - dependencies: - "@types/node-forge": "npm:^1.3.0" - node-forge: "npm:^1" - checksum: 10c0/521829ec36ea042f7e9963bf1da2ed040a815cf774422544b112ec53b7edc0bc50a0f8cc2ae7aa6cc19afa967c641fd96a15de0fc650c68651e41277d2e1df09 - languageName: node - linkType: hard - -"semver-diff@npm:^4.0.0": - version: 4.0.0 - resolution: "semver-diff@npm:4.0.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/3ed1bb22f39b4b6e98785bb066e821eabb9445d3b23e092866c50e7df8b9bd3eda617b242f81db4159586e0e39b0deb908dd160a24f783bd6f52095b22cd68ea - languageName: node - linkType: hard - -"semver@npm:2 || 3 || 4 || 5": - version: 5.7.2 - resolution: "semver@npm:5.7.2" - bin: - semver: bin/semver - checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 - languageName: node - linkType: hard - -"semver@npm:7.6.3, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.1, semver@npm:^7.6.2, semver@npm:^7.6.3": - version: 7.6.3 - resolution: "semver@npm:7.6.3" - bin: - semver: bin/semver.js - checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf - languageName: node - linkType: hard - -"semver@npm:^6.3.0, semver@npm:^6.3.1": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d - languageName: node - linkType: hard - -"semver@npm:~7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: "npm:^6.0.0" - bin: - semver: bin/semver.js - checksum: 10c0/5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e - languageName: node - linkType: hard - -"send@npm:0.18.0": - version: 0.18.0 - resolution: "send@npm:0.18.0" - dependencies: - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" - mime: "npm:1.6.0" - ms: "npm:2.1.3" - on-finished: "npm:2.4.1" - range-parser: "npm:~1.2.1" - statuses: "npm:2.0.1" - checksum: 10c0/0eb134d6a51fc13bbcb976a1f4214ea1e33f242fae046efc311e80aff66c7a43603e26a79d9d06670283a13000e51be6e0a2cb80ff0942eaf9f1cd30b7ae736a - languageName: node - linkType: hard - -"serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.1": - version: 6.0.2 - resolution: "serialize-javascript@npm:6.0.2" - dependencies: - randombytes: "npm:^2.1.0" - checksum: 10c0/2dd09ef4b65a1289ba24a788b1423a035581bef60817bea1f01eda8e3bda623f86357665fe7ac1b50f6d4f583f97db9615b3f07b2a2e8cbcb75033965f771dd2 - languageName: node - linkType: hard - -"serve-handler@npm:^6.1.5": - version: 6.1.5 - resolution: "serve-handler@npm:6.1.5" - dependencies: - bytes: "npm:3.0.0" - content-disposition: "npm:0.5.2" - fast-url-parser: "npm:1.1.3" - mime-types: "npm:2.1.18" - minimatch: "npm:3.1.2" - path-is-inside: "npm:1.0.2" - path-to-regexp: "npm:2.2.1" - range-parser: "npm:1.2.0" - checksum: 10c0/6fd393ae37a0305107e634ca545322b00605322189fe70d8f1a4a90a101c4e354768c610efe5a7ef1af3820cec5c33d97467c88151f35a3cb41d8ff2075ef802 - languageName: node - linkType: hard - -"serve-index@npm:^1.9.1": - version: 1.9.1 - resolution: "serve-index@npm:1.9.1" - dependencies: - accepts: "npm:~1.3.4" - batch: "npm:0.6.1" - debug: "npm:2.6.9" - escape-html: "npm:~1.0.3" - http-errors: "npm:~1.6.2" - mime-types: "npm:~2.1.17" - parseurl: "npm:~1.3.2" - checksum: 10c0/a666471a24196f74371edf2c3c7bcdd82adbac52f600804508754b5296c3567588bf694258b19e0cb23a567acfa20d9721bfdaed3286007b81f9741ada8a3a9c - languageName: node - linkType: hard - -"serve-static@npm:1.15.0": - version: 1.15.0 - resolution: "serve-static@npm:1.15.0" - dependencies: - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - parseurl: "npm:~1.3.3" - send: "npm:0.18.0" - checksum: 10c0/fa9f0e21a540a28f301258dfe1e57bb4f81cd460d28f0e973860477dd4acef946a1f41748b5bd41c73b621bea2029569c935faa38578fd34cd42a9b4947088ba - languageName: node - linkType: hard - -"set-function-length@npm:^1.2.1": - version: 1.2.2 - resolution: "set-function-length@npm:1.2.2" - dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c - languageName: node - linkType: hard - -"setprototypeof@npm:1.1.0": - version: 1.1.0 - resolution: "setprototypeof@npm:1.1.0" - checksum: 10c0/a77b20876689c6a89c3b42f0c3596a9cae02f90fc902570cbd97198e9e8240382086c9303ad043e88cee10f61eae19f1004e51d885395a1e9bf49f9ebed12872 - languageName: node - linkType: hard - -"setprototypeof@npm:1.2.0": - version: 1.2.0 - resolution: "setprototypeof@npm:1.2.0" - checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc - languageName: node - linkType: hard - -"shallow-clone@npm:^3.0.0": - version: 3.0.1 - resolution: "shallow-clone@npm:3.0.1" - dependencies: - kind-of: "npm:^6.0.2" - checksum: 10c0/7bab09613a1b9f480c85a9823aebec533015579fa055ba6634aa56ba1f984380670eaf33b8217502931872aa1401c9fcadaa15f9f604d631536df475b05bcf1e - languageName: node - linkType: hard - -"shallowequal@npm:^1.1.0": - version: 1.1.0 - resolution: "shallowequal@npm:1.1.0" - checksum: 10c0/b926efb51cd0f47aa9bc061add788a4a650550bbe50647962113a4579b60af2abe7b62f9b02314acc6f97151d4cf87033a2b15fc20852fae306d1a095215396c - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: "npm:^3.0.0" - checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 - languageName: node - linkType: hard - -"shell-quote@npm:^1.7.3, shell-quote@npm:^1.8.1": - version: 1.8.1 - resolution: "shell-quote@npm:1.8.1" - checksum: 10c0/8cec6fd827bad74d0a49347057d40dfea1e01f12a6123bf82c4649f3ef152fc2bc6d6176e6376bffcd205d9d0ccb4f1f9acae889384d20baff92186f01ea455a - languageName: node - linkType: hard - -"shelljs@npm:^0.8.5": - version: 0.8.5 - resolution: "shelljs@npm:0.8.5" - dependencies: - glob: "npm:^7.0.0" - interpret: "npm:^1.0.0" - rechoir: "npm:^0.6.2" - bin: - shjs: bin/shjs - checksum: 10c0/feb25289a12e4bcd04c40ddfab51aff98a3729f5c2602d5b1a1b95f6819ec7804ac8147ebd8d9a85dfab69d501bcf92d7acef03247320f51c1552cec8d8e2382 - languageName: node - linkType: hard - -"shiki@npm:^1.9.1": - version: 1.14.1 - resolution: "shiki@npm:1.14.1" - dependencies: - "@shikijs/core": "npm:1.14.1" - "@types/hast": "npm:^3.0.4" - checksum: 10c0/756f45917f281e158eef114b985b9a4cae9f0470f955e2f96f4473a3aed327dc1d653b9bd6280eb28398bd0da6d533caa4fce61b716c1263c5d85df53964ade2 - languageName: node - linkType: hard - -"side-channel@npm:^1.0.4": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" - dependencies: - call-bind: "npm:^1.0.7" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - object-inspect: "npm:^1.13.1" - checksum: 10c0/d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 - languageName: node - linkType: hard - -"sirv@npm:^2.0.3": - version: 2.0.4 - resolution: "sirv@npm:2.0.4" - dependencies: - "@polka/url": "npm:^1.0.0-next.24" - mrmime: "npm:^2.0.0" - totalist: "npm:^3.0.0" - checksum: 10c0/68f8ee857f6a9415e9c07a1f31c7c561df8d5f1b1ba79bee3de583fa37da8718def5309f6b1c6e2c3ef77de45d74f5e49efc7959214443aa92d42e9c99180a4e - languageName: node - linkType: hard - -"sisteransi@npm:^1.0.5": - version: 1.0.5 - resolution: "sisteransi@npm:1.0.5" - checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 - languageName: node - linkType: hard - -"sitemap@npm:^7.1.1": - version: 7.1.2 - resolution: "sitemap@npm:7.1.2" - dependencies: - "@types/node": "npm:^17.0.5" - "@types/sax": "npm:^1.2.1" - arg: "npm:^5.0.0" - sax: "npm:^1.2.4" - bin: - sitemap: dist/cli.js - checksum: 10c0/01dd1268c0d4b89f8ef082bcb9ef18d0182d00d1622e9c54743474918169491e5360538f9a01a769262e0fe23d6e3822a90680eff0f076cf87b68d459014a34c - languageName: node - linkType: hard - -"skin-tone@npm:^2.0.0": - version: 2.0.0 - resolution: "skin-tone@npm:2.0.0" - dependencies: - unicode-emoji-modifier-base: "npm:^1.0.0" - checksum: 10c0/82d4c2527864f9cbd6cb7f3c4abb31e2224752234d5013b881d3e34e9ab543545b05206df5a17d14b515459fcb265ce409f9cfe443903176b0360cd20e4e4ba5 - languageName: node - linkType: hard - -"slash@npm:^3.0.0": - version: 3.0.0 - resolution: "slash@npm:3.0.0" - checksum: 10c0/e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b - languageName: node - linkType: hard - -"slash@npm:^4.0.0": - version: 4.0.0 - resolution: "slash@npm:4.0.0" - checksum: 10c0/b522ca75d80d107fd30d29df0549a7b2537c83c4c4ecd12cd7d4ea6c8aaca2ab17ada002e7a1d78a9d736a0261509f26ea5b489082ee443a3a810586ef8eff18 - languageName: node - linkType: hard - -"slash@npm:^5.1.0": - version: 5.1.0 - resolution: "slash@npm:5.1.0" - checksum: 10c0/eb48b815caf0bdc390d0519d41b9e0556a14380f6799c72ba35caf03544d501d18befdeeef074bc9c052acf69654bc9e0d79d7f1de0866284137a40805299eb3 - languageName: node - linkType: hard - -"slashes@npm:^3.0.12": - version: 3.0.12 - resolution: "slashes@npm:3.0.12" - checksum: 10c0/71ca2a1fcd1ab6814b0fdb8cf9c33a3d54321deec2aa8d173510f0086880201446021a9b9e6a18561f7c472b69a2145977c6a8fb9c53a8ff7be31778f203d175 - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 - languageName: node - linkType: hard - -"smol-toml@npm:^1.1.4": - version: 1.3.0 - resolution: "smol-toml@npm:1.3.0" - checksum: 10c0/442b4d033236ff6dd05bf91d57695fd9070a8221af080a5b2782cb2d9fad8bc31f698c61de5308a351907c1200202ba3ee51d52c5704f5349149e7c374f5fe90 - languageName: node - linkType: hard - -"smol-toml@npm:~1.2.0": - version: 1.2.2 - resolution: "smol-toml@npm:1.2.2" - checksum: 10c0/25a1be6dab16db07b1c7380df6175512a3f3d74fdf59ddb3e2eea126e985e0ae56b8150f5a0bea2bd4df259c59694374febdaa626a009b9d7958f9c1d385dd99 - languageName: node - linkType: hard - -"snake-case@npm:^3.0.4": - version: 3.0.4 - resolution: "snake-case@npm:3.0.4" - dependencies: - dot-case: "npm:^3.0.4" - tslib: "npm:^2.0.3" - checksum: 10c0/ab19a913969f58f4474fe9f6e8a026c8a2142a01f40b52b79368068343177f818cdfef0b0c6b9558f298782441d5ca8ed5932eb57822439fad791d866e62cecd - languageName: node - linkType: hard - -"sockjs@npm:^0.3.24": - version: 0.3.24 - resolution: "sockjs@npm:0.3.24" - dependencies: - faye-websocket: "npm:^0.11.3" - uuid: "npm:^8.3.2" - websocket-driver: "npm:^0.7.4" - checksum: 10c0/aa102c7d921bf430215754511c81ea7248f2dcdf268fbdb18e4d8183493a86b8793b164c636c52f474a886f747447c962741df2373888823271efdb9d2594f33 - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.4 - resolution: "socks-proxy-agent@npm:8.0.4" - dependencies: - agent-base: "npm:^7.1.1" - debug: "npm:^4.3.4" - socks: "npm:^2.8.3" - checksum: 10c0/345593bb21b95b0508e63e703c84da11549f0a2657d6b4e3ee3612c312cb3a907eac10e53b23ede3557c6601d63252103494caa306b66560f43af7b98f53957a - languageName: node - linkType: hard - -"socks@npm:^2.8.3": - version: 2.8.3 - resolution: "socks@npm:2.8.3" - dependencies: - ip-address: "npm:^9.0.5" - smart-buffer: "npm:^4.2.0" - checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 - languageName: node - linkType: hard - -"sort-css-media-queries@npm:2.2.0": - version: 2.2.0 - resolution: "sort-css-media-queries@npm:2.2.0" - checksum: 10c0/7478308c7ca93409f959ab993d41de2f0515ed5f51b671908ecb777aae0d63be97b454d59d80e14ee4874884618a2e825d4ae7ccb225779276904dd175f4e766 - languageName: node - linkType: hard - -"sort-object-keys@npm:^1.1.3": - version: 1.1.3 - resolution: "sort-object-keys@npm:1.1.3" - checksum: 10c0/3bf62398658d3ff4bbca0db4ed8f42f98abc41433859f63d02fb0ab953fbe5526be240ec7e5d85aa50fcab6c937f3fa7015abf1ecdeb3045a2281c53953886bf - languageName: node - linkType: hard - -"sort-package-json@npm:2.10.0": - version: 2.10.0 - resolution: "sort-package-json@npm:2.10.0" - dependencies: - detect-indent: "npm:^7.0.1" - detect-newline: "npm:^4.0.0" - get-stdin: "npm:^9.0.0" - git-hooks-list: "npm:^3.0.0" - globby: "npm:^13.1.2" - is-plain-obj: "npm:^4.1.0" - semver: "npm:^7.6.0" - sort-object-keys: "npm:^1.1.3" - bin: - sort-package-json: cli.js - checksum: 10c0/f3325c402cd63fa42947e3861fde0ed26c742bb1db9011d4a4111f2a27427ec778ce8223af5c5dd8fcdb1cf49a1ff55d7e5323fb187d29811cd99e503a80fe26 - languageName: node - linkType: hard - -"source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.0": - version: 1.2.0 - resolution: "source-map-js@npm:1.2.0" - checksum: 10c0/7e5f896ac10a3a50fe2898e5009c58ff0dc102dcb056ed27a354623a0ece8954d4b2649e1a1b2b52ef2e161d26f8859c7710350930751640e71e374fe2d321a4 - languageName: node - linkType: hard - -"source-map-support@npm:0.5.13": - version: 0.5.13 - resolution: "source-map-support@npm:0.5.13" - dependencies: - buffer-from: "npm:^1.0.0" - source-map: "npm:^0.6.0" - checksum: 10c0/137539f8c453fa0f496ea42049ab5da4569f96781f6ac8e5bfda26937be9494f4e8891f523c5f98f0e85f71b35d74127a00c46f83f6a4f54672b58d53202565e - languageName: node - linkType: hard - -"source-map-support@npm:^0.5.21, source-map-support@npm:~0.5.20": - version: 0.5.21 - resolution: "source-map-support@npm:0.5.21" - dependencies: - buffer-from: "npm:^1.0.0" - source-map: "npm:^0.6.0" - checksum: 10c0/9ee09942f415e0f721d6daad3917ec1516af746a8120bba7bb56278707a37f1eb8642bde456e98454b8a885023af81a16e646869975f06afc1a711fb90484e7d - languageName: node - linkType: hard - -"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0, source-map@npm:~0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 - languageName: node - linkType: hard - -"source-map@npm:^0.7.0, source-map@npm:^0.7.3, source-map@npm:^0.7.4": - version: 0.7.4 - resolution: "source-map@npm:0.7.4" - checksum: 10c0/dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc - languageName: node - linkType: hard - -"space-separated-tokens@npm:^2.0.0": - version: 2.0.2 - resolution: "space-separated-tokens@npm:2.0.2" - checksum: 10c0/6173e1d903dca41dcab6a2deed8b4caf61bd13b6d7af8374713500570aa929ff9414ae09a0519f4f8772df993300305a395d4871f35bc4ca72b6db57e1f30af8 - languageName: node - linkType: hard - -"spdx-correct@npm:^3.0.0": - version: 3.2.0 - resolution: "spdx-correct@npm:3.2.0" - dependencies: - spdx-expression-parse: "npm:^3.0.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 - languageName: node - linkType: hard - -"spdx-exceptions@npm:^2.1.0": - version: 2.5.0 - resolution: "spdx-exceptions@npm:2.5.0" - checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^3.0.0": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" - dependencies: - spdx-exceptions: "npm:^2.1.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^4.0.0": - version: 4.0.0 - resolution: "spdx-expression-parse@npm:4.0.0" - dependencies: - spdx-exceptions: "npm:^2.1.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/965c487e77f4fb173f1c471f3eef4eb44b9f0321adc7f93d95e7620da31faa67d29356eb02523cd7df8a7fc1ec8238773cdbf9e45bd050329d2b26492771b736 - languageName: node - linkType: hard - -"spdx-license-ids@npm:^3.0.0": - version: 3.0.18 - resolution: "spdx-license-ids@npm:3.0.18" - checksum: 10c0/c64ba03d4727191c8fdbd001f137d6ab51386c350d5516be8a4576c2e74044cb27bc8a758f6a04809da986cc0b14213f069b04de72caccecbc9f733753ccde32 - languageName: node - linkType: hard - -"spdy-transport@npm:^3.0.0": - version: 3.0.0 - resolution: "spdy-transport@npm:3.0.0" - dependencies: - debug: "npm:^4.1.0" - detect-node: "npm:^2.0.4" - hpack.js: "npm:^2.1.6" - obuf: "npm:^1.1.2" - readable-stream: "npm:^3.0.6" - wbuf: "npm:^1.7.3" - checksum: 10c0/eaf7440fa90724fffc813c386d4a8a7427d967d6e46d7c51d8f8a533d1a6911b9823ea9218703debbae755337e85f110185d7a00ae22ec5c847077b908ce71bb - languageName: node - linkType: hard - -"spdy@npm:^4.0.2": - version: 4.0.2 - resolution: "spdy@npm:4.0.2" - dependencies: - debug: "npm:^4.1.0" - handle-thing: "npm:^2.0.0" - http-deceiver: "npm:^1.2.7" - select-hose: "npm:^2.0.0" - spdy-transport: "npm:^3.0.0" - checksum: 10c0/983509c0be9d06fd00bb9dff713c5b5d35d3ffd720db869acdd5ad7aa6fc0e02c2318b58f75328957d8ff772acdf1f7d19382b6047df342044ff3e2d6805ccdf - languageName: node - linkType: hard - -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec - languageName: node - linkType: hard - -"sprintf-js@npm:~1.0.2": - version: 1.0.3 - resolution: "sprintf-js@npm:1.0.3" - checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb - languageName: node - linkType: hard - -"srcset@npm:^4.0.0": - version: 4.0.0 - resolution: "srcset@npm:4.0.0" - checksum: 10c0/0685c3bd2423b33831734fb71560cd8784f024895e70ee2ac2c392e30047c27ffd9481e001950fb0503f4906bc3fe963145935604edad77944d09c9800990660 - languageName: node - linkType: hard - -"ssri@npm:^10.0.0": - version: 10.0.6 - resolution: "ssri@npm:10.0.6" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/e5a1e23a4057a86a97971465418f22ea89bd439ac36ade88812dd920e4e61873e8abd6a9b72a03a67ef50faa00a2daf1ab745c5a15b46d03e0544a0296354227 - languageName: node - linkType: hard - -"stable-hash@npm:^0.0.4": - version: 0.0.4 - resolution: "stable-hash@npm:0.0.4" - checksum: 10c0/53d010d2a1b014fb60d398c095f43912c353b7b44774e55222bb26fd428bc75b73d7bdfcae509ce927c23ca9c5aff2dc1bc82f191d30e57a879550bc2952bdb0 - languageName: node - linkType: hard - -"stack-trace@npm:0.0.x": - version: 0.0.10 - resolution: "stack-trace@npm:0.0.10" - checksum: 10c0/9ff3dabfad4049b635a85456f927a075c9d0c210e3ea336412d18220b2a86cbb9b13ec46d6c37b70a302a4ea4d49e30e5d4944dd60ae784073f1cde778ac8f4b - languageName: node - linkType: hard - -"stack-utils@npm:^2.0.3": - version: 2.0.6 - resolution: "stack-utils@npm:2.0.6" - dependencies: - escape-string-regexp: "npm:^2.0.0" - checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a - languageName: node - linkType: hard - -"statuses@npm:2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 10c0/34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0 - languageName: node - linkType: hard - -"statuses@npm:>= 1.4.0 < 2": - version: 1.5.0 - resolution: "statuses@npm:1.5.0" - checksum: 10c0/e433900956357b3efd79b1c547da4d291799ac836960c016d10a98f6a810b1b5c0dcc13b5a7aa609a58239b5190e1ea176ad9221c2157d2fd1c747393e6b2940 - languageName: node - linkType: hard - -"std-env@npm:^3.0.1": - version: 3.7.0 - resolution: "std-env@npm:3.7.0" - checksum: 10c0/60edf2d130a4feb7002974af3d5a5f3343558d1ccf8d9b9934d225c638606884db4a20d2fe6440a09605bca282af6b042ae8070a10490c0800d69e82e478f41e - languageName: node - linkType: hard - -"stdin-discarder@npm:^0.2.1": - version: 0.2.2 - resolution: "stdin-discarder@npm:0.2.2" - checksum: 10c0/c78375e82e956d7a64be6e63c809c7f058f5303efcaf62ea48350af072bacdb99c06cba39209b45a071c1acbd49116af30df1df9abb448df78a6005b72f10537 - languageName: node - linkType: hard - -"string-argv@npm:~0.3.1": - version: 0.3.2 - resolution: "string-argv@npm:0.3.2" - checksum: 10c0/75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82 - languageName: node - linkType: hard - -"string-length@npm:^4.0.1": - version: 4.0.2 - resolution: "string-length@npm:4.0.2" - dependencies: - char-regex: "npm:^1.0.2" - strip-ansi: "npm:^6.0.0" - checksum: 10c0/1cd77409c3d7db7bc59406f6bcc9ef0783671dcbabb23597a1177c166906ef2ee7c8290f78cae73a8aec858768f189d2cb417797df5e15ec4eb5e16b3346340c - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: "npm:^8.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - strip-ansi: "npm:^6.0.1" - checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b - languageName: node - linkType: hard - -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: "npm:^0.2.0" - emoji-regex: "npm:^9.2.2" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca - languageName: node - linkType: hard - -"string-width@npm:^7.0.0": - version: 7.2.0 - resolution: "string-width@npm:7.2.0" - dependencies: - emoji-regex: "npm:^10.3.0" - get-east-asian-width: "npm:^1.0.0" - strip-ansi: "npm:^7.1.0" - checksum: 10c0/eb0430dd43f3199c7a46dcbf7a0b34539c76fe3aa62763d0b0655acdcbdf360b3f66f3d58ca25ba0205f42ea3491fa00f09426d3b7d3040e506878fc7664c9b9 - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: "npm:~5.2.0" - checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d - languageName: node - linkType: hard - -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" - dependencies: - safe-buffer: "npm:~5.1.0" - checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e - languageName: node - linkType: hard - -"stringify-entities@npm:^4.0.0": - version: 4.0.4 - resolution: "stringify-entities@npm:4.0.4" - dependencies: - character-entities-html4: "npm:^2.0.0" - character-entities-legacy: "npm:^3.0.0" - checksum: 10c0/537c7e656354192406bdd08157d759cd615724e9d0873602d2c9b2f6a5c0a8d0b1d73a0a08677848105c5eebac6db037b57c0b3a4ec86331117fa7319ed50448 - languageName: node - linkType: hard - -"stringify-object@npm:^3.3.0": - version: 3.3.0 - resolution: "stringify-object@npm:3.3.0" - dependencies: - get-own-enumerable-property-symbols: "npm:^3.0.0" - is-obj: "npm:^1.0.1" - is-regexp: "npm:^1.0.0" - checksum: 10c0/ba8078f84128979ee24b3de9a083489cbd3c62cb8572a061b47d4d82601a8ae4b4d86fa8c54dd955593da56bb7c16a6de51c27221fdc6b7139bb4f29d815f35b - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: "npm:^5.0.1" - checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 - languageName: node - linkType: hard - -"strip-bom-string@npm:^1.0.0": - version: 1.0.0 - resolution: "strip-bom-string@npm:1.0.0" - checksum: 10c0/5c5717e2643225aa6a6d659d34176ab2657037f1fe2423ac6fcdb488f135e14fef1022030e426d8b4d0989e09adbd5c3288d5d3b9c632abeefd2358dfc512bca - languageName: node - linkType: hard - -"strip-bom@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-bom@npm:3.0.0" - checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 - languageName: node - linkType: hard - -"strip-bom@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-bom@npm:4.0.0" - checksum: 10c0/26abad1172d6bc48985ab9a5f96c21e440f6e7e476686de49be813b5a59b3566dccb5c525b831ec54fe348283b47f3ffb8e080bc3f965fde12e84df23f6bb7ef - languageName: node - linkType: hard - -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 10c0/bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f - languageName: node - linkType: hard - -"strip-final-newline@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-final-newline@npm:4.0.0" - checksum: 10c0/b0cf2b62d597a1b0e3ebc42b88767f0a0d45601f89fd379a928a1812c8779440c81abba708082c946445af1d6b62d5f16e2a7cf4f30d9d6587b89425fae801ff - languageName: node - linkType: hard - -"strip-indent@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-indent@npm:3.0.0" - dependencies: - min-indent: "npm:^1.0.0" - checksum: 10c0/ae0deaf41c8d1001c5d4fbe16cb553865c1863da4fae036683b474fa926af9fc121e155cb3fc57a68262b2ae7d5b8420aa752c97a6428c315d00efe2a3875679 - languageName: node - linkType: hard - -"strip-json-comments@npm:5.0.1": - version: 5.0.1 - resolution: "strip-json-comments@npm:5.0.1" - checksum: 10c0/c9d9d55a0167c57aa688df3aa20628cf6f46f0344038f189eaa9d159978e80b2bfa6da541a40d83f7bde8a3554596259bf6b70578b2172356536a0e3fa5a0982 - languageName: node - linkType: hard - -"strip-json-comments@npm:^3.1.1, strip-json-comments@npm:~3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd - languageName: node - linkType: hard - -"strip-json-comments@npm:~2.0.1": - version: 2.0.1 - resolution: "strip-json-comments@npm:2.0.1" - checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 - languageName: node - linkType: hard - -"style-to-object@npm:^0.4.0": - version: 0.4.4 - resolution: "style-to-object@npm:0.4.4" - dependencies: - inline-style-parser: "npm:0.1.1" - checksum: 10c0/3a733080da66952881175b17d65f92985cf94c1ca358a92cf21b114b1260d49b94a404ed79476047fb95698d64c7e366ca7443f0225939e2fb34c38bbc9c7639 - languageName: node - linkType: hard - -"style-to-object@npm:^1.0.0": - version: 1.0.6 - resolution: "style-to-object@npm:1.0.6" - dependencies: - inline-style-parser: "npm:0.2.3" - checksum: 10c0/be5e8e3f0e35c0338de4112b9d861db576a52ebbd97f2501f1fb2c900d05c8fc42c5114407fa3a7f8b39301146cd8ca03a661bf52212394125a9629d5b771aba - languageName: node - linkType: hard - -"stylehacks@npm:^6.1.1": - version: 6.1.1 - resolution: "stylehacks@npm:6.1.1" - dependencies: - browserslist: "npm:^4.23.0" - postcss-selector-parser: "npm:^6.0.16" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/2dd2bccfd8311ff71492e63a7b8b86c3d7b1fff55d4ba5a2357aff97743e633d351cdc2f5ae3c0057637d00dab4ef5fc5b218a1b370e4585a41df22b5a5128be - languageName: node - linkType: hard - -"stylehacks@npm:^7.0.3": - version: 7.0.3 - resolution: "stylehacks@npm:7.0.3" - dependencies: - browserslist: "npm:^4.23.3" - postcss-selector-parser: "npm:^6.1.1" - peerDependencies: - postcss: ^8.4.31 - checksum: 10c0/5030334b06ef705b5700444dab120b540b09159e935e75b60f25bd56db1d85f0d11755f0b0f64ce3f12c5a72ff1b6f57fea49c26d18eb0de2334d6a143b94f8d - languageName: node - linkType: hard - -"summary@npm:2.1.0": - version: 2.1.0 - resolution: "summary@npm:2.1.0" - checksum: 10c0/2743c1f940fb303c496ef1b085e654704a6c16872957b6b76648c34bd32c8f0b7a3c5ec4e0f8bfb71dcb8473e34d172fef31026b85562af589cf220aa901698d - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 - languageName: node - linkType: hard - -"supports-color@npm:^8.0.0, supports-color@npm:~8.1.1": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 - languageName: node - linkType: hard - -"svg-parser@npm:^2.0.4": - version: 2.0.4 - resolution: "svg-parser@npm:2.0.4" - checksum: 10c0/02f6cb155dd7b63ebc2f44f36365bc294543bebb81b614b7628f1af3c54ab64f7e1cec20f06e252bf95bdde78441ae295a412c68ad1678f16a6907d924512b7a - languageName: node - linkType: hard - -"svgo@npm:^3.0.2, svgo@npm:^3.2.0, svgo@npm:^3.3.2": - version: 3.3.2 - resolution: "svgo@npm:3.3.2" - dependencies: - "@trysound/sax": "npm:0.2.0" - commander: "npm:^7.2.0" - css-select: "npm:^5.1.0" - css-tree: "npm:^2.3.1" - css-what: "npm:^6.1.0" - csso: "npm:^5.0.5" - picocolors: "npm:^1.0.0" - bin: - svgo: ./bin/svgo - checksum: 10c0/a6badbd3d1d6dbb177f872787699ab34320b990d12e20798ecae915f0008796a0f3c69164f1485c9def399e0ce0a5683eb4a8045e51a5e1c364bb13a0d9f79e1 - languageName: node - linkType: hard - -"synckit@npm:0.9.1, synckit@npm:^0.9.1": - version: 0.9.1 - resolution: "synckit@npm:0.9.1" - dependencies: - "@pkgr/core": "npm:^0.1.0" - tslib: "npm:^2.6.2" - checksum: 10c0/d8b89e1bf30ba3ffb469d8418c836ad9c0c062bf47028406b4d06548bc66af97155ea2303b96c93bf5c7c0f0d66153a6fbd6924c76521b434e6a9898982abc2e - languageName: node - linkType: hard - -"syncpack@npm:^12.4.0": - version: 12.4.0 - resolution: "syncpack@npm:12.4.0" - dependencies: - "@effect/schema": "npm:0.69.0" - chalk: "npm:5.3.0" - chalk-template: "npm:1.1.0" - commander: "npm:12.1.0" - cosmiconfig: "npm:9.0.0" - effect: "npm:3.5.7" - enquirer: "npm:2.4.1" - fast-check: "npm:3.20.0" - globby: "npm:14.0.2" - minimatch: "npm:10.0.1" - npm-package-arg: "npm:11.0.3" - ora: "npm:8.0.1" - prompts: "npm:2.4.2" - read-yaml-file: "npm:2.1.0" - semver: "npm:7.6.3" - tightrope: "npm:0.2.0" - ts-toolbelt: "npm:9.6.0" - bin: - syncpack: dist/bin.js - syncpack-fix-mismatches: dist/bin-fix-mismatches/index.js - syncpack-format: dist/bin-format/index.js - syncpack-lint: dist/bin-lint/index.js - syncpack-lint-semver-ranges: dist/bin-lint-semver-ranges/index.js - syncpack-list: dist/bin-list/index.js - syncpack-list-mismatches: dist/bin-list-mismatches/index.js - syncpack-prompt: dist/bin-prompt/index.js - syncpack-set-semver-ranges: dist/bin-set-semver-ranges/index.js - syncpack-update: dist/bin-update/index.js - checksum: 10c0/367aee2311e1860d584c682ab5dade65a3b5b276218c0ec2345aff93ec35bd0933879648e31ac4514359f07d5a7a3230b7cd808d1c31406f9f52774aacb2ec1f - languageName: node - linkType: hard - -"tapable@npm:^1.0.0": - version: 1.1.3 - resolution: "tapable@npm:1.1.3" - checksum: 10c0/c9f0265e55e45821ec672b9b9ee8a35d95bf3ea6b352199f8606a2799018e89cfe4433c554d424b31fc67c4be26b05d4f36dc3c607def416fdb2514cd63dba50 - languageName: node - linkType: hard - -"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 - languageName: node - linkType: hard - -"tar@npm:^6.1.11, tar@npm:^6.2.1": - version: 6.2.1 - resolution: "tar@npm:6.2.1" - dependencies: - chownr: "npm:^2.0.0" - fs-minipass: "npm:^2.0.0" - minipass: "npm:^5.0.0" - minizlib: "npm:^2.1.1" - mkdirp: "npm:^1.0.3" - yallist: "npm:^4.0.0" - checksum: 10c0/a5eca3eb50bc11552d453488344e6507156b9193efd7635e98e867fab275d527af53d8866e2370cd09dfe74378a18111622ace35af6a608e5223a7d27fe99537 - languageName: node - linkType: hard - -"terser-webpack-plugin@npm:^5.3.10, terser-webpack-plugin@npm:^5.3.9": - version: 5.3.10 - resolution: "terser-webpack-plugin@npm:5.3.10" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.20" - jest-worker: "npm:^27.4.5" - schema-utils: "npm:^3.1.1" - serialize-javascript: "npm:^6.0.1" - terser: "npm:^5.26.0" - peerDependencies: - webpack: ^5.1.0 - peerDependenciesMeta: - "@swc/core": - optional: true - esbuild: - optional: true - uglify-js: - optional: true - checksum: 10c0/66d1ed3174542560911cf96f4716aeea8d60e7caab212291705d50072b6ba844c7391442541b13c848684044042bea9ec87512b8506528c12854943da05faf91 - languageName: node - linkType: hard - -"terser@npm:^5.10.0, terser@npm:^5.15.1, terser@npm:^5.26.0": - version: 5.31.6 - resolution: "terser@npm:5.31.6" - dependencies: - "@jridgewell/source-map": "npm:^0.3.3" - acorn: "npm:^8.8.2" - commander: "npm:^2.20.0" - source-map-support: "npm:~0.5.20" - bin: - terser: bin/terser - checksum: 10c0/b17d02b65a52a5041430572b3c514475820f5e7590fa93773c0f5b4be601ccf3f6d745bf5a79f3ee58187cf85edf61c24ddf4345783839fccb44c9c8fa9b427e - languageName: node - linkType: hard - -"test-exclude@npm:^6.0.0": - version: 6.0.0 - resolution: "test-exclude@npm:6.0.0" - dependencies: - "@istanbuljs/schema": "npm:^0.1.2" - glob: "npm:^7.1.4" - minimatch: "npm:^3.0.4" - checksum: 10c0/019d33d81adff3f9f1bfcff18125fb2d3c65564f437d9be539270ee74b994986abb8260c7c2ce90e8f30162178b09dbbce33c6389273afac4f36069c48521f57 - languageName: node - linkType: hard - -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c - languageName: node - linkType: hard - -"thunky@npm:^1.0.2": - version: 1.1.0 - resolution: "thunky@npm:1.1.0" - checksum: 10c0/369764f39de1ce1de2ba2fa922db4a3f92e9c7f33bcc9a713241bc1f4a5238b484c17e0d36d1d533c625efb00e9e82c3e45f80b47586945557b45abb890156d2 - languageName: node - linkType: hard - -"tightrope@npm:0.2.0": - version: 0.2.0 - resolution: "tightrope@npm:0.2.0" - checksum: 10c0/124e1f94bc6bbe8da60b22e236b12083379716a80d22f21856235107a53f2de34f0197a7b8d86c34327dcdea10ef9ffedeee360626f0ac3ec3693881dc71abca - languageName: node - linkType: hard - -"tiny-invariant@npm:^1.0.2": - version: 1.3.3 - resolution: "tiny-invariant@npm:1.3.3" - checksum: 10c0/65af4a07324b591a059b35269cd696aba21bef2107f29b9f5894d83cc143159a204b299553435b03874ebb5b94d019afa8b8eff241c8a4cfee95872c2e1c1c4a - languageName: node - linkType: hard - -"tiny-warning@npm:^1.0.0": - version: 1.0.3 - resolution: "tiny-warning@npm:1.0.3" - checksum: 10c0/ef8531f581b30342f29670cb41ca248001c6fd7975ce22122bd59b8d62b4fc84ad4207ee7faa95cde982fa3357cd8f4be650142abc22805538c3b1392d7084fa - languageName: node - linkType: hard - -"tmpl@npm:1.0.5": - version: 1.0.5 - resolution: "tmpl@npm:1.0.5" - checksum: 10c0/f935537799c2d1922cb5d6d3805f594388f75338fe7a4a9dac41504dd539704ca4db45b883b52e7b0aa5b2fd5ddadb1452bf95cd23a69da2f793a843f9451cc9 - languageName: node - linkType: hard - -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: 10c0/b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: "npm:^7.0.0" - checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 - languageName: node - linkType: hard - -"toidentifier@npm:1.0.1": - version: 1.0.1 - resolution: "toidentifier@npm:1.0.1" - checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 - languageName: node - linkType: hard - -"totalist@npm:^3.0.0": - version: 3.0.1 - resolution: "totalist@npm:3.0.1" - checksum: 10c0/4bb1fadb69c3edbef91c73ebef9d25b33bbf69afe1e37ce544d5f7d13854cda15e47132f3e0dc4cafe300ddb8578c77c50a65004d8b6e97e77934a69aa924863 - languageName: node - linkType: hard - -"trim-lines@npm:^3.0.0": - version: 3.0.1 - resolution: "trim-lines@npm:3.0.1" - checksum: 10c0/3a1611fa9e52aa56a94c69951a9ea15b8aaad760eaa26c56a65330dc8adf99cb282fc07cc9d94968b7d4d88003beba220a7278bbe2063328eb23fb56f9509e94 - languageName: node - linkType: hard - -"trough@npm:^2.0.0": - version: 2.2.0 - resolution: "trough@npm:2.2.0" - checksum: 10c0/58b671fc970e7867a48514168894396dd94e6d9d6456aca427cc299c004fe67f35ed7172a36449086b2edde10e78a71a284ec0076809add6834fb8f857ccb9b0 - languageName: node - linkType: hard - -"true-myth@npm:^4.1.0": - version: 4.1.1 - resolution: "true-myth@npm:4.1.1" - checksum: 10c0/ac83ac82f969129d5f002dcc489b86e28e59ee4149641b341b0176e9407786823c83702fe4b9ae9c0f9593f29a98c931ee175789d33e884f99c47e9c16e80adb - languageName: node - linkType: hard - -"ts-api-utils@npm:^1.3.0": - version: 1.3.0 - resolution: "ts-api-utils@npm:1.3.0" - peerDependencies: - typescript: ">=4.2.0" - checksum: 10c0/f54a0ba9ed56ce66baea90a3fa087a484002e807f28a8ccb2d070c75e76bde64bd0f6dce98b3802834156306050871b67eec325cb4e918015a360a3f0868c77c - languageName: node - linkType: hard - -"ts-json-schema-generator@npm:^2.3.0": - version: 2.3.0 - resolution: "ts-json-schema-generator@npm:2.3.0" - dependencies: - "@types/json-schema": "npm:^7.0.15" - commander: "npm:^12.0.0" - glob: "npm:^10.3.12" - json5: "npm:^2.2.3" - normalize-path: "npm:^3.0.0" - safe-stable-stringify: "npm:^2.4.3" - tslib: "npm:^2.6.2" - typescript: "npm:^5.4.5" - bin: - ts-json-schema-generator: bin/ts-json-schema-generator.js - checksum: 10c0/db6ad8fd863ad62e8e6c77addc93f44c217ad48109e69c9a10e08e0a930ef5aee36c0bae0410d2b81c689f9af6784941f7479049533f821a08f002ba0b32babe - languageName: node - linkType: hard - -"ts-morph@npm:^17.0.1": - version: 17.0.1 - resolution: "ts-morph@npm:17.0.1" - dependencies: - "@ts-morph/common": "npm:~0.18.0" - code-block-writer: "npm:^11.0.3" - checksum: 10c0/6ec17a189a81f002ddb4723f7bd5938077f8af0d75b6cc9949ff0d27354185c9ade6ef79af9a57d15a20fadcaf657b97d8cca2238437f5e57b1aa14102589bc5 - languageName: node - linkType: hard - -"ts-prune-2@npm:^0.10.7": - version: 0.10.7 - resolution: "ts-prune-2@npm:0.10.7" - dependencies: - chalk: "npm:4.1.2" - commander: "npm:^6.2.1" - cosmiconfig: "npm:^7.0.1" - json5: "npm:^2.1.3" - lodash: "npm:^4.17.21" - true-myth: "npm:^4.1.0" - ts-morph: "npm:^17.0.1" - bin: - ts-prune: lib/index.js - checksum: 10c0/bff25439768853959b25461636338d716b6da75f06dc0af357dc0471f72084c8b3e927569afe78735bcf0fd55cae3e2ba202e14becc8acdf75cd1f0334b7fb5a - languageName: node - linkType: hard - -"ts-toolbelt@npm:9.6.0": - version: 9.6.0 - resolution: "ts-toolbelt@npm:9.6.0" - checksum: 10c0/838f9a2f0fe881d5065257a23b402c41315b33ff987b73db3e2b39fcb70640c4c7220e1ef118ed5676763543724fdbf4eda7b0e2c17acb667ed1401336af9f8c - languageName: node - linkType: hard - -"tsconfck@npm:^3.1.1": - version: 3.1.1 - resolution: "tsconfck@npm:3.1.1" - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - bin: - tsconfck: bin/tsconfck.js - checksum: 10c0/e133eb308ba37e8db8dbac1905bddaaf4a62f0e01aa88143e19867e274a877b86b35cf69c9a0172ca3e7d1a4bb32400381ac7f7a1429e34250a8d7ae55aee3e7 - languageName: node - linkType: hard - -"tsconfig-paths@npm:^4.2.0": - version: 4.2.0 - resolution: "tsconfig-paths@npm:4.2.0" - dependencies: - json5: "npm:^2.2.2" - minimist: "npm:^1.2.6" - strip-bom: "npm:^3.0.0" - checksum: 10c0/09a5877402d082bb1134930c10249edeebc0211f36150c35e1c542e5b91f1047b1ccf7da1e59babca1ef1f014c525510f4f870de7c9bda470c73bb4e2721b3ea - languageName: node - linkType: hard - -"tslib@npm:^1.8.1": - version: 1.14.1 - resolution: "tslib@npm:1.14.1" - checksum: 10c0/69ae09c49eea644bc5ebe1bca4fa4cc2c82b7b3e02f43b84bd891504edf66dbc6b2ec0eef31a957042de2269139e4acff911e6d186a258fb14069cd7f6febce2 - languageName: node - linkType: hard - -"tslib@npm:^2.0.3, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.6.0, tslib@npm:^2.6.2": - version: 2.6.3 - resolution: "tslib@npm:2.6.3" - checksum: 10c0/2598aef53d9dbe711af75522464b2104724d6467b26a60f2bdac8297d2b5f1f6b86a71f61717384aa8fd897240467aaa7bcc36a0700a0faf751293d1331db39a - languageName: node - linkType: hard - -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" - dependencies: - tslib: "npm:^1.8.1" - 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" - checksum: 10c0/02f19e458ec78ead8fffbf711f834ad8ecd2cc6ade4ec0320790713dccc0a412b99e7fd907c4cda2a1dc602c75db6f12e0108e87a5afad4b2f9e90a24cabd5a2 - languageName: node - linkType: hard - -"tsx@npm:^4.17.0": - version: 4.17.0 - resolution: "tsx@npm:4.17.0" - dependencies: - esbuild: "npm:~0.23.0" - fsevents: "npm:~2.3.3" - get-tsconfig: "npm:^4.7.5" - dependenciesMeta: - fsevents: - optional: true - bin: - tsx: dist/cli.mjs - checksum: 10c0/ad720b81d6447c7695d24c27947fa1a2b6db9d2ef03216389edd6fa0006aa479bc0d8348a1ac9975a08edef4ce791ff5629a24d8dccbb0987f42e5407785cfa4 - languageName: node - linkType: hard - -"type-check@npm:^0.4.0, type-check@npm:~0.4.0": - version: 0.4.0 - resolution: "type-check@npm:0.4.0" - dependencies: - prelude-ls: "npm:^1.2.1" - checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 - languageName: node - linkType: hard - -"type-detect@npm:4.0.8": - version: 4.0.8 - resolution: "type-detect@npm:4.0.8" - checksum: 10c0/8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd - languageName: node - linkType: hard - -"type-fest@npm:^0.21.3": - version: 0.21.3 - resolution: "type-fest@npm:0.21.3" - checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 - languageName: node - linkType: hard - -"type-fest@npm:^0.6.0": - version: 0.6.0 - resolution: "type-fest@npm:0.6.0" - checksum: 10c0/0c585c26416fce9ecb5691873a1301b5aff54673c7999b6f925691ed01f5b9232db408cdbb0bd003d19f5ae284322523f44092d1f81ca0a48f11f7cf0be8cd38 - languageName: node - linkType: hard - -"type-fest@npm:^0.8.1": - version: 0.8.1 - resolution: "type-fest@npm:0.8.1" - checksum: 10c0/dffbb99329da2aa840f506d376c863bd55f5636f4741ad6e65e82f5ce47e6914108f44f340a0b74009b0cb5d09d6752ae83203e53e98b1192cf80ecee5651636 - languageName: node - linkType: hard - -"type-fest@npm:^1.0.1": - version: 1.4.0 - resolution: "type-fest@npm:1.4.0" - checksum: 10c0/a3c0f4ee28ff6ddf800d769eafafcdeab32efa38763c1a1b8daeae681920f6e345d7920bf277245235561d8117dab765cb5f829c76b713b4c9de0998a5397141 - languageName: node - linkType: hard - -"type-fest@npm:^2.13.0, type-fest@npm:^2.5.0": - version: 2.19.0 - resolution: "type-fest@npm:2.19.0" - checksum: 10c0/a5a7ecf2e654251613218c215c7493574594951c08e52ab9881c9df6a6da0aeca7528c213c622bc374b4e0cb5c443aa3ab758da4e3c959783ce884c3194e12cb - languageName: node - linkType: hard - -"type-is@npm:~1.6.18": - version: 1.6.18 - resolution: "type-is@npm:1.6.18" - dependencies: - media-typer: "npm:0.3.0" - mime-types: "npm:~2.1.24" - checksum: 10c0/a23daeb538591b7efbd61ecf06b6feb2501b683ffdc9a19c74ef5baba362b4347e42f1b4ed81f5882a8c96a3bfff7f93ce3ffaf0cbbc879b532b04c97a55db9d - languageName: node - linkType: hard - -"typedarray-to-buffer@npm:^3.1.5": - version: 3.1.5 - resolution: "typedarray-to-buffer@npm:3.1.5" - dependencies: - is-typedarray: "npm:^1.0.0" - checksum: 10c0/4ac5b7a93d604edabf3ac58d3a2f7e07487e9f6e98195a080e81dbffdc4127817f470f219d794a843b87052cedef102b53ac9b539855380b8c2172054b7d5027 - languageName: node - linkType: hard - -"typedoc-plugin-markdown@npm:^4.2.5": - version: 4.2.5 - resolution: "typedoc-plugin-markdown@npm:4.2.5" - peerDependencies: - typedoc: 0.26.x - checksum: 10c0/7bb46c919f061299e74d0ecdea41f6eb6772bbf8e72bba02a5d98e5f38ac3e0876287a30bca7bf514e762d58a93295e94e6a390f150f3cb538a45e703dc16af7 - languageName: node - linkType: hard - -"typedoc-plugin-rename@npm:^1.1.1": - version: 1.1.1 - resolution: "typedoc-plugin-rename@npm:1.1.1" - peerDependencies: - typedoc: ">=0.26.2" - checksum: 10c0/f8b04583882e27f8712668084e54020eb0dc70475978f96f872121d4978516c16f3c2bd5a56a94876eb381f121b34fd0429e52c1b8d4ee08d7c45d10b7a10252 - languageName: node - linkType: hard - -"typedoc@npm:^0.26.5": - version: 0.26.5 - resolution: "typedoc@npm:0.26.5" - dependencies: - lunr: "npm:^2.3.9" - markdown-it: "npm:^14.1.0" - minimatch: "npm:^9.0.5" - shiki: "npm:^1.9.1" - yaml: "npm:^2.4.5" - peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x - bin: - typedoc: bin/typedoc - checksum: 10c0/c3ca06e7496276d6c14af6c9ed7afe48477117093fa4723b30c73b902adba5821fd58bb19139be9322980de0f279ec688600ac4d6da31792c1654675068f1352 - languageName: node - linkType: hard - -"typescript-eslint@npm:^8.1.0": - version: 8.1.0 - resolution: "typescript-eslint@npm:8.1.0" - dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.1.0" - "@typescript-eslint/parser": "npm:8.1.0" - "@typescript-eslint/utils": "npm:8.1.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/9b5769b95aeca54ae9fa15cd2f0e5656747f643a7be220513555de143ff19d70c5945eb82259a3fb29ab4d37f4d158f7f088e7b2cf98e2e8253a7429ac19d072 - languageName: node - linkType: hard - -"typescript-to-lua@npm:^1.26.2": - version: 1.26.2 - resolution: "typescript-to-lua@npm:1.26.2" - dependencies: - "@typescript-to-lua/language-extensions": "npm:1.19.0" - enhanced-resolve: "npm:^5.8.2" - picomatch: "npm:^2.3.1" - resolve: "npm:^1.15.1" - source-map: "npm:^0.7.3" - peerDependencies: - typescript: 5.5.2 - bin: - tstl: dist/tstl.js - checksum: 10c0/0fed582c5123e4a67fbcdf13f08e4bed502bca36f8c43320a7b1c8ba141f6cf0acc2bede45768fcfebd943d2a00d8785de481dbc370fd0fa7dd6b56f70d42f77 - languageName: node - linkType: hard - -"typescript@npm:5.4.2": - version: 5.4.2 - resolution: "typescript@npm:5.4.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/583ff68cafb0c076695f72d61df6feee71689568179fb0d3a4834dac343df6b6ed7cf7b6f6c801fa52d43cd1d324e2f2d8ae4497b09f9e6cfe3d80a6d6c9ca52 - languageName: node - linkType: hard - -"typescript@npm:^5.4.5, typescript@npm:^5.5.4": - version: 5.5.4 - resolution: "typescript@npm:5.5.4" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/422be60f89e661eab29ac488c974b6cc0a660fb2228003b297c3d10c32c90f3bcffc1009b43876a082515a3c376b1eefcce823d6e78982e6878408b9a923199c - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A5.4.2#optional!builtin": - version: 5.4.2 - resolution: "typescript@patch:typescript@npm%3A5.4.2#optional!builtin::version=5.4.2&hash=5adc0c" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/fcf6658073d07283910d9a0e04b1d5d0ebc822c04dbb7abdd74c3151c7aa92fcddbac7d799404e358197222006ccdc4c0db219d223d2ee4ccd9e2b01333b49be - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A^5.4.5#optional!builtin, typescript@patch:typescript@npm%3A^5.5.4#optional!builtin": - version: 5.5.4 - resolution: "typescript@patch:typescript@npm%3A5.5.4#optional!builtin::version=5.5.4&hash=379a07" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/73409d7b9196a5a1217b3aaad929bf76294d3ce7d6e9766dd880ece296ee91cf7d7db6b16c6c6c630ee5096eccde726c0ef17c7dfa52b01a243e57ae1f09ef07 - languageName: node - linkType: hard - -"typesense-docsearch-css@npm:^0.4.1": - version: 0.4.1 - resolution: "typesense-docsearch-css@npm:0.4.1" - checksum: 10c0/1e455d4e8ab4a9c335de1f234e6cd458ddccabd265c85f003bd01c77b5b3000a8c2c066db80dbf905b4fbcdca828efef35d223727c9e36b25f4e0d7f92d989f0 - languageName: node - linkType: hard - -"typesense-docsearch-react@npm:^3.4.1": - version: 3.4.1 - resolution: "typesense-docsearch-react@npm:3.4.1" - dependencies: - "@algolia/autocomplete-core": "npm:1.8.2" - "@algolia/autocomplete-preset-algolia": "npm:1.8.2" - typesense: "npm:^1.7.2" - typesense-docsearch-css: "npm:^0.4.1" - typesense-instantsearch-adapter: "npm:^2.7.1" - peerDependencies: - "@types/react": ">= 16.8.0 < 19.0.0" - react: ">= 16.8.0 < 19.0.0" - react-dom: ">= 16.8.0 < 19.0.0" - peerDependenciesMeta: - "@types/react": - optional: true - react: - optional: true - react-dom: - optional: true - checksum: 10c0/7b8b149f7077d079ba0abfc4410e388c222df723c599d075c17c82d147df28eb97e4464ac8346b920c63b229180fc1c84abb85dda94cf5ad840f948011be2efe - languageName: node - linkType: hard - -"typesense-instantsearch-adapter@npm:^2.7.1": - version: 2.8.0 - resolution: "typesense-instantsearch-adapter@npm:2.8.0" - dependencies: - typesense: "npm:^1.7.2" - peerDependencies: - "@babel/runtime": ^7.17.2 - checksum: 10c0/ce54f03cc57bf888839a099abf61adce7dd65b3728eb5a5db32d21a00f760f833d52d55ee36415cb25d7220ab2cde4e4259fadf89eec88e125f41242ca620063 - languageName: node - linkType: hard - -"typesense@npm:^1.7.2": - version: 1.8.2 - resolution: "typesense@npm:1.8.2" - dependencies: - axios: "npm:^1.6.0" - loglevel: "npm:^1.8.1" - peerDependencies: - "@babel/runtime": ^7.23.2 - checksum: 10c0/9a553b479ebbd435867dd257035ce6dda78e1e7c2e1c1fb9fc90aef2cf36c67ecdc5e322a8d10ff069bb27efd017d1b29c4496b54581ad453f5eb54af4cd0696 - languageName: node - linkType: hard - -"uc.micro@npm:^2.0.0, uc.micro@npm:^2.1.0": - version: 2.1.0 - resolution: "uc.micro@npm:2.1.0" - checksum: 10c0/8862eddb412dda76f15db8ad1c640ccc2f47cdf8252a4a30be908d535602c8d33f9855dfcccb8b8837855c1ce1eaa563f7fa7ebe3c98fd0794351aab9b9c55fa - languageName: node - linkType: hard - -"ufo@npm:^1.5.3": - version: 1.5.4 - resolution: "ufo@npm:1.5.4" - checksum: 10c0/b5dc4dc435c49c9ef8890f1b280a19ee4d0954d1d6f9ab66ce62ce64dd04c7be476781531f952a07c678d51638d02ad4b98e16237be29149295b0f7c09cda765 - languageName: node - linkType: hard - -"unbuild@npm:^2.0.0": - version: 2.0.0 - resolution: "unbuild@npm:2.0.0" - dependencies: - "@rollup/plugin-alias": "npm:^5.0.0" - "@rollup/plugin-commonjs": "npm:^25.0.4" - "@rollup/plugin-json": "npm:^6.0.0" - "@rollup/plugin-node-resolve": "npm:^15.2.1" - "@rollup/plugin-replace": "npm:^5.0.2" - "@rollup/pluginutils": "npm:^5.0.3" - chalk: "npm:^5.3.0" - citty: "npm:^0.1.2" - consola: "npm:^3.2.3" - defu: "npm:^6.1.2" - esbuild: "npm:^0.19.2" - globby: "npm:^13.2.2" - hookable: "npm:^5.5.3" - jiti: "npm:^1.19.3" - magic-string: "npm:^0.30.3" - mkdist: "npm:^1.3.0" - mlly: "npm:^1.4.0" - pathe: "npm:^1.1.1" - pkg-types: "npm:^1.0.3" - pretty-bytes: "npm:^6.1.1" - rollup: "npm:^3.28.1" - rollup-plugin-dts: "npm:^6.0.0" - scule: "npm:^1.0.0" - untyped: "npm:^1.4.0" - peerDependencies: - typescript: ^5.1.6 - peerDependenciesMeta: - typescript: - optional: true - bin: - unbuild: dist/cli.mjs - checksum: 10c0/47169daf1d76911c2501b6d2bccf43e96948795276cb072970e9c7f20457b4fcfa35ffe39e2bb0d307c8149064d033d25be38915340724d479dda49be57aa945 - languageName: node - linkType: hard - -"unc-path-regex@npm:^0.1.2": - version: 0.1.2 - resolution: "unc-path-regex@npm:0.1.2" - checksum: 10c0/bf9c781c4e2f38e6613ea17a51072e4b416840fbe6eeb244597ce9b028fac2fb6cfd3dde1f14111b02c245e665dc461aab8168ecc30b14364d02caa37f812996 - languageName: node - linkType: hard - -"undici-types@npm:~6.19.2": - version: 6.19.6 - resolution: "undici-types@npm:6.19.6" - checksum: 10c0/9b2264c5700e7169c6c62c643aac56cd8984c5fd7e18ed31ff11780260e137f6340dee8317a2e6e0ae3c49f5e5ef6fa577ea07193cbaa535265cba76a267cae9 - languageName: node - linkType: hard - -"unicode-canonical-property-names-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" - checksum: 10c0/0fe812641bcfa3ae433025178a64afb5d9afebc21a922dafa7cba971deebb5e4a37350423890750132a85c936c290fb988146d0b1bd86838ad4897f4fc5bd0de - languageName: node - linkType: hard - -"unicode-emoji-modifier-base@npm:^1.0.0": - version: 1.0.0 - resolution: "unicode-emoji-modifier-base@npm:1.0.0" - checksum: 10c0/b37623fcf0162186debd20f116483e035a2d5b905b932a2c472459d9143d446ebcbefb2a494e2fe4fa7434355396e2a95ec3fc1f0c29a3bc8f2c827220e79c66 - languageName: node - linkType: hard - -"unicode-match-property-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-match-property-ecmascript@npm:2.0.0" - dependencies: - unicode-canonical-property-names-ecmascript: "npm:^2.0.0" - unicode-property-aliases-ecmascript: "npm:^2.0.0" - checksum: 10c0/4d05252cecaf5c8e36d78dc5332e03b334c6242faf7cf16b3658525441386c0a03b5f603d42cbec0f09bb63b9fd25c9b3b09667aee75463cac3efadae2cd17ec - languageName: node - linkType: hard - -"unicode-match-property-value-ecmascript@npm:^2.1.0": - version: 2.1.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.1.0" - checksum: 10c0/f5b9499b9e0ffdc6027b744d528f17ec27dd7c15da03254ed06851feec47e0531f20d410910c8a49af4a6a190f4978413794c8d75ce112950b56d583b5d5c7f2 - languageName: node - linkType: hard - -"unicode-property-aliases-ecmascript@npm:^2.0.0": - version: 2.1.0 - resolution: "unicode-property-aliases-ecmascript@npm:2.1.0" - checksum: 10c0/50ded3f8c963c7785e48c510a3b7c6bc4e08a579551489aa0349680a35b1ceceec122e33b2b6c1b579d0be2250f34bb163ac35f5f8695fe10bbc67fb757f0af8 - languageName: node - linkType: hard - -"unicorn-magic@npm:^0.1.0": - version: 0.1.0 - resolution: "unicorn-magic@npm:0.1.0" - checksum: 10c0/e4ed0de05b0a05e735c7d8a2930881e5efcfc3ec897204d5d33e7e6247f4c31eac92e383a15d9a6bccb7319b4271ee4bea946e211bf14951fec6ff2cbbb66a92 - languageName: node - linkType: hard - -"unidecode@npm:^1.1.0": - version: 1.1.0 - resolution: "unidecode@npm:1.1.0" - checksum: 10c0/e9827ba9f981b01a29c694781b1a7baec051635621989ffda76e7e3433798918352ff217296ae287764a7c8c86987051a5ae31d243316538781d1be87b30a3d0 - languageName: node - linkType: hard - -"unified@npm:^11.0.0, unified@npm:^11.0.3, unified@npm:^11.0.4, unified@npm:^11.0.5": - version: 11.0.5 - resolution: "unified@npm:11.0.5" - dependencies: - "@types/unist": "npm:^3.0.0" - bail: "npm:^2.0.0" - devlop: "npm:^1.0.0" - extend: "npm:^3.0.0" - is-plain-obj: "npm:^4.0.0" - trough: "npm:^2.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/53c8e685f56d11d9d458a43e0e74328a4d6386af51c8ac37a3dcabec74ce5026da21250590d4aff6733ccd7dc203116aae2b0769abc18cdf9639a54ae528dfc9 - languageName: node - linkType: hard - -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: "npm:^4.0.0" - checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f - languageName: node - linkType: hard - -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 - languageName: node - linkType: hard - -"unique-string@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-string@npm:3.0.0" - dependencies: - crypto-random-string: "npm:^4.0.0" - checksum: 10c0/b35ea034b161b2a573666ec16c93076b4b6106b8b16c2415808d747ab3a0566b5db0c4be231d4b11cfbc16d7fd915c9d8a45884bff0e2db11b799775b2e1e017 - languageName: node - linkType: hard - -"unist-util-is@npm:^6.0.0": - version: 6.0.0 - resolution: "unist-util-is@npm:6.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - checksum: 10c0/9419352181eaa1da35eca9490634a6df70d2217815bb5938a04af3a662c12c5607a2f1014197ec9c426fbef18834f6371bfdb6f033040fa8aa3e965300d70e7e - languageName: node - linkType: hard - -"unist-util-position-from-estree@npm:^2.0.0": - version: 2.0.0 - resolution: "unist-util-position-from-estree@npm:2.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - checksum: 10c0/39127bf5f0594e0a76d9241dec4f7aa26323517120ce1edd5ed91c8c1b9df7d6fb18af556e4b6250f1c7368825720ed892e2b6923be5cdc08a9bb16536dc37b3 - languageName: node - linkType: hard - -"unist-util-position@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-position@npm:5.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - checksum: 10c0/dde3b31e314c98f12b4dc6402f9722b2bf35e96a4f2d463233dd90d7cde2d4928074a7a11eff0a5eb1f4e200f27fc1557e0a64a7e8e4da6558542f251b1b7400 - languageName: node - linkType: hard - -"unist-util-remove-position@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-remove-position@npm:5.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-visit: "npm:^5.0.0" - checksum: 10c0/e8c76da4399446b3da2d1c84a97c607b37d03d1d92561e14838cbe4fdcb485bfc06c06cfadbb808ccb72105a80643976d0660d1fe222ca372203075be9d71105 - languageName: node - linkType: hard - -"unist-util-stringify-position@npm:^4.0.0": - version: 4.0.0 - resolution: "unist-util-stringify-position@npm:4.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - checksum: 10c0/dfe1dbe79ba31f589108cb35e523f14029b6675d741a79dea7e5f3d098785045d556d5650ec6a8338af11e9e78d2a30df12b1ee86529cded1098da3f17ee999e - languageName: node - linkType: hard - -"unist-util-visit-parents@npm:^6.0.0": - version: 6.0.1 - resolution: "unist-util-visit-parents@npm:6.0.1" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-is: "npm:^6.0.0" - checksum: 10c0/51b1a5b0aa23c97d3e03e7288f0cdf136974df2217d0999d3de573c05001ef04cccd246f51d2ebdfb9e8b0ed2704451ad90ba85ae3f3177cf9772cef67f56206 - languageName: node - linkType: hard - -"unist-util-visit@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-visit@npm:5.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-is: "npm:^6.0.0" - unist-util-visit-parents: "npm:^6.0.0" - checksum: 10c0/51434a1d80252c1540cce6271a90fd1a106dbe624997c09ed8879279667fb0b2d3a685e02e92bf66598dcbe6cdffa7a5f5fb363af8fdf90dda6c855449ae39a5 - languageName: node - linkType: hard - -"universalify@npm:^0.1.0": - version: 0.1.2 - resolution: "universalify@npm:0.1.2" - checksum: 10c0/e70e0339f6b36f34c9816f6bf9662372bd241714dc77508d231d08386d94f2c4aa1ba1318614f92015f40d45aae1b9075cd30bd490efbe39387b60a76ca3f045 - languageName: node - linkType: hard - -"universalify@npm:^2.0.0": - version: 2.0.1 - resolution: "universalify@npm:2.0.1" - checksum: 10c0/73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a - languageName: node - linkType: hard - -"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": - version: 1.0.0 - resolution: "unpipe@npm:1.0.0" - checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c - languageName: node - linkType: hard - -"untyped@npm:^1.4.0": - version: 1.4.2 - resolution: "untyped@npm:1.4.2" - dependencies: - "@babel/core": "npm:^7.23.7" - "@babel/standalone": "npm:^7.23.8" - "@babel/types": "npm:^7.23.6" - defu: "npm:^6.1.4" - jiti: "npm:^1.21.0" - mri: "npm:^1.2.0" - scule: "npm:^1.2.0" - bin: - untyped: dist/cli.mjs - checksum: 10c0/91e759a07353b6bd2f5bb4b08e05132cff4b11fb3c7e025ce2cc6985f96be2206e8cf9c8ecccd35f5924452ce38325d630defd78365c84113d317f2c9d822e6a - languageName: node - linkType: hard - -"update-browserslist-db@npm:^1.1.0": - version: 1.1.0 - resolution: "update-browserslist-db@npm:1.1.0" - dependencies: - escalade: "npm:^3.1.2" - picocolors: "npm:^1.0.1" - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 10c0/a7452de47785842736fb71547651c5bbe5b4dc1e3722ccf48a704b7b34e4dcf633991eaa8e4a6a517ffb738b3252eede3773bef673ef9021baa26b056d63a5b9 - languageName: node - linkType: hard - -"update-notifier@npm:^6.0.2": - version: 6.0.2 - resolution: "update-notifier@npm:6.0.2" - dependencies: - boxen: "npm:^7.0.0" - chalk: "npm:^5.0.1" - configstore: "npm:^6.0.0" - has-yarn: "npm:^3.0.0" - import-lazy: "npm:^4.0.0" - is-ci: "npm:^3.0.1" - is-installed-globally: "npm:^0.4.0" - is-npm: "npm:^6.0.0" - is-yarn-global: "npm:^0.4.0" - latest-version: "npm:^7.0.0" - pupa: "npm:^3.1.0" - semver: "npm:^7.3.7" - semver-diff: "npm:^4.0.0" - xdg-basedir: "npm:^5.1.0" - checksum: 10c0/ad3980073312df904133a6e6c554a7f9d0832ed6275e55f5a546313fe77a0f20f23a7b1b4aeb409e20a78afb06f4d3b2b28b332d9cfb55745b5d1ea155810bcc - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: "npm:^2.1.0" - checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c - languageName: node - linkType: hard - -"url-loader@npm:^4.1.1": - version: 4.1.1 - resolution: "url-loader@npm:4.1.1" - dependencies: - loader-utils: "npm:^2.0.0" - mime-types: "npm:^2.1.27" - schema-utils: "npm:^3.0.0" - peerDependencies: - file-loader: "*" - webpack: ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - file-loader: - optional: true - checksum: 10c0/71b6300e02ce26c70625eae1a2297c0737635038c62691bb3007ac33e85c0130efc74bfb444baf5c6b3bad5953491159d31d66498967d1417865d0c7e7cd1a64 - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 - languageName: node - linkType: hard - -"utila@npm:~0.4": - version: 0.4.0 - resolution: "utila@npm:0.4.0" - checksum: 10c0/2791604e09ca4f77ae314df83e80d1805f867eb5c7e13e7413caee01273c278cf2c9a3670d8d25c889a877f7b149d892fe61b0181a81654b425e9622ab23d42e - languageName: node - linkType: hard - -"utility-types@npm:^3.10.0": - version: 3.11.0 - resolution: "utility-types@npm:3.11.0" - checksum: 10c0/2f1580137b0c3e6cf5405f37aaa8f5249961a76d26f1ca8efc0ff49a2fc0e0b2db56de8e521a174d075758e0c7eb3e590edec0832eb44478b958f09914920f19 - languageName: node - linkType: hard - -"utils-merge@npm:1.0.1": - version: 1.0.1 - resolution: "utils-merge@npm:1.0.1" - checksum: 10c0/02ba649de1b7ca8854bfe20a82f1dfbdda3fb57a22ab4a8972a63a34553cf7aa51bc9081cf7e001b035b88186d23689d69e71b510e610a09a4c66f68aa95b672 - languageName: node - linkType: hard - -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 - languageName: node - linkType: hard - -"v8-to-istanbul@npm:^9.0.1": - version: 9.3.0 - resolution: "v8-to-istanbul@npm:9.3.0" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.12" - "@types/istanbul-lib-coverage": "npm:^2.0.1" - convert-source-map: "npm:^2.0.0" - checksum: 10c0/968bcf1c7c88c04df1ffb463c179558a2ec17aa49e49376120504958239d9e9dad5281aa05f2a78542b8557f2be0b0b4c325710262f3b838b40d703d5ed30c23 - languageName: node - linkType: hard - -"validate-npm-package-license@npm:^3.0.1": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" - dependencies: - spdx-correct: "npm:^3.0.0" - spdx-expression-parse: "npm:^3.0.0" - checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f - languageName: node - linkType: hard - -"validate-npm-package-name@npm:^5.0.0": - version: 5.0.1 - resolution: "validate-npm-package-name@npm:5.0.1" - checksum: 10c0/903e738f7387404bb72f7ac34e45d7010c877abd2803dc2d614612527927a40a6d024420033132e667b1bade94544b8a1f65c9431a4eb30d0ce0d80093cd1f74 - languageName: node - linkType: hard - -"value-equal@npm:^1.0.1": - version: 1.0.1 - resolution: "value-equal@npm:1.0.1" - checksum: 10c0/79068098355483ef29f4d3753999ad880875b87625d7e9055cad9346ea4b7662aad3a66f87976801b0dd7a6f828ba973d28b1669ebcd37eaf88cc5f687c1a691 - languageName: node - linkType: hard - -"vary@npm:~1.1.2": - version: 1.1.2 - resolution: "vary@npm:1.1.2" - checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f - languageName: node - linkType: hard - -"vfile-location@npm:^5.0.0": - version: 5.0.3 - resolution: "vfile-location@npm:5.0.3" - dependencies: - "@types/unist": "npm:^3.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/1711f67802a5bc175ea69750d59863343ed43d1b1bb25c0a9063e4c70595e673e53e2ed5cdbb6dcdc370059b31605144d95e8c061b9361bcc2b036b8f63a4966 - languageName: node - linkType: hard - -"vfile-message@npm:^4.0.0": - version: 4.0.2 - resolution: "vfile-message@npm:4.0.2" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-stringify-position: "npm:^4.0.0" - checksum: 10c0/07671d239a075f888b78f318bc1d54de02799db4e9dce322474e67c35d75ac4a5ac0aaf37b18801d91c9f8152974ea39678aa72d7198758b07f3ba04fb7d7514 - languageName: node - linkType: hard - -"vfile@npm:^6.0.0, vfile@npm:^6.0.1": - version: 6.0.2 - resolution: "vfile@npm:6.0.2" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-stringify-position: "npm:^4.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/96b7e060b332ff1b05462053bd9b0f39062c00c5eabb78fc75603cc808d5f77c4379857fffca3e30a28e0aad2d51c065dfcd4a43fbe15b1fc9c2aaa9ac1be8e1 - languageName: node - linkType: hard - -"vscode-languageserver-textdocument@npm:^1.0.12": - version: 1.0.12 - resolution: "vscode-languageserver-textdocument@npm:1.0.12" - checksum: 10c0/534349894b059602c4d97615a1147b6c4c031141c2093e59657f54e38570f5989c21b376836f13b9375419869242e9efb4066643208b21ab1e1dee111a0f00fb - languageName: node - linkType: hard - -"vscode-uri@npm:^3.0.8": - version: 3.0.8 - resolution: "vscode-uri@npm:3.0.8" - checksum: 10c0/f7f217f526bf109589969fe6e66b71e70b937de1385a1d7bb577ca3ee7c5e820d3856a86e9ff2fa9b7a0bc56a3dd8c3a9a557d3fedd7df414bc618d5e6b567f9 - languageName: node - linkType: hard - -"walker@npm:^1.0.8": - version: 1.0.8 - resolution: "walker@npm:1.0.8" - dependencies: - makeerror: "npm:1.0.12" - checksum: 10c0/a17e037bccd3ca8a25a80cb850903facdfed0de4864bd8728f1782370715d679fa72e0a0f5da7c1c1379365159901e5935f35be531229da53bbfc0efdabdb48e - languageName: node - linkType: hard - -"watchpack@npm:^2.4.1": - version: 2.4.2 - resolution: "watchpack@npm:2.4.2" - dependencies: - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.1.2" - checksum: 10c0/ec60a5f0e9efaeca0102fd9126346b3b2d523e01c34030d3fddf5813a7125765121ebdc2552981136dcd2c852deb1af0b39340f2fcc235f292db5399d0283577 - languageName: node - linkType: hard - -"wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": - version: 1.7.3 - resolution: "wbuf@npm:1.7.3" - dependencies: - minimalistic-assert: "npm:^1.0.0" - checksum: 10c0/56edcc5ef2b3d30913ba8f1f5cccc364d180670b24d5f3f8849c1e6fb514e5c7e3a87548ae61227a82859eba6269c11393ae24ce12a2ea1ecb9b465718ddced7 - languageName: node - linkType: hard - -"wcwidth@npm:^1.0.1": - version: 1.0.1 - resolution: "wcwidth@npm:1.0.1" - dependencies: - defaults: "npm:^1.0.3" - checksum: 10c0/5b61ca583a95e2dd85d7078400190efd452e05751a64accb8c06ce4db65d7e0b0cde9917d705e826a2e05cc2548f61efde115ffa374c3e436d04be45c889e5b4 - languageName: node - linkType: hard - -"web-namespaces@npm:^2.0.0": - version: 2.0.1 - resolution: "web-namespaces@npm:2.0.1" - checksum: 10c0/df245f466ad83bd5cd80bfffc1674c7f64b7b84d1de0e4d2c0934fb0782e0a599164e7197a4bce310ee3342fd61817b8047ff04f076a1ce12dd470584142a4bd - languageName: node - linkType: hard - -"webpack-bundle-analyzer@npm:^4.9.0": - version: 4.10.2 - resolution: "webpack-bundle-analyzer@npm:4.10.2" - dependencies: - "@discoveryjs/json-ext": "npm:0.5.7" - acorn: "npm:^8.0.4" - acorn-walk: "npm:^8.0.0" - commander: "npm:^7.2.0" - debounce: "npm:^1.2.1" - escape-string-regexp: "npm:^4.0.0" - gzip-size: "npm:^6.0.0" - html-escaper: "npm:^2.0.2" - opener: "npm:^1.5.2" - picocolors: "npm:^1.0.0" - sirv: "npm:^2.0.3" - ws: "npm:^7.3.1" - bin: - webpack-bundle-analyzer: lib/bin/analyzer.js - checksum: 10c0/00603040e244ead15b2d92981f0559fa14216381349412a30070a7358eb3994cd61a8221d34a3b3fb8202dc3d1c5ee1fbbe94c5c52da536e5b410aa1cf279a48 - languageName: node - linkType: hard - -"webpack-dev-middleware@npm:^5.3.4": - version: 5.3.4 - resolution: "webpack-dev-middleware@npm:5.3.4" - dependencies: - colorette: "npm:^2.0.10" - memfs: "npm:^3.4.3" - mime-types: "npm:^2.1.31" - range-parser: "npm:^1.2.1" - schema-utils: "npm:^4.0.0" - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - checksum: 10c0/257df7d6bc5494d1d3cb66bba70fbdf5a6e0423e39b6420f7631aeb52435afbfbff8410a62146dcdf3d2f945c62e03193aae2ac1194a2f7d5a2523b9d194e9e1 - languageName: node - linkType: hard - -"webpack-dev-server@npm:^4.15.1": - version: 4.15.2 - resolution: "webpack-dev-server@npm:4.15.2" - dependencies: - "@types/bonjour": "npm:^3.5.9" - "@types/connect-history-api-fallback": "npm:^1.3.5" - "@types/express": "npm:^4.17.13" - "@types/serve-index": "npm:^1.9.1" - "@types/serve-static": "npm:^1.13.10" - "@types/sockjs": "npm:^0.3.33" - "@types/ws": "npm:^8.5.5" - ansi-html-community: "npm:^0.0.8" - bonjour-service: "npm:^1.0.11" - chokidar: "npm:^3.5.3" - colorette: "npm:^2.0.10" - compression: "npm:^1.7.4" - connect-history-api-fallback: "npm:^2.0.0" - default-gateway: "npm:^6.0.3" - express: "npm:^4.17.3" - graceful-fs: "npm:^4.2.6" - html-entities: "npm:^2.3.2" - http-proxy-middleware: "npm:^2.0.3" - ipaddr.js: "npm:^2.0.1" - launch-editor: "npm:^2.6.0" - open: "npm:^8.0.9" - p-retry: "npm:^4.5.0" - rimraf: "npm:^3.0.2" - schema-utils: "npm:^4.0.0" - selfsigned: "npm:^2.1.1" - serve-index: "npm:^1.9.1" - sockjs: "npm:^0.3.24" - spdy: "npm:^4.0.2" - webpack-dev-middleware: "npm:^5.3.4" - ws: "npm:^8.13.0" - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true - bin: - webpack-dev-server: bin/webpack-dev-server.js - checksum: 10c0/625bd5b79360afcf98782c8b1fd710b180bb0e96d96b989defff550c546890010ceea82ffbecb2a0a23f7f018bc72f2dee7b3070f7b448fb0110df6657fb2904 - languageName: node - linkType: hard - -"webpack-merge@npm:^5.9.0": - version: 5.10.0 - resolution: "webpack-merge@npm:5.10.0" - dependencies: - clone-deep: "npm:^4.0.1" - flat: "npm:^5.0.2" - wildcard: "npm:^2.0.0" - checksum: 10c0/b607c84cabaf74689f965420051a55a08722d897bdd6c29cb0b2263b451c090f962d41ecf8c9bf56b0ab3de56e65476ace0a8ecda4f4a4663684243d90e0512b - languageName: node - linkType: hard - -"webpack-sources@npm:^3.2.3": - version: 3.2.3 - resolution: "webpack-sources@npm:3.2.3" - checksum: 10c0/2ef63d77c4fad39de4a6db17323d75eb92897b32674e97d76f0a1e87c003882fc038571266ad0ef581ac734cbe20952912aaa26155f1905e96ce251adbb1eb4e - languageName: node - linkType: hard - -"webpack@npm:^5.88.1": - version: 5.93.0 - resolution: "webpack@npm:5.93.0" - dependencies: - "@types/eslint-scope": "npm:^3.7.3" - "@types/estree": "npm:^1.0.5" - "@webassemblyjs/ast": "npm:^1.12.1" - "@webassemblyjs/wasm-edit": "npm:^1.12.1" - "@webassemblyjs/wasm-parser": "npm:^1.12.1" - acorn: "npm:^8.7.1" - acorn-import-attributes: "npm:^1.9.5" - browserslist: "npm:^4.21.10" - chrome-trace-event: "npm:^1.0.2" - enhanced-resolve: "npm:^5.17.0" - es-module-lexer: "npm:^1.2.1" - eslint-scope: "npm:5.1.1" - events: "npm:^3.2.0" - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.2.11" - json-parse-even-better-errors: "npm:^2.3.1" - loader-runner: "npm:^4.2.0" - mime-types: "npm:^2.1.27" - neo-async: "npm:^2.6.2" - schema-utils: "npm:^3.2.0" - tapable: "npm:^2.1.1" - terser-webpack-plugin: "npm:^5.3.10" - watchpack: "npm:^2.4.1" - webpack-sources: "npm:^3.2.3" - peerDependenciesMeta: - webpack-cli: - optional: true - bin: - webpack: bin/webpack.js - checksum: 10c0/f0c72f1325ff57a4cc461bb978e6e1296f2a7d45c9765965271aa686ccdd448512956f4d7fdcf8c164d073af046c5a0aba17ce85ea98e33e5e2bfbfe13aa5808 - languageName: node - linkType: hard - -"webpackbar@npm:^5.0.2": - version: 5.0.2 - resolution: "webpackbar@npm:5.0.2" - dependencies: - chalk: "npm:^4.1.0" - consola: "npm:^2.15.3" - pretty-time: "npm:^1.1.0" - std-env: "npm:^3.0.1" - peerDependencies: - webpack: 3 || 4 || 5 - checksum: 10c0/336568a6ed1c1ad743c8d20a5cab5875a7ebe1e96181f49ae0a1a897f1a59d1661d837574a25d8ba9dfa4f2f705bd46ca0cd037ff60286ff70fb8d9db2b0c123 - languageName: node - linkType: hard - -"websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": - version: 0.7.4 - resolution: "websocket-driver@npm:0.7.4" - dependencies: - http-parser-js: "npm:>=0.5.1" - safe-buffer: "npm:>=5.1.0" - websocket-extensions: "npm:>=0.1.1" - checksum: 10c0/5f09547912b27bdc57bac17b7b6527d8993aa4ac8a2d10588bb74aebaf785fdcf64fea034aae0c359b7adff2044dd66f3d03866e4685571f81b13e548f9021f1 - languageName: node - linkType: hard - -"websocket-extensions@npm:>=0.1.1": - version: 0.1.4 - resolution: "websocket-extensions@npm:0.1.4" - checksum: 10c0/bbc8c233388a0eb8a40786ee2e30d35935cacbfe26ab188b3e020987e85d519c2009fe07cfc37b7f718b85afdba7e54654c9153e6697301f72561bfe429177e0 - languageName: node - linkType: hard - -"which@npm:^1.3.1": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: "npm:^2.0.0" - bin: - which: ./bin/which - checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 - languageName: node - linkType: hard - -"which@npm:^2.0.1": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: "npm:^2.0.0" - bin: - node-which: ./bin/node-which - checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f - languageName: node - linkType: hard - -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" - dependencies: - isexe: "npm:^3.1.1" - bin: - node-which: bin/which.js - checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a - languageName: node - linkType: hard - -"widest-line@npm:^4.0.1": - version: 4.0.1 - resolution: "widest-line@npm:4.0.1" - dependencies: - string-width: "npm:^5.0.1" - checksum: 10c0/7da9525ba45eaf3e4ed1a20f3dcb9b85bd9443962450694dae950f4bdd752839747bbc14713522b0b93080007de8e8af677a61a8c2114aa553ad52bde72d0f9c - languageName: node - linkType: hard - -"wildcard@npm:^2.0.0": - version: 2.0.1 - resolution: "wildcard@npm:2.0.1" - checksum: 10c0/08f70cd97dd9a20aea280847a1fe8148e17cae7d231640e41eb26d2388697cbe65b67fd9e68715251c39b080c5ae4f76d71a9a69fa101d897273efdfb1b58bf7 - languageName: node - linkType: hard - -"winston@npm:2.x": - version: 2.4.7 - resolution: "winston@npm:2.4.7" - dependencies: - async: "npm:^2.6.4" - colors: "npm:1.0.x" - cycle: "npm:1.0.x" - eyes: "npm:0.1.x" - isstream: "npm:0.1.x" - stack-trace: "npm:0.0.x" - checksum: 10c0/8c6f7365955d93a78f3345db9259052fd68c64096898c5787cdd766a26555d869e56c6607db29c85733d342fe86b8e8b65862843cb751391e594752b1565a89b - languageName: node - linkType: hard - -"word-wrap@npm:^1.2.5": - version: 1.2.5 - resolution: "word-wrap@npm:1.2.5" - checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.0.1, wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: "npm:^6.1.0" - string-width: "npm:^5.0.1" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 - languageName: node - linkType: hard - -"write-file-atomic@npm:^3.0.3": - version: 3.0.3 - resolution: "write-file-atomic@npm:3.0.3" - dependencies: - imurmurhash: "npm:^0.1.4" - is-typedarray: "npm:^1.0.0" - signal-exit: "npm:^3.0.2" - typedarray-to-buffer: "npm:^3.1.5" - checksum: 10c0/7fb67affd811c7a1221bed0c905c26e28f0041e138fb19ccf02db57a0ef93ea69220959af3906b920f9b0411d1914474cdd90b93a96e5cd9e8368d9777caac0e - languageName: node - linkType: hard - -"write-file-atomic@npm:^4.0.2": - version: 4.0.2 - resolution: "write-file-atomic@npm:4.0.2" - dependencies: - imurmurhash: "npm:^0.1.4" - signal-exit: "npm:^3.0.7" - checksum: 10c0/a2c282c95ef5d8e1c27b335ae897b5eca00e85590d92a3fd69a437919b7b93ff36a69ea04145da55829d2164e724bc62202cdb5f4b208b425aba0807889375c7 - languageName: node - linkType: hard - -"ws@npm:^7.3.1": - version: 7.5.10 - resolution: "ws@npm:7.5.10" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/bd7d5f4aaf04fae7960c23dcb6c6375d525e00f795dd20b9385902bd008c40a94d3db3ce97d878acc7573df852056ca546328b27b39f47609f80fb22a0a9b61d - languageName: node - linkType: hard - -"ws@npm:^8.13.0": - version: 8.18.0 - resolution: "ws@npm:8.18.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 - languageName: node - linkType: hard - -"xdg-basedir@npm:^5.0.1, xdg-basedir@npm:^5.1.0": - version: 5.1.0 - resolution: "xdg-basedir@npm:5.1.0" - checksum: 10c0/c88efabc71ffd996ba9ad8923a8cc1c7c020a03e2c59f0ffa72e06be9e724ad2a0fccef488757bc6ed3d8849d753dd25082d1035d95cb179e79eae4d034d0b80 - languageName: node - linkType: hard - -"xml-js@npm:^1.6.11": - version: 1.6.11 - resolution: "xml-js@npm:1.6.11" - dependencies: - sax: "npm:^1.2.4" - bin: - xml-js: ./bin/cli.js - checksum: 10c0/c83631057f10bf90ea785cee434a8a1a0030c7314fe737ad9bf568a281083b565b28b14c9e9ba82f11fc9dc582a3a907904956af60beb725be1c9ad4b030bc5a - languageName: node - linkType: hard - -"xml2js@npm:^0.6.2": - version: 0.6.2 - resolution: "xml2js@npm:0.6.2" - dependencies: - sax: "npm:>=0.6.0" - xmlbuilder: "npm:~11.0.0" - checksum: 10c0/e98a84e9c172c556ee2c5afa0fc7161b46919e8b53ab20de140eedea19903ed82f7cd5b1576fb345c84f0a18da1982ddf65908129b58fc3d7cbc658ae232108f - languageName: node - linkType: hard - -"xmlbuilder@npm:~11.0.0": - version: 11.0.1 - resolution: "xmlbuilder@npm:11.0.1" - checksum: 10c0/74b979f89a0a129926bc786b913459bdbcefa809afaa551c5ab83f89b1915bdaea14c11c759284bb9b931e3b53004dbc2181e21d3ca9553eeb0b2a7b4e40c35b - languageName: node - linkType: hard - -"y18n@npm:^5.0.5": - version: 5.0.8 - resolution: "y18n@npm:5.0.8" - checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 - languageName: node - linkType: hard - -"yallist@npm:^3.0.2": - version: 3.1.1 - resolution: "yallist@npm:3.1.1" - checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a - languageName: node - linkType: hard - -"yaml@npm:^1.10.0, yaml@npm:^1.7.2": - version: 1.10.2 - resolution: "yaml@npm:1.10.2" - checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f - languageName: node - linkType: hard - -"yaml@npm:^2.4.5, yaml@npm:^2.5.0": - version: 2.5.0 - resolution: "yaml@npm:2.5.0" - bin: - yaml: bin.mjs - checksum: 10c0/771a1df083c8217cf04ef49f87244ae2dd7d7457094425e793b8f056159f167602ce172aa32d6bca21f787d24ec724aee3cecde938f6643564117bd151452631 - languageName: node - linkType: hard - -"yargs-parser@npm:^21.1.1": - version: 21.1.1 - resolution: "yargs-parser@npm:21.1.1" - checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 - languageName: node - linkType: hard - -"yargs@npm:^17.3.1": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" - dependencies: - cliui: "npm:^8.0.1" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.3" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^21.1.1" - checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f - languageName: node - linkType: hard - -"yocto-queue@npm:^1.0.0": - version: 1.1.1 - resolution: "yocto-queue@npm:1.1.1" - checksum: 10c0/cb287fe5e6acfa82690acb43c283de34e945c571a78a939774f6eaba7c285bacdf6c90fbc16ce530060863984c906d2b4c6ceb069c94d1e0a06d5f2b458e2a92 - languageName: node - linkType: hard - -"yoctocolors@npm:^2.0.0": - version: 2.1.1 - resolution: "yoctocolors@npm:2.1.1" - checksum: 10c0/85903f7fa96f1c70badee94789fade709f9d83dab2ec92753d612d84fcea6d34c772337a9f8914c6bed2f5fc03a428ac5d893e76fab636da5f1236ab725486d0 - languageName: node - linkType: hard - -"zod-validation-error@npm:^3.0.3": - version: 3.3.1 - resolution: "zod-validation-error@npm:3.3.1" - peerDependencies: - zod: ^3.18.0 - checksum: 10c0/53869a8478f42cd38f51e159431fe7af9e0b456e8078c6d9d906adb212753788defa9c8bd7374e9ecd4a688b6736fcfa091aebac65054328b8cfdecce9395d8e - languageName: node - linkType: hard - -"zod@npm:^3.22.4, zod@npm:^3.23.8": - version: 3.23.8 - resolution: "zod@npm:3.23.8" - checksum: 10c0/8f14c87d6b1b53c944c25ce7a28616896319d95bc46a9660fe441adc0ed0a81253b02b5abdaeffedbeb23bdd25a0bf1c29d2c12dd919aef6447652dd295e3e69 - languageName: node - linkType: hard - -"zwitch@npm:^2.0.0": - version: 2.0.4 - resolution: "zwitch@npm:2.0.4" - checksum: 10c0/3c7830cdd3378667e058ffdb4cf2bb78ac5711214e2725900873accb23f3dfe5f9e7e5a06dcdc5f29605da976fc45c26d9a13ca334d6eea2245a15e77b8fc06e - languageName: node - linkType: hard