diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index ece166b..0000000 --- a/.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -root = true - -[*] -charset = utf-8 -insert_final_newline = true -end_of_line = lf -indent_size = 2 -indent_style = space -trim_trailing_whitespace = true -max_line_length = 90 - -[*.md] -trim_trailing_whitespace = false \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 825830a..f1793d4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,28 +1,36 @@ name: CI -on: - push: - pull_request: +on: [push, pull_request] jobs: lint: - name: Check linting and formatting + name: Check linting, formatting, types runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 + with: + version: 11 + - uses: actions/setup-node@v7 + with: + node-version: 24 - run: | - yarn - yarn prettier . --debug-check - - run: | - yarn lint + pnpm install + pnpm check + pnpm check:types test: name: Test rules runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 + with: + version: 11 + - uses: actions/setup-node@v7 + with: + node-version: 24 - run: | - yarn - yarn test + pnpm install + pnpm test + pnpm test:e2e diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 0dbf448..0000000 --- a/.prettierrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "trailingComma": "es5", - "semi": true, - "singleQuote": true -} diff --git a/AGENTS.md b/AGENTS.md deleted file mode 100644 index 24932b6..0000000 --- a/AGENTS.md +++ /dev/null @@ -1,68 +0,0 @@ -# Agent Guide — eslint-plugin-suitescript - -This file gives AI coding agents the context they need to work in this repo without surprises. - -## Project type - -ESLint **flat-config plugin** that provides lint rules for NetSuite SuiteScript v1 and v2. - -## Setup - -```sh -yarn install -``` - -Requires Node.js `^20.19.0 || ^22.13.0 || >=24` and Yarn Classic (1.x). The repo ships a `yarn.lock` — do not introduce `package-lock.json`. - -## Common commands - -| Command | Purpose | -| ----------------- | ---------------------------------------------- | -| `yarn test` | Run the Mocha rule-tester suite | -| `yarn lint` | Lint the plugin source itself | -| `yarn lint:fix` | Lint and auto-fix | -| `yarn format` | Check Prettier formatting | -| `yarn format:fix` | Apply Prettier formatting | -| `yarn build:docs` | Regenerate `docs/rules/*.md` from `docs/src/*` | - -## Layout - -- `lib/index.js` — plugin entry point (registers rules and flat configs) -- `lib/rules/` — one file per rule -- `lib/util/` — shared helpers (`metadata`, `modules`, `script-types`, `globals`, …) -- `tests/rules/` — one Mocha test file per rule, using ESLint `RuleTester` -- `docs/src/` — doc templates (with `` placeholders consumed by `scripts/generate_docs.js`) -- `docs/rules/` — generated rule docs (output of `yarn build:docs`) - -## Rule-authoring conventions - -- Use `context.sourceCode` — never `context.getSourceCode()` (the latter was removed in ESLint 9). -- Provide `meta.schema`. Use `[]` for option-less rules. -- Provide `meta.messages` and report findings via `messageId`, not inline strings. -- Provide `meta.docs.description` and `meta.docs.url` (`https://github.com/acdvs/eslint-plugin-suitescript/blob/master/docs/rules/.md`). - -## Test conventions - -- Configure `RuleTester` with `languageOptions`, never `parserOptions`. -- Each rule has a corresponding `tests/rules/.js` with both `valid` and `invalid` cases. - -## Adding a new rule - -1. Create `lib/rules/.js`. -2. Register it in `lib/index.js` (the `allRules` map and the relevant configs). -3. Add `tests/rules/.js` with `valid` and `invalid` cases. -4. Add a doc template in `docs/src/.md`. -5. Run `yarn build:docs` to regenerate `docs/rules/.md`. -6. Add the rule to the list in `README.md`. - -## Commit conventions - -- English, imperative mood (`Add rule for X`, `Fix off-by-one in Y`). -- One logical change per commit. - -## Out of scope without explicit instruction - -- Bumping the `peerDependencies` floor. -- Introducing TypeScript or a build step. -- Changing the public `configs` shape. -- Adding runtime dependencies. diff --git a/README.md b/README.md index f27cbe5..f8ee3c7 100644 --- a/README.md +++ b/README.md @@ -46,18 +46,9 @@ export default [ ]; ``` -## Migration from v1.x +## Upgrading -v2 is **flat-config only**. To migrate: - -- Replace `.eslintrc.*` with `eslint.config.js`. -- Replace `extends: ['plugin:suitescript/recommended']` with `...suitescript.configs.recommended` (spread). -- Replace `env: { 'suitescript/suitescript2': true }` with `...suitescript.configs.suitescript2`. -- Bump `eslint` to `>= 9` in your project. - -`configs.recommended` already declares the AMD globals (`define`, `require`) and the standard browser globals (`window`, `document`, ...) that v1's `env: { amd: true, browser: true }` provided, so `no-undef` keeps working on `define([...], function() {})` modules and on client scripts that touch the DOM. - -Stay on `eslint-plugin-suitescript@^1` if you cannot migrate. +See the [upgrade guide](docs/upgrade.md) for details on upgrading the package to a new major version. ## List of supported rules @@ -65,11 +56,8 @@ Stay on `eslint-plugin-suitescript@^1` if you cannot migrate. - [suitescript/entry-points](docs/rules/entry-points.md): Enforces inclusion of at least one entry point based on `@NScriptType` - [suitescript/log-args](docs/rules/log-args.md): Enforces correct log arguments - [suitescript/module-vars](docs/rules/module-vars.md): Enforces correct module identifiers for each configured module -- [suitescript/no-amd-name](docs/rules/no-amd-name.md): Restricts naming of AMD modules -- [suitescript/no-extra-modules](docs/rules/no-extra-modules.md): Enforces equal number of module literals and identifiers - [suitescript/no-invalid-modules](docs/rules/no-invalid-modules.md): Enforces valid SuiteScript modules in `define` array - [suitescript/no-log-module](docs/rules/no-log-module.md): Restricts loading of the N/log module in favor of global `log` -- [suitescript/no-module-extensions](docs/rules/no-module-extensions.md): Restricts filename extensions on module dependencies - [suitescript/script-type](docs/rules/script-type.md): Enforces valid `@NScriptType` tag values ## License diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..ea5e7da --- /dev/null +++ b/biome.json @@ -0,0 +1,37 @@ +{ + "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false + }, + "formatter": { + "enabled": true, + "indentStyle": "space" + }, + "linter": { + "enabled": true, + "rules": { + "preset": "recommended", + "suspicious": { + "useIterableCallbackReturn": "off" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + } +} diff --git a/docs/rules/module-vars.md b/docs/rules/module-vars.md index b4f6e0b..997ec32 100644 --- a/docs/rules/module-vars.md +++ b/docs/rules/module-vars.md @@ -71,7 +71,9 @@ Specify at least one module name with a corresponding variable name. - N/https - N/https/clientCertificate - N/keyControl +- N/llm - N/log +- N/pgp - N/piremoval - N/plugin - N/portlet diff --git a/docs/rules/no-amd-name.md b/docs/rules/no-amd-name.md deleted file mode 100644 index 1a9b565..0000000 --- a/docs/rules/no-amd-name.md +++ /dev/null @@ -1,33 +0,0 @@ -# suitescript/no-amd-name - -:wrench: _The `--fix` option on the command line can automatically fix some of the problems reported by this rule._ - -Restricts naming of AMD modules. - -Naming AMD modules [should generally be avoided](https://requirejs.org/docs/whyamd.html#namedmodules) because compilers will handle the ID-ing of modules internally where necessary. - -## Rule Details - -:white_check_mark: The following pattern is **correct**: - -```js -/* eslint suitescript/no-amd-name: "error" */ - -define([], function () {}); -``` - -:x: The following pattern is **incorrect**: - -```js -/* eslint suitescript/no-amd-name: "error" */ - -define('myModule', [], function () {}); -``` - -## Version - -This rule was introduced in version 1.0.0. - -## Source - -- [Rule source](../../lib/rules/no-amd-name.js) diff --git a/docs/rules/no-extra-modules.md b/docs/rules/no-extra-modules.md deleted file mode 100644 index c561f8f..0000000 --- a/docs/rules/no-extra-modules.md +++ /dev/null @@ -1,41 +0,0 @@ -# suitescript/no-extra-modules - -Enforces an equal number of module literals and identifiers in the `define` call arguments. - -## Rule Details - -:white_check_mark: The following patterns are **correct**: - -```js -/* eslint suitescript/no-extra-modules: "error" */ - -define([], function () {}); -``` - -```js -/* eslint suitescript/no-extra-modules: "error" */ - -define(['N/search'], function (search) {}); -``` - -:x: The following patterns are **incorrect**: - -```js -/* eslint suitescript/no-extra-modules: "error" */ - -define(['N/file'], function (file, record) {}); -``` - -```js -/* eslint suitescript/no-extra-modules: "error" */ - -define(['N/file', 'N/record'], function (file) {}); -``` - -## Version - -This rule was introduced in version 1.0.0. - -## Source - -- [Rule source](../../lib/rules/no-extra-modules.js) diff --git a/docs/rules/no-module-extensions.md b/docs/rules/no-module-extensions.md deleted file mode 100644 index b90738d..0000000 --- a/docs/rules/no-module-extensions.md +++ /dev/null @@ -1,31 +0,0 @@ -# suitescript/no-module-extensions - -:wrench: _The `--fix` option on the command line can automatically fix some of the problems reported by this rule._ - -Restricts filename extensions on module dependencies. - -> **Note:** As of January 2021, there appears to be a NetSuite bug that intermittently causes an error (`SuiteScript 2.1 entry point scripts must implement one script type function..`) when attempting to upload script files that include dependencies with file extensions. - -## Rule Details - -:white_check_mark: The following pattern is **correct**: - -```js -/* eslint suitescript/no-module-extensions: "error" */ - -define(['./lib'], function (lib) {}); -``` - -:x: The following pattern is **incorrect**: - -```js -/* eslint suitescript/no-module-extensions: "error" */ - -define(['./lib.js'], function (lib) {}); -``` - -## Version - -This rule was introduced in version 1.0.3 - -- [Rule source](../../lib/rules/no-module-extensions.js) diff --git a/docs/src/no-amd-name.md b/docs/src/no-amd-name.md deleted file mode 100644 index 1a9b565..0000000 --- a/docs/src/no-amd-name.md +++ /dev/null @@ -1,33 +0,0 @@ -# suitescript/no-amd-name - -:wrench: _The `--fix` option on the command line can automatically fix some of the problems reported by this rule._ - -Restricts naming of AMD modules. - -Naming AMD modules [should generally be avoided](https://requirejs.org/docs/whyamd.html#namedmodules) because compilers will handle the ID-ing of modules internally where necessary. - -## Rule Details - -:white_check_mark: The following pattern is **correct**: - -```js -/* eslint suitescript/no-amd-name: "error" */ - -define([], function () {}); -``` - -:x: The following pattern is **incorrect**: - -```js -/* eslint suitescript/no-amd-name: "error" */ - -define('myModule', [], function () {}); -``` - -## Version - -This rule was introduced in version 1.0.0. - -## Source - -- [Rule source](../../lib/rules/no-amd-name.js) diff --git a/docs/src/no-extra-modules.md b/docs/src/no-extra-modules.md deleted file mode 100644 index c561f8f..0000000 --- a/docs/src/no-extra-modules.md +++ /dev/null @@ -1,41 +0,0 @@ -# suitescript/no-extra-modules - -Enforces an equal number of module literals and identifiers in the `define` call arguments. - -## Rule Details - -:white_check_mark: The following patterns are **correct**: - -```js -/* eslint suitescript/no-extra-modules: "error" */ - -define([], function () {}); -``` - -```js -/* eslint suitescript/no-extra-modules: "error" */ - -define(['N/search'], function (search) {}); -``` - -:x: The following patterns are **incorrect**: - -```js -/* eslint suitescript/no-extra-modules: "error" */ - -define(['N/file'], function (file, record) {}); -``` - -```js -/* eslint suitescript/no-extra-modules: "error" */ - -define(['N/file', 'N/record'], function (file) {}); -``` - -## Version - -This rule was introduced in version 1.0.0. - -## Source - -- [Rule source](../../lib/rules/no-extra-modules.js) diff --git a/docs/src/no-module-extensions.md b/docs/src/no-module-extensions.md deleted file mode 100644 index b90738d..0000000 --- a/docs/src/no-module-extensions.md +++ /dev/null @@ -1,31 +0,0 @@ -# suitescript/no-module-extensions - -:wrench: _The `--fix` option on the command line can automatically fix some of the problems reported by this rule._ - -Restricts filename extensions on module dependencies. - -> **Note:** As of January 2021, there appears to be a NetSuite bug that intermittently causes an error (`SuiteScript 2.1 entry point scripts must implement one script type function..`) when attempting to upload script files that include dependencies with file extensions. - -## Rule Details - -:white_check_mark: The following pattern is **correct**: - -```js -/* eslint suitescript/no-module-extensions: "error" */ - -define(['./lib'], function (lib) {}); -``` - -:x: The following pattern is **incorrect**: - -```js -/* eslint suitescript/no-module-extensions: "error" */ - -define(['./lib.js'], function (lib) {}); -``` - -## Version - -This rule was introduced in version 1.0.3 - -- [Rule source](../../lib/rules/no-module-extensions.js) diff --git a/docs/upgrade.md b/docs/upgrade.md new file mode 100644 index 0000000..11e628c --- /dev/null +++ b/docs/upgrade.md @@ -0,0 +1,22 @@ +# Upgrading to v2 + +With v2, the plugin only supports flag config, so the following changes should be made: + +- Replace `.eslintrc.*` with `eslint.config.js`. +- Replace `extends: ['plugin:suitescript/recommended']` with `...suitescript.configs.recommended` (spread). +- Replace `env: { 'suitescript/suitescript2': true }` with `...suitescript.configs.suitescript2`. +- Bump `eslint` to `>= 9` in your project. + +`configs.recommended` already declares the AMD globals (`define`, `require`) and the standard browser globals (`window`, `document`, ...) that v1's `env: { amd: true, browser: true }` provided, so `no-undef` keeps working on `define([...], function() {})` modules and on client scripts that touch the DOM. + +Stay on `eslint-plugin-suitescript@^1` if you cannot migrate. + +# Upgrading to v3 + +With v3, general AMD rules have been abstracted to the [`@acdvs/eslint-plugin-amd`][eslint-plugin-amd] plugin: + +- Rule `suitescript/no-amd-name` is replaced by `amd/no-name`. +- Rule `suitescript/no-extra-modules` is replaced by both `amd/no-extra-deps` and `amd/no-extra-params`. +- Rule `suitescript/no-module-extensions` is replaced by `amd/no-module-extensions`. + +[eslint-plugin-amd]: https://www.npmjs.com/package/@acdvs/eslint-plugin-amd \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index 3047d99..0000000 --- a/eslint.config.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -const eslintConfigPrettier = require('eslint-config-prettier/flat'); - -module.exports = [ - { - languageOptions: { - ecmaVersion: 2020, - sourceType: 'module', - globals: { - require: 'readonly', - module: 'readonly', - exports: 'writable', - __dirname: 'readonly', - __filename: 'readonly', - process: 'readonly', - console: 'readonly', - Buffer: 'readonly', - global: 'readonly', - }, - }, - }, - eslintConfigPrettier, -]; diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index fc69c2c..0000000 --- a/lib/index.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict'; - -const envGlobals = require('globals'); -const { MODULES } = require('./util/modules'); -const globals = require('./util/globals'); -const pkg = require('../package.json'); - -const plugin = { - meta: { name: pkg.name, version: pkg.version }, - rules: { - 'api-version': require('./rules/api-version'), - 'entry-points': require('./rules/entry-points'), - 'log-args': require('./rules/log-args'), - 'module-vars': require('./rules/module-vars'), - 'no-amd-name': require('./rules/no-amd-name'), - 'no-extra-modules': require('./rules/no-extra-modules'), - 'no-invalid-modules': require('./rules/no-invalid-modules'), - 'no-log-module': require('./rules/no-log-module'), - 'no-module-extensions': require('./rules/no-module-extensions'), - 'script-type': require('./rules/script-type'), - }, -}; - -plugin.configs = { - recommended: [ - { - plugins: { suitescript: plugin }, - languageOptions: { - sourceType: 'module', - globals: { - ...envGlobals.amd, - ...envGlobals.browser, - log: 'readonly', - }, - }, - rules: { - 'suitescript/api-version': 'error', - 'suitescript/entry-points': 'error', - 'suitescript/log-args': 'error', - 'suitescript/module-vars': ['error', MODULES], - 'suitescript/no-amd-name': 'error', - 'suitescript/no-extra-modules': 'error', - 'suitescript/no-invalid-modules': 'error', - 'suitescript/no-log-module': 'error', - 'suitescript/no-module-extensions': 'error', - 'suitescript/script-type': 'error', - }, - }, - ], - suitescript1: [{ languageOptions: { globals: globals.suitescript1 } }], - suitescript2: [{ languageOptions: { globals: globals.suitescript2 } }], -}; - -plugin.configs.all = plugin.configs.recommended; - -module.exports = plugin; diff --git a/lib/index.ts b/lib/index.ts new file mode 100644 index 0000000..c09f8db --- /dev/null +++ b/lib/index.ts @@ -0,0 +1,42 @@ +import type { ESLint } from 'eslint'; +import envGlobals from 'globals'; +import pkg from '../package.json'; +import rules from './rules'; +import globals from './utils/globals'; +import { modules } from './utils/modules'; + +const plugin: ESLint.Plugin = { + meta: { name: pkg.name, version: pkg.version }, + rules, +}; + +plugin.configs = { + recommended: [ + { + plugins: { suitescript: plugin }, + languageOptions: { + sourceType: 'module', + globals: { + ...envGlobals.amd, + ...envGlobals.browser, + log: 'readonly', + }, + }, + rules: { + 'suitescript/api-version': 'error', + 'suitescript/entry-points': 'error', + 'suitescript/log-args': 'error', + 'suitescript/module-vars': ['error', modules], + 'suitescript/no-invalid-modules': 'error', + 'suitescript/no-log-module': 'error', + 'suitescript/script-type': 'error', + }, + }, + ], + suitescript1: [{ languageOptions: { globals: globals.suitescript1 } }], + suitescript2: [{ languageOptions: { globals: globals.suitescript2 } }], +}; + +plugin.configs.all = plugin.configs.recommended; + +export default plugin; diff --git a/lib/rules/api-version.js b/lib/rules/api-version.ts similarity index 78% rename from lib/rules/api-version.js rename to lib/rules/api-version.ts index b883da7..de5924d 100644 --- a/lib/rules/api-version.js +++ b/lib/rules/api-version.ts @@ -1,15 +1,19 @@ -'use strict'; +import path from 'node:path'; +import type { Rule } from 'eslint'; +import pkg from '../../package.json'; const VERSION_TAG = '@NApiVersion'; const VERSION_TAG_REGEX = /@NApiVersion(?: (\S+))?/; const VERSIONS = ['1.0', '2.x', '2.0', '2.1']; -module.exports = { +const RULE_NAME = path.basename(import.meta.filename, '.ts'); + +const rule: Rule.RuleModule = { meta: { type: 'problem', docs: { description: 'Enforce valid @NApiVersion tag values', - url: 'https://github.com/acdvs/eslint-plugin-suitescript/blob/master/docs/rules/api-version.md', + url: `${pkg.homepage}/blob/master/docs/rules/${RULE_NAME}.md`, }, schema: [], messages: { @@ -17,7 +21,6 @@ module.exports = { noValue: 'No @NApiVersion value provided', }, }, - create: (context) => ({ Program: () => { const sourceCode = context.sourceCode; @@ -25,11 +28,11 @@ module.exports = { .getAllComments() .find((node) => VERSION_TAG_REGEX.test(node.value)); - if (!comment || comment.type !== 'Block') { + if (!comment?.loc || comment.type !== 'Block') { return; } - const version = comment.value.match(VERSION_TAG_REGEX)[1]; + const version = comment.value.match(VERSION_TAG_REGEX)?.[1]; const commentIndex = sourceCode.getIndexFromLoc(comment.loc.start) + 1; const tagIndex = commentIndex + comment.value.indexOf(VERSION_TAG) + 1; @@ -58,3 +61,5 @@ module.exports = { }, }), }; + +export default rule; diff --git a/lib/rules/entry-points.js b/lib/rules/entry-points.ts similarity index 50% rename from lib/rules/entry-points.js rename to lib/rules/entry-points.ts index d9eed0c..8f954df 100644 --- a/lib/rules/entry-points.js +++ b/lib/rules/entry-points.ts @@ -1,28 +1,32 @@ -'use strict'; +import path from 'node:path'; +import type { Rule } from 'eslint'; +import type { CallExpression, ReturnStatement, Statement } from 'estree'; +import pkg from '../../package.json'; +import { getScriptType } from '../utils/metadata'; -const { getScriptType } = require('../util/metadata'); +const RULE_NAME = path.basename(import.meta.filename, '.ts'); -module.exports = { +const rule: Rule.RuleModule = { meta: { type: 'problem', docs: { - description: 'Enforce inclusion of at least one entry point based on @NScriptType', - url: 'https://github.com/acdvs/eslint-plugin-suitescript/blob/master/docs/rules/entry-points.md', + description: + 'Enforce inclusion of at least one entry point based on @NScriptType', + url: `${pkg.homepage}/blob/master/docs/rules/${RULE_NAME}.md`, }, schema: [], messages: { returnEntryPoint: 'Return at least one valid {{ type }} entry point', }, }, - create: (context) => ({ - 'CallExpression[callee.name=define]': (node) => { + 'CallExpression[callee.name=define]': (node: CallExpression) => { let hasValidEntryPoint = false; - let scriptType = getScriptType(context); + const scriptType = getScriptType(context); - if (!scriptType || !scriptType.value || !scriptType.def) { - return; - } + if (!scriptType?.value) return; + if (!scriptType.def) return; + const def = scriptType.def; const argsCount = node.arguments.length; const callback = node.arguments[argsCount - 1]; @@ -35,18 +39,22 @@ module.exports = { return; } - const hasBlockBody = callback.body.type === 'BlockStatement'; - const callbackBody = hasBlockBody ? callback.body.body : []; - const returnStatement = - hasBlockBody && callbackBody.find((n) => n.type === 'ReturnStatement'); - const returnArgument = hasBlockBody - ? returnStatement && returnStatement.argument - : callback.body; + const callbackBody = + callback.body.type === 'BlockStatement' ? callback.body.body : []; + const returnStatement = callbackBody.find( + (n): n is ReturnStatement => n.type === 'ReturnStatement', + ); + const returnArgument = + callback.body.type !== 'BlockStatement' + ? callback.body + : returnStatement?.argument; - if (returnArgument && returnArgument.type === 'ObjectExpression') { + if (returnArgument?.type === 'ObjectExpression') { for (const property of returnArgument.properties) { if ( - scriptType.def.entryPoints.includes(property.key.name) && + property.type === 'Property' && + property.key.type === 'Identifier' && + def.entryPoints.includes(property.key.name) && (property.value.type === 'Identifier' || property.value.type === 'FunctionExpression' || property.value.type === 'ArrowFunctionExpression') @@ -59,12 +67,14 @@ module.exports = { if (returnArgument && returnArgument.type === 'Identifier') { const returnAssignments = callbackBody.filter( - (n) => + (n: Statement) => n.type === 'ExpressionStatement' && n.expression.type === 'AssignmentExpression' && n.expression.left.type === 'MemberExpression' && + n.expression.left.object.type === 'Identifier' && n.expression.left.object.name === returnArgument.name && - scriptType.def.entryPoints.includes(n.expression.left.property.name) + n.expression.left.property.type === 'Identifier' && + def.entryPoints.includes(n.expression.left.property.name), ); if (returnAssignments.length > 0) { @@ -72,7 +82,7 @@ module.exports = { } } - if (scriptType.def.entryPoints.length === 0) { + if (def.entryPoints.length === 0) { hasValidEntryPoint = true; } @@ -88,3 +98,5 @@ module.exports = { }, }), }; + +export default rule; diff --git a/lib/rules/index.ts b/lib/rules/index.ts new file mode 100644 index 0000000..e5f6426 --- /dev/null +++ b/lib/rules/index.ts @@ -0,0 +1,20 @@ +import type { Rule } from 'eslint'; +import apiVersion from './api-version'; +import entryPoints from './entry-points'; +import logArgs from './log-args'; +import moduleVars from './module-vars'; +import noInvalidModules from './no-invalid-modules'; +import noLogModule from './no-log-module'; +import scriptType from './script-type'; + +const rules = { + 'api-version': apiVersion, + 'entry-points': entryPoints, + 'log-args': logArgs, + 'module-vars': moduleVars, + 'no-invalid-modules': noInvalidModules, + 'no-log-module': noLogModule, + 'script-type': scriptType, +} satisfies Record; + +export default rules; diff --git a/lib/rules/log-args.js b/lib/rules/log-args.js deleted file mode 100644 index 9458b5f..0000000 --- a/lib/rules/log-args.js +++ /dev/null @@ -1,91 +0,0 @@ -'use strict'; - -const moduleUtil = require('../util/modules'); -const objectUtil = require('../util/objects'); - -const LOG_MEMBERS = ['debug', 'audit', 'error', 'emergency']; - -module.exports = { - meta: { - type: 'suggestion', - docs: { - description: 'Enforce correct log arguments', - url: 'https://github.com/acdvs/eslint-plugin-suitescript/blob/master/docs/rules/log-args.md', - }, - messages: { - titleRequired: "A log title is required with 'Log.{{ prop }}'", - detailsRequired: "Log details are required with 'Log.{{ prop }}'", - }, - schema: [ - { - type: 'object', - properties: { - requireTitle: { - type: 'boolean', - }, - requireDetails: { - type: 'boolean', - }, - }, - additionalProperties: false, - }, - ], - }, - - create: (context) => { - let logModule; - - return { - 'CallExpression[callee.name=define]': (node) => { - logModule = moduleUtil.getModuleNodePair(node, 'N/log'); - }, - 'CallExpression[callee.object.type=Identifier]': (node) => { - let config = context.options[0] || { requireTitle: true, requireDetails: true }; - const args = node.arguments; - - if (args.length === 0 || (!config.requireTitle && !config.requireDetails)) { - return; - } - - const callee = node.callee; - const logVar = logModule?.variable?.name ?? 'log'; - - if ( - callee.object.name !== logVar || - !LOG_MEMBERS.includes(callee.property.name) - ) { - return; - } - - if ( - config.requireTitle && - args[0].type === 'ObjectExpression' && - !objectUtil.getPropByKey(args[0], 'title') - ) { - context.report({ - node, - messageId: 'titleRequired', - data: { - prop: callee.property.name, - }, - }); - } - - if ( - config.requireDetails && - ((args[0].type !== 'ObjectExpression' && !args[1]) || - (args[0].type === 'ObjectExpression' && - !objectUtil.getPropByKey(args[0], 'details'))) - ) { - context.report({ - node, - messageId: 'detailsRequired', - data: { - prop: callee.property.name, - }, - }); - } - }, - }; - }, -}; diff --git a/lib/rules/log-args.ts b/lib/rules/log-args.ts new file mode 100644 index 0000000..06561fb --- /dev/null +++ b/lib/rules/log-args.ts @@ -0,0 +1,119 @@ +import path from 'node:path'; +import type { Rule } from 'eslint'; +import type { CallExpression } from 'estree'; +import pkg from '../../package.json'; +import { getModuleNodePair, type ModuleNodes } from '../utils/modules'; +import { getPropByKey } from '../utils/objects'; + +const RULE_NAME = path.basename(import.meta.filename, '.ts'); + +type Options = { + requireTitle: boolean; + requireDetails: boolean; +}; + +const LOG_MEMBERS = ['debug', 'audit', 'error', 'emergency']; + +const rule: Rule.RuleModule = { + meta: { + type: 'suggestion', + docs: { + description: 'Enforce correct log arguments', + url: `${pkg.homepage}/blob/master/docs/rules/${RULE_NAME}.md`, + }, + messages: { + titleRequired: "A log title is required with 'Log.{{ prop }}'", + detailsRequired: "Log details are required with 'Log.{{ prop }}'", + }, + schema: [ + { + type: 'object', + properties: { + requireTitle: { + type: 'boolean', + }, + requireDetails: { + type: 'boolean', + }, + }, + additionalProperties: false, + }, + ], + defaultOptions: [ + { + requireTitle: true, + requireDetails: true, + }, + ], + }, + create: (context) => { + const { requireTitle, requireDetails } = (context.options[0] ?? + {}) as Options; + + let logModule: ModuleNodes | undefined; + + return { + 'CallExpression[callee.name=define]': (node: CallExpression) => { + logModule = getModuleNodePair(node, 'N/log'); + }, + 'CallExpression[callee.object.type=Identifier]': ( + node: CallExpression, + ) => { + const args = node.arguments; + const noArgsRequired = !requireTitle && !requireDetails; + + if (args.length === 0 || noArgsRequired) { + return; + } + + const callee = node.callee; + + if ( + callee.type !== 'MemberExpression' || + callee.object.type !== 'Identifier' || + callee.property.type !== 'Identifier' + ) { + return; + } + + const logVar = logModule?.variable?.name ?? 'log'; + const isValidLogType = LOG_MEMBERS.includes(callee.property.name); + + if (callee.object.name !== logVar || !isValidLogType) { + return; + } + + const firstArg = args[0]; + const firstArgIsObj = firstArg.type === 'ObjectExpression'; + const objMissingTitle = + firstArgIsObj && !getPropByKey(firstArg, 'title'); + + if (requireTitle && objMissingTitle) { + context.report({ + node, + messageId: 'titleRequired', + data: { + prop: callee.property.name, + }, + }); + } + + const onlyOneNonObjArg = !firstArgIsObj && args.length === 1; + const objMissingDetails = + firstArgIsObj && !getPropByKey(firstArg, 'details'); + + if (requireDetails && (onlyOneNonObjArg || objMissingDetails)) { + context.report({ + node, + messageId: 'detailsRequired', + data: { + prop: callee.property.name, + }, + }); + } + }, + }; + }, +}; + +export default rule; diff --git a/lib/rules/module-vars.js b/lib/rules/module-vars.js deleted file mode 100644 index b5b828e..0000000 --- a/lib/rules/module-vars.js +++ /dev/null @@ -1,68 +0,0 @@ -'use strict'; - -const moduleUtil = require('../util/modules'); -const { moduleNames } = require('../util/modules'); - -module.exports = { - meta: { - type: 'suggestion', - docs: { - description: 'Enforce correct module identifiers for each configured module', - url: 'https://github.com/acdvs/eslint-plugin-suitescript/blob/master/docs/rules/module-vars.md', - }, - messages: { - useCorrectName: "Identifier for {{ module }} should be '{{ id }}'", - }, - schema: [ - { - type: 'object', - properties: getSchemaProperties(), - additionalProperties: false, - }, - ], - }, - - create: (context) => ({ - 'CallExpression[callee.name=define]': (node) => { - if (!context.options[0]) return; - - const config = context.options[0]; - const modules = moduleUtil.getModules(node); - - if (modules.varCount === 0) return; - - for (const module of modules.list) { - if (!module.nodes.variable) continue; - - const configVar = config[module.name]; - - if (configVar && configVar !== module.variable) { - context.report({ - node: module.nodes.variable, - messageId: 'useCorrectName', - data: { - module: module.name, - id: configVar, - }, - }); - } - } - }, - }), -}; - -/** - * Get schema properties from module names - * @returns {Object} - */ -function getSchemaProperties() { - let properties = moduleNames.map((name) => { - return { - [name]: { - type: 'string', - }, - }; - }); - - return Object.assign({}, ...properties); -} diff --git a/lib/rules/module-vars.ts b/lib/rules/module-vars.ts new file mode 100644 index 0000000..d469396 --- /dev/null +++ b/lib/rules/module-vars.ts @@ -0,0 +1,76 @@ +import path from 'node:path'; +import { getDefineCall } from '@acdvs/eslint-plugin-amd/utils'; +import type { Rule } from 'eslint'; +import type { CallExpression, Identifier } from 'estree'; +import pkg from '../../package.json'; +import { type ModuleName, moduleNames, modules } from '../utils/modules'; + +type Options = Partial>; + +const RULE_NAME = path.basename(import.meta.filename, '.ts'); + +const rule: Rule.RuleModule = { + meta: { + type: 'suggestion', + docs: { + description: + 'Enforce correct module identifiers for each configured module', + url: `${pkg.homepage}/blob/master/docs/rules/${RULE_NAME}.md`, + }, + messages: { + useCorrectName: "Identifier for {{ module }} should be '{{ id }}'", + }, + schema: [ + { + type: 'object', + properties: getSchemaProperties(), + additionalProperties: false, + }, + ], + defaultOptions: [modules], + }, + create: (context) => { + const config = (context.options[0] ?? {}) as Options; + + return { + 'CallExpression[callee.name=define]': (node: CallExpression) => { + if (!context.options[0]) return; + + const defineCall = getDefineCall(node); + const pairs = defineCall?.depAnalysis?.pairs; + + if (!pairs) return; + + for (const pair of pairs) { + const moduleName = pair.name?.value as ModuleName; + const param = pair.param as Identifier; + const paramName = param.name as ModuleName; + const configParamName = config[moduleName]; + + if (configParamName && paramName !== configParamName) { + context.report({ + node: param, + messageId: 'useCorrectName', + data: { + module: moduleName, + id: configParamName, + }, + }); + } + } + }, + }; + }, +}; + +function getSchemaProperties() { + const properties = moduleNames.map((name) => ({ + [name]: { + type: 'string', + }, + })); + + return Object.assign({}, ...properties); +} + +export default rule; diff --git a/lib/rules/no-amd-name.js b/lib/rules/no-amd-name.js deleted file mode 100644 index 6bbd5c5..0000000 --- a/lib/rules/no-amd-name.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict'; - -module.exports = { - meta: { - type: 'suggestion', - docs: { - description: 'Restrict naming of AMD modules', - url: 'https://github.com/acdvs/eslint-plugin-suitescript/blob/master/docs/rules/no-amd-name.md', - }, - schema: [], - messages: { - noModuleName: 'No AMD module name should be provided', - }, - fixable: 'code', - }, - - create: (context) => ({ - 'CallExpression[callee.name=define]': (node) => { - if (node.arguments.length !== 3) { - return; - } - - const arg1 = node.arguments[0]; - const arg2 = node.arguments[1]; - - if (arg1 && arg1.type === 'Literal' && typeof arg1.value === 'string') { - context.report({ - node: arg1, - messageId: 'noModuleName', - fix: function (fixer) { - return fixer.replaceTextRange([arg1.range[0], arg2.range[0]], ''); - }, - }); - } - }, - }), -}; diff --git a/lib/rules/no-extra-modules.js b/lib/rules/no-extra-modules.js deleted file mode 100644 index c9f18b0..0000000 --- a/lib/rules/no-extra-modules.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; - -const moduleUtil = require('../util/modules'); - -module.exports = { - meta: { - type: 'problem', - docs: { - description: 'Enforce equal number of module literals and identifiers', - url: 'https://github.com/acdvs/eslint-plugin-suitescript/blob/master/docs/rules/no-extra-modules.md', - }, - schema: [], - messages: { - excessName: "Excess module name '{{ name }}'", - excessVar: "Excess module identifier '{{ var }}'", - }, - }, - - create: (context) => ({ - 'CallExpression[callee.name=define]': (node) => { - const modules = moduleUtil.getModules(node); - const nameCount = modules.nameCount; - const varCount = modules.varCount; - - if (nameCount === varCount) return; - - const excessCount = - nameCount > varCount ? nameCount - varCount : varCount - nameCount; - const excessModules = modules.list.slice(-excessCount); - - for (const excessModule of excessModules) { - if (nameCount > varCount) { - context.report({ - node: excessModule.nodes.name, - messageId: 'excessName', - data: { - name: excessModule.name, - }, - }); - } else { - context.report({ - node: excessModule.nodes.variable, - messageId: 'excessVar', - data: { - var: excessModule.variable, - }, - }); - } - } - }, - }), -}; diff --git a/lib/rules/no-invalid-modules.js b/lib/rules/no-invalid-modules.js deleted file mode 100644 index f32988a..0000000 --- a/lib/rules/no-invalid-modules.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict'; - -const moduleUtil = require('../util/modules'); - -module.exports = { - meta: { - type: 'problem', - docs: { - description: 'Enforce valid SuiteScript modules in define array', - url: 'https://github.com/acdvs/eslint-plugin-suitescript/blob/master/docs/rules/no-invalid-modules.md', - }, - schema: [], - messages: { - invalidModule: "Invalid NetSuite module '{{ module }}'", - }, - }, - - create: (context) => { - let invalidModuleNodes = []; - - return { - 'CallExpression[callee.name=define]': (node) => { - const modules = moduleUtil.getModules(node).list; - invalidModuleNodes = modules - .filter((m) => !m.isValid && m.nodes.name) - .map((m) => m.nodes.name); - - for (const invalidModuleNode of invalidModuleNodes) { - context.report({ - node: invalidModuleNode, - messageId: 'invalidModule', - data: { - module: invalidModuleNode.value, - }, - }); - } - }, - }; - }, -}; diff --git a/lib/rules/no-invalid-modules.ts b/lib/rules/no-invalid-modules.ts new file mode 100644 index 0000000..a3e9866 --- /dev/null +++ b/lib/rules/no-invalid-modules.ts @@ -0,0 +1,45 @@ +import path from 'node:path'; +import type { Rule } from 'eslint'; +import type { CallExpression, Literal } from 'estree'; +import pkg from '../../package.json'; +import { getModules } from '../utils/modules'; + +const RULE_NAME = path.basename(import.meta.filename, '.ts'); + +const rule: Rule.RuleModule = { + meta: { + type: 'problem', + docs: { + description: 'Enforce valid SuiteScript modules in define array', + url: `${pkg.homepage}/blob/master/docs/rules/${RULE_NAME}.md`, + }, + schema: [], + messages: { + invalidModule: "Invalid NetSuite module '{{ module }}'", + }, + }, + create: (context) => { + let invalidModuleNodes: Literal[] = []; + + return { + 'CallExpression[callee.name=define]': (node: CallExpression) => { + invalidModuleNodes = getModules(node) + .list.filter((m) => !m.isValid) + .map((m) => m.nodes.name) + .filter((n): n is Literal => n !== null); + + for (const invalidModuleNode of invalidModuleNodes) { + context.report({ + node: invalidModuleNode, + messageId: 'invalidModule', + data: { + module: String(invalidModuleNode.value), + }, + }); + } + }, + }; + }, +}; + +export default rule; diff --git a/lib/rules/no-log-module.js b/lib/rules/no-log-module.js deleted file mode 100644 index 447f621..0000000 --- a/lib/rules/no-log-module.js +++ /dev/null @@ -1,49 +0,0 @@ -'use strict'; - -const moduleUtil = require('../util/modules'); -const metadataUtil = require('../util/metadata'); - -module.exports = { - meta: { - type: 'suggestion', - docs: { - description: 'Restrict loading of the N/log module in favor of global log', - url: 'https://github.com/acdvs/eslint-plugin-suitescript/blob/master/docs/rules/no-log-module.md', - }, - messages: { - useGlobalLog: 'Use global log instead of the N/log module', - }, - schema: [ - { - type: 'object', - properties: { - allowInClientScripts: { - type: 'boolean', - }, - }, - additionalProperties: false, - }, - ], - }, - - create: (context) => ({ - 'CallExpression[callee.name=define]': (node) => { - const config = context.options[0] || { allowInClientScripts: true }; - - const logModule = moduleUtil.getModuleNodePair(node, 'N/log'); - const scriptType = metadataUtil.getScriptType(context); - const isClientScript = scriptType && scriptType.value === 'ClientScript'; - - if (isClientScript && config.allowInClientScripts) { - return; - } - - if (logModule) { - context.report({ - node: logModule.name, - messageId: 'useGlobalLog', - }); - } - }, - }), -}; diff --git a/lib/rules/no-log-module.ts b/lib/rules/no-log-module.ts new file mode 100644 index 0000000..19301d3 --- /dev/null +++ b/lib/rules/no-log-module.ts @@ -0,0 +1,60 @@ +import path from 'node:path'; +import type { Rule } from 'eslint'; +import type { CallExpression } from 'estree'; +import pkg from '../../package.json'; +import { getScriptType } from '../utils/metadata'; +import { getModuleNodePair } from '../utils/modules'; + +const RULE_NAME = path.basename(import.meta.filename, '.ts'); + +const rule: Rule.RuleModule = { + meta: { + type: 'suggestion', + docs: { + description: + 'Restrict loading of the N/log module in favor of global log', + url: `${pkg.homepage}/blob/master/docs/rules/${RULE_NAME}.md`, + }, + messages: { + useGlobalLog: 'Use global log instead of the N/log module', + }, + schema: [ + { + type: 'object', + properties: { + allowInClientScripts: { + type: 'boolean', + }, + }, + additionalProperties: false, + }, + ], + defaultOptions: [ + { + allowInClientScripts: true, + }, + ], + }, + create: (context) => ({ + 'CallExpression[callee.name=define]': (node: CallExpression) => { + const config = context.options[0] || { allowInClientScripts: true }; + + const logModule = getModuleNodePair(node, 'N/log'); + const scriptType = getScriptType(context); + const isClientScript = scriptType && scriptType.value === 'ClientScript'; + + if (isClientScript && config.allowInClientScripts) { + return; + } + + if (logModule?.name) { + context.report({ + node: logModule.name, + messageId: 'useGlobalLog', + }); + } + }, + }), +}; + +export default rule; diff --git a/lib/rules/no-module-extensions.js b/lib/rules/no-module-extensions.js deleted file mode 100644 index bda20ef..0000000 --- a/lib/rules/no-module-extensions.js +++ /dev/null @@ -1,48 +0,0 @@ -'use strict'; - -const moduleUtil = require('../util/modules'); - -const INVALID_MODULE_REGEX = /\.js/; - -module.exports = { - meta: { - type: 'problem', - docs: { - description: 'Restrict filename extensions on module dependencies', - url: 'https://github.com/acdvs/eslint-plugin-suitescript/blob/master/docs/rules/no-module-extensions.md', - }, - schema: [], - messages: { - invalidModuleExtension: 'Module name should not include file extension', - }, - fixable: 'code', - }, - - create: (context) => { - let invalidModuleNodes = []; - - return { - 'CallExpression[callee.name=define]': (node) => { - const modules = moduleUtil.getModules(node).list; - - invalidModuleNodes = modules - .filter((m) => INVALID_MODULE_REGEX.test(m.name)) - .map((m) => m.nodes.name); - - for (const invalidModuleNode of invalidModuleNodes) { - context.report({ - node: invalidModuleNode, - messageId: 'invalidModuleExtension', - fix: function (fixer) { - const fixedModuleName = invalidModuleNode.raw.replace( - INVALID_MODULE_REGEX, - '' - ); - return fixer.replaceText(invalidModuleNode, fixedModuleName); - }, - }); - } - }, - }; - }, -}; diff --git a/lib/rules/script-type.js b/lib/rules/script-type.ts similarity index 70% rename from lib/rules/script-type.js rename to lib/rules/script-type.ts index c40db40..5ab6785 100644 --- a/lib/rules/script-type.js +++ b/lib/rules/script-type.ts @@ -1,13 +1,16 @@ -'use strict'; +import path from 'node:path'; +import type { Rule } from 'eslint'; +import pkg from '../../package.json'; +import { getScriptType } from '../utils/metadata'; -const { getScriptType } = require('../util/metadata'); +const RULE_NAME = path.basename(import.meta.filename, '.ts'); -module.exports = { +const rule: Rule.RuleModule = { meta: { type: 'problem', docs: { description: 'Enforce valid @NScriptType tag values', - url: 'https://github.com/acdvs/eslint-plugin-suitescript/blob/master/docs/rules/script-type.md', + url: `${pkg.homepage}/blob/master/docs/rules/${RULE_NAME}.md`, }, schema: [], messages: { @@ -15,7 +18,6 @@ module.exports = { noValue: 'No @NScriptType value provided', }, }, - create: (context) => ({ Program: () => { const scriptType = getScriptType(context); @@ -39,3 +41,5 @@ module.exports = { }, }), }; + +export default rule; diff --git a/lib/util/arrays.js b/lib/util/arrays.js deleted file mode 100644 index 81bfde8..0000000 --- a/lib/util/arrays.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; - -/** - * Finds a property in list by its key - * @param {ASTNode[]} arr Array of AST nodes - * @param {number} count Required count - * @param {string} type Element type - * @param {boolean} exact If result count should be exact - * @returns {boolean} - */ -function hasManyOfType(arr, count, type, exact) { - let currCount = 0; - - for (let node of arr) { - switch (node.type) { - case 'Literal': - if (typeof node.value === type) currCount++; - break; - case 'ObjectExpression': - if (type === 'object') currCount++; - } - } - - return exact ? currCount === count : currCount >= count; -} - -module.exports = { - hasManyOfType, -}; diff --git a/lib/util/metadata.js b/lib/util/metadata.js deleted file mode 100644 index e18ff9e..0000000 --- a/lib/util/metadata.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -const { getScriptTypeDef } = require('./script-types'); - -const SCRIPT_TAG = '@NScriptType'; -const SCRIPT_TAG_REGEX = /@NScriptType(?: (\S+))?/; - -/** - * Gets "@NScriptType" value and metadata - * @param {Object} context Execution context - * @returns {(Object|null)} - */ -function getScriptType(context) { - const sourceCode = context.sourceCode; - const comment = sourceCode - .getAllComments() - .find((node) => SCRIPT_TAG_REGEX.test(node.value)); - - if (!comment || comment.type !== 'Block') { - return null; - } - - const scriptType = comment.value.match(SCRIPT_TAG_REGEX)[1]; - - const commentIndex = sourceCode.getIndexFromLoc(comment.loc.start) + 1; - const tagIndex = commentIndex + comment.value.indexOf(SCRIPT_TAG) + 1; - const typeIndex = tagIndex + SCRIPT_TAG.length + 1; - - return { - value: scriptType, - def: getScriptTypeDef(scriptType), - locs: { - tag: { - start: sourceCode.getLocFromIndex(tagIndex), - end: sourceCode.getLocFromIndex(tagIndex + SCRIPT_TAG.length), - }, - value: scriptType && { - start: sourceCode.getLocFromIndex(typeIndex), - end: sourceCode.getLocFromIndex(typeIndex + scriptType.length), - }, - }, - }; -} - -module.exports = { - getScriptType, -}; diff --git a/lib/util/objects.js b/lib/util/objects.js deleted file mode 100644 index 668b4fd..0000000 --- a/lib/util/objects.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -/** - * Finds a property in list by its key - * @param {ASTNode} obj Target object - * @param {string} key Key to search for in properties list - * @returns {(Object|null)} - */ -function getPropByKey(obj, key) { - if (obj.type !== 'ObjectExpression') return null; - - for (let prop of obj.properties) { - if (prop.key.name === key) return prop; - } - - return null; -} - -/** - * Gets a list of all properties in an AST object node - * @param {ASTNode} obj Target object - * @returns {Array} - */ -function getPropList(obj) { - return obj.properties.map((prop) => prop.key.name); -} - -module.exports = { - getPropByKey, - getPropList, -}; diff --git a/lib/util/globals.js b/lib/utils/globals.ts similarity index 99% rename from lib/util/globals.js rename to lib/utils/globals.ts index e60d693..61e4bd5 100644 --- a/lib/util/globals.js +++ b/lib/utils/globals.ts @@ -1,6 +1,4 @@ -'use strict'; - -module.exports = { +export default { suitescript2: { log: 'readonly', util: 'readonly', diff --git a/lib/utils/metadata.ts b/lib/utils/metadata.ts new file mode 100644 index 0000000..04f752b --- /dev/null +++ b/lib/utils/metadata.ts @@ -0,0 +1,53 @@ +import type { Rule } from 'eslint'; +import type { Position } from 'estree'; +import { getScriptTypeDef } from './script-types'; + +const SCRIPT_TAG = '@NScriptType'; +const SCRIPT_TAG_REGEX = /@NScriptType(?: (\S+))?/; + +type Loc = { start: Position; end: Position }; + +type ScriptTypeInfo = { + value: string | undefined; + def: ReturnType | undefined; + locs: { + tag: Loc; + value: Loc | false; + }; +}; + +function getScriptType(context: Rule.RuleContext): ScriptTypeInfo | undefined { + const sourceCode = context.sourceCode; + const comment = sourceCode + .getAllComments() + .find((node) => SCRIPT_TAG_REGEX.test(node.value)); + + if (!comment?.loc || comment.type !== 'Block') { + return; + } + + const scriptType = comment.value.match(SCRIPT_TAG_REGEX)?.[1]; + + const commentIndex = sourceCode.getIndexFromLoc(comment.loc.start) + 1; + const tagIndex = commentIndex + comment.value.indexOf(SCRIPT_TAG) + 1; + const typeIndex = tagIndex + SCRIPT_TAG.length + 1; + + return { + value: scriptType, + def: scriptType ? getScriptTypeDef(scriptType) : undefined, + locs: { + tag: { + start: sourceCode.getLocFromIndex(tagIndex), + end: sourceCode.getLocFromIndex(tagIndex + SCRIPT_TAG.length), + }, + value: scriptType + ? { + start: sourceCode.getLocFromIndex(typeIndex), + end: sourceCode.getLocFromIndex(typeIndex + scriptType.length), + } + : false, + }, + }; +} + +export { getScriptType }; diff --git a/lib/util/modules.js b/lib/utils/modules.ts similarity index 50% rename from lib/util/modules.js rename to lib/utils/modules.ts index ffab333..1676cf7 100644 --- a/lib/util/modules.js +++ b/lib/utils/modules.ts @@ -1,7 +1,22 @@ -'use strict'; +import type { CallExpression, Identifier, Literal } from 'estree'; + +export type ModuleName = keyof typeof modules; + +export interface ModuleNodes { + name: Literal | null; + variable: Identifier | null; +} + +interface Module { + name: string | null; + variable: string | null; + nodes: ModuleNodes; + isValid: boolean; +} const N_MODULE_REGEX = /^N\//; -const MODULES = { + +export const modules = { 'N/action': 'action', 'N/auth': 'auth', 'N/cache': 'cache', @@ -57,30 +72,25 @@ const MODULES = { 'N/xml': 'xml', }; -const moduleNames = Object.keys(MODULES); - -/** - * Maps the define callback params to the module array - * Includes module names that don't have assigned callback params - * @param {ASTNode} defineCallNode Root define call node - * @returns {Object} - */ -function getModules(defineCallNode) { - let modules = { - list: [], - nameCount: 0, - varCount: 0, - }; +export const moduleNames = Object.keys(modules); + +export function getModules(defineCallNode: CallExpression): { + list: Module[]; + varCount: number; +} { + const list: Module[] = []; + + let varCount = 0; if ( - defineCallNode && - defineCallNode.type === 'CallExpression' && + defineCallNode?.type === 'CallExpression' && + defineCallNode.callee.type === 'Identifier' && defineCallNode.callee.name === 'define' ) { const argCount = defineCallNode.arguments.length; if (argCount < 2 || argCount > 3) { - return modules; + return { list, varCount }; } const moduleList = defineCallNode.arguments[argCount - 2]; @@ -91,78 +101,56 @@ function getModules(defineCallNode) { (callback.type !== 'FunctionExpression' && callback.type !== 'ArrowFunctionExpression') ) { - return modules; + return { list, varCount }; } - modules.nameCount = moduleList.elements.length; - modules.varCount = callback.params.length; + const nameCount = moduleList.elements.length; + varCount = callback.params.length; const longerList = - modules.nameCount > modules.varCount ? moduleList.elements : callback.params; + nameCount > varCount ? moduleList.elements : callback.params; for (let i = 0; i < longerList.length; i++) { const nameNode = moduleList.elements[i]; const varNode = callback.params[i]; - modules.list.push({ - name: nameNode ? nameNode.value : null, - variable: varNode ? varNode.name : null, + const literalNameNode = nameNode?.type === 'Literal' ? nameNode : null; + const identVarNode = varNode?.type === 'Identifier' ? varNode : null; + + list.push({ + name: literalNameNode ? (literalNameNode.value as string) : null, + variable: identVarNode ? identVarNode.name : null, nodes: { - name: nameNode, - variable: varNode, + name: literalNameNode, + variable: identVarNode, }, isValid: - !!nameNode && - (moduleNames.includes(nameNode.value) || !N_MODULE_REGEX.test(nameNode.value)), + !!literalNameNode && + (moduleNames.includes(literalNameNode.value as string) || + !N_MODULE_REGEX.test(literalNameNode.value as string)), }); } } - return modules; + return { list, varCount }; } -/** - * Gets the literal string names of all modules - * @param {ASTNode} defineCallNode Root define call node - * @returns {Array} - */ -function getModuleNames(defineCallNode) { - const modules = getModules(defineCallNode).list; - const moduleNames = modules.map((module) => module.name); - - return moduleNames; +export function getModuleNames(defineCallNode: CallExpression) { + const modules = getModules(defineCallNode); + return modules.list.map((module) => module.name); } -/** - * Gets the variable names of all modules - * @param {ASTNode} defineCallNode Root define call node - * @returns {Array} - */ -function getModuleVars(defineCallNode) { - const modules = getModules(defineCallNode).list; - const moduleVars = modules.map((module) => module.variable); - - return moduleVars; +export function getModuleVars(defineCallNode: CallExpression) { + const modules = getModules(defineCallNode); + return modules.list.map((module) => module.variable); } -/** - * Gets the name and variable nodes of a module by name - * @param {ASTNode} defineCallNode Root define call node - * @param {string} moduleName Module name in N/ format - * @returns {(Object|boolean)} - */ -function getModuleNodePair(defineCallNode, moduleName) { - const modules = getModules(defineCallNode).list; - const targetModule = modules.find((m) => m.name === moduleName); - - return targetModule && targetModule.nodes; -} +export function getModuleNodePair( + defineCallNode: CallExpression, + moduleName: string, +) { + const modules = getModules(defineCallNode); + const targetModule = modules.list.find((m) => m.name === moduleName); -module.exports = { - MODULES, - moduleNames, - getModules, - getModuleNames, - getModuleVars, - getModuleNodePair, -}; + return targetModule?.nodes; +} diff --git a/lib/utils/objects.ts b/lib/utils/objects.ts new file mode 100644 index 0000000..48e0340 --- /dev/null +++ b/lib/utils/objects.ts @@ -0,0 +1,30 @@ +import type { ObjectExpression, Property, SpreadElement } from 'estree'; + +function getPropByKey(obj: ObjectExpression, key: string) { + for (const _prop of obj.properties) { + const prop = propAsIdentProp(_prop); + + if (prop?.key.name === key) { + return prop; + } + } + + return null; +} + +function getPropList(obj: ObjectExpression) { + return obj.properties + .map((prop) => propAsIdentProp(prop)?.key.name) + .filter(Boolean) as string[]; +} + +function propAsIdentProp(prop: Property | SpreadElement) { + return prop.type === 'Property' && prop.key.type === 'Identifier' + ? { + ...prop, + key: prop.key, + } + : null; +} + +export { getPropByKey, getPropList }; diff --git a/lib/util/script-types.js b/lib/utils/script-types.ts similarity index 84% rename from lib/util/script-types.js rename to lib/utils/script-types.ts index c574d5f..0120cf8 100644 --- a/lib/util/script-types.js +++ b/lib/utils/script-types.ts @@ -1,5 +1,3 @@ -'use strict'; - const scriptTypes = [ { name: 'BankConnectivityPlugin', @@ -39,7 +37,11 @@ const scriptTypes = [ { name: 'DatasetBuilderPlugin', entryPoints: ['createDataset'] }, { name: 'FiConnectivityPlugin', - entryPoints: ['getConfigurationIFrameUrl', 'getAccounts', 'getTransactionData'], + entryPoints: [ + 'getConfigurationIFrameUrl', + 'getAccounts', + 'getTransactionData', + ], }, { name: 'FiParserPlugin', @@ -78,14 +80,11 @@ const scriptTypes = [ }, ]; -function getScriptTypeDef(scriptType) { - return ( - !!scriptType && - scriptTypes.find((x) => x.name.toLowerCase() === scriptType.toLowerCase()) +function getScriptTypeDef(scriptType: string) { + if (!scriptType) return undefined; + return scriptTypes.find( + (x) => x.name.toLowerCase() === scriptType.toLowerCase(), ); } -module.exports = { - scriptTypes, - getScriptTypeDef, -}; +export { getScriptTypeDef, scriptTypes }; diff --git a/package.json b/package.json index 800a57a..0f70519 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,44 @@ { "name": "eslint-plugin-suitescript", - "version": "2.0.0", + "version": "3.0.0", "description": "ESLint plugin for NetSuite's SuiteScript v1/v2 API", - "author": "Adam Davies (https://adam-davies.me)", + "author": "Adam Davies (https://acdvs.dev)", "license": "MIT", - "homepage": "https://github.com/acdvs/eslint-plugin-suitescript#readme", + "homepage": "https://github.com/acdvs/eslint-plugin-suitescript", "repository": { "type": "git", "url": "git+https://github.com/acdvs/eslint-plugin-suitescript.git" }, "bugs": "https://github.com/acdvs/eslint-plugin-suitescript/issues", - "main": "lib/index.js", + "type": "module", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "types": "./dist/index.d.cts", + "exports": { + ".": { + "import": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } + } + }, "scripts": { - "build:docs": "node scripts/generate_docs.js", - "format": "prettier . --check", - "format:fix": "prettier . --write", - "lint": "eslint {lib,tests}/**", - "lint:fix": "eslint {lib,tests}/** --fix", - "test": "mocha tests/** --recursive --reporter min" + "build": "tsdown", + "build:docs": "tsx scripts/generate-docs.ts", + "check": "biome check", + "check:fix": "biome check --fix", + "check:types": "tsc --noemit", + "test": "node --test --require tsx tests/rules/**.ts", + "test:e2e": "pnpm build && node --test tests/e2e/e2e.test.mjs" }, "files": [ "LICENSE", "README.md", - "lib" + "dist" ], "keywords": [ "suitescript", @@ -30,19 +46,25 @@ "eslint", "plugin" ], - "devDependencies": { - "eslint": "^10.0.0", - "eslint-config-prettier": "^10.1.5", - "mocha": "^11.4.0", - "prettier": "^3.5.3" - }, - "peerDependencies": { - "eslint": ">=9.0.0" - }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, "dependencies": { - "globals": "^17.6.0" + "@acdvs/eslint-plugin-amd": "^1.0.0", + "globals": "^17.7.0" + }, + "devDependencies": { + "@biomejs/biome": "^2.5.4", + "@types/eslint": "^9.6.1", + "@types/estree": "^1.0.9", + "@types/node": "^25.9.5", + "eslint": "^10.7.0", + "tsc-alias": "^1.9.1", + "tsdown": "^0.22.8", + "tsx": "^4.23.1", + "typescript": "^7.0.2" + }, + "peerDependencies": { + "eslint": ">=9.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..69b1e55 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2162 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@acdvs/eslint-plugin-amd': + specifier: ^1.0.0 + version: 1.0.0(eslint@10.7.0) + globals: + specifier: ^17.7.0 + version: 17.7.0 + devDependencies: + '@biomejs/biome': + specifier: ^2.5.4 + version: 2.5.4 + '@types/eslint': + specifier: ^9.6.1 + version: 9.6.1 + '@types/estree': + specifier: ^1.0.9 + version: 1.0.9 + '@types/node': + specifier: ^25.9.5 + version: 25.9.5 + eslint: + specifier: ^10.7.0 + version: 10.7.0 + tsc-alias: + specifier: ^1.9.1 + version: 1.9.1 + tsdown: + specifier: ^0.22.8 + version: 0.22.8(tsx@4.23.1)(typescript@7.0.2) + tsx: + specifier: ^4.23.1 + version: 4.23.1 + typescript: + specifier: ^7.0.2 + version: 7.0.2 + +packages: + + '@acdvs/eslint-plugin-amd@1.0.0': + resolution: {integrity: sha512-90FzRgppxuEZWiydk4Y3yVoIlMDVeTd05EY/XT9pKMG/+MI2VgoKeyZsxn5rLJb1RM0hpd+tIWyQciem3rryuQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: '>=9.0.0' + + '@biomejs/biome@2.5.4': + resolution: {integrity: sha512-xy5FNE5kQJKyK5MR1gJy6ztXYx4WBAbYGlK04lMEgmyPRWKybY9NFwiG9yo0XdzOU8Xvhj41u034J1ywfoWfMw==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.5.4': + resolution: {integrity: sha512-4o3NFRobXHynkgcFVrlZsoDAFtF2ldlEGN8sORSws5ZQqyY4PXnPUIylu4ksfyHuwkfvDREuWh3JK+niRwGq3w==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.5.4': + resolution: {integrity: sha512-D32P5HkU2Y6PySuC/WsVDTOgsDwVFmujzhhhOQjajtATpVWFDXuVd3oRbsWNSEA+aaFzyzZm22szsyydBYlSyQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.5.4': + resolution: {integrity: sha512-Rpm5/AT1m+DlJmUoYvS4/vXc+0tXJPJ2NQz25TGPyHVF5JrWy75PE0GH6kVxsKtQDuCH4OgzquZq0R4kj/wCVg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-arm64@2.5.4': + resolution: {integrity: sha512-pSEfW7B8kTsXUjUxC1xVVK+y85Ht3C5XxZ9gclmC7/3Ku9Vqz8jmI7k0p/BNIjQ6t4sFERI2sFeH73ybiZl6YQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-linux-x64-musl@2.5.4': + resolution: {integrity: sha512-aby/PohmmgbShcHqFsZVzG8H6D98+P+A6xRWRrQcLW1pCjabcov5UUlke4UqNQBYTkDQav+jB4zyyDDeKB2GaA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-x64@2.5.4': + resolution: {integrity: sha512-FNxojWJkL7EajAuzBgoLe0T2G0y112M4lBrDIFl/DomFTx8yqenYOIdsRLNXvOvBBofE8hJi85LjzLmBDpY7/Q==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-win32-arm64@2.5.4': + resolution: {integrity: sha512-emoXexPZIPAZkz2RKmA95WJUqK3I5MJNYtwEbL5ESciRzhmFMMyekDhNG8hpeOaK+ZGRDxAU4wvGuA5IHQ0h0w==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.5.4': + resolution: {integrity: sha512-U1jaluLw1qQc2Tx7/CeSoL9N5XcqIH+GWjpUAy1ouB5nVjSCMNO+NNHdY3RAs8zxNurLWAdj6pehQdCA2zyU+Q==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@oxc-project/types@0.139.0': + resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} + + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + + '@rolldown/binding-android-arm64@1.1.5': + resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.1.5': + resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.1.5': + resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.1.5': + resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.1.5': + resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.1.5': + resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.1.5': + resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.1.5': + resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.1.5': + resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.1.5': + resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.1.5': + resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.1.5': + resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.1.5': + resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.1.5': + resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@25.9.5': + resolution: {integrity: sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==} + + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + '@yuku-codegen/binding-darwin-arm64@0.6.3': + resolution: {integrity: sha512-pbDcFygFmbvo0jGFq5U0m5Sa9U8aVttVJWbBHZDZ68w/X48HdDWS1V4XvBacs8XkmWbTr/ef5fMGG7HsngqTmg==} + cpu: [arm64] + os: [darwin] + + '@yuku-codegen/binding-darwin-x64@0.6.3': + resolution: {integrity: sha512-qZMrnA4i8OfqL3NMGoOvLdh1vby8cCGsmNo+tJQIIezXO557m3fdQLenz/57GqtBnnGWzWqd/aDp+faNxWlLwQ==} + cpu: [x64] + os: [darwin] + + '@yuku-codegen/binding-freebsd-x64@0.6.3': + resolution: {integrity: sha512-2+SFpfem2GBH6BlCTAq6R44bZwuieduwRWHkCQnSgbK8tdEjMwB0Ix0IchryVBn6hdiWCZSTkSE3UILliRXsRQ==} + cpu: [x64] + os: [freebsd] + + '@yuku-codegen/binding-linux-arm-gnu@0.6.3': + resolution: {integrity: sha512-fbxg3cBPdJ++36DXtdzcoKw2xzFov91Wxvmn1khX9MXQbDqJQLJmITZhtokcZsj4uGJe32sUmxAZnKbUtZLjmA==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@yuku-codegen/binding-linux-arm-musl@0.6.3': + resolution: {integrity: sha512-Jk4P7kocGEisSvUFIm1VuHO3hC01LvS3sYAAmVVu1/ve5TuZ0iXyl9kIGtd1ZrgUvchgvZWNOaB+/Kq/RO63FA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@yuku-codegen/binding-linux-arm64-gnu@0.6.3': + resolution: {integrity: sha512-i1xE8Bx1YZLheWtBZHD0Mq3nAIDrhgiH7o8VB4GiCbHufKb4XKj4CqSDMWSC0RYPmn//E+UEd1NsE2NbOux1tQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@yuku-codegen/binding-linux-arm64-musl@0.6.3': + resolution: {integrity: sha512-ZeLkC6xZrlDoIJTadHfqTABTmsj2f6wCCtYBYx/RPGgdmQcGLA0NALRl7m0tnK2CT45eNRuOYzsfEZyF0XWM/A==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@yuku-codegen/binding-linux-x64-gnu@0.6.3': + resolution: {integrity: sha512-HNYt7zjIChPcnjZRG42CZq3Zn5mqaRo4UcFLr4mIbmGqdhX5hDDE8O8US8YgYyOUosfbBTBFdsbvFwVAx1TOkQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@yuku-codegen/binding-linux-x64-musl@0.6.3': + resolution: {integrity: sha512-/1ttT31dAQc7hGtXWSEYEgzGtakAyO2C+/GqAzIuKXlGLpNPZgXdR8LZ0iDHDalbEr3AuHIPRV43sWLUrHWdsA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@yuku-codegen/binding-win32-arm64@0.6.3': + resolution: {integrity: sha512-oAArRDU1lkKg+xFEtiQ7C+/wghpqrkBrFWM05W73S+3sZz8JIHH79Q+Qh5gWls3i8vccitUgCnvln5V7xKn3XQ==} + cpu: [arm64] + os: [win32] + + '@yuku-codegen/binding-win32-x64@0.6.3': + resolution: {integrity: sha512-bhFDcDsvmp5KuBfWTt4carNo1E4LXH7++S8qqZgDtXVqJxs0xMm7gbuqPihA8kBbphM+NzAUm5qmq6ocfqM6kg==} + cpu: [x64] + os: [win32] + + '@yuku-parser/binding-darwin-arm64@0.6.3': + resolution: {integrity: sha512-Xate6yyZgvi7da/gdnZy+Vu5jlFB0LRlb5m4MY6Y98KSQeJPZIhoVXMK2Vsl48XOmPlDIS8lge414HUVUEo+hg==} + cpu: [arm64] + os: [darwin] + + '@yuku-parser/binding-darwin-x64@0.6.3': + resolution: {integrity: sha512-WKMZ5UU2HBdGZDEpQoLq+21f1FlS+BjroH1FaVE6zCSeqKmZ7xRP5jIRGtQ4vCYj/k2KHgyABZ16lgK9mTe2Sg==} + cpu: [x64] + os: [darwin] + + '@yuku-parser/binding-freebsd-x64@0.6.3': + resolution: {integrity: sha512-OWX8V2k4bmtl/DNwU3yz3PZa2QXiSqWN3Xk7pNB5IPt7FcJBDlnpkOcX6h3tjMS7CyKE0lMvPUwwcmWSdbjkyA==} + cpu: [x64] + os: [freebsd] + + '@yuku-parser/binding-linux-arm-gnu@0.6.3': + resolution: {integrity: sha512-/4LzmPXPaCWqIpY1j3+XVb8rbXIratqCte3A4sGEjua6aVhvVxEVAqeKlBsoGkORWLeqbpcxhgxKwOGM17eexA==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@yuku-parser/binding-linux-arm-musl@0.6.3': + resolution: {integrity: sha512-Df4jk0M/eNKKQfYzXBBKhKkmJBpB+XoX2LkMxmlK3GN+fxUdeb8EM78wX+1+eLVl5dZNo6f7gOd6oDV0gChevw==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@yuku-parser/binding-linux-arm64-gnu@0.6.3': + resolution: {integrity: sha512-sRCtDktUgIbbV78SYX3wdGVVm1Hz/nSUS24JgXB4MzUeGNwBNB+eQAWMtBxCGriyJNXK3zwfj+SSgvTmUdPf/A==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@yuku-parser/binding-linux-arm64-musl@0.6.3': + resolution: {integrity: sha512-3J/jV3ROSqlhLyB/6i5EUHxjkom5i59iPvrtiAsnAjHzMsZJJPEke9LSaOsB0rf4MJFH9AmjvsK8gDahTjZy+A==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@yuku-parser/binding-linux-x64-gnu@0.6.3': + resolution: {integrity: sha512-a5mPn/OMSq2Aa2i7eJXcc37Jtw0b89gDO2mDpXN769b06IirEiqOzLNNJd6R7R8DxoadHzY0nLFhYNChE+jyAg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@yuku-parser/binding-linux-x64-musl@0.6.3': + resolution: {integrity: sha512-kQSjfa6zdvotuXEGNKQ9vZZxE+lcEEbTUMSuvY/5+0crlwBCjEqrf9/W9ViFDoQAEt8WJiu/mtVNYkKAOkjLmA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@yuku-parser/binding-win32-arm64@0.6.3': + resolution: {integrity: sha512-ZawdN3R0YKr48BeXCpbax+WDWbgEG6nWyDosVeZasrT5TjgfF4XMP5SfuyMNvRJ4gbTitrcYHZkENSXZ9ncqcg==} + cpu: [arm64] + os: [win32] + + '@yuku-parser/binding-win32-x64@0.6.3': + resolution: {integrity: sha512-NcqZwBXQhKyfC0Eb+yBxXQcPjZoUstD1Dbr3X4UlOD1QiYfnvAYRKCZJ6nQ6KQ5p30dGaKkQeBL4t3qQtDQNWA==} + cpu: [x64] + os: [win32] + + '@yuku-toolchain/types@0.5.43': + resolution: {integrity: sha512-kSpvPntnXw5+lYjO71ffBEnQ5ycQ74KGIYknh0TS4xeyCuBkOqxyJumxZkMhLBBUCLjDAbx2+Icnr3Zh4ftjpQ==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + ansis@4.3.1: + resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} + engines: {node: '>=14'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@5.0.7: + resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} + engines: {node: 18 || 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + cac@7.0.0: + resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} + engines: {node: '>=20.19.0'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dts-resolver@3.0.0: + resolution: {integrity: sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==} + engines: {node: ^22.18.0 || >=24.0.0} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + + empathic@2.0.1: + resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + engines: {node: '>=14'} + + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.7.0: + resolution: {integrity: sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + + get-tsconfig@5.0.0-beta.5: + resolution: {integrity: sha512-/6gFNr0N04nob252sTQxyFLi3eKFRqIg1I87YcqAMT1i6SQrSF6KujUEQrtrjMV0H/eejTCltLdDSTEMzHbnsQ==} + engines: {node: '>=20.20.0'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@17.7.0: + resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} + engines: {node: '>=18'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + hookable@6.1.1: + resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-without-cache@0.4.0: + resolution: {integrity: sha512-NkJQA7oZ4YHQhd2+H3BoRFKF3d/XNsiKpHZCQEMH9pDX27hQQLsTyOocyRgaIVtf8gHX3Nt3LPkR4e5EdtPAGQ==} + engines: {node: ^22.18.0 || >=24.0.0} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mylas@2.1.14: + resolution: {integrity: sha512-BzQguy9W9NJgoVn2mRWzbFrFWWztGCcng2QI9+41frfk+Athwgx3qhqhvStz7ExeUUu7Kzw427sNzHpEZNINog==} + engines: {node: '>=16.0.0'} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + obug@2.1.3: + resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} + engines: {node: '>=12.20.0'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + plimit-lit@1.6.1: + resolution: {integrity: sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==} + engines: {node: '>=12'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + + queue-lit@1.5.2: + resolution: {integrity: sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==} + engines: {node: '>=12'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rolldown-plugin-dts@0.27.9: + resolution: {integrity: sha512-d54yt65+ZF/Mk8H6P36As02PAMdaiWRSzVNtJRc1h7nCgUFjuRI4cN2DyTfJyfVpPH6pgy7/2D7YQH1/Rh75Yg==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@ts-macro/tsc': ^0.3.6 + '@typescript/native-preview': '*' + rolldown: ^1.0.0 + typescript: ^5.0.0 || ^6.0.0 || ~7.0.0 + vue-tsc: ~3.2.0 || ~3.3.0 + peerDependenciesMeta: + '@ts-macro/tsc': + optional: true + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.1.5: + resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + tsc-alias@1.9.1: + resolution: {integrity: sha512-sFZdVFthH8uvdplPJrOYGOHcxu6UPtcAcY678JPwEQiMzgLZYFO7Qc/rzELp7ingTc+OxtzH6n+8Pn2eVQep6w==} + engines: {node: '>=16.20.2'} + hasBin: true + + tsdown@0.22.8: + resolution: {integrity: sha512-6FOLlr1iLcE3LheqQt13hVUWtTduJNwF2akPskPe8Tf1hr+N5UULHzrNZYTMNwL6lr2UyQ8iefVBB6tdqp1PCQ==} + engines: {node: ^22.18.0 || >=24.11.0} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + '@tsdown/css': 0.22.8 + '@tsdown/exe': 0.22.8 + '@vitejs/devtools': '*' + publint: ^0.3.8 + tsx: '*' + typescript: ^5.0.0 || ^6.0.0 || ^7.0.0 + unplugin-unused: ^0.5.0 + unrun: '*' + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + '@tsdown/css': + optional: true + '@tsdown/exe': + optional: true + '@vitejs/devtools': + optional: true + publint: + optional: true + tsx: + optional: true + typescript: + optional: true + unplugin-unused: + optional: true + unrun: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.23.1: + resolution: {integrity: sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} + hasBin: true + + unconfig-core@7.5.0: + resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} + + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yuku-ast@0.1.7: + resolution: {integrity: sha512-2RiMEWv500TixY5rJy6OZd4fSy9WYZKWh6gGbIJ7y7vAGcuCugWOWwOLGaQcRZrXcPUfqtLtvpaJ3SdXtWlhKA==} + + yuku-codegen@0.6.3: + resolution: {integrity: sha512-3c9H521tf1RRDu4cNUySfH01sKlALve4HKu2sITk33gLl5HhsvI6ngSuarpWxMPAiJEgqJc/HTvojWQRnYm9/g==} + + yuku-parser@0.6.3: + resolution: {integrity: sha512-iI6uABvvup9mvv8Mcpz7Tp//gehQlvcSnX4A4/0bf9i6X3RVQDuVUZel8jdpljwlF7WrbKsvD19y55Mc6+sKZw==} + +snapshots: + + '@acdvs/eslint-plugin-amd@1.0.0(eslint@10.7.0)': + dependencies: + eslint: 10.7.0 + globals: 17.7.0 + + '@biomejs/biome@2.5.4': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.5.4 + '@biomejs/cli-darwin-x64': 2.5.4 + '@biomejs/cli-linux-arm64': 2.5.4 + '@biomejs/cli-linux-arm64-musl': 2.5.4 + '@biomejs/cli-linux-x64': 2.5.4 + '@biomejs/cli-linux-x64-musl': 2.5.4 + '@biomejs/cli-win32-arm64': 2.5.4 + '@biomejs/cli-win32-x64': 2.5.4 + + '@biomejs/cli-darwin-arm64@2.5.4': + optional: true + + '@biomejs/cli-darwin-x64@2.5.4': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.5.4': + optional: true + + '@biomejs/cli-linux-arm64@2.5.4': + optional: true + + '@biomejs/cli-linux-x64-musl@2.5.4': + optional: true + + '@biomejs/cli-linux-x64@2.5.4': + optional: true + + '@biomejs/cli-win32-arm64@2.5.4': + optional: true + + '@biomejs/cli-win32-x64@2.5.4': + optional: true + + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.28.1': + optional: true + + '@esbuild/android-arm64@0.28.1': + optional: true + + '@esbuild/android-arm@0.28.1': + optional: true + + '@esbuild/android-x64@0.28.1': + optional: true + + '@esbuild/darwin-arm64@0.28.1': + optional: true + + '@esbuild/darwin-x64@0.28.1': + optional: true + + '@esbuild/freebsd-arm64@0.28.1': + optional: true + + '@esbuild/freebsd-x64@0.28.1': + optional: true + + '@esbuild/linux-arm64@0.28.1': + optional: true + + '@esbuild/linux-arm@0.28.1': + optional: true + + '@esbuild/linux-ia32@0.28.1': + optional: true + + '@esbuild/linux-loong64@0.28.1': + optional: true + + '@esbuild/linux-mips64el@0.28.1': + optional: true + + '@esbuild/linux-ppc64@0.28.1': + optional: true + + '@esbuild/linux-riscv64@0.28.1': + optional: true + + '@esbuild/linux-s390x@0.28.1': + optional: true + + '@esbuild/linux-x64@0.28.1': + optional: true + + '@esbuild/netbsd-arm64@0.28.1': + optional: true + + '@esbuild/netbsd-x64@0.28.1': + optional: true + + '@esbuild/openbsd-arm64@0.28.1': + optional: true + + '@esbuild/openbsd-x64@0.28.1': + optional: true + + '@esbuild/openharmony-arm64@0.28.1': + optional: true + + '@esbuild/sunos-x64@0.28.1': + optional: true + + '@esbuild/win32-arm64@0.28.1': + optional: true + + '@esbuild/win32-ia32@0.28.1': + optional: true + + '@esbuild/win32-x64@0.28.1': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@10.7.0)': + dependencies: + eslint: 10.7.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.6.0': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.2': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 + + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@oxc-project/types@0.139.0': {} + + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + + '@rolldown/binding-android-arm64@1.1.5': + optional: true + + '@rolldown/binding-darwin-arm64@1.1.5': + optional: true + + '@rolldown/binding-darwin-x64@1.1.5': + optional: true + + '@rolldown/binding-freebsd-x64@1.1.5': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.1.5': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-x64-musl@1.1.5': + optional: true + + '@rolldown/binding-openharmony-arm64@1.1.5': + optional: true + + '@rolldown/binding-wasm32-wasi@1.1.5': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.1.5': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.1.5': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.9 + '@types/json-schema': 7.0.15 + + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.9': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@25.9.5': + dependencies: + undici-types: 7.24.6 + + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + + '@yuku-codegen/binding-darwin-arm64@0.6.3': + optional: true + + '@yuku-codegen/binding-darwin-x64@0.6.3': + optional: true + + '@yuku-codegen/binding-freebsd-x64@0.6.3': + optional: true + + '@yuku-codegen/binding-linux-arm-gnu@0.6.3': + optional: true + + '@yuku-codegen/binding-linux-arm-musl@0.6.3': + optional: true + + '@yuku-codegen/binding-linux-arm64-gnu@0.6.3': + optional: true + + '@yuku-codegen/binding-linux-arm64-musl@0.6.3': + optional: true + + '@yuku-codegen/binding-linux-x64-gnu@0.6.3': + optional: true + + '@yuku-codegen/binding-linux-x64-musl@0.6.3': + optional: true + + '@yuku-codegen/binding-win32-arm64@0.6.3': + optional: true + + '@yuku-codegen/binding-win32-x64@0.6.3': + optional: true + + '@yuku-parser/binding-darwin-arm64@0.6.3': + optional: true + + '@yuku-parser/binding-darwin-x64@0.6.3': + optional: true + + '@yuku-parser/binding-freebsd-x64@0.6.3': + optional: true + + '@yuku-parser/binding-linux-arm-gnu@0.6.3': + optional: true + + '@yuku-parser/binding-linux-arm-musl@0.6.3': + optional: true + + '@yuku-parser/binding-linux-arm64-gnu@0.6.3': + optional: true + + '@yuku-parser/binding-linux-arm64-musl@0.6.3': + optional: true + + '@yuku-parser/binding-linux-x64-gnu@0.6.3': + optional: true + + '@yuku-parser/binding-linux-x64-musl@0.6.3': + optional: true + + '@yuku-parser/binding-win32-arm64@0.6.3': + optional: true + + '@yuku-parser/binding-win32-x64@0.6.3': + optional: true + + '@yuku-toolchain/types@0.5.43': {} + + acorn-jsx@5.3.2(acorn@8.17.0): + dependencies: + acorn: 8.17.0 + + acorn@8.17.0: {} + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansis@4.3.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + array-union@2.1.0: {} + + balanced-match@4.0.4: {} + + binary-extensions@2.3.0: {} + + brace-expansion@5.0.7: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + cac@7.0.0: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + commander@9.5.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + defu@6.1.7: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dts-resolver@3.0.0: {} + + empathic@2.0.1: {} + + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + + escape-string-regexp@4.0.0: {} + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.7.0: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.6.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@11.2.0: + dependencies: + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + eslint-visitor-keys: 5.0.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + + flatted@3.4.2: {} + + fsevents@2.3.3: + optional: true + + get-tsconfig@4.14.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + get-tsconfig@5.0.0-beta.5: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@17.7.0: {} + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + hookable@6.1.1: {} + + ignore@5.3.2: {} + + import-without-cache@0.4.0: {} + + imurmurhash@0.1.4: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + isexe@2.0.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.7 + + ms@2.1.3: {} + + mylas@2.1.14: {} + + natural-compare@1.4.0: {} + + normalize-path@3.0.0: {} + + obug@2.1.3: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-type@4.0.0: {} + + picomatch@2.3.2: {} + + picomatch@4.0.5: {} + + plimit-lit@1.6.1: + dependencies: + queue-lit: 1.5.2 + + prelude-ls@1.2.1: {} + + punycode@2.3.1: {} + + quansync@1.0.0: {} + + queue-lit@1.5.2: {} + + queue-microtask@1.2.3: {} + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + + resolve-pkg-maps@1.0.0: {} + + reusify@1.1.0: {} + + rolldown-plugin-dts@0.27.9(rolldown@1.1.5)(typescript@7.0.2): + dependencies: + dts-resolver: 3.0.0 + get-tsconfig: 5.0.0-beta.5 + obug: 2.1.3 + rolldown: 1.1.5 + yuku-ast: 0.1.7 + yuku-codegen: 0.6.3 + yuku-parser: 0.6.3 + optionalDependencies: + typescript: 7.0.2 + transitivePeerDependencies: + - oxc-resolver + + rolldown@1.1.5: + dependencies: + '@oxc-project/types': 0.139.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.1.5 + '@rolldown/binding-darwin-arm64': 1.1.5 + '@rolldown/binding-darwin-x64': 1.1.5 + '@rolldown/binding-freebsd-x64': 1.1.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.5 + '@rolldown/binding-linux-arm64-gnu': 1.1.5 + '@rolldown/binding-linux-arm64-musl': 1.1.5 + '@rolldown/binding-linux-ppc64-gnu': 1.1.5 + '@rolldown/binding-linux-s390x-gnu': 1.1.5 + '@rolldown/binding-linux-x64-gnu': 1.1.5 + '@rolldown/binding-linux-x64-musl': 1.1.5 + '@rolldown/binding-openharmony-arm64': 1.1.5 + '@rolldown/binding-wasm32-wasi': 1.1.5 + '@rolldown/binding-win32-arm64-msvc': 1.1.5 + '@rolldown/binding-win32-x64-msvc': 1.1.5 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + semver@7.8.5: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + slash@3.0.0: {} + + tinyexec@1.2.4: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tree-kill@1.2.2: {} + + tsc-alias@1.9.1: + dependencies: + chokidar: 3.6.0 + commander: 9.5.0 + get-tsconfig: 4.14.0 + globby: 11.1.0 + mylas: 2.1.14 + normalize-path: 3.0.0 + plimit-lit: 1.6.1 + + tsdown@0.22.8(tsx@4.23.1)(typescript@7.0.2): + dependencies: + ansis: 4.3.1 + cac: 7.0.0 + defu: 6.1.7 + empathic: 2.0.1 + hookable: 6.1.1 + import-without-cache: 0.4.0 + obug: 2.1.3 + picomatch: 4.0.5 + rolldown: 1.1.5 + rolldown-plugin-dts: 0.27.9(rolldown@1.1.5)(typescript@7.0.2) + semver: 7.8.5 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 + tree-kill: 1.2.2 + unconfig-core: 7.5.0 + optionalDependencies: + tsx: 4.23.1 + typescript: 7.0.2 + transitivePeerDependencies: + - '@ts-macro/tsc' + - '@typescript/native-preview' + - oxc-resolver + - vue-tsc + + tslib@2.8.1: + optional: true + + tsx@4.23.1: + dependencies: + esbuild: 0.28.1 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 + + unconfig-core@7.5.0: + dependencies: + '@quansync/fs': 1.0.0 + quansync: 1.0.0 + + undici-types@7.24.6: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + yocto-queue@0.1.0: {} + + yuku-ast@0.1.7: + dependencies: + '@yuku-toolchain/types': 0.5.43 + + yuku-codegen@0.6.3: + dependencies: + '@yuku-toolchain/types': 0.5.43 + optionalDependencies: + '@yuku-codegen/binding-darwin-arm64': 0.6.3 + '@yuku-codegen/binding-darwin-x64': 0.6.3 + '@yuku-codegen/binding-freebsd-x64': 0.6.3 + '@yuku-codegen/binding-linux-arm-gnu': 0.6.3 + '@yuku-codegen/binding-linux-arm-musl': 0.6.3 + '@yuku-codegen/binding-linux-arm64-gnu': 0.6.3 + '@yuku-codegen/binding-linux-arm64-musl': 0.6.3 + '@yuku-codegen/binding-linux-x64-gnu': 0.6.3 + '@yuku-codegen/binding-linux-x64-musl': 0.6.3 + '@yuku-codegen/binding-win32-arm64': 0.6.3 + '@yuku-codegen/binding-win32-x64': 0.6.3 + + yuku-parser@0.6.3: + dependencies: + '@yuku-toolchain/types': 0.5.43 + optionalDependencies: + '@yuku-parser/binding-darwin-arm64': 0.6.3 + '@yuku-parser/binding-darwin-x64': 0.6.3 + '@yuku-parser/binding-freebsd-x64': 0.6.3 + '@yuku-parser/binding-linux-arm-gnu': 0.6.3 + '@yuku-parser/binding-linux-arm-musl': 0.6.3 + '@yuku-parser/binding-linux-arm64-gnu': 0.6.3 + '@yuku-parser/binding-linux-arm64-musl': 0.6.3 + '@yuku-parser/binding-linux-x64-gnu': 0.6.3 + '@yuku-parser/binding-linux-x64-musl': 0.6.3 + '@yuku-parser/binding-win32-arm64': 0.6.3 + '@yuku-parser/binding-win32-x64': 0.6.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..d9778c6 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,4 @@ +allowBuilds: + esbuild: false +minimumReleaseAgeExclude: + - '@acdvs/eslint-plugin-amd@1.0.0' diff --git a/scripts/generate-docs.ts b/scripts/generate-docs.ts new file mode 100644 index 0000000..458dac7 --- /dev/null +++ b/scripts/generate-docs.ts @@ -0,0 +1,88 @@ +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { moduleNames } from '../lib/utils/modules'; +import { scriptTypes } from '../lib/utils/script-types'; + +const SRC_DIR = './docs/src'; +const OUT_DIR = './docs/rules'; +const SCRIPT_NAME = path.basename(import.meta.filename, '.ts'); + +type DocReplaceOptions = Record; + +const docsToModify: Record = { + 'entry-points.md': { + old: '', + new: scriptTypes + .flatMap((st) => [ + `- ${st.name}`, + ...st.entryPoints.map((ep) => ` - ${ep}`), + ]) + .join('\n'), + }, + 'module-vars.md': { + old: '', + new: moduleNames.map((m) => `- ${m}`).join('\n'), + }, + 'script-type.md': { + old: '', + new: scriptTypes.map((st) => `- ${st.name}`).join('\n'), + }, +}; + +async function generateDocs() { + let files: string[] = []; + + try { + files = await fs.readdir(SRC_DIR); + } catch { + console.error(`[${SCRIPT_NAME}] Error reading docs at ${SRC_DIR}`); + process.exit(1); + } + + for (const file of files) { + const options = docsToModify[file]; + const fromPath = path.join(SRC_DIR, file); + const toPath = path.join(OUT_DIR, file); + + if (!options) { + copyDoc(fromPath, toPath); + continue; + } + + const data = await readDoc(fromPath); + const newContent = data?.replaceAll(options.old, options.new); + + if (newContent) { + writeDoc(toPath, newContent); + } + } +} + +function readDoc(docPath: string) { + try { + return fs.readFile(docPath, 'utf8'); + } catch { + console.error(`[${SCRIPT_NAME}] Error reading doc at ${docPath}`); + } +} + +function writeDoc(docPath: string, content: string) { + try { + fs.writeFile(docPath, content, 'utf8'); + console.log(`[${SCRIPT_NAME}] Wrote doc at ${docPath}`); + } catch { + console.error(`[${SCRIPT_NAME}] Error writing doc at ${docPath}`); + } +} + +async function copyDoc(fromPath: string, toPath: string) { + try { + await fs.copyFile(fromPath, toPath); + } catch { + console.error( + `[${SCRIPT_NAME}] Error copying doc from ${fromPath} to ${toPath}`, + ); + } +} + +generateDocs(); diff --git a/scripts/generate_docs.js b/scripts/generate_docs.js deleted file mode 100644 index d8b55d1..0000000 --- a/scripts/generate_docs.js +++ /dev/null @@ -1,71 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const { moduleNames } = require('./../lib/util/modules'); -const { scriptTypes } = require('./../lib/util/script-types'); - -const SRC_DIR = './docs/src'; -const OUT_DIR = './docs/rules'; -const SCRIPT_NAME = path.basename(__filename); - -const docsToModify = { - 'entry-points.md': { - old: '', - new: scriptTypes.reduce((str, x) => { - str += `- ${x.name}\n`; - x.entryPoints.forEach((ep) => (str += ` - ${ep}\n`)); - return str; - }, ''), - }, - 'module-vars.md': { - old: '', - new: moduleNames.reduce((str, x) => { - str += `- ${x}\n`; - return str; - }, ''), - }, - 'script-type.md': { - old: '', - new: scriptTypes.reduce((str, x) => { - str += `- ${x.name}\n`; - return str; - }, ''), - }, -}; - -fs.readdir(SRC_DIR, (err, files) => { - if (err) { - console.error(`[${SCRIPT_NAME}] Error reading docs`); - return; - } - - files.forEach((file) => { - const options = docsToModify[file]; - const srcPath = path.join(SRC_DIR, file); - const outPath = path.join(OUT_DIR, file); - - if (options) { - fs.readFile(srcPath, 'utf8', (err, data) => { - if (err) { - console.error(`[${SCRIPT_NAME}] Error reading doc: ${srcPath}`); - return; - } - - const newContent = data.replace(new RegExp(options.old, 'g'), options.new); - - fs.writeFile(outPath, newContent, 'utf8', (err) => { - if (err) { - console.error(`[${SCRIPT_NAME}] Error writing doc: ${outPath}`); - } else { - console.log(`[${SCRIPT_NAME}] Generated doc: ${outPath}`); - } - }); - }); - } else { - fs.copyFile(srcPath, outPath, (err) => { - if (err) { - console.error(`[${SCRIPT_NAME}] Error copying doc: ${outPath}`); - } - }); - } - }); -}); diff --git a/tests/e2e/e2e.test.mjs b/tests/e2e/e2e.test.mjs new file mode 100644 index 0000000..7be1405 --- /dev/null +++ b/tests/e2e/e2e.test.mjs @@ -0,0 +1,51 @@ +import assert from 'node:assert/strict'; +import { readdirSync, readFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { test } from 'node:test'; +import { fileURLToPath } from 'node:url'; +import { Linter } from 'eslint'; +import suitescript from 'eslint-plugin-suitescript'; + +const FIXTURES = join(dirname(fileURLToPath(import.meta.url)), 'fixtures'); +const linter = new Linter(); + +/** Lint a fixture with the plugin's recommended config and return its rule IDs. */ +function lintFixture(file) { + const code = readFileSync(join(FIXTURES, file), 'utf8'); + const messages = linter.verify(code, suitescript.configs.recommended, file); + return messages.map((m) => m.ruleId).sort(); +} + +/** The exact set of rule violations each fixture is expected to produce. */ +const expected = { + 'suitelet.js': ['suitescript/api-version', 'suitescript/script-type'], + 'user-event-script.js': [ + 'suitescript/api-version', + 'suitescript/entry-points', + 'suitescript/log-args', + 'suitescript/module-vars', + 'suitescript/module-vars', + 'suitescript/no-invalid-modules', + 'suitescript/no-log-module', + ], + 'valid-map-reduce.js': [], +}; + +for (const [file, ruleIds] of Object.entries(expected)) { + test(`${file} triggers the expected rules`, () => { + assert.deepEqual(lintFixture(file), ruleIds.slice().sort()); + }); +} + +test('every fixture is covered by an expectation', () => { + const fixtures = readdirSync(FIXTURES).filter((f) => f.endsWith('.js')); + assert.deepEqual(fixtures.sort(), Object.keys(expected).sort()); +}); + +test('fixtures collectively exercise every plugin rule', () => { + const triggered = new Set(Object.values(expected).flat()); + const declared = Object.keys(suitescript.rules).map( + (r) => `suitescript/${r}`, + ); + assert.deepEqual([...triggered].sort(), declared.sort()); +}); diff --git a/tests/e2e/fixtures/suitelet.js b/tests/e2e/fixtures/suitelet.js new file mode 100644 index 0000000..16a3fe8 --- /dev/null +++ b/tests/e2e/fixtures/suitelet.js @@ -0,0 +1,18 @@ +/** + * A Suitelet with mistakes. + * + * No version value. + * @NApiVersion + * Misspelled script type. + * @NScriptType Suitlet + */ +define(['N/ui/serverWidget'], (serverWidget) => { + // biome-ignore lint/correctness/noUnusedFunctionParameters: entry-point context intentionally unused + function onRequest(context) { + serverWidget.createForm({ title: 'Hello' }); + } + + return { + onRequest: onRequest, + }; +}); diff --git a/tests/e2e/fixtures/user-event-script.js b/tests/e2e/fixtures/user-event-script.js new file mode 100644 index 0000000..22038ce --- /dev/null +++ b/tests/e2e/fixtures/user-event-script.js @@ -0,0 +1,19 @@ +/** + * A UserEventscript with mistakes. + * + * Invalid version. + * @NApiVersion 3.x + * @NScriptType UserEventScript + */ +// biome-ignore lint/correctness/noUnusedFunctionParameters: rec and foo intentionally unused to trigger module-vars and no-invalid-modules +define(['N/record', 'N/log', 'N/fooBar'], (rec, logModule, foo) => { + // biome-ignore lint/correctness/noUnusedFunctionParameters: entry-point context intentionally unused + function onLoad(context) { + logModule.debug('missing details'); + } + + // Wrong entry point name for UserEventScript. + return { + onLoad: onLoad, + }; +}); diff --git a/tests/e2e/fixtures/valid-map-reduce.js b/tests/e2e/fixtures/valid-map-reduce.js new file mode 100644 index 0000000..6502899 --- /dev/null +++ b/tests/e2e/fixtures/valid-map-reduce.js @@ -0,0 +1,26 @@ +/** + * A MapReduceScript with no errors. + * + * @NApiVersion 2.1 + * @NScriptType MapReduceScript + */ +// biome-ignore lint/correctness/noUnusedFunctionParameters: record dep intentionally unused +define(['N/search', 'N/record'], (search, record) => { + function getInputData() { + return search.create({ type: 'salesorder' }); + } + + function map(context) { + log.debug({ title: 'map', details: context.value }); + } + + function summarize(summary) { + log.audit({ title: 'summarize', details: summary.usage }); + } + + return { + getInputData: getInputData, + map: map, + summarize: summarize, + }; +}); diff --git a/tests/rule-tester.ts b/tests/rule-tester.ts new file mode 100644 index 0000000..5a49149 --- /dev/null +++ b/tests/rule-tester.ts @@ -0,0 +1,34 @@ +import { describe, it } from 'node:test'; +import { RuleTester } from 'eslint'; + +type TestCase = RuleTester.ValidTestCase | RuleTester.InvalidTestCase; + +RuleTester.describe = describe; +RuleTester.it = it; + +export default new RuleTester({ + languageOptions: { + ecmaVersion: 2015, + sourceType: 'commonjs', + }, +}); + +export function createTests(tests: T[]): T[] { + return tests.map((t) => { + t.code = t.code && trimCode(t.code); + if ('output' in t) { + t.output = t.output && trimCode(t.output); + } + return t; + }); +} + +function trimCode(code: string) { + if (code.includes('\n')) { + const lines = code.split('\n').slice(1, -1); + const indentSize = lines[0].match(/^(\s*)/)?.[1].length; + return lines.map((l) => l.slice(indentSize)).join('\n'); + } + + return code.trim(); +} diff --git a/tests/rules/api-version.js b/tests/rules/api-version.js deleted file mode 100644 index e3d5a33..0000000 --- a/tests/rules/api-version.js +++ /dev/null @@ -1,94 +0,0 @@ -'use strict'; - -const RuleTester = require('eslint').RuleTester; -const rule = require('../../lib/rules/api-version'); - -const ruleTester = new RuleTester({ - languageOptions: { - ecmaVersion: 2015, - sourceType: 'module', - }, -}); -ruleTester.run('api-version', rule, { - valid: [ - { - code: ` -/** - * @NApiVersion 1.0 - */ - `, - }, - { - code: ` -/** - * @NApiVersion 2.x - */ - `, - }, - { - code: ` -/** - * @NApiVersion 2.0 - */ - `, - }, - { - code: ` -/** - * @NApiVersion 2.1 - */ - `, - }, - ], - - invalid: [ - { - code: ` -/** - * @NApiVersion - */ - `, - errors: [{ messageId: 'noValue' }], - }, - { - code: ` -/** - * @NApiVersion 1 - */ - `, - errors: [{ messageId: 'invalidValue', data: { value: 1 } }], - }, - { - code: ` -/** - * @NApiVersion 2 - */ - `, - errors: [{ messageId: 'invalidValue', data: { value: 2 } }], - }, - { - code: ` -/** - * @NApiVersion 3 - */ - `, - errors: [{ messageId: 'invalidValue', data: { value: 3 } }], - }, - { - code: ` -/** - * @NApiVersion 2.2 - */ - `, - errors: [{ messageId: 'invalidValue', data: { value: 2.2 } }], - }, - { - code: ` -/** - * @NApiVersion test - */ - `, - errors: [{ messageId: 'invalidValue', data: { value: 'test' } }], - }, - ], -}); diff --git a/tests/rules/api-version.ts b/tests/rules/api-version.ts new file mode 100644 index 0000000..6438c07 --- /dev/null +++ b/tests/rules/api-version.ts @@ -0,0 +1,81 @@ +import path from 'node:path'; +import rule from '../../lib/rules/api-version'; +import ruleTester, { createTests } from '../rule-tester'; + +const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); + +const valid = createTests([ + { + name: '1.0', + code: ` + /** + * @NApiVersion 1.0 + */ + `, + }, + { + name: '2.x', + code: ` + /** + * @NApiVersion 2.x + */ + `, + }, + { + name: '2.0', + code: ` + /** + * @NApiVersion 2.0 + */ + `, + }, + { + name: '2.1', + code: ` + /** + * @NApiVersion 2.1 + */ + `, + }, +]); + +const invalid = createTests([ + { + name: 'no value', + code: ` + /** + * @NApiVersion + */ + `, + errors: [{ messageId: 'noValue' }], + }, + { + name: 'invalid integer', + code: ` + /** + * @NApiVersion 1 + */ + `, + errors: [{ messageId: 'invalidValue', data: { value: 1 } }], + }, + { + name: 'invalid float', + code: ` + /** + * @NApiVersion 2.2 + */ + `, + errors: [{ messageId: 'invalidValue', data: { value: 2.2 } }], + }, + { + name: 'invalid string', + code: ` + /** + * @NApiVersion test + */ + `, + errors: [{ messageId: 'invalidValue', data: { value: 'test' } }], + }, +]); + +ruleTester.run(RULE_NAME, rule, { valid, invalid }); diff --git a/tests/rules/entry-points.js b/tests/rules/entry-points.js deleted file mode 100644 index 86ee0bc..0000000 --- a/tests/rules/entry-points.js +++ /dev/null @@ -1,267 +0,0 @@ -'use strict'; - -const RuleTester = require('eslint').RuleTester; -const rule = require('../../lib/rules/entry-points'); - -const ruleTester = new RuleTester({ - languageOptions: { - ecmaVersion: 2015, - sourceType: 'module', - }, -}); -ruleTester.run('entry-points', rule, { - valid: [ - { - code: ` -/** - * @NScriptType UserEventScript - */ -define([], function() { - return { beforeSubmit: x }; -}); - `, - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define([], function() { - return { pageInit: x }; -}); - `, - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define([], function() { - return { pageInit: function() {} }; -}); - `, - }, - { - code: ` -/** - * @NScriptType - */ -define([], function() {}); - `, - }, - { - code: ` -/** - * @NScriptType - */ -define([], function() { - return; -}); - `, - }, - { - code: ` -/** - * @NScriptType - */ -define([], function() { - return { somethingElse: x }; -}); - `, - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define([], function() { - var exports = {}; - exports.pageInit = x; - return exports; -}); - `, - }, - { - code: ` -/** - * @NScriptType plugintypeimpl - */ -define([], function() { - return {}; -}); - `, - }, - { - code: ` -/** - * @NScriptType plugintypeimpl - */ -define([], function() { - return { customFn: function() {} }; -}); - `, - }, - { - code: ` -// no @NScriptType comment - -define([], function() { - return { foo: 'bar' }; -}); - `, - // Should not error, since scriptType is null and rule should exit early - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define([], () => { - return { pageInit: x }; -}); - `, - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define([], () => { - return { pageInit: () => {} }; -}); - `, - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define([], () => ({ pageInit: x })); - `, - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define([], () => ({ pageInit: () => {} })); - `, - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define([], function() { - var exports = {}; - log.debug('init'); - exports.pageInit = x; - return exports; -}); - `, - }, - ], - - invalid: [ - { - code: ` -/** - * @NScriptType Restlet - */ -define([], function() {}); - `, - errors: [{ messageId: 'returnEntryPoint', data: { type: 'Restlet' } }], - }, - { - code: ` -/** - * @NScriptType Restlet - */ -define([], function() { - return; -}); - `, - errors: [{ messageId: 'returnEntryPoint', data: { type: 'Restlet' } }], - }, - { - code: ` -/** - * @NScriptType Restlet - */ -define([], function() { - return x; -}); - `, - errors: [{ messageId: 'returnEntryPoint', data: { type: 'Restlet' } }], - }, - { - code: ` -/** - * @NScriptType Restlet - */ -define([], function() { - return { notAnEntryPoint }; -}); - `, - errors: [{ messageId: 'returnEntryPoint', data: { type: 'Restlet' } }], - }, - { - code: ` -/** - * @NScriptType Restlet - */ -define([], function() { - return { notAnEntryPoint: x }; -}); - `, - errors: [{ messageId: 'returnEntryPoint', data: { type: 'Restlet' } }], - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define([], function() { - var exports = {}; - exports.notAnEntryPoint = x; - return exports; -}); - `, - errors: [{ messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }], - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define([], function() { - var exports = {}; - var notTheReturnObject = {}; - notTheReturnObject.pageInit = x; - return exports; -}); - `, - errors: [{ messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }], - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define([], (record) => { - return { getInputData, map, reduce, summarize }; -}); - `, - errors: [{ messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }], - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define([], () => ({ notAnEntryPoint: x })); - `, - errors: [{ messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }], - }, - ], -}); diff --git a/tests/rules/entry-points.ts b/tests/rules/entry-points.ts new file mode 100644 index 0000000..5ac8ee9 --- /dev/null +++ b/tests/rules/entry-points.ts @@ -0,0 +1,212 @@ +import path from 'node:path'; +import rule from '../../lib/rules/entry-points'; +import ruleTester, { createTests } from '../rule-tester'; + +const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); + +const valid = createTests([ + { + name: 'script type w/ entry point', + code: ` + /** + * @NScriptType UserEventScript + */ + define([], function() { + return { beforeSubmit: x }; + }); + `, + }, + { + name: 'script type w/ no entry points', + code: ` + /** + * @NScriptType PluginTypeImpl + */ + define([], function() { + return {}; + }); + `, + }, + { + name: 'script type w/ no entry points, misc entry point', + code: ` + /** + * @NScriptType PluginTypeImpl + */ + define([], function() { + return { customFn: function() {} }; + }); + `, + }, + { + name: 'entry point as ident', + code: ` + /** + * @NScriptType ClientScript + */ + define([], function() { + return { pageInit: x }; + }); + `, + }, + { + name: 'entry point as fn', + code: ` + /** + * @NScriptType ClientScript + */ + define([], function() { + return { pageInit: function() {} }; + }); + `, + }, + { + name: 'entry point as arrow fn', + code: ` + /** + * @NScriptType ClientScript + */ + define([], function() { + return { pageInit: () => {} }; + }); + `, + }, + { + name: 'entry point as obj prop', + code: ` + /** + * @NScriptType ClientScript + */ + define([], function() { + var exports = {}; + exports.pageInit = x; + return exports; + }); + `, + }, + { + name: 'arrow fn as factory', + code: ` + /** + * @NScriptType ClientScript + */ + define([], () => { + return { pageInit: x }; + }); + `, + }, + { + name: 'no script type comment, no entry point', + code: ` + define([], () => {}); + `, + }, + { + name: 'no script type comment, misc entry point', + code: ` + define([], () => { + return { foo: 'bar' }; + }); + `, + }, + { + name: 'no script type value, no entry point', + code: ` + /** + * @NScriptType + */ + define([], () => {}); + `, + }, + { + name: 'no script type value, misc entry point', + code: ` + /** + * @NScriptType + */ + define([], () => { + return { somethingElse: x }; + }); + `, + }, +]); + +const invalid = createTests([ + { + name: 'no entry point', + code: ` + /** + * @NScriptType Restlet + */ + define([], () => {}); + `, + errors: [{ messageId: 'returnEntryPoint', data: { type: 'Restlet' } }], + }, + { + name: 'invalid entry point', + code: ` + /** + * @NScriptType Restlet + */ + define([], () => { + return { notAnEntryPoint }; + }); + `, + errors: [{ messageId: 'returnEntryPoint', data: { type: 'Restlet' } }], + }, + { + name: 'missing entry point obj as ident', + code: ` + /** + * @NScriptType Restlet + */ + define([], () => { + return x; + }); + `, + errors: [{ messageId: 'returnEntryPoint', data: { type: 'Restlet' } }], + }, + { + name: 'invalid entry point as obj prop', + code: ` + /** + * @NScriptType ClientScript + */ + define([], () => { + var exports = {}; + exports.notAnEntryPoint = x; + return exports; + }); + `, + errors: [{ messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }], + }, + { + name: 'valid entry point on non-returned obj', + code: ` + /** + * @NScriptType ClientScript + */ + define([], () => { + var exports = {}; + var notTheReturnObject = {}; + notTheReturnObject.pageInit = x; + return exports; + }); + `, + errors: [{ messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }], + }, + { + name: 'valid entry points of different script type', + code: ` + /** + * @NScriptType ClientScript + */ + define([], (record) => { + return { getInputData, map, reduce, summarize }; + }); + `, + errors: [{ messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }], + }, +]); + +ruleTester.run(RULE_NAME, rule, { valid, invalid }); diff --git a/tests/rules/log-args.js b/tests/rules/log-args.js deleted file mode 100644 index a396ae2..0000000 --- a/tests/rules/log-args.js +++ /dev/null @@ -1,123 +0,0 @@ -'use strict'; - -const RuleTester = require('eslint').RuleTester; -const rule = require('../../lib/rules/log-args'); - -const ruleTester = new RuleTester({ - languageOptions: { - ecmaVersion: 2015, - sourceType: 'module', - }, -}); -ruleTester.run('log-args', rule, { - valid: [ - { - code: ` -define([], function() { - log.debug("title", "description"); -}); - `, - }, - { - code: ` -define(["N/log", "N/extra"], function(logModule) { - log.debug("title", "description"); -}); - `, - }, - { - code: ` -define([], function() { - log.debug({ title: "Title", details: "Message" }); -}); - `, - }, - { - code: ` -define([], function() { - log.debug({ title: "Title" }); -}); - `, - options: [{ requireTitle: true }], - }, - { - code: ` -define([], function() { - log.debug({ details: "Message" }); -}); - `, - options: [{ requireDetails: true }], - }, - { - code: ` -define([], function() { - log.error({ details: "Error message" }); -}); - `, - options: [{ requireDetails: true }], - }, - { - code: ` -define([], function() { - log.custom({ details: "Message" }); -}); - `, - options: [{ requireDetails: true }], - }, - { - code: ` -define(["N/log"], function(log) { - log.debug({ details: "Message" }); -}); - `, - options: [{ requireDetails: true }], - }, - { - code: ` -define(["N/record"], function(record) { - log.debug({ title: "Message" }); -}); - `, - options: [{ requireTitle: true }], - }, - ], - - invalid: [ - { - code: ` -define([], function() { - log.debug("title"); -}); - `, - options: [{ requireDetails: true }], - errors: [{ messageId: 'detailsRequired', data: { prop: 'debug' } }], - }, - { - code: ` -define([], function() { - log.audit("title"); -}); - `, - options: [{ requireDetails: true }], - errors: [{ messageId: 'detailsRequired', data: { prop: 'audit' } }], - }, - { - code: ` -define([], function() { - log.error({ details: "Message" }, "title"); -}); - `, - options: [{ requireTitle: true }], - errors: [{ messageId: 'titleRequired', data: { prop: 'error' } }], - }, - { - code: ` -define(["N/record", "N/log"], function(record, log) { - log.debug("test"); -}); - `, - options: [{ requireDetails: true }], - errors: [{ messageId: 'detailsRequired', data: { prop: 'debug' } }], - }, - ], -}); diff --git a/tests/rules/log-args.ts b/tests/rules/log-args.ts new file mode 100644 index 0000000..8da5013 --- /dev/null +++ b/tests/rules/log-args.ts @@ -0,0 +1,99 @@ +import path from 'node:path'; +import rule from '../../lib/rules/log-args'; +import ruleTester, { createTests } from '../rule-tester'; + +const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); + +const valid = createTests([ + { + name: 'title and details as args', + code: ` + define([], () => { + log.debug("title", "details"); + }); + `, + }, + { + name: 'title and details in obj', + code: ` + define([], () => { + log.debug({ title: "title", details: "details" }); + }); + `, + }, + { + name: 'null title and details as args', + code: ` + define([], () => { + log.debug(null, "details"); + }); + `, + }, + { + name: 'title and null details as args', + code: ` + define([], () => { + log.debug("title", null); + }); + `, + }, + { + name: 'details off, only title as arg', + code: ` + define([], () => { + log.debug("title"); + }); + `, + options: [{ requireDetails: false }], + }, + { + name: 'title off, only details in obj', + code: ` + define([], () => { + log.debug({ details: "details" }); + }); + `, + options: [{ requireTitle: false }], + }, + { + name: 'details off, only title in obj', + code: ` + define([], () => { + log.debug({ title: "title" }); + }); + `, + options: [{ requireDetails: false }], + }, +]); + +const invalid = createTests([ + { + name: 'only title as arg', + code: ` + define([], () => { + log.debug("title"); + }); + `, + errors: [{ messageId: 'detailsRequired', data: { prop: 'debug' } }], + }, + { + name: 'only title in obj', + code: ` + define([], () => { + log.debug({ title: "title" }); + }); + `, + errors: [{ messageId: 'detailsRequired', data: { prop: 'debug' } }], + }, + { + name: 'only details in obj', + code: ` + define([], () => { + log.debug({ details: "details" }); + }); + `, + errors: [{ messageId: 'titleRequired', data: { prop: 'debug' } }], + }, +]); + +ruleTester.run(RULE_NAME, rule, { valid, invalid }); diff --git a/tests/rules/module-vars.js b/tests/rules/module-vars.js deleted file mode 100644 index 57098d5..0000000 --- a/tests/rules/module-vars.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict'; - -const RuleTester = require('eslint').RuleTester; -const rule = require('../../lib/rules/module-vars'); - -const ruleTester = new RuleTester({ - languageOptions: { - ecmaVersion: 2015, - sourceType: 'module', - }, -}); -ruleTester.run('module-vars', rule, { - valid: [ - { - code: 'define(["N/record"], function(record) {});', - options: [{ 'N/record': 'record' }], - }, - { - code: 'define(["N/https"], function(https) {});', - options: [{ 'N/https': 'https' }], - }, - { - code: 'define(["N/ui/serverWidget"], function(ui) {});', - options: [{ 'N/ui/serverWidget': 'ui' }], - }, - { - code: 'define(["N/file", "N/runtime"], function(file, runtime) {});', - options: [{ 'N/file': 'file', 'N/runtime': 'runtime' }], - }, - { - code: 'define(["N/file", "N/runtime"], function(f, r) {});', - options: [{ 'N/file': 'f', 'N/runtime': 'r' }], - }, - { - code: 'define(["N/record", "N/search"], function(record) {});', - options: [{ 'N/record': 'record', 'N/search': 'search' }], - }, - ], - - invalid: [ - { - code: 'define(["N/record"], function(test) {});', - options: [{ 'N/record': 'record' }], - errors: [ - { messageId: 'useCorrectName', data: { module: 'N/record', id: 'record' } }, - ], - }, - { - code: 'define(["N/record", "N/search"], function(wrongName) {});', - options: [{ 'N/record': 'record', 'N/search': 'search' }], - errors: [ - { messageId: 'useCorrectName', data: { module: 'N/record', id: 'record' } }, - ], - }, - ], -}); diff --git a/tests/rules/module-vars.ts b/tests/rules/module-vars.ts new file mode 100644 index 0000000..ae3c05a --- /dev/null +++ b/tests/rules/module-vars.ts @@ -0,0 +1,59 @@ +import path from 'node:path'; +import rule from '../../lib/rules/module-vars'; +import ruleTester, { createTests } from '../rule-tester'; + +const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); + +const valid = createTests([ + { + name: 'one module, default name', + code: 'define(["N/record"], (record) => {});', + }, + { + name: 'one module, custom name', + code: 'define(["N/ui/serverWidget"], (ui) => {});', + options: [{ 'N/ui/serverWidget': 'ui' }], + }, + { + name: 'two modules, default names', + code: 'define(["N/file", "N/runtime"], (file, runtime) => {});', + }, + { + name: 'two modules, custom names', + code: 'define(["N/file", "N/runtime"], (f, r) => {});', + options: [{ 'N/file': 'f', 'N/runtime': 'r' }], + }, + { + name: 'invalid N module var ignored', + code: 'define(["N/foo"], (foo) => {});', + }, +]); + +const invalid = createTests([ + { + name: 'one module, incorrect default name', + code: 'define(["N/record"], (test) => {});', + errors: [ + { + messageId: 'useCorrectName', + data: { module: 'N/record', id: 'record' }, + }, + ], + }, + { + name: 'two modules, switched default names', + code: 'define(["N/record", "N/search"], (search, record) => {});', + errors: [ + { + messageId: 'useCorrectName', + data: { module: 'N/record', id: 'record' }, + }, + { + messageId: 'useCorrectName', + data: { module: 'N/search', id: 'search' }, + }, + ], + }, +]); + +ruleTester.run(RULE_NAME, rule, { valid, invalid }); diff --git a/tests/rules/no-amd-name.js b/tests/rules/no-amd-name.js deleted file mode 100644 index 9fbd76d..0000000 --- a/tests/rules/no-amd-name.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict'; - -const RuleTester = require('eslint').RuleTester; -const rule = require('../../lib/rules/no-amd-name'); - -const ruleTester = new RuleTester({ - languageOptions: { - ecmaVersion: 2015, - sourceType: 'module', - }, -}); -ruleTester.run('no-amd-name', rule, { - valid: [ - { - code: 'define([], function() {});', - }, - { - code: 'define(["N/search"], function(search) {});', - }, - { - code: 'define("moduleName");', - }, - { - code: 'define("moduleName", ["N/search"]);', - }, - ], - - invalid: [ - { - code: 'define("moduleName", [], function() {});', - errors: [{ messageId: 'noModuleName' }], - output: 'define([], function() {});', - }, - { - code: 'define("moduleName", ["N/search"], function(search) {});', - errors: [{ messageId: 'noModuleName' }], - output: 'define(["N/search"], function(search) {});', - }, - ], -}); diff --git a/tests/rules/no-extra-modules.js b/tests/rules/no-extra-modules.js deleted file mode 100644 index 2a5f8c6..0000000 --- a/tests/rules/no-extra-modules.js +++ /dev/null @@ -1,60 +0,0 @@ -'use strict'; - -const RuleTester = require('eslint').RuleTester; -const rule = require('../../lib/rules/no-extra-modules'); - -const ruleTester = new RuleTester({ - languageOptions: { - ecmaVersion: 2015, - sourceType: 'module', - }, -}); -ruleTester.run('no-extra-modules', rule, { - valid: [ - { - code: 'define(["N/record"], function(record) {});', - }, - { - code: 'define(["N/record", "N/file"], function(record, file) {});', - }, - { - code: 'define(["N/record", "N/file", "N/search"], function(record, file, search) {});', - }, - { - code: 'define([], function() {});', - }, - ], - - invalid: [ - { - code: 'define(["N/runtime"], function() {});', - errors: [{ messageId: 'excessName', data: { name: 'N/runtime' } }], - }, - { - code: 'define(["N/record", "N/file"], function(record) {});', - errors: [{ messageId: 'excessName', data: { name: 'N/file' } }], - }, - { - code: 'define(["N/record", "N/file", "N/https"], function(record) {});', - errors: [ - { messageId: 'excessName', data: { name: 'N/file' } }, - { messageId: 'excessName', data: { name: 'N/https' } }, - ], - }, - { - code: 'define([], function(sftp) {});', - errors: [{ messageId: 'excessVar', data: { var: 'sftp' } }], - }, - { - code: 'define(["N/record"], function(record, file) {});', - errors: [{ messageId: 'excessVar', data: { var: 'file' } }], - }, - { - code: 'define(["N/record"], function(record, file, https) {});', - errors: [ - { messageId: 'excessVar', data: { var: 'file' } }, - { messageId: 'excessVar', data: { var: 'https' } }, - ], - }, - ], -}); diff --git a/tests/rules/no-invalid-modules.js b/tests/rules/no-invalid-modules.js deleted file mode 100644 index a5aad1e..0000000 --- a/tests/rules/no-invalid-modules.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -const RuleTester = require('eslint').RuleTester; -const rule = require('../../lib/rules/no-invalid-modules'); - -const ruleTester = new RuleTester({ - languageOptions: { - ecmaVersion: 2015, - sourceType: 'module', - }, -}); -ruleTester.run('no-invalid-modules', rule, { - valid: [ - { - code: 'define(["N/record"], function(record) {});', - }, - { - code: 'define(["N/search"], function(search) {});', - }, - { - code: 'define(["customModule"], function(customModule) {});', - }, - { - code: 'define(["customModule", "N/file"], function(customModule, file) {});', - }, - { - code: 'define([], function() {});', - }, - ], - - invalid: [ - { - code: 'define(["N/invalid"], function(invalid) {});', - errors: [{ messageId: 'invalidModule', data: { module: 'N/invalid' } }], - }, - { - code: 'define(["N/file", "N/invalid"], function(file, invalid) {});', - errors: [{ messageId: 'invalidModule', data: { module: 'N/invalid' } }], - }, - { - code: 'define(["customModule", "N/invalid"], function(customModule, invalid) {});', - errors: [{ messageId: 'invalidModule', data: { module: 'N/invalid' } }], - }, - ], -}); diff --git a/tests/rules/no-invalid-modules.ts b/tests/rules/no-invalid-modules.ts new file mode 100644 index 0000000..e9d9191 --- /dev/null +++ b/tests/rules/no-invalid-modules.ts @@ -0,0 +1,44 @@ +import path from 'node:path'; +import rule from '../../lib/rules/no-invalid-modules'; +import ruleTester, { createTests } from '../rule-tester'; + +const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); + +const valid = createTests([ + { + name: 'N module', + code: 'define(["N/record"], (record) => {});', + }, + { + name: 'custom module', + code: 'define(["customModule"], (customModule) => {});', + }, + { + name: 'N and custom modules', + code: 'define(["customModule", "N/file"], (customModule, file) => {});', + }, + { + name: 'no modules', + code: 'define([], () => {});', + }, +]); + +const invalid = createTests([ + { + name: 'invalid N module', + code: 'define(["N/invalid"], (invalid) => {});', + errors: [{ messageId: 'invalidModule', data: { module: 'N/invalid' } }], + }, + { + name: 'invalid and valid N modules', + code: 'define(["N/file", "N/invalid"], (file, invalid) => {});', + errors: [{ messageId: 'invalidModule', data: { module: 'N/invalid' } }], + }, + { + name: 'invalid N module and custom module', + code: 'define(["customModule", "N/invalid"], (customModule, invalid) => {});', + errors: [{ messageId: 'invalidModule', data: { module: 'N/invalid' } }], + }, +]); + +ruleTester.run(RULE_NAME, rule, { valid, invalid }); diff --git a/tests/rules/no-log-module.js b/tests/rules/no-log-module.js deleted file mode 100644 index faa71e9..0000000 --- a/tests/rules/no-log-module.js +++ /dev/null @@ -1,127 +0,0 @@ -'use strict'; - -const RuleTester = require('eslint').RuleTester; -const rule = require('../../lib/rules/no-log-module'); - -const ruleTester = new RuleTester({ - languageOptions: { - ecmaVersion: 2015, - sourceType: 'module', - }, -}); -ruleTester.run('no-log-module', rule, { - valid: [ - { - code: 'define(["N/record"], function(record) {});', - }, - { - code: 'define(["N/search", "N/file"], function(search, file) {});', - }, - { - code: 'define(["N/record", "N/file", "N/search"], function(record, file, search) {});', - }, - { - code: 'define([], function() {});', - }, - { - code: ` -/** - * @NScriptType - */ -define([], function() {}); - `, - }, - { - code: ` -/** - * @NScriptType Suitelet - */ -define([], function() {}); - `, - }, - { - code: ` -/** - * @NScriptType Suitelet - */ -define([], function() {}); - `, - options: [{ allowInClientScripts: false }], - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define([], function() {}); - `, - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define(["N/log"], function(log) {}); - `, - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define(["N/log"], function(log) {}); - `, - options: [{ allowInClientScripts: true }], - }, - ], - - invalid: [ - { - code: 'define(["N/log"], function(log) {});', - errors: [{ messageId: 'useGlobalLog' }], - }, - { - code: 'define(["N/record", "N/log"], function(record, log) {});', - errors: [{ messageId: 'useGlobalLog' }], - }, - { - code: ` -/** - * @NScriptType Suitelet - */ -define(["N/log"], function(log) {}); - `, - errors: [{ messageId: 'useGlobalLog' }], - }, - { - code: ` -/** - * @NScriptType Suitelet - */ -define(["N/log"], function(log) {}); - `, - options: [{ allowInClientScripts: true }], - errors: [{ messageId: 'useGlobalLog' }], - }, - { - code: ` -/** - * @NScriptType Suitelet - */ -define(["N/log"], function(log) {}); - `, - options: [{ allowInClientScripts: false }], - errors: [{ messageId: 'useGlobalLog' }], - }, - { - code: ` -/** - * @NScriptType ClientScript - */ -define(["N/log"], function(log) {}); - `, - options: [{ allowInClientScripts: false }], - errors: [{ messageId: 'useGlobalLog' }], - }, - ], -}); diff --git a/tests/rules/no-log-module.ts b/tests/rules/no-log-module.ts new file mode 100644 index 0000000..2bca55c --- /dev/null +++ b/tests/rules/no-log-module.ts @@ -0,0 +1,56 @@ +import path from 'node:path'; +import rule from '../../lib/rules/no-log-module'; +import ruleTester, { createTests } from '../rule-tester'; + +const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); + +const valid = createTests([ + { + name: 'no modules', + code: 'define([], () => {});', + }, + { + name: 'non-log module', + code: 'define(["N/record"], (record) => {});', + }, + { + name: 'client script with log - default', + code: ` + /** + * @NScriptType ClientScript + */ + define(["N/log"], (log) => {}); + `, + }, + { + name: 'client script with log - on', + code: ` + /** + * @NScriptType ClientScript + */ + define(["N/log"], (log) => {}); + `, + options: [{ allowInClientScripts: true }], + }, +]); + +const invalid = createTests([ + { + name: 'log module', + code: 'define(["N/log"], (log) => {});', + errors: [{ messageId: 'useGlobalLog' }], + }, + { + name: 'client script with log - false', + code: ` + /** + * @NScriptType ClientScript + */ + define(["N/log"], function(log) {}); + `, + options: [{ allowInClientScripts: false }], + errors: [{ messageId: 'useGlobalLog' }], + }, +]); + +ruleTester.run(RULE_NAME, rule, { valid, invalid }); diff --git a/tests/rules/no-module-extensions.js b/tests/rules/no-module-extensions.js deleted file mode 100644 index 011b7d8..0000000 --- a/tests/rules/no-module-extensions.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -const RuleTester = require('eslint').RuleTester; -const rule = require('../../lib/rules/no-module-extensions'); - -const ruleTester = new RuleTester({ - languageOptions: { - ecmaVersion: 2015, - sourceType: 'module', - }, -}); -ruleTester.run('no-module-extensions', rule, { - valid: [ - { - code: 'define(["./lib"], function(lib) {});', - }, - { - code: 'define(["N/record", "./lib"], function(record, lib) {});', - }, - { - code: 'define([], function() {});', - }, - { - code: 'define(["N/record", "./lib"], (record, lib) => {});', - }, - ], - - invalid: [ - { - code: 'define(["./lib.js"], function(lib) {});', - errors: [{ messageId: 'invalidModuleExtension' }], - output: 'define(["./lib"], function(lib) {});', - }, - { - code: "define(['./lib.js'], function(lib) {});", - errors: [{ messageId: 'invalidModuleExtension' }], - output: "define(['./lib'], function(lib) {});", - }, - { - code: 'define(["./lib1", "./lib2.js"], function(lib1, lib2) {});', - errors: [{ messageId: 'invalidModuleExtension' }], - output: 'define(["./lib1", "./lib2"], function(lib1, lib2) {});', - }, - { - code: 'define(["./lib1", "./lib2.js"], (lib1, lib2) => {});', - errors: [{ messageId: 'invalidModuleExtension' }], - output: 'define(["./lib1", "./lib2"], (lib1, lib2) => {});', - }, - ], -}); diff --git a/tests/rules/script-type.js b/tests/rules/script-type.js deleted file mode 100644 index 803c217..0000000 --- a/tests/rules/script-type.js +++ /dev/null @@ -1,172 +0,0 @@ -'use strict'; - -const RuleTester = require('eslint').RuleTester; -const rule = require('../../lib/rules/script-type'); - -const ruleTester = new RuleTester({ - languageOptions: { - ecmaVersion: 2015, - sourceType: 'module', - }, -}); -ruleTester.run('script-type', rule, { - valid: [ - { - code: ` -/** - * @NScriptType BundleInstallationScript - */ - `, - }, - { - code: ` -/** - * @NScriptType bundleinstallationscript - */ - `, - }, - { - code: ` -/** - * @NScriptType ClientScript - */ - `, - }, - { - code: ` -/** - * @NScriptType FiParserPlugin - */ - `, - }, - { - code: ` -/** - * @NScriptType MapReduceScript - */ - `, - }, - { - code: ` -/** - * @NScriptType MassUpdateScript - */ - `, - }, - { - code: ` -/** - * @NScriptType Portlet - */ - `, - }, - { - code: ` -/** - * @NScriptType Restlet - */ - `, - }, - { - code: ` -/** - * @NScriptType ScheduledScript - */ - `, - }, - { - code: ` -/** - * @NScriptType SDFInstallationScript - */ - `, - }, - { - code: ` -/** - * @NScriptType Suitelet - */ - `, - }, - { - code: ` -/** - * @NScriptType UserEventScript - */ - `, - }, - { - code: ` -/** - * @NScriptType WorkflowActionScript - */ - `, - }, - { - code: ` -/** - * @NScriptType Suitelet - */ -/** - * @NScriptType SuiteletScript - */ - `, - }, - { - code: ` -/** - * Not a script type tag - */ - `, - }, - { - code: '// @NScriptType SuiteletScript', - }, - ], - - invalid: [ - { - code: ` -/** - * @NScriptType - */ - `, - errors: [{ messageId: 'noValue' }], - }, - { - code: ` -/** - * @NScriptType PortletScript - */ - `, - errors: [{ messageId: 'invalidValue', data: { value: 'PortletScript' } }], - }, - { - code: ` -/** - * @NScriptType RestletScript - */ - `, - errors: [{ messageId: 'invalidValue', data: { value: 'RestletScript' } }], - }, - { - code: ` -/** - * @NScriptType SuiteletScript - */ - `, - errors: [{ messageId: 'invalidValue', data: { value: 'SuiteletScript' } }], - }, - { - code: ` -/** - * @NScriptType SuiteletScript - */ -/** - * @NScriptType Suitelet - */ - `, - errors: [{ messageId: 'invalidValue', data: { value: 'SuiteletScript' } }], - }, - ], -}); diff --git a/tests/rules/script-type.ts b/tests/rules/script-type.ts new file mode 100644 index 0000000..8867dd3 --- /dev/null +++ b/tests/rules/script-type.ts @@ -0,0 +1,50 @@ +import path from 'node:path'; +import rule from '../../lib/rules/script-type'; +import ruleTester, { createTests } from '../rule-tester'; + +const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); + +const valid = createTests([ + { + name: 'single script type tag', + code: ` + /** + * @NScriptType Suitelet + */ + `, + }, + { + name: 'two script type tags', + code: ` + /** + * @NScriptType Suitelet + */ + /** + * @NScriptType SuiteletScript + */ + `, + }, +]); + +const invalid = createTests([ + { + name: 'missing script type value', + code: ` + /** + * @NScriptType + */ + `, + errors: [{ messageId: 'noValue' }], + }, + { + name: 'invalid script type', + code: ` + /** + * @NScriptType Invalid + */ + `, + errors: [{ messageId: 'invalidValue', data: { value: 'Invalid' } }], + }, +]); + +ruleTester.run(RULE_NAME, rule, { valid, invalid }); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ab40157 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "exactOptionalPropertyTypes": true, + "isolatedModules": true, + "module": "esnext", + "moduleDetection": "force", + "moduleResolution": "bundler", + "noEmit": true, + "noUncheckedSideEffectImports": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strictNullChecks": true, + "target": "es2025", + "types": ["eslint", "estree", "node"] + }, + "include": [ + "lib/**/*.ts", + "scripts/**/*.ts", + "tests/**/*.ts", + "tsdown.config.ts" + ] +} diff --git a/tsdown.config.ts b/tsdown.config.ts new file mode 100644 index 0000000..0c713e2 --- /dev/null +++ b/tsdown.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'tsdown'; + +export default defineConfig({ + entry: 'lib/index.ts', + format: ['cjs', 'esm'], + dts: true, + clean: true, + outDir: 'dist', +}); diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 92409ab..0000000 --- a/yarn.lock +++ /dev/null @@ -1,924 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@eslint-community/eslint-utils@^4.8.0": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" - integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.12.2": - version "4.12.2" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" - integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== - -"@eslint/config-array@^0.23.5": - version "0.23.5" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.23.5.tgz#56e86d243049195d8acc0c06a1b3dfdc3fa3de95" - integrity sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA== - dependencies: - "@eslint/object-schema" "^3.0.5" - debug "^4.3.1" - minimatch "^10.2.4" - -"@eslint/config-helpers@^0.5.5": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.5.5.tgz#ae16134e4792ac5fbdc533548a24ac1ea9f7f3ae" - integrity sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w== - dependencies: - "@eslint/core" "^1.2.1" - -"@eslint/core@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-1.2.1.tgz#c1da7cd1b82fa8787f98b5629fb811848a1b63ce" - integrity sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/object-schema@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-3.0.5.tgz#88e9bf4d11d2b19c082e78ebe7ce88724a5eb091" - integrity sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw== - -"@eslint/plugin-kit@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz#c4125fd015eceeb09b793109fdbcd4dd0a02d346" - integrity sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ== - dependencies: - "@eslint/core" "^1.2.1" - levn "^0.4.1" - -"@humanfs/core@^0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.2.tgz#a8272ca03b2acf492670222b2320b6c421bfde60" - integrity sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA== - dependencies: - "@humanfs/types" "^0.15.0" - -"@humanfs/node@^0.16.6": - version "0.16.8" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.8.tgz#8f800cccc13f4f8cd3116e2d9c0a94939da3e3ed" - integrity sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ== - dependencies: - "@humanfs/core" "^0.19.2" - "@humanfs/types" "^0.15.0" - "@humanwhocodes/retry" "^0.4.0" - -"@humanfs/types@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@humanfs/types/-/types-0.15.0.tgz#f2a09f62012390b2bff3fc6fb248ddec8c09a090" - integrity sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q== - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" - integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@types/esrecurse@^4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@types/esrecurse/-/esrecurse-4.3.1.tgz#6f636af962fbe6191b830bd676ba5986926bccec" - integrity sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw== - -"@types/estree@^1.0.6", "@types/estree@^1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== - -"@types/json-schema@^7.0.15": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.16.0: - version "8.16.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" - integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== - -ajv@^6.14.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.15.0.tgz#07e982c74626167aa7a2495c53817892d7139492" - integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== - 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" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -balanced-match@^4.0.2: - version "4.0.4" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" - integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -brace-expansion@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.5.tgz#dcc3a37116b79f3e1b46db994ced5d570e930fdb" - integrity sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ== - dependencies: - balanced-match "^4.0.2" - -browser-stdout@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" - integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== - dependencies: - readdirp "^4.0.1" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@^4.3.1, debug@^4.3.2, debug@^4.3.5: - version "4.4.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== - dependencies: - ms "^2.1.3" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -diff@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" - integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -escalade@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-prettier@^10.1.5: - version "10.1.5" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz#00c18d7225043b6fbce6a665697377998d453782" - integrity sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw== - -eslint-scope@^9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-9.1.2.tgz#b9de6ace2fab1cff24d2e58d85b74c8fcea39802" - integrity sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ== - dependencies: - "@types/esrecurse" "^4.3.1" - "@types/estree" "^1.0.8" - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" - integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== - -eslint@^10.0.0: - version "10.2.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.2.1.tgz#224b2a6caeb34473eddcf918762363e2e063222a" - integrity sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q== - dependencies: - "@eslint-community/eslint-utils" "^4.8.0" - "@eslint-community/regexpp" "^4.12.2" - "@eslint/config-array" "^0.23.5" - "@eslint/config-helpers" "^0.5.5" - "@eslint/core" "^1.2.1" - "@eslint/plugin-kit" "^0.7.1" - "@humanfs/node" "^0.16.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.4.2" - "@types/estree" "^1.0.6" - ajv "^6.14.0" - cross-spawn "^7.0.6" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^9.1.2" - eslint-visitor-keys "^5.0.1" - espree "^11.2.0" - esquery "^1.7.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^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" - minimatch "^10.2.4" - natural-compare "^1.4.0" - optionator "^0.9.3" - -espree@^11.2.0: - version "11.2.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-11.2.0.tgz#01d5e47dc332aaba3059008362454a8cc34ccaa5" - integrity sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw== - dependencies: - acorn "^8.16.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^5.0.1" - -esquery@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" - integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== - dependencies: - flat-cache "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.4" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.2.9: - version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== - -foreground-child@^3.1.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" - integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== - dependencies: - cross-spawn "^7.0.6" - signal-exit "^4.0.1" - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^10.4.5: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - 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" - -globals@^17.6.0: - version "17.6.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-17.6.0.tgz#0f0be018d5cca8690e6375ead1f65c4bb96191fc" - integrity sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -ignore@^5.2.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -minimatch@^10.2.4: - version "10.2.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.5.tgz#bd48687a0be38ed2961399105600f832095861d1" - integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg== - dependencies: - brace-expansion "^5.0.5" - -minimatch@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -mocha@^11.4.0: - version "11.4.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.4.0.tgz#6e873ee0beed4475e06f782bc9dd076670f932fd" - integrity sha512-O6oi5Y9G6uu8f9iqXR6iKNLWHLRex3PKbmHynfpmUnMJJGrdgXh8ZmS85Ei5KR2Gnl+/gQ9s+Ktv5CqKybNw4A== - dependencies: - browser-stdout "^1.3.1" - chokidar "^4.0.1" - debug "^4.3.5" - diff "^7.0.0" - escape-string-regexp "^4.0.0" - find-up "^5.0.0" - glob "^10.4.5" - he "^1.2.0" - js-yaml "^4.1.0" - log-symbols "^4.1.0" - minimatch "^5.1.6" - ms "^2.1.3" - picocolors "^1.1.1" - serialize-javascript "^6.0.2" - strip-json-comments "^3.1.1" - supports-color "^8.1.1" - workerpool "^6.5.1" - yargs "^17.7.2" - yargs-parser "^21.1.1" - yargs-unparser "^2.0.0" - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - 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" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.3.tgz#4fc2ce0d657e7a02e602549f053b239cb7dfe1b5" - integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw== - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -readdirp@^4.0.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" - integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -workerpool@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" - integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs-unparser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==