From dd1865355eebf31ecde495140c925559dde5da29 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Sat, 2 May 2026 12:52:06 -0500 Subject: [PATCH 01/35] chore: move to biome --- .editorconfig | 13 -------- .github/workflows/ci.yml | 4 +-- .prettierrc | 5 ---- biome.json | 37 +++++++++++++++++++++++ eslint.config.js | 24 --------------- package.json | 26 +++++++--------- yarn.lock | 64 +++++++++++++++++++++++++++++++++------- 7 files changed, 103 insertions(+), 70 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .prettierrc create mode 100644 biome.json delete mode 100644 eslint.config.js 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..0679846 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,9 +13,7 @@ jobs: - uses: actions/setup-node@v4 - run: | yarn - yarn prettier . --debug-check - - run: | - yarn lint + yarn check test: name: Test rules 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/biome.json b/biome.json new file mode 100644 index 0000000..9d342f6 --- /dev/null +++ b/biome.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.4.14/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false + }, + "formatter": { + "enabled": true, + "indentStyle": "space" + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "suspicious": { + "useIterableCallbackReturn": "off" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + } +} 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/package.json b/package.json index 800a57a..9701c90 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,9 @@ "name": "eslint-plugin-suitescript", "version": "2.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" @@ -13,10 +13,7 @@ "main": "lib/index.js", "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", + "check": "biome check", "test": "mocha tests/** --recursive --reporter min" }, "files": [ @@ -30,19 +27,18 @@ "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" + }, + "devDependencies": { + "@biomejs/biome": "^2.4.14", + "eslint": "^10.0.0", + "mocha": "^11.4.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" } } diff --git a/yarn.lock b/yarn.lock index 92409ab..7fabdab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,60 @@ # yarn lockfile v1 +"@biomejs/biome@^2.4.14": + version "2.4.14" + resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-2.4.14.tgz#3d29f06baa789dce37169e5c537d6e6648361635" + integrity sha512-TmAvxOEgrpLypzVGJ8FulIZnlyA9TxrO1hyqYrCz9r+bwma9xXxuLA5IuYnj55XQneFx460KjRbx6SWGLkg3bQ== + optionalDependencies: + "@biomejs/cli-darwin-arm64" "2.4.14" + "@biomejs/cli-darwin-x64" "2.4.14" + "@biomejs/cli-linux-arm64" "2.4.14" + "@biomejs/cli-linux-arm64-musl" "2.4.14" + "@biomejs/cli-linux-x64" "2.4.14" + "@biomejs/cli-linux-x64-musl" "2.4.14" + "@biomejs/cli-win32-arm64" "2.4.14" + "@biomejs/cli-win32-x64" "2.4.14" + +"@biomejs/cli-darwin-arm64@2.4.14": + version "2.4.14" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.14.tgz#b026f36d3f6add2e712928f65e70b030abb62ef6" + integrity sha512-XvgoE9XOawUOQPdmvs4J7wPhi/DLwSCGks3AlPJDmh34O0awRTqCED1HRcRDdpf1Zrp4us4MGOOdIxNpbqNF5Q== + +"@biomejs/cli-darwin-x64@2.4.14": + version "2.4.14" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.14.tgz#bc4e2166ecc143641781e7093def0079fb870c86" + integrity sha512-jE7hKBCFhOx3uUh+ZkWBfOHxAcILPfhFplNkuID/eZeSTLHzfZzoZxW8fbqY9xXRnPi7jGNAf1iPVR+0yWsM/Q== + +"@biomejs/cli-linux-arm64-musl@2.4.14": + version "2.4.14" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.14.tgz#f2b5a52482b98c6bfe1399d0c4c001873740ccee" + integrity sha512-/z+6gqAqqUQTHazwStxSXKHg9b8UvqBmDFRp+c4wYbq2KXhELQDon9EoC9RpmQ8JWkqQx/lIUy/cs+MhzDZp6A== + +"@biomejs/cli-linux-arm64@2.4.14": + version "2.4.14" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.14.tgz#86c5195e69139eafbbabb9a285bcda9b737f3632" + integrity sha512-2TELhZnW5RSLL063l9rc5xLpA0ZIw0Ccwy/0q384rvNAgFw3yI76bd59547yxowdQr5MNPET/xDLrLuvgSeeWQ== + +"@biomejs/cli-linux-x64-musl@2.4.14": + version "2.4.14" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.14.tgz#0abae51ba32c6fdc9c8e273bc406245f660fc49f" + integrity sha512-R6BWgJdQOwW9ulJatuTVrQkjnODjqHZkKNOqb1sz++3Noe5LYd0i3PchnOBUCYAPHoPWHhjJqbdZlHEu0hpjdA== + +"@biomejs/cli-linux-x64@2.4.14": + version "2.4.14" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.14.tgz#31204057d50b0218b3f54614c7521f5530f0901c" + integrity sha512-zHrlQZDBDUz4OLAraYpWKcnLS6HOewBFWYOzY91d1ZjdqZwibOyb6BEu6WuWLugyo0P3riCmsbV9UqV1cSXwQg== + +"@biomejs/cli-win32-arm64@2.4.14": + version "2.4.14" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.14.tgz#1df473fa218e9c191b1de671daf45d739688af96" + integrity sha512-M3EH5hqOI/F/FUA2u4xcLoUgmxd218mvuj/6JL7Hv2toQvr2/AdOvKSpGkoRuWFCtQPVa+ZqkEV3Q5xBA9+XSA== + +"@biomejs/cli-win32-x64@2.4.14": + version "2.4.14" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.14.tgz#65d585b378f79aba1cddb1817d2c64880815639c" + integrity sha512-WL0EG5qE+EAKomGXbf2g6VnSKJhTL3tXC0QRzWRwA5VpjxNYa6H4P7ZWfymbGE4IhZZQi1KXQ2R0YjwInmz2fA== + "@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" @@ -286,11 +340,6 @@ escape-string-regexp@^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" @@ -704,11 +753,6 @@ prelude-ls@^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" From 1eb403f91c257a689feb93c4bd86763710f84922 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Sat, 2 May 2026 13:19:00 -0500 Subject: [PATCH 02/35] chore: move to pnpm --- .github/workflows/ci.yml | 23 +- pnpm-lock.yaml | 1700 ++++++++++++++++++++++++++++++++++++++ yarn.lock | 968 ---------------------- 3 files changed, 1718 insertions(+), 973 deletions(-) create mode 100644 pnpm-lock.yaml delete mode 100644 yarn.lock diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0679846..8fe101b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,21 +6,34 @@ on: jobs: lint: - name: Check linting and formatting + name: Check linting, formatting, types runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: + version: 10 - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: "pnpm" - run: | - yarn - yarn check + pnpm install + pnpm check + pnpm check:types test: name: Test rules runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: + version: 10 - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: "pnpm" - run: | - yarn - yarn test + pnpm install + pnpm test diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..a09fc0c --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1700 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + globals: + specifier: ^17.6.0 + version: 17.6.0 + devDependencies: + '@biomejs/biome': + specifier: ^2.4.14 + version: 2.4.14 + eslint: + specifier: ^10.0.0 + version: 10.3.0 + mocha: + specifier: ^11.4.0 + version: 11.7.5 + tsc-alias: + specifier: ^1.8.17 + version: 1.8.17 + tsx: + specifier: ^4.21.0 + version: 4.21.0 + typescript: + specifier: ^6.0.3 + version: 6.0.3 + +packages: + + '@biomejs/biome@2.4.14': + resolution: {integrity: sha512-TmAvxOEgrpLypzVGJ8FulIZnlyA9TxrO1hyqYrCz9r+bwma9xXxuLA5IuYnj55XQneFx460KjRbx6SWGLkg3bQ==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.4.14': + resolution: {integrity: sha512-XvgoE9XOawUOQPdmvs4J7wPhi/DLwSCGks3AlPJDmh34O0awRTqCED1HRcRDdpf1Zrp4us4MGOOdIxNpbqNF5Q==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.4.14': + resolution: {integrity: sha512-jE7hKBCFhOx3uUh+ZkWBfOHxAcILPfhFplNkuID/eZeSTLHzfZzoZxW8fbqY9xXRnPi7jGNAf1iPVR+0yWsM/Q==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.4.14': + resolution: {integrity: sha512-/z+6gqAqqUQTHazwStxSXKHg9b8UvqBmDFRp+c4wYbq2KXhELQDon9EoC9RpmQ8JWkqQx/lIUy/cs+MhzDZp6A==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-arm64@2.4.14': + resolution: {integrity: sha512-2TELhZnW5RSLL063l9rc5xLpA0ZIw0Ccwy/0q384rvNAgFw3yI76bd59547yxowdQr5MNPET/xDLrLuvgSeeWQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-linux-x64-musl@2.4.14': + resolution: {integrity: sha512-R6BWgJdQOwW9ulJatuTVrQkjnODjqHZkKNOqb1sz++3Noe5LYd0i3PchnOBUCYAPHoPWHhjJqbdZlHEu0hpjdA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-x64@2.4.14': + resolution: {integrity: sha512-zHrlQZDBDUz4OLAraYpWKcnLS6HOewBFWYOzY91d1ZjdqZwibOyb6BEu6WuWLugyo0P3riCmsbV9UqV1cSXwQg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-win32-arm64@2.4.14': + resolution: {integrity: sha512-M3EH5hqOI/F/FUA2u4xcLoUgmxd218mvuj/6JL7Hv2toQvr2/AdOvKSpGkoRuWFCtQPVa+ZqkEV3Q5xBA9+XSA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.4.14': + resolution: {integrity: sha512-WL0EG5qE+EAKomGXbf2g6VnSKJhTL3tXC0QRzWRwA5VpjxNYa6H4P7ZWfymbGE4IhZZQi1KXQ2R0YjwInmz2fA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@esbuild/aix-ppc64@0.27.4': + resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.4': + resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.4': + resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.4': + resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.4': + resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.4': + resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.4': + resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.4': + resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.4': + resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.4': + resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.4': + resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.4': + resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.4': + resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.4': + resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.4': + resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.4': + resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.4': + resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.4': + resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.4': + resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.4': + resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.4': + resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.4': + resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.4': + resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.4': + resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.4': + resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.4': + resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} + 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.5.5': + resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + 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.1': + resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + 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'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@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'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + 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@2.0.3: + resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==} + + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + 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 + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + esbuild@0.27.4: + resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + 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.3.0: + resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} + 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==} + + 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'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + 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-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-tsconfig@4.13.7: + resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + + 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'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + globals@17.6.0: + resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} + engines: {node: '>=18'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + 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-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + 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'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + 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'} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + 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} + + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + mocha@11.7.5: + resolution: {integrity: sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + + 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'} + + 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'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + 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-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + 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'} + + queue-lit@1.5.2: + resolution: {integrity: sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==} + engines: {node: '>=12'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.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'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + 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'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tsc-alias@1.8.17: + resolution: {integrity: sha512-EIduCZHqbNwPm8BZYfq1aD7BQ697A4h6uSGMOFQfYGoQwfrYFTKwYfy9Bv42YxHkduVBcn9Zx0DkX111DKskyg==} + engines: {node: '>=16.20.2'} + hasBin: true + + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + 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'} + + workerpool@9.3.4: + resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@biomejs/biome@2.4.14': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.4.14 + '@biomejs/cli-darwin-x64': 2.4.14 + '@biomejs/cli-linux-arm64': 2.4.14 + '@biomejs/cli-linux-arm64-musl': 2.4.14 + '@biomejs/cli-linux-x64': 2.4.14 + '@biomejs/cli-linux-x64-musl': 2.4.14 + '@biomejs/cli-win32-arm64': 2.4.14 + '@biomejs/cli-win32-x64': 2.4.14 + + '@biomejs/cli-darwin-arm64@2.4.14': + optional: true + + '@biomejs/cli-darwin-x64@2.4.14': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.4.14': + optional: true + + '@biomejs/cli-linux-arm64@2.4.14': + optional: true + + '@biomejs/cli-linux-x64-musl@2.4.14': + optional: true + + '@biomejs/cli-linux-x64@2.4.14': + optional: true + + '@biomejs/cli-win32-arm64@2.4.14': + optional: true + + '@biomejs/cli-win32-x64@2.4.14': + optional: true + + '@esbuild/aix-ppc64@0.27.4': + optional: true + + '@esbuild/android-arm64@0.27.4': + optional: true + + '@esbuild/android-arm@0.27.4': + optional: true + + '@esbuild/android-x64@0.27.4': + optional: true + + '@esbuild/darwin-arm64@0.27.4': + optional: true + + '@esbuild/darwin-x64@0.27.4': + optional: true + + '@esbuild/freebsd-arm64@0.27.4': + optional: true + + '@esbuild/freebsd-x64@0.27.4': + optional: true + + '@esbuild/linux-arm64@0.27.4': + optional: true + + '@esbuild/linux-arm@0.27.4': + optional: true + + '@esbuild/linux-ia32@0.27.4': + optional: true + + '@esbuild/linux-loong64@0.27.4': + optional: true + + '@esbuild/linux-mips64el@0.27.4': + optional: true + + '@esbuild/linux-ppc64@0.27.4': + optional: true + + '@esbuild/linux-riscv64@0.27.4': + optional: true + + '@esbuild/linux-s390x@0.27.4': + optional: true + + '@esbuild/linux-x64@0.27.4': + optional: true + + '@esbuild/netbsd-arm64@0.27.4': + optional: true + + '@esbuild/netbsd-x64@0.27.4': + optional: true + + '@esbuild/openbsd-arm64@0.27.4': + optional: true + + '@esbuild/openbsd-x64@0.27.4': + optional: true + + '@esbuild/openharmony-arm64@0.27.4': + optional: true + + '@esbuild/sunos-x64@0.27.4': + optional: true + + '@esbuild/win32-arm64@0.27.4': + optional: true + + '@esbuild/win32-ia32@0.27.4': + optional: true + + '@esbuild/win32-x64@0.27.4': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0)': + dependencies: + eslint: 10.3.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(supports-color@8.1.1) + minimatch: 10.2.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.5.5': + 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.1': + 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': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@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 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + ajv@6.14.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 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + binary-extensions@2.3.0: {} + + brace-expansion@2.0.3: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.5: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-stdout@1.3.1: {} + + camelcase@6.3.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.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 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + 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(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + decamelize@4.0.0: {} + + deep-is@0.1.4: {} + + diff@7.0.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + eastasianwidth@0.2.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + esbuild@0.27.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.4 + '@esbuild/android-arm': 0.27.4 + '@esbuild/android-arm64': 0.27.4 + '@esbuild/android-x64': 0.27.4 + '@esbuild/darwin-arm64': 0.27.4 + '@esbuild/darwin-x64': 0.27.4 + '@esbuild/freebsd-arm64': 0.27.4 + '@esbuild/freebsd-x64': 0.27.4 + '@esbuild/linux-arm': 0.27.4 + '@esbuild/linux-arm64': 0.27.4 + '@esbuild/linux-ia32': 0.27.4 + '@esbuild/linux-loong64': 0.27.4 + '@esbuild/linux-mips64el': 0.27.4 + '@esbuild/linux-ppc64': 0.27.4 + '@esbuild/linux-riscv64': 0.27.4 + '@esbuild/linux-s390x': 0.27.4 + '@esbuild/linux-x64': 0.27.4 + '@esbuild/netbsd-arm64': 0.27.4 + '@esbuild/netbsd-x64': 0.27.4 + '@esbuild/openbsd-arm64': 0.27.4 + '@esbuild/openbsd-x64': 0.27.4 + '@esbuild/openharmony-arm64': 0.27.4 + '@esbuild/sunos-x64': 0.27.4 + '@esbuild/win32-arm64': 0.27.4 + '@esbuild/win32-ia32': 0.27.4 + '@esbuild/win32-x64': 0.27.4 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.3.0: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.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.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.14.0 + cross-spawn: 7.0.6 + debug: 4.4.3(supports-color@8.1.1) + 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.16.0 + acorn-jsx: 5.3.2(acorn@8.16.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 + + 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 + + flat@5.0.2: {} + + flatted@3.4.2: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fsevents@2.3.3: + optional: true + + get-caller-file@2.0.5: {} + + get-tsconfig@4.13.7: + 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 + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globals@17.6.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 + + has-flag@4.0.0: {} + + he@1.2.0: {} + + ignore@5.3.2: {} + + imurmurhash@0.1.4: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@2.1.0: {} + + is-unicode-supported@0.1.0: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + 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 + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + lru-cache@10.4.3: {} + + 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.5 + + minimatch@9.0.9: + dependencies: + brace-expansion: 2.0.3 + + minipass@7.1.3: {} + + mocha@11.7.5: + dependencies: + browser-stdout: 1.3.1 + chokidar: 4.0.3 + debug: 4.4.3(supports-color@8.1.1) + diff: 7.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 10.5.0 + he: 1.2.0 + is-path-inside: 3.0.3 + js-yaml: 4.1.1 + log-symbols: 4.1.0 + minimatch: 9.0.9 + 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: 9.3.4 + yargs: 17.7.2 + yargs-parser: 21.1.1 + yargs-unparser: 2.0.0 + + ms@2.1.3: {} + + mylas@2.1.14: {} + + natural-compare@1.4.0: {} + + normalize-path@3.0.0: {} + + 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 + + package-json-from-dist@1.0.1: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + + path-type@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + plimit-lit@1.6.1: + dependencies: + queue-lit: 1.5.2 + + prelude-ls@1.2.1: {} + + punycode@2.3.1: {} + + queue-lit@1.5.2: {} + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + + readdirp@4.1.2: {} + + require-directory@2.1.1: {} + + resolve-pkg-maps@1.0.0: {} + + reusify@1.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tsc-alias@1.8.17: + dependencies: + chokidar: 3.6.0 + commander: 9.5.0 + get-tsconfig: 4.13.7 + globby: 11.1.0 + mylas: 2.1.14 + normalize-path: 3.0.0 + plimit-lit: 1.6.1 + + tsx@4.21.0: + dependencies: + esbuild: 0.27.4 + get-tsconfig: 4.13.7 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript@6.0.3: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + workerpool@9.3.4: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 + + y18n@5.0.8: {} + + yargs-parser@21.1.1: {} + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 7fabdab..0000000 --- a/yarn.lock +++ /dev/null @@ -1,968 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@biomejs/biome@^2.4.14": - version "2.4.14" - resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-2.4.14.tgz#3d29f06baa789dce37169e5c537d6e6648361635" - integrity sha512-TmAvxOEgrpLypzVGJ8FulIZnlyA9TxrO1hyqYrCz9r+bwma9xXxuLA5IuYnj55XQneFx460KjRbx6SWGLkg3bQ== - optionalDependencies: - "@biomejs/cli-darwin-arm64" "2.4.14" - "@biomejs/cli-darwin-x64" "2.4.14" - "@biomejs/cli-linux-arm64" "2.4.14" - "@biomejs/cli-linux-arm64-musl" "2.4.14" - "@biomejs/cli-linux-x64" "2.4.14" - "@biomejs/cli-linux-x64-musl" "2.4.14" - "@biomejs/cli-win32-arm64" "2.4.14" - "@biomejs/cli-win32-x64" "2.4.14" - -"@biomejs/cli-darwin-arm64@2.4.14": - version "2.4.14" - resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.14.tgz#b026f36d3f6add2e712928f65e70b030abb62ef6" - integrity sha512-XvgoE9XOawUOQPdmvs4J7wPhi/DLwSCGks3AlPJDmh34O0awRTqCED1HRcRDdpf1Zrp4us4MGOOdIxNpbqNF5Q== - -"@biomejs/cli-darwin-x64@2.4.14": - version "2.4.14" - resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.14.tgz#bc4e2166ecc143641781e7093def0079fb870c86" - integrity sha512-jE7hKBCFhOx3uUh+ZkWBfOHxAcILPfhFplNkuID/eZeSTLHzfZzoZxW8fbqY9xXRnPi7jGNAf1iPVR+0yWsM/Q== - -"@biomejs/cli-linux-arm64-musl@2.4.14": - version "2.4.14" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.14.tgz#f2b5a52482b98c6bfe1399d0c4c001873740ccee" - integrity sha512-/z+6gqAqqUQTHazwStxSXKHg9b8UvqBmDFRp+c4wYbq2KXhELQDon9EoC9RpmQ8JWkqQx/lIUy/cs+MhzDZp6A== - -"@biomejs/cli-linux-arm64@2.4.14": - version "2.4.14" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.14.tgz#86c5195e69139eafbbabb9a285bcda9b737f3632" - integrity sha512-2TELhZnW5RSLL063l9rc5xLpA0ZIw0Ccwy/0q384rvNAgFw3yI76bd59547yxowdQr5MNPET/xDLrLuvgSeeWQ== - -"@biomejs/cli-linux-x64-musl@2.4.14": - version "2.4.14" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.14.tgz#0abae51ba32c6fdc9c8e273bc406245f660fc49f" - integrity sha512-R6BWgJdQOwW9ulJatuTVrQkjnODjqHZkKNOqb1sz++3Noe5LYd0i3PchnOBUCYAPHoPWHhjJqbdZlHEu0hpjdA== - -"@biomejs/cli-linux-x64@2.4.14": - version "2.4.14" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.14.tgz#31204057d50b0218b3f54614c7521f5530f0901c" - integrity sha512-zHrlQZDBDUz4OLAraYpWKcnLS6HOewBFWYOzY91d1ZjdqZwibOyb6BEu6WuWLugyo0P3riCmsbV9UqV1cSXwQg== - -"@biomejs/cli-win32-arm64@2.4.14": - version "2.4.14" - resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.14.tgz#1df473fa218e9c191b1de671daf45d739688af96" - integrity sha512-M3EH5hqOI/F/FUA2u4xcLoUgmxd218mvuj/6JL7Hv2toQvr2/AdOvKSpGkoRuWFCtQPVa+ZqkEV3Q5xBA9+XSA== - -"@biomejs/cli-win32-x64@2.4.14": - version "2.4.14" - resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.14.tgz#65d585b378f79aba1cddb1817d2c64880815639c" - integrity sha512-WL0EG5qE+EAKomGXbf2g6VnSKJhTL3tXC0QRzWRwA5VpjxNYa6H4P7ZWfymbGE4IhZZQi1KXQ2R0YjwInmz2fA== - -"@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-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== - -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== From a091ac8f1f98f863d2a78e06607da48407dc947f Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Sat, 2 May 2026 13:25:33 -0500 Subject: [PATCH 03/35] chore: add typescript deps, scripts, configs --- package.json | 11 ++++++++--- pnpm-lock.yaml | 25 ++++++++++++++++++++----- tsconfig.base.json | 16 ++++++++++++++++ tsconfig.dev.json | 8 ++++++++ tsconfig.prod.json | 9 +++++++++ 5 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 tsconfig.base.json create mode 100644 tsconfig.dev.json create mode 100644 tsconfig.prod.json diff --git a/package.json b/package.json index 9701c90..1f0b0f8 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,10 @@ "bugs": "https://github.com/acdvs/eslint-plugin-suitescript/issues", "main": "lib/index.js", "scripts": { - "build:docs": "node scripts/generate_docs.js", + "build": "tsc -p tsconfig.prod.json && tsc-alias -p tsconfig.prod.json", + "build:docs": "tsx scripts/generate-docs.ts", "check": "biome check", + "check:types": "tsc -p tsconfig.dev.json", "test": "mocha tests/** --recursive --reporter min" }, "files": [ @@ -36,9 +38,12 @@ "devDependencies": { "@biomejs/biome": "^2.4.14", "eslint": "^10.0.0", - "mocha": "^11.4.0" + "mocha": "^11.4.0", + "tsc-alias": "^1.8.17", + "tsx": "^4.21.0", + "typescript": "^5.9.3" }, "peerDependencies": { "eslint": ">=9.0.0" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a09fc0c..ee9a98a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,6 +15,9 @@ importers: '@biomejs/biome': specifier: ^2.4.14 version: 2.4.14 + '@types/node': + specifier: ^25.6.0 + version: 25.6.0 eslint: specifier: ^10.0.0 version: 10.3.0 @@ -28,8 +31,8 @@ importers: specifier: ^4.21.0 version: 4.21.0 typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^5.9.3 + version: 5.9.3 packages: @@ -325,6 +328,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/node@25.6.0': + resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -863,11 +869,14 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript@6.0.3: - resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1102,6 +1111,10 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/node@25.6.0': + dependencies: + undici-types: 7.19.2 + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: acorn: 8.16.0 @@ -1650,7 +1663,9 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript@6.0.3: {} + typescript@5.9.3: {} + + undici-types@7.19.2: {} uri-js@4.4.1: dependencies: diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..e687f25 --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "allowJs": true, + "exactOptionalPropertyTypes": true, + "isolatedModules": true, + "module": "commonjs", + "moduleDetection": "force", + "noUncheckedSideEffectImports": true, + "outDir": "dist", + "target": "es2020", + "types": [], + "skipLibCheck": true, + "strict": true + } +} diff --git a/tsconfig.dev.json b/tsconfig.dev.json new file mode 100644 index 0000000..96bb762 --- /dev/null +++ b/tsconfig.dev.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./tsconfig.base.json", + "compilerOptions": { + "noEmit": true + }, + "include": ["lib/**.ts", "scripts/**.ts", "tests/**.ts"] +} diff --git a/tsconfig.prod.json b/tsconfig.prod.json new file mode 100644 index 0000000..537ef0e --- /dev/null +++ b/tsconfig.prod.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "lib" + }, + "include": ["lib/**.ts"] +} From 46c7f0760d8fbbbc832ada09b560f4bf3839dcd8 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Sat, 2 May 2026 15:47:31 -0500 Subject: [PATCH 04/35] refactor: move doc generate script to ts --- package.json | 1 + scripts/generate-docs.ts | 97 ++++++++++++++++++++++++++++++++++++++++ scripts/generate_docs.js | 71 ----------------------------- tsconfig.base.json | 4 +- 4 files changed, 100 insertions(+), 73 deletions(-) create mode 100644 scripts/generate-docs.ts delete mode 100644 scripts/generate_docs.js diff --git a/package.json b/package.json index 1f0b0f8..486bc42 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ }, "devDependencies": { "@biomejs/biome": "^2.4.14", + "@types/node": "^25.6.0", "eslint": "^10.0.0", "mocha": "^11.4.0", "tsc-alias": "^1.8.17", diff --git a/scripts/generate-docs.ts b/scripts/generate-docs.ts new file mode 100644 index 0000000..57c0ee9 --- /dev/null +++ b/scripts/generate-docs.ts @@ -0,0 +1,97 @@ +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { moduleNames } from '../lib/util/modules'; +import { scriptTypes } from '../lib/util/script-types'; + +const SRC_DIR = './docs/src'; +const OUT_DIR = './docs/rules'; +const SCRIPT_NAME = path.basename(__filename); + +type DocReplaceOptions = Record; + +const docsToModify: Record = { + 'entry-points.md': { + old: '', + new: scriptTypes + .reduce((lines: string[], st) => { + lines.push(`- ${st.name}`); + st.entryPoints.forEach((ep) => (lines.push(` - ${ep}`))); + return lines; + }, []) + .join('\n'), + }, + 'module-vars.md': { + old: '', + new: moduleNames + .reduce((lines: string[], m) => { + lines.push(`- ${m}`); + return lines; + }, []) + .join('\n'), + }, + 'script-type.md': { + old: '', + new: scriptTypes + .reduce((lines: string[], st) => { + lines.push(`- ${st.name}`); + return lines; + }, []) + .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/tsconfig.base.json b/tsconfig.base.json index e687f25..a2b6ef6 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -4,12 +4,12 @@ "allowJs": true, "exactOptionalPropertyTypes": true, "isolatedModules": true, - "module": "commonjs", + "module": "nodenext", "moduleDetection": "force", + "moduleResolution": "nodenext", "noUncheckedSideEffectImports": true, "outDir": "dist", "target": "es2020", - "types": [], "skipLibCheck": true, "strict": true } From a23b943d6ab4d84291e639c2d52f003273ccf45f Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Sat, 2 May 2026 15:47:43 -0500 Subject: [PATCH 05/35] docs: update module vars --- docs/rules/module-vars.md | 2 ++ 1 file changed, 2 insertions(+) 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 From 6b454ae678f7c4f7b814a6678ab60d016ea53ceb Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Sat, 2 May 2026 16:49:11 -0500 Subject: [PATCH 06/35] refactor: move tests to typescript --- lib/rules/api-version.js | 60 ------------------- package.json | 1 + pnpm-lock.yaml | 11 ++++ tests/rule-tester.ts | 8 +++ .../rules/{api-version.js => api-version.ts} | 12 +--- .../{entry-points.js => entry-points.ts} | 28 ++++----- tests/rules/{log-args.js => log-args.ts} | 12 +--- .../rules/{module-vars.js => module-vars.ts} | 22 ++++--- .../rules/{no-amd-name.js => no-amd-name.ts} | 12 +--- ...o-extra-modules.js => no-extra-modules.ts} | 12 +--- ...valid-modules.js => no-invalid-modules.ts} | 12 +--- .../{no-log-module.js => no-log-module.ts} | 12 +--- ...-extensions.js => no-module-extensions.ts} | 12 +--- .../rules/{script-type.js => script-type.ts} | 20 +++---- 14 files changed, 66 insertions(+), 168 deletions(-) delete mode 100644 lib/rules/api-version.js create mode 100644 tests/rule-tester.ts rename tests/rules/{api-version.js => api-version.ts} (82%) rename tests/rules/{entry-points.js => entry-points.ts} (86%) rename tests/rules/{log-args.js => log-args.ts} (90%) rename tests/rules/{module-vars.js => module-vars.ts} (74%) rename tests/rules/{no-amd-name.js => no-amd-name.ts} (74%) rename tests/rules/{no-extra-modules.js => no-extra-modules.ts} (85%) rename tests/rules/{no-invalid-modules.js => no-invalid-modules.ts} (80%) rename tests/rules/{no-log-module.js => no-log-module.ts} (90%) rename tests/rules/{no-module-extensions.js => no-module-extensions.ts} (82%) rename tests/rules/{script-type.js => script-type.ts} (82%) diff --git a/lib/rules/api-version.js b/lib/rules/api-version.js deleted file mode 100644 index b883da7..0000000 --- a/lib/rules/api-version.js +++ /dev/null @@ -1,60 +0,0 @@ -'use strict'; - -const VERSION_TAG = '@NApiVersion'; -const VERSION_TAG_REGEX = /@NApiVersion(?: (\S+))?/; -const VERSIONS = ['1.0', '2.x', '2.0', '2.1']; - -module.exports = { - 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', - }, - schema: [], - messages: { - invalidValue: "Invalid @NApiVersion value '{{ value }}'", - noValue: 'No @NApiVersion value provided', - }, - }, - - create: (context) => ({ - Program: () => { - const sourceCode = context.sourceCode; - const comment = sourceCode - .getAllComments() - .find((node) => VERSION_TAG_REGEX.test(node.value)); - - if (!comment || comment.type !== 'Block') { - return; - } - - 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; - - if (!version) { - context.report({ - messageId: 'noValue', - loc: { - start: sourceCode.getLocFromIndex(tagIndex), - end: sourceCode.getLocFromIndex(tagIndex + VERSION_TAG.length), - }, - }); - } else if (!VERSIONS.includes(version)) { - const typeIndex = tagIndex + VERSION_TAG.length + 1; - - context.report({ - messageId: 'invalidValue', - data: { - value: version, - }, - loc: { - start: sourceCode.getLocFromIndex(typeIndex), - end: sourceCode.getLocFromIndex(typeIndex + version.length), - }, - }); - } - }, - }), -}; diff --git a/package.json b/package.json index 486bc42..339adde 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ }, "devDependencies": { "@biomejs/biome": "^2.4.14", + "@types/eslint": "^9.6.1", "@types/node": "^25.6.0", "eslint": "^10.0.0", "mocha": "^11.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee9a98a..c37aab0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,6 +15,9 @@ importers: '@biomejs/biome': specifier: ^2.4.14 version: 2.4.14 + '@types/eslint': + specifier: ^9.6.1 + version: 9.6.1 '@types/node': specifier: ^25.6.0 version: 25.6.0 @@ -319,6 +322,9 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} @@ -1105,6 +1111,11 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@types/esrecurse@4.3.1': {} '@types/estree@1.0.8': {} diff --git a/tests/rule-tester.ts b/tests/rule-tester.ts new file mode 100644 index 0000000..2318c99 --- /dev/null +++ b/tests/rule-tester.ts @@ -0,0 +1,8 @@ +import { RuleTester } from 'eslint'; + +export default new RuleTester({ + languageOptions: { + ecmaVersion: 2015, + sourceType: 'module', + }, +}); diff --git a/tests/rules/api-version.js b/tests/rules/api-version.ts similarity index 82% rename from tests/rules/api-version.js rename to tests/rules/api-version.ts index e3d5a33..11e04b2 100644 --- a/tests/rules/api-version.js +++ b/tests/rules/api-version.ts @@ -1,14 +1,6 @@ -'use strict'; +import rule from '../../lib/rules/api-version'; +import ruleTester from '../rule-tester'; -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: [ { diff --git a/tests/rules/entry-points.js b/tests/rules/entry-points.ts similarity index 86% rename from tests/rules/entry-points.js rename to tests/rules/entry-points.ts index 86ee0bc..a9780e2 100644 --- a/tests/rules/entry-points.js +++ b/tests/rules/entry-points.ts @@ -1,14 +1,6 @@ -'use strict'; +import rule from '../../lib/rules/entry-points'; +import ruleTester from '../rule-tester'; -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: [ { @@ -227,7 +219,9 @@ define([], function() { return exports; }); `, - errors: [{ messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }], + errors: [ + { messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }, + ], }, { code: ` @@ -241,7 +235,9 @@ define([], function() { return exports; }); `, - errors: [{ messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }], + errors: [ + { messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }, + ], }, { code: ` @@ -252,7 +248,9 @@ define([], (record) => { return { getInputData, map, reduce, summarize }; }); `, - errors: [{ messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }], + errors: [ + { messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }, + ], }, { code: ` @@ -261,7 +259,9 @@ define([], (record) => { */ define([], () => ({ notAnEntryPoint: x })); `, - errors: [{ messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }], + errors: [ + { messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }, + ], }, ], }); diff --git a/tests/rules/log-args.js b/tests/rules/log-args.ts similarity index 90% rename from tests/rules/log-args.js rename to tests/rules/log-args.ts index a396ae2..da4481a 100644 --- a/tests/rules/log-args.js +++ b/tests/rules/log-args.ts @@ -1,14 +1,6 @@ -'use strict'; +import rule from '../../lib/rules/log-args'; +import ruleTester from '../rule-tester'; -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: [ { diff --git a/tests/rules/module-vars.js b/tests/rules/module-vars.ts similarity index 74% rename from tests/rules/module-vars.js rename to tests/rules/module-vars.ts index 57098d5..8f153d3 100644 --- a/tests/rules/module-vars.js +++ b/tests/rules/module-vars.ts @@ -1,14 +1,6 @@ -'use strict'; +import rule from '../../lib/rules/module-vars'; +import ruleTester from '../rule-tester'; -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: [ { @@ -42,14 +34,20 @@ ruleTester.run('module-vars', rule, { code: 'define(["N/record"], function(test) {});', options: [{ 'N/record': 'record' }], errors: [ - { messageId: 'useCorrectName', data: { module: 'N/record', id: 'record' } }, + { + 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' } }, + { + messageId: 'useCorrectName', + data: { module: 'N/record', id: 'record' }, + }, ], }, ], diff --git a/tests/rules/no-amd-name.js b/tests/rules/no-amd-name.ts similarity index 74% rename from tests/rules/no-amd-name.js rename to tests/rules/no-amd-name.ts index 9fbd76d..e3a1466 100644 --- a/tests/rules/no-amd-name.js +++ b/tests/rules/no-amd-name.ts @@ -1,14 +1,6 @@ -'use strict'; +import rule from '../../lib/rules/no-amd-name'; +import ruleTester from '../rule-tester'; -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: [ { diff --git a/tests/rules/no-extra-modules.js b/tests/rules/no-extra-modules.ts similarity index 85% rename from tests/rules/no-extra-modules.js rename to tests/rules/no-extra-modules.ts index 2a5f8c6..593ce01 100644 --- a/tests/rules/no-extra-modules.js +++ b/tests/rules/no-extra-modules.ts @@ -1,14 +1,6 @@ -'use strict'; +import rule from '../../lib/rules/no-extra-modules'; +import ruleTester from '../rule-tester'; -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: [ { diff --git a/tests/rules/no-invalid-modules.js b/tests/rules/no-invalid-modules.ts similarity index 80% rename from tests/rules/no-invalid-modules.js rename to tests/rules/no-invalid-modules.ts index a5aad1e..6f427db 100644 --- a/tests/rules/no-invalid-modules.js +++ b/tests/rules/no-invalid-modules.ts @@ -1,14 +1,6 @@ -'use strict'; +import rule from '../../lib/rules/no-invalid-modules'; +import ruleTester from '../rule-tester'; -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: [ { diff --git a/tests/rules/no-log-module.js b/tests/rules/no-log-module.ts similarity index 90% rename from tests/rules/no-log-module.js rename to tests/rules/no-log-module.ts index faa71e9..cd6b5ae 100644 --- a/tests/rules/no-log-module.js +++ b/tests/rules/no-log-module.ts @@ -1,14 +1,6 @@ -'use strict'; +import rule from '../../lib/rules/no-log-module'; +import ruleTester from '../rule-tester'; -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: [ { diff --git a/tests/rules/no-module-extensions.js b/tests/rules/no-module-extensions.ts similarity index 82% rename from tests/rules/no-module-extensions.js rename to tests/rules/no-module-extensions.ts index 011b7d8..b3e8558 100644 --- a/tests/rules/no-module-extensions.js +++ b/tests/rules/no-module-extensions.ts @@ -1,14 +1,6 @@ -'use strict'; +import rule from '../../lib/rules/no-module-extensions'; +import ruleTester from '../rule-tester'; -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: [ { diff --git a/tests/rules/script-type.js b/tests/rules/script-type.ts similarity index 82% rename from tests/rules/script-type.js rename to tests/rules/script-type.ts index 803c217..afb95f3 100644 --- a/tests/rules/script-type.js +++ b/tests/rules/script-type.ts @@ -1,14 +1,6 @@ -'use strict'; +import rule from '../../lib/rules/script-type'; +import ruleTester from '../rule-tester'; -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: [ { @@ -155,7 +147,9 @@ ruleTester.run('script-type', rule, { * @NScriptType SuiteletScript */ `, - errors: [{ messageId: 'invalidValue', data: { value: 'SuiteletScript' } }], + errors: [ + { messageId: 'invalidValue', data: { value: 'SuiteletScript' } }, + ], }, { code: ` @@ -166,7 +160,9 @@ ruleTester.run('script-type', rule, { * @NScriptType Suitelet */ `, - errors: [{ messageId: 'invalidValue', data: { value: 'SuiteletScript' } }], + errors: [ + { messageId: 'invalidValue', data: { value: 'SuiteletScript' } }, + ], }, ], }); From 94e2762a67d5ea9e53ad7ec883cd3ffd08d18146 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Sat, 2 May 2026 16:59:50 -0500 Subject: [PATCH 07/35] chore: move testing to ts-mocha --- package.json | 4 +- pnpm-lock.yaml | 142 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 141 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 339adde..5376851 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "build:docs": "tsx scripts/generate-docs.ts", "check": "biome check", "check:types": "tsc -p tsconfig.dev.json", - "test": "mocha tests/** --recursive --reporter min" + "test": "ts-mocha -p tsconfig.dev.json tests/** --recursive --reporter min" }, "files": [ "LICENSE", @@ -40,7 +40,7 @@ "@types/eslint": "^9.6.1", "@types/node": "^25.6.0", "eslint": "^10.0.0", - "mocha": "^11.4.0", + "ts-mocha": "^11.1.0", "tsc-alias": "^1.8.17", "tsx": "^4.21.0", "typescript": "^5.9.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c37aab0..64993e9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,9 +24,9 @@ importers: eslint: specifier: ^10.0.0 version: 10.3.0 - mocha: - specifier: ^11.4.0 - version: 11.7.5 + ts-mocha: + specifier: ^11.1.0 + version: 11.1.0(mocha@11.7.5)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3)) tsc-alias: specifier: ^1.8.17 version: 1.8.17 @@ -96,6 +96,10 @@ packages: cpu: [x64] os: [win32] + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.27.4': resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} engines: {node: '>=18'} @@ -306,6 +310,16 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -322,6 +336,18 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} @@ -342,6 +368,10 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} + engines: {node: '>=0.4.0'} + acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} @@ -370,6 +400,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -433,6 +466,9 @@ packages: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -453,6 +489,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + diff@4.0.4: + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} + engines: {node: '>=0.3.1'} + diff@7.0.0: resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} @@ -686,6 +726,9 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -861,6 +904,32 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + ts-mocha@11.1.0: + resolution: {integrity: sha512-yT7FfzNRCu8ZKkYvAOiH01xNma/vLq6Vit7yINKYFNVP8e5UyrYXSOMIipERTpzVKJQ4Qcos5bQo1tNERNZevQ==} + engines: {node: '>= 6.X.X'} + hasBin: true + peerDependencies: + mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X + ts-node: ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X + tsconfig-paths: ^4.X.X + peerDependenciesMeta: + tsconfig-paths: + optional: true + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + tsc-alias@1.8.17: resolution: {integrity: sha512-EIduCZHqbNwPm8BZYfq1aD7BQ697A4h6uSGMOFQfYGoQwfrYFTKwYfy9Bv42YxHkduVBcn9Zx0DkX111DKskyg==} engines: {node: '>=16.20.2'} @@ -886,6 +955,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -922,6 +994,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -963,6 +1039,10 @@ snapshots: '@biomejs/cli-win32-x64@2.4.14': optional: true + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + '@esbuild/aix-ppc64@0.27.4': optional: true @@ -1096,6 +1176,15 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1111,6 +1200,14 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@tsconfig/node10@1.0.12': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + '@types/eslint@9.6.1': dependencies: '@types/estree': 1.0.8 @@ -1130,6 +1227,10 @@ snapshots: dependencies: acorn: 8.16.0 + acorn-walk@8.3.5: + dependencies: + acorn: 8.16.0 + acorn@8.16.0: {} ajv@6.14.0: @@ -1154,6 +1255,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.2 + arg@4.1.3: {} + argparse@2.0.1: {} array-union@2.1.0: {} @@ -1215,6 +1318,8 @@ snapshots: commander@9.5.0: {} + create-require@1.1.1: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -1231,6 +1336,8 @@ snapshots: deep-is@0.1.4: {} + diff@4.0.4: {} + diff@7.0.0: {} dir-glob@3.0.1: @@ -1488,6 +1595,8 @@ snapshots: lru-cache@10.4.3: {} + make-error@1.3.6: {} + merge2@1.4.1: {} micromatch@4.0.8: @@ -1653,6 +1762,29 @@ snapshots: dependencies: is-number: 7.0.0 + ts-mocha@11.1.0(mocha@11.7.5)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3)): + dependencies: + mocha: 11.7.5 + ts-node: 10.9.2(@types/node@25.6.0)(typescript@5.9.3) + + ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 25.6.0 + acorn: 8.16.0 + acorn-walk: 8.3.5 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + tsc-alias@1.8.17: dependencies: chokidar: 3.6.0 @@ -1682,6 +1814,8 @@ snapshots: dependencies: punycode: 2.3.1 + v8-compile-cache-lib@3.0.1: {} + which@2.0.2: dependencies: isexe: 2.0.0 @@ -1723,4 +1857,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yn@3.1.1: {} + yocto-queue@0.1.0: {} From 7fe6daa1e52a6607b6ef7821b51d29fc0bca5db0 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Sat, 2 May 2026 17:28:00 -0500 Subject: [PATCH 08/35] refactor: move rules to typescript --- lib/rules/api-version.ts | 61 +++++++++++++++++++ .../{entry-points.js => entry-points.ts} | 28 +++++---- lib/rules/{log-args.js => log-args.ts} | 28 +++++---- lib/rules/{module-vars.js => module-vars.ts} | 21 ++++--- lib/rules/{no-amd-name.js => no-amd-name.ts} | 15 ++--- ...o-extra-modules.js => no-extra-modules.ts} | 15 ++--- ...valid-modules.js => no-invalid-modules.ts} | 15 ++--- .../{no-log-module.js => no-log-module.ts} | 22 ++++--- ...-extensions.js => no-module-extensions.ts} | 19 +++--- lib/rules/{script-type.js => script-type.ts} | 10 +-- package.json | 1 + pnpm-lock.yaml | 3 + 12 files changed, 160 insertions(+), 78 deletions(-) create mode 100644 lib/rules/api-version.ts rename lib/rules/{entry-points.js => entry-points.ts} (77%) rename lib/rules/{log-args.js => log-args.ts} (76%) rename lib/rules/{module-vars.js => module-vars.ts} (73%) rename lib/rules/{no-amd-name.js => no-amd-name.ts} (69%) rename lib/rules/{no-extra-modules.js => no-extra-modules.ts} (81%) rename lib/rules/{no-invalid-modules.js => no-invalid-modules.ts} (73%) rename lib/rules/{no-log-module.js => no-log-module.ts} (63%) rename lib/rules/{no-module-extensions.js => no-module-extensions.ts} (75%) rename lib/rules/{script-type.js => script-type.ts} (86%) diff --git a/lib/rules/api-version.ts b/lib/rules/api-version.ts new file mode 100644 index 0000000..b0c5454 --- /dev/null +++ b/lib/rules/api-version.ts @@ -0,0 +1,61 @@ +import type { Rule } from 'eslint'; + +const VERSION_TAG = '@NApiVersion'; +const VERSION_TAG_REGEX = /@NApiVersion(?: (\S+))?/; +const VERSIONS = ['1.0', '2.x', '2.0', '2.1']; + +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', + }, + schema: [], + messages: { + invalidValue: "Invalid @NApiVersion value '{{ value }}'", + noValue: 'No @NApiVersion value provided', + }, + }, + create: (context) => ({ + Program: () => { + const sourceCode = context.sourceCode; + const comment = sourceCode + .getAllComments() + .find((node) => VERSION_TAG_REGEX.test(node.value)); + + if (!comment?.loc || comment.type !== 'Block') { + return; + } + + 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; + + if (!version) { + context.report({ + messageId: 'noValue', + loc: { + start: sourceCode.getLocFromIndex(tagIndex), + end: sourceCode.getLocFromIndex(tagIndex + VERSION_TAG.length), + }, + }); + } else if (!VERSIONS.includes(version)) { + const typeIndex = tagIndex + VERSION_TAG.length + 1; + + context.report({ + messageId: 'invalidValue', + data: { + value: version, + }, + loc: { + start: sourceCode.getLocFromIndex(typeIndex), + end: sourceCode.getLocFromIndex(typeIndex + version.length), + }, + }); + } + }, + }), +}; + +export default rule; diff --git a/lib/rules/entry-points.js b/lib/rules/entry-points.ts similarity index 77% rename from lib/rules/entry-points.js rename to lib/rules/entry-points.ts index d9eed0c..4332b15 100644 --- a/lib/rules/entry-points.js +++ b/lib/rules/entry-points.ts @@ -1,12 +1,13 @@ -'use strict'; +import type { Rule } from 'eslint'; +import type { CallExpression } from 'estree'; +import { getScriptType } from '../util/metadata'; -const { getScriptType } = require('../util/metadata'); - -module.exports = { +const rule: Rule.RuleModule = { meta: { type: 'problem', docs: { - description: 'Enforce inclusion of at least one entry point based on @NScriptType', + 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', }, schema: [], @@ -14,13 +15,12 @@ module.exports = { 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) { + if (!scriptType?.value || !scriptType.def) { return; } @@ -40,10 +40,10 @@ module.exports = { const returnStatement = hasBlockBody && callbackBody.find((n) => n.type === 'ReturnStatement'); const returnArgument = hasBlockBody - ? returnStatement && returnStatement.argument + ? returnStatement?.argument : callback.body; - if (returnArgument && returnArgument.type === 'ObjectExpression') { + if (returnArgument?.type === 'ObjectExpression') { for (const property of returnArgument.properties) { if ( scriptType.def.entryPoints.includes(property.key.name) && @@ -64,7 +64,9 @@ module.exports = { n.expression.type === 'AssignmentExpression' && n.expression.left.type === 'MemberExpression' && n.expression.left.object.name === returnArgument.name && - scriptType.def.entryPoints.includes(n.expression.left.property.name) + scriptType.def.entryPoints.includes( + n.expression.left.property.name, + ), ); if (returnAssignments.length > 0) { @@ -88,3 +90,5 @@ module.exports = { }, }), }; + +export default rule; diff --git a/lib/rules/log-args.js b/lib/rules/log-args.ts similarity index 76% rename from lib/rules/log-args.js rename to lib/rules/log-args.ts index 9458b5f..7219f31 100644 --- a/lib/rules/log-args.js +++ b/lib/rules/log-args.ts @@ -1,11 +1,10 @@ -'use strict'; - -const moduleUtil = require('../util/modules'); -const objectUtil = require('../util/objects'); +import type { Rule } from 'eslint'; +import { getModuleNodePair } from '../util/modules'; +import { getPropByKey } from '../util/objects'; const LOG_MEMBERS = ['debug', 'audit', 'error', 'emergency']; -module.exports = { +const rule: Rule.RuleModule = { meta: { type: 'suggestion', docs: { @@ -31,19 +30,24 @@ module.exports = { }, ], }, - create: (context) => { let logModule; return { 'CallExpression[callee.name=define]': (node) => { - logModule = moduleUtil.getModuleNodePair(node, 'N/log'); + logModule = getModuleNodePair(node, 'N/log'); }, 'CallExpression[callee.object.type=Identifier]': (node) => { - let config = context.options[0] || { requireTitle: true, requireDetails: true }; + const config = context.options[0] || { + requireTitle: true, + requireDetails: true, + }; const args = node.arguments; - if (args.length === 0 || (!config.requireTitle && !config.requireDetails)) { + if ( + args.length === 0 || + (!config.requireTitle && !config.requireDetails) + ) { return; } @@ -60,7 +64,7 @@ module.exports = { if ( config.requireTitle && args[0].type === 'ObjectExpression' && - !objectUtil.getPropByKey(args[0], 'title') + !getPropByKey(args[0], 'title') ) { context.report({ node, @@ -75,7 +79,7 @@ module.exports = { config.requireDetails && ((args[0].type !== 'ObjectExpression' && !args[1]) || (args[0].type === 'ObjectExpression' && - !objectUtil.getPropByKey(args[0], 'details'))) + !getPropByKey(args[0], 'details'))) ) { context.report({ node, @@ -89,3 +93,5 @@ module.exports = { }; }, }; + +export default rule; diff --git a/lib/rules/module-vars.js b/lib/rules/module-vars.ts similarity index 73% rename from lib/rules/module-vars.js rename to lib/rules/module-vars.ts index b5b828e..2af5a1b 100644 --- a/lib/rules/module-vars.js +++ b/lib/rules/module-vars.ts @@ -1,13 +1,13 @@ -'use strict'; +import type { Rule } from 'eslint'; +import type { CallExpression } from 'estree'; +import { getModules, moduleNames } from '../util/modules'; -const moduleUtil = require('../util/modules'); -const { moduleNames } = require('../util/modules'); - -module.exports = { +const rule: Rule.RuleModule = { meta: { type: 'suggestion', docs: { - description: 'Enforce correct module identifiers for each configured module', + 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: { @@ -21,13 +21,12 @@ module.exports = { }, ], }, - create: (context) => ({ - 'CallExpression[callee.name=define]': (node) => { + 'CallExpression[callee.name=define]': (node: CallExpression) => { if (!context.options[0]) return; const config = context.options[0]; - const modules = moduleUtil.getModules(node); + const modules = getModules(node); if (modules.varCount === 0) return; @@ -56,7 +55,7 @@ module.exports = { * @returns {Object} */ function getSchemaProperties() { - let properties = moduleNames.map((name) => { + const properties = moduleNames.map((name) => { return { [name]: { type: 'string', @@ -66,3 +65,5 @@ function getSchemaProperties() { return Object.assign({}, ...properties); } + +export default rule; diff --git a/lib/rules/no-amd-name.js b/lib/rules/no-amd-name.ts similarity index 69% rename from lib/rules/no-amd-name.js rename to lib/rules/no-amd-name.ts index 6bbd5c5..e5092c5 100644 --- a/lib/rules/no-amd-name.js +++ b/lib/rules/no-amd-name.ts @@ -1,6 +1,7 @@ -'use strict'; +import type { Rule } from 'eslint'; +import type { CallExpression } from 'estree'; -module.exports = { +const rule: Rule.RuleModule = { meta: { type: 'suggestion', docs: { @@ -13,9 +14,8 @@ module.exports = { }, fixable: 'code', }, - create: (context) => ({ - 'CallExpression[callee.name=define]': (node) => { + 'CallExpression[callee.name=define]': (node: CallExpression) => { if (node.arguments.length !== 3) { return; } @@ -27,11 +27,12 @@ module.exports = { context.report({ node: arg1, messageId: 'noModuleName', - fix: function (fixer) { - return fixer.replaceTextRange([arg1.range[0], arg2.range[0]], ''); - }, + fix: (fixer) => + fixer.replaceTextRange([arg1.range[0], arg2.range[0]], ''), }); } }, }), }; + +export default rule; diff --git a/lib/rules/no-extra-modules.js b/lib/rules/no-extra-modules.ts similarity index 81% rename from lib/rules/no-extra-modules.js rename to lib/rules/no-extra-modules.ts index c9f18b0..431fa2f 100644 --- a/lib/rules/no-extra-modules.js +++ b/lib/rules/no-extra-modules.ts @@ -1,8 +1,8 @@ -'use strict'; +import type { Rule } from 'eslint'; +import type { CallExpression } from 'estree'; +import { getModules } from '../util/modules'; -const moduleUtil = require('../util/modules'); - -module.exports = { +const rule: Rule.RuleModule = { meta: { type: 'problem', docs: { @@ -15,10 +15,9 @@ module.exports = { excessVar: "Excess module identifier '{{ var }}'", }, }, - create: (context) => ({ - 'CallExpression[callee.name=define]': (node) => { - const modules = moduleUtil.getModules(node); + 'CallExpression[callee.name=define]': (node: CallExpression) => { + const modules = getModules(node); const nameCount = modules.nameCount; const varCount = modules.varCount; @@ -50,3 +49,5 @@ module.exports = { }, }), }; + +export default rule; diff --git a/lib/rules/no-invalid-modules.js b/lib/rules/no-invalid-modules.ts similarity index 73% rename from lib/rules/no-invalid-modules.js rename to lib/rules/no-invalid-modules.ts index f32988a..c076801 100644 --- a/lib/rules/no-invalid-modules.js +++ b/lib/rules/no-invalid-modules.ts @@ -1,8 +1,8 @@ -'use strict'; +import type { Rule } from 'eslint'; +import type { CallExpression } from 'estree'; +import { getModules } from '../util/modules'; -const moduleUtil = require('../util/modules'); - -module.exports = { +const rule: Rule.RuleModule = { meta: { type: 'problem', docs: { @@ -14,13 +14,12 @@ module.exports = { invalidModule: "Invalid NetSuite module '{{ module }}'", }, }, - create: (context) => { let invalidModuleNodes = []; return { - 'CallExpression[callee.name=define]': (node) => { - const modules = moduleUtil.getModules(node).list; + 'CallExpression[callee.name=define]': (node: CallExpression) => { + const modules = getModules(node).list; invalidModuleNodes = modules .filter((m) => !m.isValid && m.nodes.name) .map((m) => m.nodes.name); @@ -38,3 +37,5 @@ module.exports = { }; }, }; + +export default rule; diff --git a/lib/rules/no-log-module.js b/lib/rules/no-log-module.ts similarity index 63% rename from lib/rules/no-log-module.js rename to lib/rules/no-log-module.ts index 447f621..f9ea76d 100644 --- a/lib/rules/no-log-module.js +++ b/lib/rules/no-log-module.ts @@ -1,13 +1,14 @@ -'use strict'; +import type { Rule } from 'eslint'; +import type { CallExpression } from 'estree'; +import { getScriptType } from '../util/metadata'; +import { getModuleNodePair } from '../util/modules'; -const moduleUtil = require('../util/modules'); -const metadataUtil = require('../util/metadata'); - -module.exports = { +const rule: Rule.RuleModule = { meta: { type: 'suggestion', docs: { - description: 'Restrict loading of the N/log module in favor of global log', + 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: { @@ -25,13 +26,12 @@ module.exports = { }, ], }, - create: (context) => ({ - 'CallExpression[callee.name=define]': (node) => { + 'CallExpression[callee.name=define]': (node: CallExpression) => { const config = context.options[0] || { allowInClientScripts: true }; - const logModule = moduleUtil.getModuleNodePair(node, 'N/log'); - const scriptType = metadataUtil.getScriptType(context); + const logModule = getModuleNodePair(node, 'N/log'); + const scriptType = getScriptType(context); const isClientScript = scriptType && scriptType.value === 'ClientScript'; if (isClientScript && config.allowInClientScripts) { @@ -47,3 +47,5 @@ module.exports = { }, }), }; + +export default rule; diff --git a/lib/rules/no-module-extensions.js b/lib/rules/no-module-extensions.ts similarity index 75% rename from lib/rules/no-module-extensions.js rename to lib/rules/no-module-extensions.ts index bda20ef..e41cfaf 100644 --- a/lib/rules/no-module-extensions.js +++ b/lib/rules/no-module-extensions.ts @@ -1,10 +1,10 @@ -'use strict'; - -const moduleUtil = require('../util/modules'); +import type { Rule } from 'eslint'; +import type { CallExpression } from 'estree'; +import { getModules } from '../util/modules'; const INVALID_MODULE_REGEX = /\.js/; -module.exports = { +const rule: Rule.RuleModule = { meta: { type: 'problem', docs: { @@ -17,13 +17,12 @@ module.exports = { }, fixable: 'code', }, - create: (context) => { let invalidModuleNodes = []; return { - 'CallExpression[callee.name=define]': (node) => { - const modules = moduleUtil.getModules(node).list; + 'CallExpression[callee.name=define]': (node: CallExpression) => { + const modules = getModules(node).list; invalidModuleNodes = modules .filter((m) => INVALID_MODULE_REGEX.test(m.name)) @@ -33,10 +32,10 @@ module.exports = { context.report({ node: invalidModuleNode, messageId: 'invalidModuleExtension', - fix: function (fixer) { + fix: (fixer) => { const fixedModuleName = invalidModuleNode.raw.replace( INVALID_MODULE_REGEX, - '' + '', ); return fixer.replaceText(invalidModuleNode, fixedModuleName); }, @@ -46,3 +45,5 @@ module.exports = { }; }, }; + +export default rule; diff --git a/lib/rules/script-type.js b/lib/rules/script-type.ts similarity index 86% rename from lib/rules/script-type.js rename to lib/rules/script-type.ts index c40db40..c171cf8 100644 --- a/lib/rules/script-type.js +++ b/lib/rules/script-type.ts @@ -1,8 +1,7 @@ -'use strict'; +import type { Rule } from 'eslint'; +import { getScriptType } from '../util/metadata'; -const { getScriptType } = require('../util/metadata'); - -module.exports = { +const rule: Rule.RuleModule = { meta: { type: 'problem', docs: { @@ -15,7 +14,6 @@ module.exports = { noValue: 'No @NScriptType value provided', }, }, - create: (context) => ({ Program: () => { const scriptType = getScriptType(context); @@ -39,3 +37,5 @@ module.exports = { }, }), }; + +export default rule; diff --git a/package.json b/package.json index 5376851..089f46b 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "devDependencies": { "@biomejs/biome": "^2.4.14", "@types/eslint": "^9.6.1", + "@types/estree": "^1.0.8", "@types/node": "^25.6.0", "eslint": "^10.0.0", "ts-mocha": "^11.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 64993e9..477bdbb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,6 +18,9 @@ importers: '@types/eslint': specifier: ^9.6.1 version: 9.6.1 + '@types/estree': + specifier: ^1.0.8 + version: 1.0.8 '@types/node': specifier: ^25.6.0 version: 25.6.0 From c8dc47412d4a2a18d507416dee88678cbedb34f1 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Mon, 25 May 2026 20:24:02 -0500 Subject: [PATCH 09/35] refactor: move utils to typescript --- lib/rules/entry-points.ts | 2 +- lib/rules/log-args.ts | 3 +- lib/rules/module-vars.ts | 2 +- lib/rules/no-invalid-modules.ts | 2 +- lib/rules/no-log-module.ts | 4 +- lib/rules/script-type.ts | 2 +- lib/util/arrays.js | 29 ------- lib/util/objects.js | 31 ------- lib/{util/globals.js => utils/globals.ts} | 4 +- lib/{util/metadata.js => utils/metadata.ts} | 26 +++--- lib/{util/modules.js => utils/modules.ts} | 84 ++++++++----------- lib/utils/objects.ts | 40 +++++++++ .../script-types.js => utils/script-types.ts} | 10 ++- scripts/generate-docs.ts | 4 +- 14 files changed, 103 insertions(+), 140 deletions(-) delete mode 100644 lib/util/arrays.js delete mode 100644 lib/util/objects.js rename lib/{util/globals.js => utils/globals.ts} (99%) rename lib/{util/metadata.js => utils/metadata.ts} (68%) rename lib/{util/modules.js => utils/modules.ts} (65%) create mode 100644 lib/utils/objects.ts rename lib/{util/script-types.js => utils/script-types.ts} (92%) diff --git a/lib/rules/entry-points.ts b/lib/rules/entry-points.ts index 4332b15..5c781f1 100644 --- a/lib/rules/entry-points.ts +++ b/lib/rules/entry-points.ts @@ -1,6 +1,6 @@ import type { Rule } from 'eslint'; import type { CallExpression } from 'estree'; -import { getScriptType } from '../util/metadata'; +import { getScriptType } from '../utils/metadata'; const rule: Rule.RuleModule = { meta: { diff --git a/lib/rules/log-args.ts b/lib/rules/log-args.ts index 7219f31..5466eb4 100644 --- a/lib/rules/log-args.ts +++ b/lib/rules/log-args.ts @@ -1,6 +1,5 @@ import type { Rule } from 'eslint'; -import { getModuleNodePair } from '../util/modules'; -import { getPropByKey } from '../util/objects'; +import { getPropByKey } from '../utils/objects'; const LOG_MEMBERS = ['debug', 'audit', 'error', 'emergency']; diff --git a/lib/rules/module-vars.ts b/lib/rules/module-vars.ts index 2af5a1b..14deca4 100644 --- a/lib/rules/module-vars.ts +++ b/lib/rules/module-vars.ts @@ -1,6 +1,6 @@ import type { Rule } from 'eslint'; import type { CallExpression } from 'estree'; -import { getModules, moduleNames } from '../util/modules'; +import { getModules, moduleNames } from '../utils/modules'; const rule: Rule.RuleModule = { meta: { diff --git a/lib/rules/no-invalid-modules.ts b/lib/rules/no-invalid-modules.ts index c076801..bc0add3 100644 --- a/lib/rules/no-invalid-modules.ts +++ b/lib/rules/no-invalid-modules.ts @@ -1,6 +1,6 @@ import type { Rule } from 'eslint'; import type { CallExpression } from 'estree'; -import { getModules } from '../util/modules'; +import { getModules } from '../utils/modules'; const rule: Rule.RuleModule = { meta: { diff --git a/lib/rules/no-log-module.ts b/lib/rules/no-log-module.ts index f9ea76d..c5636cd 100644 --- a/lib/rules/no-log-module.ts +++ b/lib/rules/no-log-module.ts @@ -1,7 +1,7 @@ import type { Rule } from 'eslint'; import type { CallExpression } from 'estree'; -import { getScriptType } from '../util/metadata'; -import { getModuleNodePair } from '../util/modules'; +import { getScriptType } from '../utils/metadata'; +import { getModuleNodePair } from '../utils/modules'; const rule: Rule.RuleModule = { meta: { diff --git a/lib/rules/script-type.ts b/lib/rules/script-type.ts index c171cf8..6318356 100644 --- a/lib/rules/script-type.ts +++ b/lib/rules/script-type.ts @@ -1,5 +1,5 @@ import type { Rule } from 'eslint'; -import { getScriptType } from '../util/metadata'; +import { getScriptType } from '../utils/metadata'; const rule: Rule.RuleModule = { meta: { 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/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/util/metadata.js b/lib/utils/metadata.ts similarity index 68% rename from lib/util/metadata.js rename to lib/utils/metadata.ts index e18ff9e..7368f71 100644 --- a/lib/util/metadata.js +++ b/lib/utils/metadata.ts @@ -1,26 +1,24 @@ -'use strict'; - -const { getScriptTypeDef } = require('./script-types'); +import type { Rule } from 'eslint'; +import { getScriptTypeDef } from './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) { +function getScriptType(context: Rule.RuleContext) { const sourceCode = context.sourceCode; const comment = sourceCode .getAllComments() .find((node) => SCRIPT_TAG_REGEX.test(node.value)); - if (!comment || comment.type !== 'Block') { - return null; + if (!comment?.loc || comment.type !== 'Block') { + return; } - const scriptType = comment.value.match(SCRIPT_TAG_REGEX)[1]; + const scriptType = comment.value.match(SCRIPT_TAG_REGEX)?.[1]; + + if (!scriptType) { + return; + } const commentIndex = sourceCode.getIndexFromLoc(comment.loc.start) + 1; const tagIndex = commentIndex + comment.value.indexOf(SCRIPT_TAG) + 1; @@ -42,6 +40,4 @@ function getScriptType(context) { }; } -module.exports = { - getScriptType, -}; +export { getScriptType }; diff --git a/lib/util/modules.js b/lib/utils/modules.ts similarity index 65% rename from lib/util/modules.js rename to lib/utils/modules.ts index ffab333..4086afc 100644 --- a/lib/util/modules.js +++ b/lib/utils/modules.ts @@ -1,4 +1,15 @@ -'use strict'; +import type { JSSyntaxElement } from 'eslint'; +import type { CallExpression } from 'estree'; + +type Module = { + name: string; + variable: string; + nodes: { + name: JSSyntaxElement | null; + variable: JSSyntaxElement | null; + }; + isValid: boolean; +}; const N_MODULE_REGEX = /^N\//; const MODULES = { @@ -59,22 +70,14 @@ const MODULES = { 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, - }; +function getModules(defineCallNode: CallExpression) { + const modules: Module[] = []; + + let nameCount = 0; + let varCount = 0; if ( - defineCallNode && - defineCallNode.type === 'CallExpression' && + defineCallNode?.type === 'CallExpression' && defineCallNode.callee.name === 'define' ) { const argCount = defineCallNode.arguments.length; @@ -94,17 +97,17 @@ function getModules(defineCallNode) { return modules; } - modules.nameCount = moduleList.elements.length; - modules.varCount = callback.params.length; + 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({ + modules.push({ name: nameNode ? nameNode.value : null, variable: varNode ? varNode.name : null, nodes: { @@ -113,7 +116,8 @@ function getModules(defineCallNode) { }, isValid: !!nameNode && - (moduleNames.includes(nameNode.value) || !N_MODULE_REGEX.test(nameNode.value)), + (moduleNames.includes(nameNode.value) || + !N_MODULE_REGEX.test(nameNode.value)), }); } } @@ -121,48 +125,32 @@ function getModules(defineCallNode) { return modules; } -/** - * 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; +function getModuleNames(defineCallNode: CallExpression) { + const modules = getModules(defineCallNode); const moduleNames = modules.map((module) => module.name); return moduleNames; } -/** - * Gets the variable names of all modules - * @param {ASTNode} defineCallNode Root define call node - * @returns {Array} - */ -function getModuleVars(defineCallNode) { - const modules = getModules(defineCallNode).list; +function getModuleVars(defineCallNode: CallExpression) { + const modules = getModules(defineCallNode); const moduleVars = modules.map((module) => module.variable); return moduleVars; } -/** - * 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; +function getModuleNodePair(defineCallNode: CallExpression, moduleName: string) { + const modules = getModules(defineCallNode); const targetModule = modules.find((m) => m.name === moduleName); - return targetModule && targetModule.nodes; + return targetModule?.nodes; } -module.exports = { - MODULES, - moduleNames, - getModules, +export { getModuleNames, - getModuleVars, getModuleNodePair, + getModules, + getModuleVars, + MODULES, + moduleNames, }; diff --git a/lib/utils/objects.ts b/lib/utils/objects.ts new file mode 100644 index 0000000..67ffc83 --- /dev/null +++ b/lib/utils/objects.ts @@ -0,0 +1,40 @@ +import type { + Identifier, + 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; +} + +/** + * Gets a list of all properties in an AST object node + * @param {ASTNode} obj Target object + * @returns {Array} + */ +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 as Identifier, + } + : null; +} + +export { getPropByKey, getPropList }; diff --git a/lib/util/script-types.js b/lib/utils/script-types.ts similarity index 92% rename from lib/util/script-types.js rename to lib/utils/script-types.ts index c574d5f..7179f51 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,7 +80,7 @@ const scriptTypes = [ }, ]; -function getScriptTypeDef(scriptType) { +function getScriptTypeDef(scriptType: string) { return ( !!scriptType && scriptTypes.find((x) => x.name.toLowerCase() === scriptType.toLowerCase()) diff --git a/scripts/generate-docs.ts b/scripts/generate-docs.ts index 57c0ee9..0eaef0d 100644 --- a/scripts/generate-docs.ts +++ b/scripts/generate-docs.ts @@ -1,7 +1,7 @@ import fs from 'node:fs/promises'; import path from 'node:path'; -import { moduleNames } from '../lib/util/modules'; -import { scriptTypes } from '../lib/util/script-types'; +import { moduleNames } from '../lib/utils/modules'; +import { scriptTypes } from '../lib/utils/script-types'; const SRC_DIR = './docs/src'; const OUT_DIR = './docs/rules'; From 721bc21790d07d7ddcec8654f55ccb72268ebfac Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Mon, 25 May 2026 21:28:57 -0500 Subject: [PATCH 10/35] refactor: move index to typescript --- lib/{index.js => index.ts} | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) rename lib/{index.js => index.ts} (86%) diff --git a/lib/index.js b/lib/index.ts similarity index 86% rename from lib/index.js rename to lib/index.ts index fc69c2c..ef19374 100644 --- a/lib/index.js +++ b/lib/index.ts @@ -1,11 +1,10 @@ -'use strict'; +import type { ESLint } from 'eslint'; +import envGlobals from 'globals'; +import pkg from '../package.json'; +import globals from './utils/globals'; +import { MODULES } from './utils/modules'; -const envGlobals = require('globals'); -const { MODULES } = require('./util/modules'); -const globals = require('./util/globals'); -const pkg = require('../package.json'); - -const plugin = { +const plugin: ESLint.Plugin = { meta: { name: pkg.name, version: pkg.version }, rules: { 'api-version': require('./rules/api-version'), @@ -53,4 +52,4 @@ plugin.configs = { plugin.configs.all = plugin.configs.recommended; -module.exports = plugin; +export default plugin; From 205374ebc49e541d48726f4622d65132fca51e1b Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Mon, 25 May 2026 21:34:15 -0500 Subject: [PATCH 11/35] feat!: remove no-amd-name --- README.md | 1 - docs/rules/no-amd-name.md | 33 --------------------------------- docs/src/no-amd-name.md | 33 --------------------------------- lib/index.ts | 2 -- lib/rules/no-amd-name.ts | 38 -------------------------------------- tests/rules/no-amd-name.ts | 32 -------------------------------- 6 files changed, 139 deletions(-) delete mode 100644 docs/rules/no-amd-name.md delete mode 100644 docs/src/no-amd-name.md delete mode 100644 lib/rules/no-amd-name.ts delete mode 100644 tests/rules/no-amd-name.ts diff --git a/README.md b/README.md index f27cbe5..f44cd33 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,6 @@ 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` 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/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/lib/index.ts b/lib/index.ts index ef19374..5f5c67a 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -11,7 +11,6 @@ const plugin: ESLint.Plugin = { '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'), @@ -37,7 +36,6 @@ plugin.configs = { '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', diff --git a/lib/rules/no-amd-name.ts b/lib/rules/no-amd-name.ts deleted file mode 100644 index e5092c5..0000000 --- a/lib/rules/no-amd-name.ts +++ /dev/null @@ -1,38 +0,0 @@ -import type { Rule } from 'eslint'; -import type { CallExpression } from 'estree'; - -const rule: Rule.RuleModule = { - 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: CallExpression) => { - 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: (fixer) => - fixer.replaceTextRange([arg1.range[0], arg2.range[0]], ''), - }); - } - }, - }), -}; - -export default rule; diff --git a/tests/rules/no-amd-name.ts b/tests/rules/no-amd-name.ts deleted file mode 100644 index e3a1466..0000000 --- a/tests/rules/no-amd-name.ts +++ /dev/null @@ -1,32 +0,0 @@ -import rule from '../../lib/rules/no-amd-name'; -import ruleTester from '../rule-tester'; - -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) {});', - }, - ], -}); From 89fad26bb3636c9ccb0775e60b45e561b1f2a5e5 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Mon, 25 May 2026 21:35:35 -0500 Subject: [PATCH 12/35] feat!: remove no-extra-modules --- README.md | 1 - docs/rules/no-extra-modules.md | 41 ------------------------- docs/src/no-extra-modules.md | 41 ------------------------- lib/index.ts | 2 -- lib/rules/no-extra-modules.ts | 53 --------------------------------- tests/rules/no-extra-modules.ts | 52 -------------------------------- 6 files changed, 190 deletions(-) delete mode 100644 docs/rules/no-extra-modules.md delete mode 100644 docs/src/no-extra-modules.md delete mode 100644 lib/rules/no-extra-modules.ts delete mode 100644 tests/rules/no-extra-modules.ts diff --git a/README.md b/README.md index f44cd33..ecbae1d 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,6 @@ 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-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 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/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/lib/index.ts b/lib/index.ts index 5f5c67a..60a1f47 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -11,7 +11,6 @@ const plugin: ESLint.Plugin = { 'entry-points': require('./rules/entry-points'), 'log-args': require('./rules/log-args'), 'module-vars': require('./rules/module-vars'), - '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'), @@ -36,7 +35,6 @@ plugin.configs = { 'suitescript/entry-points': 'error', 'suitescript/log-args': 'error', 'suitescript/module-vars': ['error', MODULES], - 'suitescript/no-extra-modules': 'error', 'suitescript/no-invalid-modules': 'error', 'suitescript/no-log-module': 'error', 'suitescript/no-module-extensions': 'error', diff --git a/lib/rules/no-extra-modules.ts b/lib/rules/no-extra-modules.ts deleted file mode 100644 index 431fa2f..0000000 --- a/lib/rules/no-extra-modules.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { Rule } from 'eslint'; -import type { CallExpression } from 'estree'; -import { getModules } from '../util/modules'; - -const rule: Rule.RuleModule = { - 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: CallExpression) => { - const modules = 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, - }, - }); - } - } - }, - }), -}; - -export default rule; diff --git a/tests/rules/no-extra-modules.ts b/tests/rules/no-extra-modules.ts deleted file mode 100644 index 593ce01..0000000 --- a/tests/rules/no-extra-modules.ts +++ /dev/null @@ -1,52 +0,0 @@ -import rule from '../../lib/rules/no-extra-modules'; -import ruleTester from '../rule-tester'; - -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' } }, - ], - }, - ], -}); From 9e8343511f880c752b310e943c67b1539cde2475 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Mon, 25 May 2026 21:44:25 -0500 Subject: [PATCH 13/35] feat!: remove no-module-extensions --- README.md | 1 - docs/rules/no-module-extensions.md | 31 ------------------ docs/src/no-module-extensions.md | 31 ------------------ lib/index.ts | 2 -- lib/rules/no-module-extensions.ts | 49 ----------------------------- tests/rules/no-module-extensions.ts | 42 ------------------------- 6 files changed, 156 deletions(-) delete mode 100644 docs/rules/no-module-extensions.md delete mode 100644 docs/src/no-module-extensions.md delete mode 100644 lib/rules/no-module-extensions.ts delete mode 100644 tests/rules/no-module-extensions.ts diff --git a/README.md b/README.md index ecbae1d..5fc7595 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,6 @@ Stay on `eslint-plugin-suitescript@^1` if you cannot migrate. - [suitescript/module-vars](docs/rules/module-vars.md): Enforces correct module identifiers for each configured module - [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/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-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/lib/index.ts b/lib/index.ts index 60a1f47..b4e2a10 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -13,7 +13,6 @@ const plugin: ESLint.Plugin = { 'module-vars': require('./rules/module-vars'), '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'), }, }; @@ -37,7 +36,6 @@ plugin.configs = { 'suitescript/module-vars': ['error', MODULES], 'suitescript/no-invalid-modules': 'error', 'suitescript/no-log-module': 'error', - 'suitescript/no-module-extensions': 'error', 'suitescript/script-type': 'error', }, }, diff --git a/lib/rules/no-module-extensions.ts b/lib/rules/no-module-extensions.ts deleted file mode 100644 index e41cfaf..0000000 --- a/lib/rules/no-module-extensions.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { Rule } from 'eslint'; -import type { CallExpression } from 'estree'; -import { getModules } from '../util/modules'; - -const INVALID_MODULE_REGEX = /\.js/; - -const rule: Rule.RuleModule = { - 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: CallExpression) => { - const modules = 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: (fixer) => { - const fixedModuleName = invalidModuleNode.raw.replace( - INVALID_MODULE_REGEX, - '', - ); - return fixer.replaceText(invalidModuleNode, fixedModuleName); - }, - }); - } - }, - }; - }, -}; - -export default rule; diff --git a/tests/rules/no-module-extensions.ts b/tests/rules/no-module-extensions.ts deleted file mode 100644 index b3e8558..0000000 --- a/tests/rules/no-module-extensions.ts +++ /dev/null @@ -1,42 +0,0 @@ -import rule from '../../lib/rules/no-module-extensions'; -import ruleTester from '../rule-tester'; - -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) => {});', - }, - ], -}); From f2e39f1eb8078e9660d27dfb8dd2ad477c6cea20 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Sat, 30 May 2026 18:42:07 -0500 Subject: [PATCH 14/35] feat: remove agents.md --- AGENTS.md | 68 ------------------------------------------------------- 1 file changed, 68 deletions(-) delete mode 100644 AGENTS.md 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. From 04f14621779773ba67f58a56a40b63fecbbeb795 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Sat, 30 May 2026 19:03:25 -0500 Subject: [PATCH 15/35] test: move to native node tests, improve test code --- package.json | 5 +- pnpm-lock.yaml | 1078 ++++++++++++++--------------- tests/rule-tester.ts | 28 +- tests/rules/api-version.ts | 157 ++--- tests/rules/entry-points.ts | 521 +++++++------- tests/rules/log-args.ts | 227 +++--- tests/rules/module-vars.ts | 105 +-- tests/rules/no-invalid-modules.ts | 71 +- tests/rules/no-log-module.ts | 235 +++---- tests/rules/script-type.ts | 329 +++++---- 10 files changed, 1387 insertions(+), 1369 deletions(-) diff --git a/package.json b/package.json index 089f46b..579140a 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "build:docs": "tsx scripts/generate-docs.ts", "check": "biome check", "check:types": "tsc -p tsconfig.dev.json", - "test": "ts-mocha -p tsconfig.dev.json tests/** --recursive --reporter min" + "test": "node --test --require tsx tests/rules/**.ts" }, "files": [ "LICENSE", @@ -41,7 +41,6 @@ "@types/estree": "^1.0.8", "@types/node": "^25.6.0", "eslint": "^10.0.0", - "ts-mocha": "^11.1.0", "tsc-alias": "^1.8.17", "tsx": "^4.21.0", "typescript": "^5.9.3" @@ -49,4 +48,4 @@ "peerDependencies": { "eslint": ">=9.0.0" } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 477bdbb..b1f4ebd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@acdvs/eslint-plugin-amd': + specifier: ^1.0.0 + version: 1.0.0(eslint@10.3.0) globals: specifier: ^17.6.0 version: 17.6.0 @@ -27,21 +30,57 @@ importers: eslint: specifier: ^10.0.0 version: 10.3.0 - ts-mocha: - specifier: ^11.1.0 - version: 11.1.0(mocha@11.7.5)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3)) tsc-alias: specifier: ^1.8.17 version: 1.8.17 + tsdown: + specifier: ^0.22.0 + version: 0.22.0(tsx@4.21.0)(typescript@6.0.3) tsx: specifier: ^4.21.0 version: 4.21.0 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 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' + + '@babel/generator@8.0.0-rc.5': + resolution: {integrity: sha512-nFZPWz3FHIS7y6rMIVoa/WBwjdutfIaRJIBQjzn+t3RnecZoRNlGmGcyR2wb0T/IgSd50Kz/6dG8/LvMCRunjg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-string-parser@8.0.0-rc.6': + resolution: {integrity: sha512-BCkFy+zN6kXQed3YOT7aJl93NfDSzQc3pBfsvTVPs9gU9X3V0aefEF5kwBT0E+mDWH9QgKaZstYUQN9VdQZT4g==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-validator-identifier@8.0.0-rc.5': + resolution: {integrity: sha512-ehJDxHvtbZ85RtX/L2fi0h9AGsBNqB5Euv1EB8RMAvGYvD+2X+QbpzzOpbklnNXO+WSZJNOaetw2BBj27xsWVg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-validator-identifier@8.0.0-rc.6': + resolution: {integrity: sha512-nVJ+1JcCgntv8d78rRo++o2wuODT0Irknx2BF8Np4Ft2CRgjLqIs4qzSZ8b66yGbBdMWGmZBO9WEZv1hhNiSpg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/parser@8.0.0-rc.4': + resolution: {integrity: sha512-0S/1yefMa15N4i2v3t8Fw9pgMHhf2gF6Lc1UEXI96Ls6FNAjqvHHZouZ2ZS/deqLhbMFtmfVeFac6iTsvFbLwA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + '@babel/parser@8.0.0-rc.6': + resolution: {integrity: sha512-rOS8IpdO7mQELkTPlCsTgPejO0bFuZdEDCGQJouYbYf9e1FLTym7Fei2pEjq8q7MWbX0ravcd7QQYKs1TxOuog==} + engines: {node: ^22.18.0 || >=24.11.0} + hasBin: true + + '@babel/types@8.0.0-rc.6': + resolution: {integrity: sha512-p7/ABylAYlexb31wtRdIfH9L9A0Z2T/9H6zAqzqndkY2PLkvNNc580wGhp/gGKN4Sp9sQvSkhc6Oga8/O+wTyw==} + engines: {node: ^22.18.0 || >=24.11.0} + '@biomejs/biome@2.4.14': resolution: {integrity: sha512-TmAvxOEgrpLypzVGJ8FulIZnlyA9TxrO1hyqYrCz9r+bwma9xXxuLA5IuYnj55XQneFx460KjRbx6SWGLkg3bQ==} engines: {node: '>=14.21.3'} @@ -99,9 +138,14 @@ packages: cpu: [x64] os: [win32] - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} '@esbuild/aix-ppc64@0.27.4': resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} @@ -309,9 +353,8 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} @@ -320,8 +363,14 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -335,21 +384,112 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + '@oxc-project/types@0.132.0': + resolution: {integrity: sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==} + + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + + '@rolldown/binding-android-arm64@1.0.2': + resolution: {integrity: sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.2': + resolution: {integrity: sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.2': + resolution: {integrity: sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.2': + resolution: {integrity: sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.2': + resolution: {integrity: sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] - '@tsconfig/node10@1.0.12': - resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + '@rolldown/binding-linux-arm64-gnu@1.0.2': + resolution: {integrity: sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + '@rolldown/binding-linux-arm64-musl@1.0.2': + resolution: {integrity: sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + '@rolldown/binding-linux-ppc64-gnu@1.0.2': + resolution: {integrity: sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@rolldown/binding-linux-s390x-gnu@1.0.2': + resolution: {integrity: sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.2': + resolution: {integrity: sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.2': + resolution: {integrity: sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.2': + resolution: {integrity: sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.2': + resolution: {integrity: sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.2': + resolution: {integrity: sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.2': + resolution: {integrity: sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ==} + 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.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} @@ -360,6 +500,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -371,10 +514,6 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.5: - resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} - engines: {node: '>=0.4.0'} - acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} @@ -383,38 +522,21 @@ packages: ajv@6.14.0: resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} + ansis@4.3.0: + resolution: {integrity: sha512-44mvgtPvohuU/70DdY5Oz2AIrLJ9k6/5x4KmoSvPwO+5Moijo0+N9D0fKbbYZQWP1hNm5CpOf+E01jhxG/r8xg==} + engines: {node: '>=14'} anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + ast-kit@3.0.0-beta.1: + resolution: {integrity: sha512-trmleAnZ2PxN/loHWVhhx1qeOHSRXq4TDsBBxq3GqeJitfk3+jTQ+v/C1km/KYq9M7wKqCewMh+/NAvVH7m+bw==} + engines: {node: '>=20.19.0'} balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} @@ -424,8 +546,8 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - brace-expansion@2.0.3: - resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==} + birpc@4.0.0: + resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} brace-expansion@5.0.5: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} @@ -435,43 +557,18 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + 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'} - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -485,43 +582,34 @@ packages: supports-color: optional: true - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - diff@4.0.4: - resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} - engines: {node: '>=0.3.1'} - - diff@7.0.0: - resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} - engines: {node: '>=0.3.1'} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + 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 - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@2.0.1: + resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + engines: {node: '>=14'} esbuild@0.27.4: resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} engines: {node: '>=18'} hasBin: true - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -564,6 +652,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -584,6 +675,15 @@ packages: 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'} @@ -600,29 +700,21 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - 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-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - get-tsconfig@4.13.7: resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + 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'} @@ -631,11 +723,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - globals@17.6.0: resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} engines: {node: '>=18'} @@ -644,18 +731,17 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true + 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'} @@ -668,10 +754,6 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -680,26 +762,12 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: @@ -722,16 +790,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -744,19 +802,6 @@ packages: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - - minipass@7.1.3: - resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} - engines: {node: '>=16 || 14 >=14.17'} - - mocha@11.7.5: - resolution: {integrity: sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -771,6 +816,9 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -783,9 +831,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -794,21 +839,21 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} picomatch@2.3.2: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + plimit-lit@1.6.1: resolution: {integrity: sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==} engines: {node: '>=12'} @@ -821,6 +866,9 @@ packages: 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'} @@ -828,21 +876,10 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -850,14 +887,37 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rolldown-plugin-dts@0.25.1: + resolution: {integrity: sha512-zK82aC/8z1iVW+g0bCnlQZq04Y5bNeL/RcRwTYBwsnU6wH0N+6vpIFkN7JC0kYRS5qKA+pxQyfIPvXJ6Q5xSpQ==} + engines: {node: ^22.18.0 || >=24.0.0} + peerDependencies: + '@ts-macro/tsc': ^0.3.6 + '@typescript/native-preview': '>=7.0.0-dev.20260325.1' + rolldown: ^1.0.0 + typescript: ^5.0.0 || ^6.0.0 + vue-tsc: ~3.2.0 + peerDependenciesMeta: + '@ts-macro/tsc': + optional: true + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.0.2: + resolution: {integrity: sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + semver@7.8.1: + resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + engines: {node: '>=10'} + hasBin: true shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -867,76 +927,67 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + tinyexec@1.2.2: + resolution: {integrity: sha512-M/Q0B2cp4K7kynaT/vnED1j8TlLY+Pp7C6Wl2bl/7u/F0mUVwdyOpwomQb8JpYLitHUssAJRmLZdMCGsrx7i+g==} + engines: {node: '>=18'} - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - ts-mocha@11.1.0: - resolution: {integrity: sha512-yT7FfzNRCu8ZKkYvAOiH01xNma/vLq6Vit7yINKYFNVP8e5UyrYXSOMIipERTpzVKJQ4Qcos5bQo1tNERNZevQ==} - engines: {node: '>= 6.X.X'} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - ts-node: ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - tsconfig-paths: ^4.X.X - peerDependenciesMeta: - tsconfig-paths: - optional: true - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + tsc-alias@1.8.17: + resolution: {integrity: sha512-EIduCZHqbNwPm8BZYfq1aD7BQ697A4h6uSGMOFQfYGoQwfrYFTKwYfy9Bv42YxHkduVBcn9Zx0DkX111DKskyg==} + engines: {node: '>=16.20.2'} + hasBin: true + + tsdown@0.22.0: + resolution: {integrity: sha512-FgW0hHb27nGQA/+F3d5+U9wKXkfilk9DVkc5+7x/ZqF03g+Hoz/eeApT32jqxATt9eRoR+1jxk7MUMON+O4CXw==} + engines: {node: ^22.18.0 || >=24.0.0} hasBin: true peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' + '@arethetypeswrong/core': ^0.18.1 + '@tsdown/css': 0.22.0 + '@tsdown/exe': 0.22.0 + '@vitejs/devtools': '*' + publint: ^0.3.8 + tsx: '*' + typescript: ^5.0.0 || ^6.0.0 + unplugin-unused: ^0.5.0 + unrun: '*' peerDependenciesMeta: - '@swc/core': + '@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 - '@swc/wasm': + unrun: optional: true - tsc-alias@1.8.17: - resolution: {integrity: sha512-EIduCZHqbNwPm8BZYfq1aD7BQ697A4h6uSGMOFQfYGoQwfrYFTKwYfy9Bv42YxHkduVBcn9Zx0DkX111DKskyg==} - engines: {node: '>=16.20.2'} - hasBin: true + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsx@4.21.0: resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} @@ -947,20 +998,20 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true + unconfig-core@7.5.0: + resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} + undici-types@7.19.2: resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -970,42 +1021,44 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workerpool@9.3.4: - resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} +snapshots: - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + '@acdvs/eslint-plugin-amd@1.0.0(eslint@10.3.0)': + dependencies: + eslint: 10.3.0 + globals: 17.6.0 - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + '@babel/generator@8.0.0-rc.5': + dependencies: + '@babel/parser': 8.0.0-rc.6 + '@babel/types': 8.0.0-rc.6 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 + jsesc: 3.1.0 - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} + '@babel/helper-string-parser@8.0.0-rc.6': {} - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + '@babel/helper-validator-identifier@8.0.0-rc.5': {} - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + '@babel/helper-validator-identifier@8.0.0-rc.6': {} - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + '@babel/parser@8.0.0-rc.4': + dependencies: + '@babel/types': 8.0.0-rc.6 -snapshots: + '@babel/parser@8.0.0-rc.6': + dependencies: + '@babel/types': 8.0.0-rc.6 + + '@babel/types@8.0.0-rc.6': + dependencies: + '@babel/helper-string-parser': 8.0.0-rc.6 + '@babel/helper-validator-identifier': 8.0.0-rc.6 '@biomejs/biome@2.4.14': optionalDependencies: @@ -1042,9 +1095,21 @@ snapshots: '@biomejs/cli-win32-x64@2.4.14': optional: true - '@cspotcode/source-map-support@0.8.1': + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': dependencies: - '@jridgewell/trace-mapping': 0.3.9 + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true '@esbuild/aix-ppc64@0.27.4': optional: true @@ -1134,7 +1199,7 @@ snapshots: '@eslint/config-array@0.23.5': dependencies: '@eslint/object-schema': 3.0.5 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 minimatch: 10.2.5 transitivePeerDependencies: - supports-color @@ -1170,24 +1235,27 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@isaacs/cliui@8.0.2': + '@jridgewell/gen-mapping@0.3.13': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.2.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.9': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1200,16 +1268,67 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@pkgjs/parseargs@0.11.0': + '@oxc-project/types@0.132.0': {} + + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + + '@rolldown/binding-android-arm64@1.0.2': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.2': optional: true - '@tsconfig/node10@1.0.12': {} + '@rolldown/binding-darwin-x64@1.0.2': + optional: true - '@tsconfig/node12@1.0.11': {} + '@rolldown/binding-freebsd-x64@1.0.2': + optional: true - '@tsconfig/node14@1.0.3': {} + '@rolldown/binding-linux-arm-gnueabihf@1.0.2': + optional: true - '@tsconfig/node16@1.0.4': {} + '@rolldown/binding-linux-arm64-gnu@1.0.2': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.2': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.2': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.2': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.2': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.2': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.2': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.2': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.2': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.2': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true '@types/eslint@9.6.1': dependencies: @@ -1220,6 +1339,8 @@ snapshots: '@types/estree@1.0.8': {} + '@types/jsesc@2.5.1': {} + '@types/json-schema@7.0.15': {} '@types/node@25.6.0': @@ -1230,10 +1351,6 @@ snapshots: dependencies: acorn: 8.16.0 - acorn-walk@8.3.5: - dependencies: - acorn: 8.16.0 - acorn@8.16.0: {} ajv@6.14.0: @@ -1243,36 +1360,26 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-regex@5.0.1: {} - - ansi-regex@6.2.2: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.3: {} + ansis@4.3.0: {} anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.2 - arg@4.1.3: {} - - argparse@2.0.1: {} - array-union@2.1.0: {} - balanced-match@1.0.2: {} + ast-kit@3.0.0-beta.1: + dependencies: + '@babel/parser': 8.0.0-rc.4 + estree-walker: 3.0.3 + pathe: 2.0.3 balanced-match@4.0.4: {} binary-extensions@2.3.0: {} - brace-expansion@2.0.3: - dependencies: - balanced-match: 1.0.2 + birpc@4.0.0: {} brace-expansion@5.0.5: dependencies: @@ -1282,14 +1389,7 @@ snapshots: dependencies: fill-range: 7.1.1 - browser-stdout@1.3.1: {} - - camelcase@6.3.0: {} - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + cac@7.0.0: {} chokidar@3.6.0: dependencies: @@ -1303,55 +1403,29 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - commander@9.5.0: {} - create-require@1.1.1: {} - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - debug@4.4.3(supports-color@8.1.1): + debug@4.4.3: dependencies: ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} deep-is@0.1.4: {} - diff@4.0.4: {} - - diff@7.0.0: {} + defu@6.1.7: {} dir-glob@3.0.1: dependencies: path-type: 4.0.0 - eastasianwidth@0.2.0: {} - - emoji-regex@8.0.0: {} + dts-resolver@3.0.0: {} - emoji-regex@9.2.2: {} + empathic@2.0.1: {} esbuild@0.27.4: optionalDependencies: @@ -1382,8 +1456,6 @@ snapshots: '@esbuild/win32-ia32': 0.27.4 '@esbuild/win32-x64': 0.27.4 - escalade@3.2.0: {} - escape-string-regexp@4.0.0: {} eslint-scope@9.1.2: @@ -1411,7 +1483,7 @@ snapshots: '@types/estree': 1.0.8 ajv: 6.14.0 cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 escape-string-regexp: 4.0.0 eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 @@ -1448,6 +1520,10 @@ snapshots: estraverse@5.3.0: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + esutils@2.0.3: {} fast-deep-equal@3.1.3: {} @@ -1468,6 +1544,10 @@ snapshots: dependencies: reusify: 1.1.0 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -1486,24 +1566,19 @@ snapshots: flatted: 3.4.2 keyv: 4.5.4 - flat@5.0.2: {} - flatted@3.4.2: {} - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - fsevents@2.3.3: optional: true - get-caller-file@2.0.5: {} - get-tsconfig@4.13.7: 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 @@ -1512,15 +1587,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.5.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.9 - minipass: 7.1.3 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - globals@17.6.0: {} globby@11.1.0: @@ -1532,12 +1598,12 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - has-flag@4.0.0: {} - - he@1.2.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: @@ -1546,31 +1612,15 @@ snapshots: is-extglob@2.1.1: {} - is-fullwidth-code-point@3.0.0: {} - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 is-number@7.0.0: {} - is-path-inside@3.0.3: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - isexe@2.0.0: {} - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - js-yaml@4.1.1: - dependencies: - argparse: 2.0.1 + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -1591,15 +1641,6 @@ snapshots: dependencies: p-locate: 5.0.0 - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - lru-cache@10.4.3: {} - - make-error@1.3.6: {} - merge2@1.4.1: {} micromatch@4.0.8: @@ -1611,36 +1652,6 @@ snapshots: dependencies: brace-expansion: 5.0.5 - minimatch@9.0.9: - dependencies: - brace-expansion: 2.0.3 - - minipass@7.1.3: {} - - mocha@11.7.5: - dependencies: - browser-stdout: 1.3.1 - chokidar: 4.0.3 - debug: 4.4.3(supports-color@8.1.1) - diff: 7.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 10.5.0 - he: 1.2.0 - is-path-inside: 3.0.3 - js-yaml: 4.1.1 - log-symbols: 4.1.0 - minimatch: 9.0.9 - 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: 9.3.4 - yargs: 17.7.2 - yargs-parser: 21.1.1 - yargs-unparser: 2.0.0 - ms@2.1.3: {} mylas@2.1.14: {} @@ -1649,6 +1660,8 @@ snapshots: normalize-path@3.0.0: {} + obug@2.1.1: {} + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -1666,23 +1679,18 @@ snapshots: dependencies: p-limit: 3.1.0 - package-json-from-dist@1.0.1: {} - path-exists@4.0.0: {} path-key@3.1.1: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.3 - path-type@4.0.0: {} - picocolors@1.1.1: {} + pathe@2.0.3: {} picomatch@2.3.2: {} + picomatch@4.0.4: {} + plimit-lit@1.6.1: dependencies: queue-lit: 1.5.2 @@ -1691,35 +1699,62 @@ snapshots: punycode@2.3.1: {} + quansync@1.0.0: {} + queue-lit@1.5.2: {} queue-microtask@1.2.3: {} - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - readdirp@3.6.0: dependencies: picomatch: 2.3.2 - readdirp@4.1.2: {} - - require-directory@2.1.1: {} - resolve-pkg-maps@1.0.0: {} reusify@1.1.0: {} + rolldown-plugin-dts@0.25.1(rolldown@1.0.2)(typescript@6.0.3): + dependencies: + '@babel/generator': 8.0.0-rc.5 + '@babel/helper-validator-identifier': 8.0.0-rc.5 + '@babel/parser': 8.0.0-rc.4 + ast-kit: 3.0.0-beta.1 + birpc: 4.0.0 + dts-resolver: 3.0.0 + get-tsconfig: 5.0.0-beta.5 + obug: 2.1.1 + rolldown: 1.0.2 + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - oxc-resolver + + rolldown@1.0.2: + dependencies: + '@oxc-project/types': 0.132.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.2 + '@rolldown/binding-darwin-arm64': 1.0.2 + '@rolldown/binding-darwin-x64': 1.0.2 + '@rolldown/binding-freebsd-x64': 1.0.2 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.2 + '@rolldown/binding-linux-arm64-gnu': 1.0.2 + '@rolldown/binding-linux-arm64-musl': 1.0.2 + '@rolldown/binding-linux-ppc64-gnu': 1.0.2 + '@rolldown/binding-linux-s390x-gnu': 1.0.2 + '@rolldown/binding-linux-x64-gnu': 1.0.2 + '@rolldown/binding-linux-x64-musl': 1.0.2 + '@rolldown/binding-openharmony-arm64': 1.0.2 + '@rolldown/binding-wasm32-wasi': 1.0.2 + '@rolldown/binding-win32-arm64-msvc': 1.0.2 + '@rolldown/binding-win32-x64-msvc': 1.0.2 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 + semver@7.8.1: {} shebang-command@2.0.0: dependencies: @@ -1727,66 +1762,20 @@ snapshots: shebang-regex@3.0.0: {} - signal-exit@4.1.0: {} - slash@3.0.0: {} - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.2.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.2.0: - dependencies: - ansi-regex: 6.2.2 - - strip-json-comments@3.1.1: {} + tinyexec@1.2.2: {} - supports-color@7.2.0: + tinyglobby@0.2.16: dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - ts-mocha@11.1.0(mocha@11.7.5)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3)): - dependencies: - mocha: 11.7.5 - ts-node: 10.9.2(@types/node@25.6.0)(typescript@5.9.3) - - ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.12 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 25.6.0 - acorn: 8.16.0 - acorn-walk: 8.3.5 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.4 - make-error: 1.3.6 - typescript: 5.9.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 + tree-kill@1.2.2: {} tsc-alias@1.8.17: dependencies: @@ -1798,6 +1787,35 @@ snapshots: normalize-path: 3.0.0 plimit-lit: 1.6.1 + tsdown@0.22.0(tsx@4.21.0)(typescript@6.0.3): + dependencies: + ansis: 4.3.0 + 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.1 + picomatch: 4.0.4 + rolldown: 1.0.2 + rolldown-plugin-dts: 0.25.1(rolldown@1.0.2)(typescript@6.0.3) + semver: 7.8.1 + tinyexec: 1.2.2 + tinyglobby: 0.2.16 + tree-kill: 1.2.2 + unconfig-core: 7.5.0 + optionalDependencies: + tsx: 4.21.0 + typescript: 6.0.3 + transitivePeerDependencies: + - '@ts-macro/tsc' + - '@typescript/native-preview' + - oxc-resolver + - vue-tsc + + tslib@2.8.1: + optional: true + tsx@4.21.0: dependencies: esbuild: 0.27.4 @@ -1809,7 +1827,12 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript@5.9.3: {} + typescript@6.0.3: {} + + unconfig-core@7.5.0: + dependencies: + '@quansync/fs': 1.0.0 + quansync: 1.0.0 undici-types@7.19.2: {} @@ -1817,49 +1840,10 @@ snapshots: dependencies: punycode: 2.3.1 - v8-compile-cache-lib@3.0.1: {} - which@2.0.2: dependencies: isexe: 2.0.0 word-wrap@1.2.5: {} - workerpool@9.3.4: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.2.0 - - y18n@5.0.8: {} - - yargs-parser@21.1.1: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yn@3.1.1: {} - yocto-queue@0.1.0: {} diff --git a/tests/rule-tester.ts b/tests/rule-tester.ts index 2318c99..5a49149 100644 --- a/tests/rule-tester.ts +++ b/tests/rule-tester.ts @@ -1,8 +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: 'module', + 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.ts b/tests/rules/api-version.ts index 11e04b2..674e7df 100644 --- a/tests/rules/api-version.ts +++ b/tests/rules/api-version.ts @@ -1,86 +1,89 @@ +import path from 'node:path'; import rule from '../../lib/rules/api-version'; -import ruleTester from '../rule-tester'; +import ruleTester, { createTests } from '../rule-tester'; -ruleTester.run('api-version', rule, { - valid: [ - { - code: ` -/** - * @NApiVersion 1.0 - */ - `, - }, - { - code: ` -/** - * @NApiVersion 2.x - */ - `, - }, - { - code: ` -/** - * @NApiVersion 2.0 - */ - `, - }, - { - code: ` -/** - * @NApiVersion 2.1 - */ - `, - }, - ], +const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); + +const valid = createTests([ + { + code: ` + /** + * @NApiVersion 1.0 + */ + `, + }, + { + code: ` + /** + * @NApiVersion 2.x + */ + `, + }, + { + code: ` + /** + * @NApiVersion 2.0 + */ + `, + }, + { + code: ` + /** + * @NApiVersion 2.1 + */ + `, + }, +]); - invalid: [ - { - code: ` -/** - * @NApiVersion - */ +const invalid = createTests([ + { + code: ` + /** + * @NApiVersion + */ `, - errors: [{ messageId: 'noValue' }], - }, - { - code: ` -/** - * @NApiVersion 1 - */ + errors: [{ messageId: 'noValue' }], + }, + { + code: ` + /** + * @NApiVersion 1 + */ `, - errors: [{ messageId: 'invalidValue', data: { value: 1 } }], - }, - { - code: ` -/** - * @NApiVersion 2 - */ + errors: [{ messageId: 'invalidValue', data: { value: 1 } }], + }, + { + code: ` + /** + * @NApiVersion 2 + */ `, - errors: [{ messageId: 'invalidValue', data: { value: 2 } }], - }, - { - code: ` -/** - * @NApiVersion 3 - */ + errors: [{ messageId: 'invalidValue', data: { value: 2 } }], + }, + { + code: ` + /** + * @NApiVersion 3 + */ `, - errors: [{ messageId: 'invalidValue', data: { value: 3 } }], - }, - { - code: ` -/** - * @NApiVersion 2.2 - */ + 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: 2.2 } }], + }, + { + code: ` + /** + * @NApiVersion test + */ `, - errors: [{ messageId: 'invalidValue', data: { value: 'test' } }], - }, - ], -}); + errors: [{ messageId: 'invalidValue', data: { value: 'test' } }], + }, +]); + +ruleTester.run(RULE_NAME, rule, { valid, invalid }); diff --git a/tests/rules/entry-points.ts b/tests/rules/entry-points.ts index a9780e2..396e013 100644 --- a/tests/rules/entry-points.ts +++ b/tests/rules/entry-points.ts @@ -1,267 +1,262 @@ +import path from 'node:path'; import rule from '../../lib/rules/entry-points'; -import ruleTester from '../rule-tester'; +import ruleTester, { createTests } from '../rule-tester'; -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 +const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); -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; -}); - `, - }, - ], +const valid = createTests([ + { + 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() {} }; + }); + `, + }, + { + // Should not error, since scriptType is null and rule should exit early + code: ` + // no @NScriptType comment - 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' } }, - ], - }, - ], -}); + define([], function() { + return { foo: 'bar' }; + }); + `, + }, + { + 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; + }); + `, + }, +]); + +const invalid = createTests([ + { + 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' } }], + }, +]); + +ruleTester.run(RULE_NAME, rule, { valid, invalid }); diff --git a/tests/rules/log-args.ts b/tests/rules/log-args.ts index da4481a..4d526da 100644 --- a/tests/rules/log-args.ts +++ b/tests/rules/log-args.ts @@ -1,115 +1,118 @@ +import path from 'node:path'; import rule from '../../lib/rules/log-args'; -import ruleTester from '../rule-tester'; +import ruleTester, { createTests } from '../rule-tester'; -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 }], - }, - ], +const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); - 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' } }], - }, - ], -}); +const valid = createTests([ + { + 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 }], + }, +]); + +const invalid = createTests([ + { + 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' } }], + }, +]); + +ruleTester.run(RULE_NAME, rule, { valid, invalid }); diff --git a/tests/rules/module-vars.ts b/tests/rules/module-vars.ts index 8f153d3..9be5ab6 100644 --- a/tests/rules/module-vars.ts +++ b/tests/rules/module-vars.ts @@ -1,54 +1,57 @@ +import path from 'node:path'; import rule from '../../lib/rules/module-vars'; -import ruleTester from '../rule-tester'; +import ruleTester, { createTests } from '../rule-tester'; -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' }], - }, - ], +const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); - 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' }, - }, - ], - }, - ], -}); +const valid = createTests([ + { + 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' }], + }, +]); + +const invalid = createTests([ + { + 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' }, + }, + ], + }, +]); + +ruleTester.run(RULE_NAME, rule, { valid, invalid }); diff --git a/tests/rules/no-invalid-modules.ts b/tests/rules/no-invalid-modules.ts index 6f427db..134848b 100644 --- a/tests/rules/no-invalid-modules.ts +++ b/tests/rules/no-invalid-modules.ts @@ -1,37 +1,40 @@ +import path from 'node:path'; import rule from '../../lib/rules/no-invalid-modules'; -import ruleTester from '../rule-tester'; +import ruleTester, { createTests } from '../rule-tester'; -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() {});', - }, - ], +const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); - 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' } }], - }, - ], -}); +const valid = createTests([ + { + 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() {});', + }, +]); + +const invalid = createTests([ + { + 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' } }], + }, +]); + +ruleTester.run(RULE_NAME, rule, { valid, invalid }); diff --git a/tests/rules/no-log-module.ts b/tests/rules/no-log-module.ts index cd6b5ae..e861b62 100644 --- a/tests/rules/no-log-module.ts +++ b/tests/rules/no-log-module.ts @@ -1,119 +1,122 @@ +import path from 'node:path'; import rule from '../../lib/rules/no-log-module'; -import ruleTester from '../rule-tester'; +import ruleTester, { createTests } from '../rule-tester'; -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 }], - }, - ], +const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); - 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' }], - }, - ], -}); +const valid = createTests([ + { + 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 }], + }, +]); + +const invalid = createTests([ + { + 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' }], + }, +]); + +ruleTester.run(RULE_NAME, rule, { valid, invalid }); diff --git a/tests/rules/script-type.ts b/tests/rules/script-type.ts index afb95f3..d377336 100644 --- a/tests/rules/script-type.ts +++ b/tests/rules/script-type.ts @@ -1,168 +1,167 @@ +import path from 'node:path'; import rule from '../../lib/rules/script-type'; -import ruleTester from '../rule-tester'; +import ruleTester, { createTests } from '../rule-tester'; -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', - }, - ], +const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); - 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' } }, - ], - }, - ], -}); +const valid = createTests([ + { + 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', + }, +]); + +const invalid = createTests([ + { + 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' } }], + }, +]); + +ruleTester.run(RULE_NAME, rule, { valid, invalid }); From 6c23479545b114361770ba697164e497c58ebca8 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Sat, 30 May 2026 19:32:28 -0500 Subject: [PATCH 16/35] docs: simplify generate script --- scripts/generate-docs.ts | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/scripts/generate-docs.ts b/scripts/generate-docs.ts index 0eaef0d..458dac7 100644 --- a/scripts/generate-docs.ts +++ b/scripts/generate-docs.ts @@ -5,7 +5,7 @@ import { scriptTypes } from '../lib/utils/script-types'; const SRC_DIR = './docs/src'; const OUT_DIR = './docs/rules'; -const SCRIPT_NAME = path.basename(__filename); +const SCRIPT_NAME = path.basename(import.meta.filename, '.ts'); type DocReplaceOptions = Record; @@ -13,30 +13,19 @@ const docsToModify: Record = { 'entry-points.md': { old: '', new: scriptTypes - .reduce((lines: string[], st) => { - lines.push(`- ${st.name}`); - st.entryPoints.forEach((ep) => (lines.push(` - ${ep}`))); - return lines; - }, []) + .flatMap((st) => [ + `- ${st.name}`, + ...st.entryPoints.map((ep) => ` - ${ep}`), + ]) .join('\n'), }, 'module-vars.md': { old: '', - new: moduleNames - .reduce((lines: string[], m) => { - lines.push(`- ${m}`); - return lines; - }, []) - .join('\n'), + new: moduleNames.map((m) => `- ${m}`).join('\n'), }, 'script-type.md': { old: '', - new: scriptTypes - .reduce((lines: string[], st) => { - lines.push(`- ${st.name}`); - return lines; - }, []) - .join('\n'), + new: scriptTypes.map((st) => `- ${st.name}`).join('\n'), }, }; @@ -60,7 +49,7 @@ async function generateDocs() { continue; } - const data = await readDoc(fromPath); + const data = await readDoc(fromPath); const newContent = data?.replaceAll(options.old, options.new); if (newContent) { @@ -90,7 +79,9 @@ 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}`); + console.error( + `[${SCRIPT_NAME}] Error copying doc from ${fromPath} to ${toPath}`, + ); } } From 1551b9f03bc5d0a5236244c5e737599fae5d1596 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Sat, 30 May 2026 19:34:09 -0500 Subject: [PATCH 17/35] chore: package with tsdown --- package.json | 26 +++++++++++++++++++++----- tsconfig.base.json | 16 ---------------- tsconfig.dev.json | 8 -------- tsconfig.json | 23 +++++++++++++++++++++++ tsconfig.prod.json | 9 --------- tsdown.config.ts | 9 +++++++++ 6 files changed, 53 insertions(+), 38 deletions(-) delete mode 100644 tsconfig.base.json delete mode 100644 tsconfig.dev.json create mode 100644 tsconfig.json delete mode 100644 tsconfig.prod.json create mode 100644 tsdown.config.ts diff --git a/package.json b/package.json index 579140a..369ba65 100644 --- a/package.json +++ b/package.json @@ -10,18 +10,33 @@ "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": "tsc -p tsconfig.prod.json && tsc-alias -p tsconfig.prod.json", + "build": "tsdown", "build:docs": "tsx scripts/generate-docs.ts", "check": "biome check", - "check:types": "tsc -p tsconfig.dev.json", + "check:types": "tsc --noemit", "test": "node --test --require tsx tests/rules/**.ts" }, "files": [ "LICENSE", "README.md", - "lib" + "dist" ], "keywords": [ "suitescript", @@ -42,8 +57,9 @@ "@types/node": "^25.6.0", "eslint": "^10.0.0", "tsc-alias": "^1.8.17", + "tsdown": "^0.22.0", "tsx": "^4.21.0", - "typescript": "^5.9.3" + "typescript": "^6.0.3" }, "peerDependencies": { "eslint": ">=9.0.0" diff --git a/tsconfig.base.json b/tsconfig.base.json deleted file mode 100644 index a2b6ef6..0000000 --- a/tsconfig.base.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "compilerOptions": { - "allowJs": true, - "exactOptionalPropertyTypes": true, - "isolatedModules": true, - "module": "nodenext", - "moduleDetection": "force", - "moduleResolution": "nodenext", - "noUncheckedSideEffectImports": true, - "outDir": "dist", - "target": "es2020", - "skipLibCheck": true, - "strict": true - } -} diff --git a/tsconfig.dev.json b/tsconfig.dev.json deleted file mode 100644 index 96bb762..0000000 --- a/tsconfig.dev.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "extends": "./tsconfig.base.json", - "compilerOptions": { - "noEmit": true - }, - "include": ["lib/**.ts", "scripts/**.ts", "tests/**.ts"] -} 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/tsconfig.prod.json b/tsconfig.prod.json deleted file mode 100644 index 537ef0e..0000000 --- a/tsconfig.prod.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "extends": "./tsconfig.base.json", - "compilerOptions": { - "outDir": "dist", - "rootDir": "lib" - }, - "include": ["lib/**.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', +}); From 088509fcbd4ed8b58841ecb9e71ae6aed59a8df7 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Sat, 30 May 2026 19:36:41 -0500 Subject: [PATCH 18/35] refactor: fully type rules, use eslint-plugin-amd --- lib/rules/entry-points.ts | 38 +++++++++++--------- lib/rules/log-args.ts | 63 ++++++++++++++++++++------------- lib/rules/module-vars.ts | 6 +--- lib/rules/no-invalid-modules.ts | 14 ++++---- lib/rules/no-log-module.ts | 2 +- lib/utils/metadata.ts | 30 ++++++++++------ lib/utils/modules.ts | 62 ++++++++++++++++---------------- lib/utils/objects.ts | 14 ++------ lib/utils/script-types.ts | 11 +++--- package.json | 1 + pnpm-workspace.yaml | 4 +++ 11 files changed, 131 insertions(+), 114 deletions(-) create mode 100644 pnpm-workspace.yaml diff --git a/lib/rules/entry-points.ts b/lib/rules/entry-points.ts index 5c781f1..38b76aa 100644 --- a/lib/rules/entry-points.ts +++ b/lib/rules/entry-points.ts @@ -1,5 +1,5 @@ import type { Rule } from 'eslint'; -import type { CallExpression } from 'estree'; +import type { CallExpression, ReturnStatement, Statement } from 'estree'; import { getScriptType } from '../utils/metadata'; const rule: Rule.RuleModule = { @@ -20,9 +20,9 @@ const rule: Rule.RuleModule = { let hasValidEntryPoint = false; const scriptType = getScriptType(context); - if (!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 +35,22 @@ const rule: Rule.RuleModule = { 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?.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?.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,14 +63,14 @@ const rule: Rule.RuleModule = { 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) { @@ -74,7 +78,7 @@ const rule: Rule.RuleModule = { } } - if (scriptType.def.entryPoints.length === 0) { + if (def.entryPoints.length === 0) { hasValidEntryPoint = true; } diff --git a/lib/rules/log-args.ts b/lib/rules/log-args.ts index 5466eb4..81785e7 100644 --- a/lib/rules/log-args.ts +++ b/lib/rules/log-args.ts @@ -1,6 +1,13 @@ import type { Rule } from 'eslint'; +import type { CallExpression } from 'estree'; +import { getModuleNodePair, type ModuleNodes } from '../utils/modules'; import { getPropByKey } from '../utils/objects'; +type Options = { + requireTitle: boolean; + requireDetails: boolean; +}; + const LOG_MEMBERS = ['debug', 'audit', 'error', 'emergency']; const rule: Rule.RuleModule = { @@ -30,41 +37,48 @@ const rule: Rule.RuleModule = { ], }, create: (context) => { - let logModule; + const { requireTitle, requireDetails } = (context.options[0] ?? + {}) as Options; + + let logModule: ModuleNodes | undefined; return { - 'CallExpression[callee.name=define]': (node) => { + 'CallExpression[callee.name=define]': (node: CallExpression) => { logModule = getModuleNodePair(node, 'N/log'); }, - 'CallExpression[callee.object.type=Identifier]': (node) => { - const config = context.options[0] || { - requireTitle: true, - requireDetails: true, - }; + 'CallExpression[callee.object.type=Identifier]': ( + node: CallExpression, + ) => { const args = node.arguments; + const noArgsRequired = !requireTitle && !requireDetails; - if ( - args.length === 0 || - (!config.requireTitle && !config.requireDetails) - ) { + if (args.length === 0 || noArgsRequired) { return; } const callee = node.callee; - const logVar = logModule?.variable?.name ?? 'log'; if ( - callee.object.name !== logVar || - !LOG_MEMBERS.includes(callee.property.name) + callee.type !== 'MemberExpression' || + callee.object.type !== 'Identifier' || + callee.property.type !== 'Identifier' ) { return; } - if ( - config.requireTitle && - args[0].type === 'ObjectExpression' && - !getPropByKey(args[0], 'title') - ) { + 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', @@ -74,12 +88,11 @@ const rule: Rule.RuleModule = { }); } - if ( - config.requireDetails && - ((args[0].type !== 'ObjectExpression' && !args[1]) || - (args[0].type === 'ObjectExpression' && - !getPropByKey(args[0], 'details'))) - ) { + const onlyOneNonObjArg = !firstArgIsObj && args.length === 1; + const objMissingDetails = + firstArgIsObj && !getPropByKey(firstArg, 'details'); + + if (requireDetails && (onlyOneNonObjArg || objMissingDetails)) { context.report({ node, messageId: 'detailsRequired', diff --git a/lib/rules/module-vars.ts b/lib/rules/module-vars.ts index 14deca4..e425ab3 100644 --- a/lib/rules/module-vars.ts +++ b/lib/rules/module-vars.ts @@ -31,7 +31,7 @@ const rule: Rule.RuleModule = { if (modules.varCount === 0) return; for (const module of modules.list) { - if (!module.nodes.variable) continue; + if (!module.nodes.variable || !module.name) continue; const configVar = config[module.name]; @@ -50,10 +50,6 @@ const rule: Rule.RuleModule = { }), }; -/** - * Get schema properties from module names - * @returns {Object} - */ function getSchemaProperties() { const properties = moduleNames.map((name) => { return { diff --git a/lib/rules/no-invalid-modules.ts b/lib/rules/no-invalid-modules.ts index bc0add3..4a1c536 100644 --- a/lib/rules/no-invalid-modules.ts +++ b/lib/rules/no-invalid-modules.ts @@ -1,5 +1,5 @@ import type { Rule } from 'eslint'; -import type { CallExpression } from 'estree'; +import type { CallExpression, Literal } from 'estree'; import { getModules } from '../utils/modules'; const rule: Rule.RuleModule = { @@ -15,21 +15,21 @@ const rule: Rule.RuleModule = { }, }, create: (context) => { - let invalidModuleNodes = []; + let invalidModuleNodes: Literal[] = []; return { 'CallExpression[callee.name=define]': (node: CallExpression) => { - const modules = getModules(node).list; - invalidModuleNodes = modules - .filter((m) => !m.isValid && m.nodes.name) - .map((m) => m.nodes.name); + 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: invalidModuleNode.value, + module: String(invalidModuleNode.value), }, }); } diff --git a/lib/rules/no-log-module.ts b/lib/rules/no-log-module.ts index c5636cd..65ca8a3 100644 --- a/lib/rules/no-log-module.ts +++ b/lib/rules/no-log-module.ts @@ -38,7 +38,7 @@ const rule: Rule.RuleModule = { return; } - if (logModule) { + if (logModule?.name) { context.report({ node: logModule.name, messageId: 'useGlobalLog', diff --git a/lib/utils/metadata.ts b/lib/utils/metadata.ts index 7368f71..04f752b 100644 --- a/lib/utils/metadata.ts +++ b/lib/utils/metadata.ts @@ -1,10 +1,22 @@ 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+))?/; -function getScriptType(context: Rule.RuleContext) { +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() @@ -16,26 +28,24 @@ function getScriptType(context: Rule.RuleContext) { const scriptType = comment.value.match(SCRIPT_TAG_REGEX)?.[1]; - if (!scriptType) { - return; - } - 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), + 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), - }, + value: scriptType + ? { + start: sourceCode.getLocFromIndex(typeIndex), + end: sourceCode.getLocFromIndex(typeIndex + scriptType.length), + } + : false, }, }; } diff --git a/lib/utils/modules.ts b/lib/utils/modules.ts index 4086afc..effcf55 100644 --- a/lib/utils/modules.ts +++ b/lib/utils/modules.ts @@ -1,13 +1,13 @@ -import type { JSSyntaxElement } from 'eslint'; -import type { CallExpression } from 'estree'; +import type { CallExpression, Identifier, Literal } from 'estree'; +export type ModuleNodes = { + name: Literal | null; + variable: Identifier | null; +}; type Module = { - name: string; - variable: string; - nodes: { - name: JSSyntaxElement | null; - variable: JSSyntaxElement | null; - }; + name: string | null; + variable: string | null; + nodes: ModuleNodes; isValid: boolean; }; @@ -70,20 +70,23 @@ const MODULES = { const moduleNames = Object.keys(MODULES); -function getModules(defineCallNode: CallExpression) { - const modules: Module[] = []; +function getModules(defineCallNode: CallExpression): { + list: Module[]; + varCount: number; +} { + const list: Module[] = []; - let nameCount = 0; let varCount = 0; if ( 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]; @@ -94,10 +97,10 @@ function getModules(defineCallNode: CallExpression) { (callback.type !== 'FunctionExpression' && callback.type !== 'ArrowFunctionExpression') ) { - return modules; + return { list, varCount }; } - nameCount = moduleList.elements.length; + const nameCount = moduleList.elements.length; varCount = callback.params.length; const longerList = @@ -107,41 +110,40 @@ function getModules(defineCallNode: CallExpression) { const nameNode = moduleList.elements[i]; const varNode = callback.params[i]; - modules.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 }; } function getModuleNames(defineCallNode: CallExpression) { const modules = getModules(defineCallNode); - const moduleNames = modules.map((module) => module.name); - - return moduleNames; + return modules.list.map((module) => module.name); } function getModuleVars(defineCallNode: CallExpression) { const modules = getModules(defineCallNode); - const moduleVars = modules.map((module) => module.variable); - - return moduleVars; + return modules.list.map((module) => module.variable); } function getModuleNodePair(defineCallNode: CallExpression, moduleName: string) { const modules = getModules(defineCallNode); - const targetModule = modules.find((m) => m.name === moduleName); + const targetModule = modules.list.find((m) => m.name === moduleName); return targetModule?.nodes; } diff --git a/lib/utils/objects.ts b/lib/utils/objects.ts index 67ffc83..48e0340 100644 --- a/lib/utils/objects.ts +++ b/lib/utils/objects.ts @@ -1,9 +1,4 @@ -import type { - Identifier, - ObjectExpression, - Property, - SpreadElement, -} from 'estree'; +import type { ObjectExpression, Property, SpreadElement } from 'estree'; function getPropByKey(obj: ObjectExpression, key: string) { for (const _prop of obj.properties) { @@ -17,11 +12,6 @@ function getPropByKey(obj: ObjectExpression, key: string) { return null; } -/** - * Gets a list of all properties in an AST object node - * @param {ASTNode} obj Target object - * @returns {Array} - */ function getPropList(obj: ObjectExpression) { return obj.properties .map((prop) => propAsIdentProp(prop)?.key.name) @@ -32,7 +22,7 @@ function propAsIdentProp(prop: Property | SpreadElement) { return prop.type === 'Property' && prop.key.type === 'Identifier' ? { ...prop, - key: prop.key as Identifier, + key: prop.key, } : null; } diff --git a/lib/utils/script-types.ts b/lib/utils/script-types.ts index 7179f51..0120cf8 100644 --- a/lib/utils/script-types.ts +++ b/lib/utils/script-types.ts @@ -81,13 +81,10 @@ const scriptTypes = [ ]; function getScriptTypeDef(scriptType: string) { - return ( - !!scriptType && - scriptTypes.find((x) => x.name.toLowerCase() === scriptType.toLowerCase()) + 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 369ba65..af4d2a5 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "node": "^20.19.0 || ^22.13.0 || >=24" }, "dependencies": { + "@acdvs/eslint-plugin-amd": "^1.0.0", "globals": "^17.6.0" }, "devDependencies": { 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' From ab5730354d00713fc33a7117b99d3b594cc249ae Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Sat, 30 May 2026 20:34:27 -0500 Subject: [PATCH 19/35] docs: use dynamic rule url --- lib/rules/api-version.ts | 6 +++++- lib/rules/entry-points.ts | 6 +++++- lib/rules/log-args.ts | 6 +++++- lib/rules/module-vars.ts | 6 +++++- lib/rules/no-invalid-modules.ts | 6 +++++- lib/rules/no-log-module.ts | 6 +++++- lib/rules/script-type.ts | 6 +++++- 7 files changed, 35 insertions(+), 7 deletions(-) diff --git a/lib/rules/api-version.ts b/lib/rules/api-version.ts index b0c5454..de5924d 100644 --- a/lib/rules/api-version.ts +++ b/lib/rules/api-version.ts @@ -1,15 +1,19 @@ +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']; +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: { diff --git a/lib/rules/entry-points.ts b/lib/rules/entry-points.ts index 38b76aa..8f954df 100644 --- a/lib/rules/entry-points.ts +++ b/lib/rules/entry-points.ts @@ -1,14 +1,18 @@ +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 RULE_NAME = path.basename(import.meta.filename, '.ts'); + 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', + url: `${pkg.homepage}/blob/master/docs/rules/${RULE_NAME}.md`, }, schema: [], messages: { diff --git a/lib/rules/log-args.ts b/lib/rules/log-args.ts index 81785e7..635a7fe 100644 --- a/lib/rules/log-args.ts +++ b/lib/rules/log-args.ts @@ -1,8 +1,12 @@ +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; @@ -15,7 +19,7 @@ const rule: Rule.RuleModule = { type: 'suggestion', docs: { description: 'Enforce correct log arguments', - url: 'https://github.com/acdvs/eslint-plugin-suitescript/blob/master/docs/rules/log-args.md', + url: `${pkg.homepage}/blob/master/docs/rules/${RULE_NAME}.md`, }, messages: { titleRequired: "A log title is required with 'Log.{{ prop }}'", diff --git a/lib/rules/module-vars.ts b/lib/rules/module-vars.ts index e425ab3..585bfb8 100644 --- a/lib/rules/module-vars.ts +++ b/lib/rules/module-vars.ts @@ -1,14 +1,18 @@ +import path from 'node:path'; import type { Rule } from 'eslint'; import type { CallExpression } from 'estree'; +import pkg from '../../package.json'; import { getModules, moduleNames } from '../utils/modules'; +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: 'https://github.com/acdvs/eslint-plugin-suitescript/blob/master/docs/rules/module-vars.md', + url: `${pkg.homepage}/blob/master/docs/rules/${RULE_NAME}.md`, }, messages: { useCorrectName: "Identifier for {{ module }} should be '{{ id }}'", diff --git a/lib/rules/no-invalid-modules.ts b/lib/rules/no-invalid-modules.ts index 4a1c536..a3e9866 100644 --- a/lib/rules/no-invalid-modules.ts +++ b/lib/rules/no-invalid-modules.ts @@ -1,13 +1,17 @@ +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: 'https://github.com/acdvs/eslint-plugin-suitescript/blob/master/docs/rules/no-invalid-modules.md', + url: `${pkg.homepage}/blob/master/docs/rules/${RULE_NAME}.md`, }, schema: [], messages: { diff --git a/lib/rules/no-log-module.ts b/lib/rules/no-log-module.ts index 65ca8a3..ce293ec 100644 --- a/lib/rules/no-log-module.ts +++ b/lib/rules/no-log-module.ts @@ -1,15 +1,19 @@ +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: 'https://github.com/acdvs/eslint-plugin-suitescript/blob/master/docs/rules/no-log-module.md', + url: `${pkg.homepage}/blob/master/docs/rules/${RULE_NAME}.md`, }, messages: { useGlobalLog: 'Use global log instead of the N/log module', diff --git a/lib/rules/script-type.ts b/lib/rules/script-type.ts index 6318356..5ab6785 100644 --- a/lib/rules/script-type.ts +++ b/lib/rules/script-type.ts @@ -1,12 +1,16 @@ +import path from 'node:path'; import type { Rule } from 'eslint'; +import pkg from '../../package.json'; import { getScriptType } from '../utils/metadata'; +const RULE_NAME = path.basename(import.meta.filename, '.ts'); + 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: { From 5aa41dfef0ec955aa608eee48f76a24bb8394386 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Sat, 30 May 2026 21:13:57 -0500 Subject: [PATCH 20/35] refactor: use amd utils in module-vars --- lib/rules/module-vars.ts | 67 ++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/lib/rules/module-vars.ts b/lib/rules/module-vars.ts index 585bfb8..f4d7ea5 100644 --- a/lib/rules/module-vars.ts +++ b/lib/rules/module-vars.ts @@ -1,8 +1,11 @@ import path from 'node:path'; +import { getDefineCall } from '@acdvs/eslint-plugin-amd/utils'; import type { Rule } from 'eslint'; -import type { CallExpression } from 'estree'; +import type { CallExpression, Identifier } from 'estree'; import pkg from '../../package.json'; -import { getModules, moduleNames } from '../utils/modules'; +import { MODULES, type ModuleName } from '../utils/modules'; + +type Options = Partial>; const RULE_NAME = path.basename(import.meta.filename, '.ts'); @@ -24,44 +27,48 @@ const rule: Rule.RuleModule = { additionalProperties: false, }, ], + defaultOptions: [MODULES], }, - create: (context) => ({ - 'CallExpression[callee.name=define]': (node: CallExpression) => { - if (!context.options[0]) return; + create: (context) => { + const config = (context.options[0] ?? {}) as Options; - const config = context.options[0]; - const modules = getModules(node); + return { + 'CallExpression[callee.name=define]': (node: CallExpression) => { + if (!context.options[0]) return; - if (modules.varCount === 0) return; + const defineCall = getDefineCall(node); + const pairs = defineCall?.depAnalysis?.pairs; - for (const module of modules.list) { - if (!module.nodes.variable || !module.name) continue; + if (!pairs) return; - const configVar = config[module.name]; + 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 (configVar && configVar !== module.variable) { - context.report({ - node: module.nodes.variable, - messageId: 'useCorrectName', - data: { - module: module.name, - id: configVar, - }, - }); + if (paramName !== configParamName) { + context.report({ + node: param, + messageId: 'useCorrectName', + data: { + module: moduleName, + id: configParamName, + }, + }); + } } - } - }, - }), + }, + }; + }, }; function getSchemaProperties() { - const properties = moduleNames.map((name) => { - return { - [name]: { - type: 'string', - }, - }; - }); + const properties = Object.keys(MODULES).map((name) => ({ + [name]: { + type: 'string', + }, + })); return Object.assign({}, ...properties); } From 38434524f878229e0d4972610b087621113e638b Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Thu, 16 Jul 2026 12:07:26 -0500 Subject: [PATCH 21/35] chore: bump deps --- package.json | 18 +- pnpm-lock.yaml | 1295 ++++++++++++++++++++++++++++++------------------ 2 files changed, 813 insertions(+), 500 deletions(-) diff --git a/package.json b/package.json index af4d2a5..9998d3f 100644 --- a/package.json +++ b/package.json @@ -49,18 +49,18 @@ }, "dependencies": { "@acdvs/eslint-plugin-amd": "^1.0.0", - "globals": "^17.6.0" + "globals": "^17.7.0" }, "devDependencies": { - "@biomejs/biome": "^2.4.14", + "@biomejs/biome": "^2.5.4", "@types/eslint": "^9.6.1", - "@types/estree": "^1.0.8", - "@types/node": "^25.6.0", - "eslint": "^10.0.0", - "tsc-alias": "^1.8.17", - "tsdown": "^0.22.0", - "tsx": "^4.21.0", - "typescript": "^6.0.3" + "@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 index b1f4ebd..69b1e55 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,38 +10,38 @@ importers: dependencies: '@acdvs/eslint-plugin-amd': specifier: ^1.0.0 - version: 1.0.0(eslint@10.3.0) + version: 1.0.0(eslint@10.7.0) globals: - specifier: ^17.6.0 - version: 17.6.0 + specifier: ^17.7.0 + version: 17.7.0 devDependencies: '@biomejs/biome': - specifier: ^2.4.14 - version: 2.4.14 + specifier: ^2.5.4 + version: 2.5.4 '@types/eslint': specifier: ^9.6.1 version: 9.6.1 '@types/estree': - specifier: ^1.0.8 - version: 1.0.8 + specifier: ^1.0.9 + version: 1.0.9 '@types/node': - specifier: ^25.6.0 - version: 25.6.0 + specifier: ^25.9.5 + version: 25.9.5 eslint: - specifier: ^10.0.0 - version: 10.3.0 + specifier: ^10.7.0 + version: 10.7.0 tsc-alias: - specifier: ^1.8.17 - version: 1.8.17 + specifier: ^1.9.1 + version: 1.9.1 tsdown: - specifier: ^0.22.0 - version: 0.22.0(tsx@4.21.0)(typescript@6.0.3) + specifier: ^0.22.8 + version: 0.22.8(tsx@4.23.1)(typescript@7.0.2) tsx: - specifier: ^4.21.0 - version: 4.21.0 + specifier: ^4.23.1 + version: 4.23.1 typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^7.0.2 + version: 7.0.2 packages: @@ -51,254 +51,224 @@ packages: peerDependencies: eslint: '>=9.0.0' - '@babel/generator@8.0.0-rc.5': - resolution: {integrity: sha512-nFZPWz3FHIS7y6rMIVoa/WBwjdutfIaRJIBQjzn+t3RnecZoRNlGmGcyR2wb0T/IgSd50Kz/6dG8/LvMCRunjg==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-string-parser@8.0.0-rc.6': - resolution: {integrity: sha512-BCkFy+zN6kXQed3YOT7aJl93NfDSzQc3pBfsvTVPs9gU9X3V0aefEF5kwBT0E+mDWH9QgKaZstYUQN9VdQZT4g==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-validator-identifier@8.0.0-rc.5': - resolution: {integrity: sha512-ehJDxHvtbZ85RtX/L2fi0h9AGsBNqB5Euv1EB8RMAvGYvD+2X+QbpzzOpbklnNXO+WSZJNOaetw2BBj27xsWVg==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-validator-identifier@8.0.0-rc.6': - resolution: {integrity: sha512-nVJ+1JcCgntv8d78rRo++o2wuODT0Irknx2BF8Np4Ft2CRgjLqIs4qzSZ8b66yGbBdMWGmZBO9WEZv1hhNiSpg==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/parser@8.0.0-rc.4': - resolution: {integrity: sha512-0S/1yefMa15N4i2v3t8Fw9pgMHhf2gF6Lc1UEXI96Ls6FNAjqvHHZouZ2ZS/deqLhbMFtmfVeFac6iTsvFbLwA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - - '@babel/parser@8.0.0-rc.6': - resolution: {integrity: sha512-rOS8IpdO7mQELkTPlCsTgPejO0bFuZdEDCGQJouYbYf9e1FLTym7Fei2pEjq8q7MWbX0ravcd7QQYKs1TxOuog==} - engines: {node: ^22.18.0 || >=24.11.0} - hasBin: true - - '@babel/types@8.0.0-rc.6': - resolution: {integrity: sha512-p7/ABylAYlexb31wtRdIfH9L9A0Z2T/9H6zAqzqndkY2PLkvNNc580wGhp/gGKN4Sp9sQvSkhc6Oga8/O+wTyw==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@biomejs/biome@2.4.14': - resolution: {integrity: sha512-TmAvxOEgrpLypzVGJ8FulIZnlyA9TxrO1hyqYrCz9r+bwma9xXxuLA5IuYnj55XQneFx460KjRbx6SWGLkg3bQ==} + '@biomejs/biome@2.5.4': + resolution: {integrity: sha512-xy5FNE5kQJKyK5MR1gJy6ztXYx4WBAbYGlK04lMEgmyPRWKybY9NFwiG9yo0XdzOU8Xvhj41u034J1ywfoWfMw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.4.14': - resolution: {integrity: sha512-XvgoE9XOawUOQPdmvs4J7wPhi/DLwSCGks3AlPJDmh34O0awRTqCED1HRcRDdpf1Zrp4us4MGOOdIxNpbqNF5Q==} + '@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.4.14': - resolution: {integrity: sha512-jE7hKBCFhOx3uUh+ZkWBfOHxAcILPfhFplNkuID/eZeSTLHzfZzoZxW8fbqY9xXRnPi7jGNAf1iPVR+0yWsM/Q==} + '@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.4.14': - resolution: {integrity: sha512-/z+6gqAqqUQTHazwStxSXKHg9b8UvqBmDFRp+c4wYbq2KXhELQDon9EoC9RpmQ8JWkqQx/lIUy/cs+MhzDZp6A==} + '@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.4.14': - resolution: {integrity: sha512-2TELhZnW5RSLL063l9rc5xLpA0ZIw0Ccwy/0q384rvNAgFw3yI76bd59547yxowdQr5MNPET/xDLrLuvgSeeWQ==} + '@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.4.14': - resolution: {integrity: sha512-R6BWgJdQOwW9ulJatuTVrQkjnODjqHZkKNOqb1sz++3Noe5LYd0i3PchnOBUCYAPHoPWHhjJqbdZlHEu0hpjdA==} + '@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.4.14': - resolution: {integrity: sha512-zHrlQZDBDUz4OLAraYpWKcnLS6HOewBFWYOzY91d1ZjdqZwibOyb6BEu6WuWLugyo0P3riCmsbV9UqV1cSXwQg==} + '@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.4.14': - resolution: {integrity: sha512-M3EH5hqOI/F/FUA2u4xcLoUgmxd218mvuj/6JL7Hv2toQvr2/AdOvKSpGkoRuWFCtQPVa+ZqkEV3Q5xBA9+XSA==} + '@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.4.14': - resolution: {integrity: sha512-WL0EG5qE+EAKomGXbf2g6VnSKJhTL3tXC0QRzWRwA5VpjxNYa6H4P7ZWfymbGE4IhZZQi1KXQ2R0YjwInmz2fA==} + '@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.10.0': - resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} - '@emnapi/runtime@1.10.0': - resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} - '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} - '@esbuild/aix-ppc64@0.27.4': - resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} + '@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.27.4': - resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.4': - resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.4': - resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.4': - resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.4': - resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.4': - resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} + '@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.27.4': - resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} + '@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.27.4': - resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.4': - resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.4': - resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.4': - resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} + '@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.27.4': - resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.4': - resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.4': - resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.4': - resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.4': - resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.4': - resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.4': - resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.4': - resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.4': - resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} + '@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.27.4': - resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.4': - resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.4': - resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.4': - resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.4': - resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -317,8 +287,8 @@ packages: resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.5.5': - resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + '@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': @@ -329,8 +299,8 @@ packages: resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.7.1': - resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + '@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': @@ -353,21 +323,8 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@napi-rs/wasm-runtime@1.1.4': - resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + '@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 @@ -384,103 +341,103 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/types@0.132.0': - resolution: {integrity: sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==} + '@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.0.2': - resolution: {integrity: sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==} + '@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.0.2': - resolution: {integrity: sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w==} + '@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.0.2': - resolution: {integrity: sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA==} + '@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.0.2': - resolution: {integrity: sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA==} + '@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.0.2': - resolution: {integrity: sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w==} + '@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.0.2': - resolution: {integrity: sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==} + '@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.0.2': - resolution: {integrity: sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==} + '@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.0.2': - resolution: {integrity: sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==} + '@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.0.2': - resolution: {integrity: sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ==} + '@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.0.2': - resolution: {integrity: sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ==} + '@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.0.2': - resolution: {integrity: sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw==} + '@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.0.2': - resolution: {integrity: sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w==} + '@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.0.2': - resolution: {integrity: sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ==} + '@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.0.2': - resolution: {integrity: sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A==} + '@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.0.2': - resolution: {integrity: sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ==} + '@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] @@ -488,8 +445,8 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@tybys/wasm-util@0.10.2': - resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@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==} @@ -497,33 +454,275 @@ packages: '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/jsesc@2.5.1': - resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + '@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.6.0': - resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} + '@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.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} hasBin: true - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ansis@4.3.0: - resolution: {integrity: sha512-44mvgtPvohuU/70DdY5Oz2AIrLJ9k6/5x4KmoSvPwO+5Moijo0+N9D0fKbbYZQWP1hNm5CpOf+E01jhxG/r8xg==} + ansis@4.3.1: + resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} engines: {node: '>=14'} anymatch@3.1.3: @@ -534,10 +733,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - ast-kit@3.0.0-beta.1: - resolution: {integrity: sha512-trmleAnZ2PxN/loHWVhhx1qeOHSRXq4TDsBBxq3GqeJitfk3+jTQ+v/C1km/KYq9M7wKqCewMh+/NAvVH7m+bw==} - engines: {node: '>=20.19.0'} - balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} @@ -546,11 +741,8 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - birpc@4.0.0: - resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} - - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.7: + resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -605,8 +797,8 @@ packages: resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} engines: {node: '>=14'} - esbuild@0.27.4: - resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} hasBin: true @@ -626,8 +818,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.3.0: - resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} + eslint@10.7.0: + resolution: {integrity: sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -652,9 +844,6 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -708,8 +897,8 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - get-tsconfig@4.13.7: - resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} get-tsconfig@5.0.0-beta.5: resolution: {integrity: sha512-/6gFNr0N04nob252sTQxyFLi3eKFRqIg1I87YcqAMT1i6SQrSF6KujUEQrtrjMV0H/eejTCltLdDSTEMzHbnsQ==} @@ -723,8 +912,8 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - globals@17.6.0: - resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} + globals@17.7.0: + resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} engines: {node: '>=18'} globby@11.1.0: @@ -765,11 +954,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -816,8 +1000,9 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + obug@2.1.3: + resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} + engines: {node: '>=12.20.0'} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} @@ -843,15 +1028,12 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - picomatch@2.3.2: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} plimit-lit@1.6.1: @@ -887,15 +1069,15 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rolldown-plugin-dts@0.25.1: - resolution: {integrity: sha512-zK82aC/8z1iVW+g0bCnlQZq04Y5bNeL/RcRwTYBwsnU6wH0N+6vpIFkN7JC0kYRS5qKA+pxQyfIPvXJ6Q5xSpQ==} - engines: {node: ^22.18.0 || >=24.0.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': '>=7.0.0-dev.20260325.1' + '@typescript/native-preview': '*' rolldown: ^1.0.0 - typescript: ^5.0.0 || ^6.0.0 - vue-tsc: ~3.2.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 @@ -906,16 +1088,16 @@ packages: vue-tsc: optional: true - rolldown@1.0.2: - resolution: {integrity: sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g==} + 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.1: - resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true @@ -931,12 +1113,12 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - tinyexec@1.2.2: - resolution: {integrity: sha512-M/Q0B2cp4K7kynaT/vnED1j8TlLY+Pp7C6Wl2bl/7u/F0mUVwdyOpwomQb8JpYLitHUssAJRmLZdMCGsrx7i+g==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} to-regex-range@5.0.1: @@ -947,23 +1129,23 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - tsc-alias@1.8.17: - resolution: {integrity: sha512-EIduCZHqbNwPm8BZYfq1aD7BQ697A4h6uSGMOFQfYGoQwfrYFTKwYfy9Bv42YxHkduVBcn9Zx0DkX111DKskyg==} + tsc-alias@1.9.1: + resolution: {integrity: sha512-sFZdVFthH8uvdplPJrOYGOHcxu6UPtcAcY678JPwEQiMzgLZYFO7Qc/rzELp7ingTc+OxtzH6n+8Pn2eVQep6w==} engines: {node: '>=16.20.2'} hasBin: true - tsdown@0.22.0: - resolution: {integrity: sha512-FgW0hHb27nGQA/+F3d5+U9wKXkfilk9DVkc5+7x/ZqF03g+Hoz/eeApT32jqxATt9eRoR+1jxk7MUMON+O4CXw==} - engines: {node: ^22.18.0 || >=24.0.0} + 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.0 - '@tsdown/exe': 0.22.0 + '@tsdown/css': 0.22.8 + '@tsdown/exe': 0.22.8 '@vitejs/devtools': '*' publint: ^0.3.8 tsx: '*' - typescript: ^5.0.0 || ^6.0.0 + typescript: ^5.0.0 || ^6.0.0 || ^7.0.0 unplugin-unused: ^0.5.0 unrun: '*' peerDependenciesMeta: @@ -989,8 +1171,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.21.0: - resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + tsx@4.23.1: + resolution: {integrity: sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==} engines: {node: '>=18.0.0'} hasBin: true @@ -998,16 +1180,16 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript@6.0.3: - resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} - engines: {node: '>=14.17'} + 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.19.2: - resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1025,173 +1207,154 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} -snapshots: - - '@acdvs/eslint-plugin-amd@1.0.0(eslint@10.3.0)': - dependencies: - eslint: 10.3.0 - globals: 17.6.0 - - '@babel/generator@8.0.0-rc.5': - dependencies: - '@babel/parser': 8.0.0-rc.6 - '@babel/types': 8.0.0-rc.6 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - '@types/jsesc': 2.5.1 - jsesc: 3.1.0 + yuku-ast@0.1.7: + resolution: {integrity: sha512-2RiMEWv500TixY5rJy6OZd4fSy9WYZKWh6gGbIJ7y7vAGcuCugWOWwOLGaQcRZrXcPUfqtLtvpaJ3SdXtWlhKA==} - '@babel/helper-string-parser@8.0.0-rc.6': {} + yuku-codegen@0.6.3: + resolution: {integrity: sha512-3c9H521tf1RRDu4cNUySfH01sKlALve4HKu2sITk33gLl5HhsvI6ngSuarpWxMPAiJEgqJc/HTvojWQRnYm9/g==} - '@babel/helper-validator-identifier@8.0.0-rc.5': {} + yuku-parser@0.6.3: + resolution: {integrity: sha512-iI6uABvvup9mvv8Mcpz7Tp//gehQlvcSnX4A4/0bf9i6X3RVQDuVUZel8jdpljwlF7WrbKsvD19y55Mc6+sKZw==} - '@babel/helper-validator-identifier@8.0.0-rc.6': {} - - '@babel/parser@8.0.0-rc.4': - dependencies: - '@babel/types': 8.0.0-rc.6 - - '@babel/parser@8.0.0-rc.6': - dependencies: - '@babel/types': 8.0.0-rc.6 +snapshots: - '@babel/types@8.0.0-rc.6': + '@acdvs/eslint-plugin-amd@1.0.0(eslint@10.7.0)': dependencies: - '@babel/helper-string-parser': 8.0.0-rc.6 - '@babel/helper-validator-identifier': 8.0.0-rc.6 + eslint: 10.7.0 + globals: 17.7.0 - '@biomejs/biome@2.4.14': + '@biomejs/biome@2.5.4': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.4.14 - '@biomejs/cli-darwin-x64': 2.4.14 - '@biomejs/cli-linux-arm64': 2.4.14 - '@biomejs/cli-linux-arm64-musl': 2.4.14 - '@biomejs/cli-linux-x64': 2.4.14 - '@biomejs/cli-linux-x64-musl': 2.4.14 - '@biomejs/cli-win32-arm64': 2.4.14 - '@biomejs/cli-win32-x64': 2.4.14 - - '@biomejs/cli-darwin-arm64@2.4.14': + '@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.4.14': + '@biomejs/cli-darwin-x64@2.5.4': optional: true - '@biomejs/cli-linux-arm64-musl@2.4.14': + '@biomejs/cli-linux-arm64-musl@2.5.4': optional: true - '@biomejs/cli-linux-arm64@2.4.14': + '@biomejs/cli-linux-arm64@2.5.4': optional: true - '@biomejs/cli-linux-x64-musl@2.4.14': + '@biomejs/cli-linux-x64-musl@2.5.4': optional: true - '@biomejs/cli-linux-x64@2.4.14': + '@biomejs/cli-linux-x64@2.5.4': optional: true - '@biomejs/cli-win32-arm64@2.4.14': + '@biomejs/cli-win32-arm64@2.5.4': optional: true - '@biomejs/cli-win32-x64@2.4.14': + '@biomejs/cli-win32-x64@2.5.4': optional: true - '@emnapi/core@1.10.0': + '@emnapi/core@1.11.1': dependencies: - '@emnapi/wasi-threads': 1.2.1 + '@emnapi/wasi-threads': 1.2.2 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.10.0': + '@emnapi/runtime@1.11.1': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.2.1': + '@emnapi/wasi-threads@1.2.2': dependencies: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.27.4': + '@esbuild/aix-ppc64@0.28.1': optional: true - '@esbuild/android-arm64@0.27.4': + '@esbuild/android-arm64@0.28.1': optional: true - '@esbuild/android-arm@0.27.4': + '@esbuild/android-arm@0.28.1': optional: true - '@esbuild/android-x64@0.27.4': + '@esbuild/android-x64@0.28.1': optional: true - '@esbuild/darwin-arm64@0.27.4': + '@esbuild/darwin-arm64@0.28.1': optional: true - '@esbuild/darwin-x64@0.27.4': + '@esbuild/darwin-x64@0.28.1': optional: true - '@esbuild/freebsd-arm64@0.27.4': + '@esbuild/freebsd-arm64@0.28.1': optional: true - '@esbuild/freebsd-x64@0.27.4': + '@esbuild/freebsd-x64@0.28.1': optional: true - '@esbuild/linux-arm64@0.27.4': + '@esbuild/linux-arm64@0.28.1': optional: true - '@esbuild/linux-arm@0.27.4': + '@esbuild/linux-arm@0.28.1': optional: true - '@esbuild/linux-ia32@0.27.4': + '@esbuild/linux-ia32@0.28.1': optional: true - '@esbuild/linux-loong64@0.27.4': + '@esbuild/linux-loong64@0.28.1': optional: true - '@esbuild/linux-mips64el@0.27.4': + '@esbuild/linux-mips64el@0.28.1': optional: true - '@esbuild/linux-ppc64@0.27.4': + '@esbuild/linux-ppc64@0.28.1': optional: true - '@esbuild/linux-riscv64@0.27.4': + '@esbuild/linux-riscv64@0.28.1': optional: true - '@esbuild/linux-s390x@0.27.4': + '@esbuild/linux-s390x@0.28.1': optional: true - '@esbuild/linux-x64@0.27.4': + '@esbuild/linux-x64@0.28.1': optional: true - '@esbuild/netbsd-arm64@0.27.4': + '@esbuild/netbsd-arm64@0.28.1': optional: true - '@esbuild/netbsd-x64@0.27.4': + '@esbuild/netbsd-x64@0.28.1': optional: true - '@esbuild/openbsd-arm64@0.27.4': + '@esbuild/openbsd-arm64@0.28.1': optional: true - '@esbuild/openbsd-x64@0.27.4': + '@esbuild/openbsd-x64@0.28.1': optional: true - '@esbuild/openharmony-arm64@0.27.4': + '@esbuild/openharmony-arm64@0.28.1': optional: true - '@esbuild/sunos-x64@0.27.4': + '@esbuild/sunos-x64@0.28.1': optional: true - '@esbuild/win32-arm64@0.27.4': + '@esbuild/win32-arm64@0.28.1': optional: true - '@esbuild/win32-ia32@0.27.4': + '@esbuild/win32-ia32@0.28.1': optional: true - '@esbuild/win32-x64@0.27.4': + '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.7.0)': dependencies: - eslint: 10.3.0 + eslint: 10.7.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -1204,7 +1367,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.5.5': + '@eslint/config-helpers@0.6.0': dependencies: '@eslint/core': 1.2.1 @@ -1214,7 +1377,7 @@ snapshots: '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.7.1': + '@eslint/plugin-kit@0.7.2': dependencies: '@eslint/core': 1.2.1 levn: 0.4.1 @@ -1235,25 +1398,11 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@jridgewell/gen-mapping@0.3.13': + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.2 + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 optional: true '@nodelib/fs.scandir@2.1.5': @@ -1268,99 +1417,225 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@oxc-project/types@0.132.0': {} + '@oxc-project/types@0.139.0': {} '@quansync/fs@1.0.0': dependencies: quansync: 1.0.0 - '@rolldown/binding-android-arm64@1.0.2': + '@rolldown/binding-android-arm64@1.1.5': optional: true - '@rolldown/binding-darwin-arm64@1.0.2': + '@rolldown/binding-darwin-arm64@1.1.5': optional: true - '@rolldown/binding-darwin-x64@1.0.2': + '@rolldown/binding-darwin-x64@1.1.5': optional: true - '@rolldown/binding-freebsd-x64@1.0.2': + '@rolldown/binding-freebsd-x64@1.1.5': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.2': + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.2': + '@rolldown/binding-linux-arm64-gnu@1.1.5': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.2': + '@rolldown/binding-linux-arm64-musl@1.1.5': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.2': + '@rolldown/binding-linux-ppc64-gnu@1.1.5': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.2': + '@rolldown/binding-linux-s390x-gnu@1.1.5': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.2': + '@rolldown/binding-linux-x64-gnu@1.1.5': optional: true - '@rolldown/binding-linux-x64-musl@1.0.2': + '@rolldown/binding-linux-x64-musl@1.1.5': optional: true - '@rolldown/binding-openharmony-arm64@1.0.2': + '@rolldown/binding-openharmony-arm64@1.1.5': optional: true - '@rolldown/binding-wasm32-wasi@1.0.2': + '@rolldown/binding-wasm32-wasi@1.1.5': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@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.0.2': + '@rolldown/binding-win32-arm64-msvc@1.1.5': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.2': + '@rolldown/binding-win32-x64-msvc@1.1.5': optional: true '@rolldown/pluginutils@1.0.1': {} - '@tybys/wasm-util@0.10.2': + '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 optional: true '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 '@types/esrecurse@4.3.1': {} - '@types/estree@1.0.8': {} - - '@types/jsesc@2.5.1': {} + '@types/estree@1.0.9': {} '@types/json-schema@7.0.15': {} - '@types/node@25.6.0': + '@types/node@25.9.5': dependencies: - undici-types: 7.19.2 + 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 - acorn-jsx@5.3.2(acorn@8.16.0): + '@yuku-toolchain/types@0.5.43': {} + + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - acorn: 8.16.0 + acorn: 8.17.0 - acorn@8.16.0: {} + acorn@8.17.0: {} - ajv@6.14.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.0: {} + ansis@4.3.1: {} anymatch@3.1.3: dependencies: @@ -1369,19 +1644,11 @@ snapshots: array-union@2.1.0: {} - ast-kit@3.0.0-beta.1: - dependencies: - '@babel/parser': 8.0.0-rc.4 - estree-walker: 3.0.3 - pathe: 2.0.3 - balanced-match@4.0.4: {} binary-extensions@2.3.0: {} - birpc@4.0.0: {} - - brace-expansion@5.0.5: + brace-expansion@5.0.7: dependencies: balanced-match: 4.0.4 @@ -1427,41 +1694,41 @@ snapshots: empathic@2.0.1: {} - esbuild@0.27.4: + esbuild@0.28.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.4 - '@esbuild/android-arm': 0.27.4 - '@esbuild/android-arm64': 0.27.4 - '@esbuild/android-x64': 0.27.4 - '@esbuild/darwin-arm64': 0.27.4 - '@esbuild/darwin-x64': 0.27.4 - '@esbuild/freebsd-arm64': 0.27.4 - '@esbuild/freebsd-x64': 0.27.4 - '@esbuild/linux-arm': 0.27.4 - '@esbuild/linux-arm64': 0.27.4 - '@esbuild/linux-ia32': 0.27.4 - '@esbuild/linux-loong64': 0.27.4 - '@esbuild/linux-mips64el': 0.27.4 - '@esbuild/linux-ppc64': 0.27.4 - '@esbuild/linux-riscv64': 0.27.4 - '@esbuild/linux-s390x': 0.27.4 - '@esbuild/linux-x64': 0.27.4 - '@esbuild/netbsd-arm64': 0.27.4 - '@esbuild/netbsd-x64': 0.27.4 - '@esbuild/openbsd-arm64': 0.27.4 - '@esbuild/openbsd-x64': 0.27.4 - '@esbuild/openharmony-arm64': 0.27.4 - '@esbuild/sunos-x64': 0.27.4 - '@esbuild/win32-arm64': 0.27.4 - '@esbuild/win32-ia32': 0.27.4 - '@esbuild/win32-x64': 0.27.4 + '@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.8 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -1469,19 +1736,19 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.3.0: + eslint@10.7.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) + '@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.5.5 + '@eslint/config-helpers': 0.6.0 '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.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.8 - ajv: 6.14.0 + '@types/estree': 1.0.9 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 @@ -1506,8 +1773,8 @@ snapshots: espree@11.2.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 5.0.1 esquery@1.7.0: @@ -1520,10 +1787,6 @@ snapshots: estraverse@5.3.0: {} - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.8 - esutils@2.0.3: {} fast-deep-equal@3.1.3: {} @@ -1544,9 +1807,9 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 file-entry-cache@8.0.0: dependencies: @@ -1571,7 +1834,7 @@ snapshots: fsevents@2.3.3: optional: true - get-tsconfig@4.13.7: + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -1587,7 +1850,7 @@ snapshots: dependencies: is-glob: 4.0.3 - globals@17.6.0: {} + globals@17.7.0: {} globby@11.1.0: dependencies: @@ -1620,8 +1883,6 @@ snapshots: isexe@2.0.0: {} - jsesc@3.1.0: {} - json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} @@ -1650,7 +1911,7 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.7 ms@2.1.3: {} @@ -1660,7 +1921,7 @@ snapshots: normalize-path@3.0.0: {} - obug@2.1.1: {} + obug@2.1.3: {} optionator@0.9.4: dependencies: @@ -1685,11 +1946,9 @@ snapshots: path-type@4.0.0: {} - pathe@2.0.3: {} - picomatch@2.3.2: {} - picomatch@4.0.4: {} + picomatch@4.0.5: {} plimit-lit@1.6.1: dependencies: @@ -1713,48 +1972,46 @@ snapshots: reusify@1.1.0: {} - rolldown-plugin-dts@0.25.1(rolldown@1.0.2)(typescript@6.0.3): + rolldown-plugin-dts@0.27.9(rolldown@1.1.5)(typescript@7.0.2): dependencies: - '@babel/generator': 8.0.0-rc.5 - '@babel/helper-validator-identifier': 8.0.0-rc.5 - '@babel/parser': 8.0.0-rc.4 - ast-kit: 3.0.0-beta.1 - birpc: 4.0.0 dts-resolver: 3.0.0 get-tsconfig: 5.0.0-beta.5 - obug: 2.1.1 - rolldown: 1.0.2 + 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: 6.0.3 + typescript: 7.0.2 transitivePeerDependencies: - oxc-resolver - rolldown@1.0.2: + rolldown@1.1.5: dependencies: - '@oxc-project/types': 0.132.0 + '@oxc-project/types': 0.139.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.2 - '@rolldown/binding-darwin-arm64': 1.0.2 - '@rolldown/binding-darwin-x64': 1.0.2 - '@rolldown/binding-freebsd-x64': 1.0.2 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.2 - '@rolldown/binding-linux-arm64-gnu': 1.0.2 - '@rolldown/binding-linux-arm64-musl': 1.0.2 - '@rolldown/binding-linux-ppc64-gnu': 1.0.2 - '@rolldown/binding-linux-s390x-gnu': 1.0.2 - '@rolldown/binding-linux-x64-gnu': 1.0.2 - '@rolldown/binding-linux-x64-musl': 1.0.2 - '@rolldown/binding-openharmony-arm64': 1.0.2 - '@rolldown/binding-wasm32-wasi': 1.0.2 - '@rolldown/binding-win32-arm64-msvc': 1.0.2 - '@rolldown/binding-win32-x64-msvc': 1.0.2 + '@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.1: {} + semver@7.8.5: {} shebang-command@2.0.0: dependencies: @@ -1764,12 +2021,12 @@ snapshots: slash@3.0.0: {} - tinyexec@1.2.2: {} + tinyexec@1.2.4: {} - tinyglobby@0.2.16: + tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 to-regex-range@5.0.1: dependencies: @@ -1777,36 +2034,36 @@ snapshots: tree-kill@1.2.2: {} - tsc-alias@1.8.17: + tsc-alias@1.9.1: dependencies: chokidar: 3.6.0 commander: 9.5.0 - get-tsconfig: 4.13.7 + 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.0(tsx@4.21.0)(typescript@6.0.3): + tsdown@0.22.8(tsx@4.23.1)(typescript@7.0.2): dependencies: - ansis: 4.3.0 + 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.1 - picomatch: 4.0.4 - rolldown: 1.0.2 - rolldown-plugin-dts: 0.25.1(rolldown@1.0.2)(typescript@6.0.3) - semver: 7.8.1 - tinyexec: 1.2.2 - tinyglobby: 0.2.16 + 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.21.0 - typescript: 6.0.3 + tsx: 4.23.1 + typescript: 7.0.2 transitivePeerDependencies: - '@ts-macro/tsc' - '@typescript/native-preview' @@ -1816,10 +2073,9 @@ snapshots: tslib@2.8.1: optional: true - tsx@4.21.0: + tsx@4.23.1: dependencies: - esbuild: 0.27.4 - get-tsconfig: 4.13.7 + esbuild: 0.28.1 optionalDependencies: fsevents: 2.3.3 @@ -1827,14 +2083,35 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript@6.0.3: {} + 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.19.2: {} + undici-types@7.24.6: {} uri-js@4.4.1: dependencies: @@ -1847,3 +2124,39 @@ snapshots: 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 From 34d74379e683e7d9e3b26167c0b996e6f3645407 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Thu, 16 Jul 2026 12:08:11 -0500 Subject: [PATCH 22/35] fix: biome errors --- biome.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/biome.json b/biome.json index 9d342f6..ea5e7da 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.4.14/schema.json", + "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", "vcs": { "enabled": true, "clientKind": "git", @@ -15,7 +15,7 @@ "linter": { "enabled": true, "rules": { - "recommended": true, + "preset": "recommended", "suspicious": { "useIterableCallbackReturn": "off" } From 80465f5bc4e962ee8e571621368ebb7ebea804a2 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Thu, 16 Jul 2026 13:03:43 -0500 Subject: [PATCH 23/35] test: improve rule tests --- tests/rules/api-version.ts | 24 ++--- tests/rules/entry-points.ts | 140 ++++++++++-------------------- tests/rules/log-args.ts | 87 ++++++++----------- tests/rules/module-vars.ts | 34 ++++---- tests/rules/no-invalid-modules.ts | 24 ++--- tests/rules/no-log-module.ts | 88 +++---------------- tests/rules/script-type.ts | 129 ++------------------------- 7 files changed, 134 insertions(+), 392 deletions(-) diff --git a/tests/rules/api-version.ts b/tests/rules/api-version.ts index 674e7df..6438c07 100644 --- a/tests/rules/api-version.ts +++ b/tests/rules/api-version.ts @@ -6,6 +6,7 @@ const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); const valid = createTests([ { + name: '1.0', code: ` /** * @NApiVersion 1.0 @@ -13,6 +14,7 @@ const valid = createTests([ `, }, { + name: '2.x', code: ` /** * @NApiVersion 2.x @@ -20,6 +22,7 @@ const valid = createTests([ `, }, { + name: '2.0', code: ` /** * @NApiVersion 2.0 @@ -27,6 +30,7 @@ const valid = createTests([ `, }, { + name: '2.1', code: ` /** * @NApiVersion 2.1 @@ -37,6 +41,7 @@ const valid = createTests([ const invalid = createTests([ { + name: 'no value', code: ` /** * @NApiVersion @@ -45,6 +50,7 @@ const invalid = createTests([ errors: [{ messageId: 'noValue' }], }, { + name: 'invalid integer', code: ` /** * @NApiVersion 1 @@ -53,22 +59,7 @@ const invalid = createTests([ errors: [{ messageId: 'invalidValue', data: { value: 1 } }], }, { - code: ` - /** - * @NApiVersion 2 - */ - `, - errors: [{ messageId: 'invalidValue', data: { value: 2 } }], - }, - { - code: ` - /** - * @NApiVersion 3 - */ - `, - errors: [{ messageId: 'invalidValue', data: { value: 3 } }], - }, - { + name: 'invalid float', code: ` /** * @NApiVersion 2.2 @@ -77,6 +68,7 @@ const invalid = createTests([ errors: [{ messageId: 'invalidValue', data: { value: 2.2 } }], }, { + name: 'invalid string', code: ` /** * @NApiVersion test diff --git a/tests/rules/entry-points.ts b/tests/rules/entry-points.ts index 396e013..5ac8ee9 100644 --- a/tests/rules/entry-points.ts +++ b/tests/rules/entry-points.ts @@ -6,6 +6,7 @@ const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); const valid = createTests([ { + name: 'script type w/ entry point', code: ` /** * @NScriptType UserEventScript @@ -16,54 +17,62 @@ const valid = createTests([ `, }, { + name: 'script type w/ no entry points', code: ` /** - * @NScriptType ClientScript + * @NScriptType PluginTypeImpl */ define([], function() { - return { pageInit: x }; + return {}; }); `, }, { + name: 'script type w/ no entry points, misc entry point', code: ` /** - * @NScriptType ClientScript + * @NScriptType PluginTypeImpl */ define([], function() { - return { pageInit: function() {} }; + return { customFn: function() {} }; }); `, }, { + name: 'entry point as ident', code: ` /** - * @NScriptType + * @NScriptType ClientScript */ - define([], function() {}); + define([], function() { + return { pageInit: x }; + }); `, }, { + name: 'entry point as fn', code: ` /** - * @NScriptType + * @NScriptType ClientScript */ define([], function() { - return; + return { pageInit: function() {} }; }); `, }, { + name: 'entry point as arrow fn', code: ` /** - * @NScriptType + * @NScriptType ClientScript */ define([], function() { - return { somethingElse: x }; + return { pageInit: () => {} }; }); `, }, { + name: 'entry point as obj prop', code: ` /** * @NScriptType ClientScript @@ -76,36 +85,7 @@ const valid = createTests([ `, }, { - code: ` - /** - * @NScriptType plugintypeimpl - */ - define([], function() { - return {}; - }); - `, - }, - { - code: ` - /** - * @NScriptType plugintypeimpl - */ - define([], function() { - return { customFn: function() {} }; - }); - `, - }, - { - // Should not error, since scriptType is null and rule should exit early - code: ` - // no @NScriptType comment - - define([], function() { - return { foo: 'bar' }; - }); - `, - }, - { + name: 'arrow fn as factory', code: ` /** * @NScriptType ClientScript @@ -116,41 +96,36 @@ const valid = createTests([ `, }, { + name: 'no script type comment, no entry point', code: ` - /** - * @NScriptType ClientScript - */ - define([], () => { - return { pageInit: () => {} }; - }); + define([], () => {}); `, }, { + name: 'no script type comment, misc entry point', code: ` - /** - * @NScriptType ClientScript - */ - define([], () => ({ pageInit: x })); + define([], () => { + return { foo: 'bar' }; + }); `, }, { + name: 'no script type value, no entry point', code: ` /** - * @NScriptType ClientScript + * @NScriptType */ - define([], () => ({ pageInit: () => {} })); + define([], () => {}); `, }, { + name: 'no script type value, misc entry point', code: ` /** - * @NScriptType ClientScript + * @NScriptType */ - define([], function() { - var exports = {}; - log.debug('init'); - exports.pageInit = x; - return exports; + define([], () => { + return { somethingElse: x }; }); `, }, @@ -158,64 +133,46 @@ const valid = createTests([ const invalid = createTests([ { + name: 'no entry point', 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; - }); + define([], () => {}); `, errors: [{ messageId: 'returnEntryPoint', data: { type: 'Restlet' } }], }, { + name: 'invalid entry point', code: ` /** * @NScriptType Restlet */ - define([], function() { + define([], () => { return { notAnEntryPoint }; }); `, errors: [{ messageId: 'returnEntryPoint', data: { type: 'Restlet' } }], }, { + name: 'missing entry point obj as ident', code: ` /** * @NScriptType Restlet */ - define([], function() { - return { notAnEntryPoint: x }; + define([], () => { + return x; }); `, errors: [{ messageId: 'returnEntryPoint', data: { type: 'Restlet' } }], }, { + name: 'invalid entry point as obj prop', code: ` /** * @NScriptType ClientScript */ - define([], function() { + define([], () => { var exports = {}; exports.notAnEntryPoint = x; return exports; @@ -224,11 +181,12 @@ const invalid = createTests([ errors: [{ messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }], }, { + name: 'valid entry point on non-returned obj', code: ` /** * @NScriptType ClientScript */ - define([], function() { + define([], () => { var exports = {}; var notTheReturnObject = {}; notTheReturnObject.pageInit = x; @@ -238,6 +196,7 @@ const invalid = createTests([ errors: [{ messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }], }, { + name: 'valid entry points of different script type', code: ` /** * @NScriptType ClientScript @@ -248,15 +207,6 @@ const invalid = createTests([ `, errors: [{ messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }], }, - { - code: ` - /** - * @NScriptType ClientScript - */ - define([], () => ({ notAnEntryPoint: x })); - `, - errors: [{ messageId: 'returnEntryPoint', data: { type: 'ClientScript' } }], - }, ]); ruleTester.run(RULE_NAME, rule, { valid, invalid }); diff --git a/tests/rules/log-args.ts b/tests/rules/log-args.ts index 4d526da..8da5013 100644 --- a/tests/rules/log-args.ts +++ b/tests/rules/log-args.ts @@ -6,112 +6,93 @@ const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); const valid = createTests([ { + name: 'title and details as args', code: ` - define([], function() { - log.debug("title", "description"); + define([], () => { + log.debug("title", "details"); }); `, }, { + name: 'title and details in obj', code: ` - define(["N/log", "N/extra"], function(logModule) { - log.debug("title", "description"); + define([], () => { + log.debug({ title: "title", details: "details" }); }); `, }, { + name: 'null title and details as args', code: ` - define([], function() { - log.debug({ title: "Title", details: "Message" }); + define([], () => { + log.debug(null, "details"); }); `, }, { + name: 'title and null details as args', code: ` - define([], function() { - log.debug({ title: "Title" }); + define([], () => { + log.debug("title", null); }); `, - options: [{ requireTitle: true }], }, { + name: 'details off, only title as arg', 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" }); + define([], () => { + log.debug("title"); }); `, - options: [{ requireDetails: true }], + options: [{ requireDetails: false }], }, { + name: 'title off, only details in obj', code: ` - define(["N/log"], function(log) { - log.debug({ details: "Message" }); + define([], () => { + log.debug({ details: "details" }); }); `, - options: [{ requireDetails: true }], + options: [{ requireTitle: false }], }, { + name: 'details off, only title in obj', code: ` - define(["N/record"], function(record) { - log.debug({ title: "Message" }); + define([], () => { + log.debug({ title: "title" }); }); `, - options: [{ requireTitle: true }], + options: [{ requireDetails: false }], }, ]); const invalid = createTests([ { + name: 'only title as arg', code: ` - define([], function() { + define([], () => { log.debug("title"); }); `, - options: [{ requireDetails: true }], errors: [{ messageId: 'detailsRequired', data: { prop: 'debug' } }], }, { + name: 'only title in obj', code: ` - define([], function() { - log.audit("title"); + define([], () => { + log.debug({ title: "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' } }], + errors: [{ messageId: 'detailsRequired', data: { prop: 'debug' } }], }, { + name: 'only details in obj', code: ` - define(["N/record", "N/log"], function(record, log) { - log.debug("test"); + define([], () => { + log.debug({ details: "details" }); }); `, - options: [{ requireDetails: true }], - errors: [{ messageId: 'detailsRequired', data: { prop: 'debug' } }], + errors: [{ messageId: 'titleRequired', data: { prop: 'debug' } }], }, ]); diff --git a/tests/rules/module-vars.ts b/tests/rules/module-vars.ts index 9be5ab6..88e2144 100644 --- a/tests/rules/module-vars.ts +++ b/tests/rules/module-vars.ts @@ -6,35 +6,29 @@ const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); const valid = createTests([ { - code: 'define(["N/record"], function(record) {});', - options: [{ 'N/record': 'record' }], + name: 'one module, default name', + code: 'define(["N/record"], (record) => {});', }, { - code: 'define(["N/https"], function(https) {});', - options: [{ 'N/https': 'https' }], - }, - { - code: 'define(["N/ui/serverWidget"], function(ui) {});', + name: 'one module, custom name', + code: 'define(["N/ui/serverWidget"], (ui) => {});', options: [{ 'N/ui/serverWidget': 'ui' }], }, { - code: 'define(["N/file", "N/runtime"], function(file, runtime) {});', - options: [{ 'N/file': 'file', 'N/runtime': 'runtime' }], + name: 'two modules, default names', + code: 'define(["N/file", "N/runtime"], (file, runtime) => {});', }, { - code: 'define(["N/file", "N/runtime"], function(f, r) {});', + name: 'two modules, custom names', + code: 'define(["N/file", "N/runtime"], (f, r) => {});', options: [{ 'N/file': 'f', 'N/runtime': 'r' }], }, - { - code: 'define(["N/record", "N/search"], function(record) {});', - options: [{ 'N/record': 'record', 'N/search': 'search' }], - }, ]); const invalid = createTests([ { - code: 'define(["N/record"], function(test) {});', - options: [{ 'N/record': 'record' }], + name: 'one module, incorrect default name', + code: 'define(["N/record"], (test) => {});', errors: [ { messageId: 'useCorrectName', @@ -43,13 +37,17 @@ const invalid = createTests([ ], }, { - code: 'define(["N/record", "N/search"], function(wrongName) {});', - options: [{ 'N/record': 'record', 'N/search': 'search' }], + 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' }, + }, ], }, ]); diff --git a/tests/rules/no-invalid-modules.ts b/tests/rules/no-invalid-modules.ts index 134848b..e9d9191 100644 --- a/tests/rules/no-invalid-modules.ts +++ b/tests/rules/no-invalid-modules.ts @@ -6,33 +6,37 @@ const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); const valid = createTests([ { - code: 'define(["N/record"], function(record) {});', + name: 'N module', + code: 'define(["N/record"], (record) => {});', }, { - code: 'define(["N/search"], function(search) {});', + name: 'custom module', + code: 'define(["customModule"], (customModule) => {});', }, { - code: 'define(["customModule"], function(customModule) {});', + name: 'N and custom modules', + code: 'define(["customModule", "N/file"], (customModule, file) => {});', }, { - code: 'define(["customModule", "N/file"], function(customModule, file) {});', - }, - { - code: 'define([], function() {});', + name: 'no modules', + code: 'define([], () => {});', }, ]); const invalid = createTests([ { - code: 'define(["N/invalid"], function(invalid) {});', + name: 'invalid N module', + code: 'define(["N/invalid"], (invalid) => {});', errors: [{ messageId: 'invalidModule', data: { module: 'N/invalid' } }], }, { - code: 'define(["N/file", "N/invalid"], function(file, invalid) {});', + name: 'invalid and valid N modules', + code: 'define(["N/file", "N/invalid"], (file, invalid) => {});', errors: [{ messageId: 'invalidModule', data: { module: 'N/invalid' } }], }, { - code: 'define(["customModule", "N/invalid"], function(customModule, invalid) {});', + name: 'invalid N module and custom module', + code: 'define(["customModule", "N/invalid"], (customModule, invalid) => {});', errors: [{ messageId: 'invalidModule', data: { module: 'N/invalid' } }], }, ]); diff --git a/tests/rules/no-log-module.ts b/tests/rules/no-log-module.ts index e861b62..2bca55c 100644 --- a/tests/rules/no-log-module.ts +++ b/tests/rules/no-log-module.ts @@ -6,64 +6,29 @@ const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); const valid = createTests([ { - code: 'define(["N/record"], function(record) {});', + name: 'no modules', + code: 'define([], () => {});', }, { - 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 }], + name: 'non-log module', + code: 'define(["N/record"], (record) => {});', }, { + name: 'client script with log - default', code: ` /** * @NScriptType ClientScript */ - define([], function() {}); + define(["N/log"], (log) => {}); `, }, { + name: 'client script with log - on', code: ` /** * @NScriptType ClientScript */ - define(["N/log"], function(log) {}); - `, - }, - { - code: ` - /** - * @NScriptType ClientScript - */ - define(["N/log"], function(log) {}); + define(["N/log"], (log) => {}); `, options: [{ allowInClientScripts: true }], }, @@ -71,43 +36,12 @@ const valid = createTests([ const invalid = createTests([ { - 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 }], + name: 'log module', + code: 'define(["N/log"], (log) => {});', errors: [{ messageId: 'useGlobalLog' }], }, { + name: 'client script with log - false', code: ` /** * @NScriptType ClientScript diff --git a/tests/rules/script-type.ts b/tests/rules/script-type.ts index d377336..8867dd3 100644 --- a/tests/rules/script-type.ts +++ b/tests/rules/script-type.ts @@ -6,76 +6,7 @@ const RULE_NAME = path.basename(import.meta.filename, '.test.ts'); const valid = createTests([ { - 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 - */ - `, - }, - { + name: 'single script type tag', code: ` /** * @NScriptType Suitelet @@ -83,20 +14,7 @@ const valid = createTests([ `, }, { - code: ` - /** - * @NScriptType UserEventScript - */ - `, - }, - { - code: ` - /** - * @NScriptType WorkflowActionScript - */ - `, - }, - { + name: 'two script type tags', code: ` /** * @NScriptType Suitelet @@ -106,20 +24,11 @@ const valid = createTests([ */ `, }, - { - code: ` - /** - * Not a script type tag - */ - `, - }, - { - code: '// @NScriptType SuiteletScript', - }, ]); const invalid = createTests([ { + name: 'missing script type value', code: ` /** * @NScriptType @@ -128,39 +37,13 @@ const invalid = createTests([ errors: [{ messageId: 'noValue' }], }, { + name: 'invalid script type', 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 + * @NScriptType Invalid */ `, - errors: [{ messageId: 'invalidValue', data: { value: 'SuiteletScript' } }], + errors: [{ messageId: 'invalidValue', data: { value: 'Invalid' } }], }, ]); From 1bd539a110e635f894f2d88fe73dac922c7fb8a5 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Thu, 16 Jul 2026 13:04:10 -0500 Subject: [PATCH 24/35] chore: add lint fix script --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 9998d3f..1a03823 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "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" }, From dbe38999e1a6e8254746d4189b7bf18e15827ba7 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Thu, 16 Jul 2026 13:07:44 -0500 Subject: [PATCH 25/35] feat: add default options to meta --- lib/rules/log-args.ts | 6 ++++++ lib/rules/no-log-module.ts | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/lib/rules/log-args.ts b/lib/rules/log-args.ts index 635a7fe..06561fb 100644 --- a/lib/rules/log-args.ts +++ b/lib/rules/log-args.ts @@ -39,6 +39,12 @@ const rule: Rule.RuleModule = { additionalProperties: false, }, ], + defaultOptions: [ + { + requireTitle: true, + requireDetails: true, + }, + ], }, create: (context) => { const { requireTitle, requireDetails } = (context.options[0] ?? diff --git a/lib/rules/no-log-module.ts b/lib/rules/no-log-module.ts index ce293ec..19301d3 100644 --- a/lib/rules/no-log-module.ts +++ b/lib/rules/no-log-module.ts @@ -29,6 +29,11 @@ const rule: Rule.RuleModule = { additionalProperties: false, }, ], + defaultOptions: [ + { + allowInClientScripts: true, + }, + ], }, create: (context) => ({ 'CallExpression[callee.name=define]': (node: CallExpression) => { From ee7112155001e836f4c5bb67f002cad2b2301593 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Thu, 16 Jul 2026 13:42:41 -0500 Subject: [PATCH 26/35] refactor: improve module util naming --- lib/index.ts | 4 ++-- lib/rules/module-vars.ts | 6 +++--- lib/utils/modules.ts | 36 +++++++++++++++++------------------- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index b4e2a10..86450d7 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -2,7 +2,7 @@ import type { ESLint } from 'eslint'; import envGlobals from 'globals'; import pkg from '../package.json'; import globals from './utils/globals'; -import { MODULES } from './utils/modules'; +import { modules } from './utils/modules'; const plugin: ESLint.Plugin = { meta: { name: pkg.name, version: pkg.version }, @@ -33,7 +33,7 @@ plugin.configs = { 'suitescript/api-version': 'error', 'suitescript/entry-points': 'error', 'suitescript/log-args': 'error', - 'suitescript/module-vars': ['error', MODULES], + 'suitescript/module-vars': ['error', modules], 'suitescript/no-invalid-modules': 'error', 'suitescript/no-log-module': 'error', 'suitescript/script-type': 'error', diff --git a/lib/rules/module-vars.ts b/lib/rules/module-vars.ts index f4d7ea5..874cb5c 100644 --- a/lib/rules/module-vars.ts +++ b/lib/rules/module-vars.ts @@ -3,7 +3,7 @@ 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 { MODULES, type ModuleName } from '../utils/modules'; +import { type ModuleName, moduleNames, modules } from '../utils/modules'; type Options = Partial>; @@ -27,7 +27,7 @@ const rule: Rule.RuleModule = { additionalProperties: false, }, ], - defaultOptions: [MODULES], + defaultOptions: [modules], }, create: (context) => { const config = (context.options[0] ?? {}) as Options; @@ -64,7 +64,7 @@ const rule: Rule.RuleModule = { }; function getSchemaProperties() { - const properties = Object.keys(MODULES).map((name) => ({ + const properties = moduleNames.map((name) => ({ [name]: { type: 'string', }, diff --git a/lib/utils/modules.ts b/lib/utils/modules.ts index effcf55..1676cf7 100644 --- a/lib/utils/modules.ts +++ b/lib/utils/modules.ts @@ -1,18 +1,22 @@ import type { CallExpression, Identifier, Literal } from 'estree'; -export type ModuleNodes = { +export type ModuleName = keyof typeof modules; + +export interface ModuleNodes { name: Literal | null; variable: Identifier | null; -}; -type Module = { +} + +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', @@ -68,9 +72,9 @@ const MODULES = { 'N/xml': 'xml', }; -const moduleNames = Object.keys(MODULES); +export const moduleNames = Object.keys(modules); -function getModules(defineCallNode: CallExpression): { +export function getModules(defineCallNode: CallExpression): { list: Module[]; varCount: number; } { @@ -131,28 +135,22 @@ function getModules(defineCallNode: CallExpression): { return { list, varCount }; } -function getModuleNames(defineCallNode: CallExpression) { +export function getModuleNames(defineCallNode: CallExpression) { const modules = getModules(defineCallNode); return modules.list.map((module) => module.name); } -function getModuleVars(defineCallNode: CallExpression) { +export function getModuleVars(defineCallNode: CallExpression) { const modules = getModules(defineCallNode); return modules.list.map((module) => module.variable); } -function getModuleNodePair(defineCallNode: CallExpression, moduleName: string) { +export function getModuleNodePair( + defineCallNode: CallExpression, + moduleName: string, +) { const modules = getModules(defineCallNode); const targetModule = modules.list.find((m) => m.name === moduleName); return targetModule?.nodes; } - -export { - getModuleNames, - getModuleNodePair, - getModules, - getModuleVars, - MODULES, - moduleNames, -}; From 7b81dbd7f7fa6688ad81826fe96ccb61a1668a10 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Thu, 16 Jul 2026 14:36:22 -0500 Subject: [PATCH 27/35] refactor: move rule imports to barrel file --- lib/index.ts | 11 ++--------- lib/rules/index.ts | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 lib/rules/index.ts diff --git a/lib/index.ts b/lib/index.ts index 86450d7..c09f8db 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,20 +1,13 @@ 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: { - '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-invalid-modules': require('./rules/no-invalid-modules'), - 'no-log-module': require('./rules/no-log-module'), - 'script-type': require('./rules/script-type'), - }, + rules, }; plugin.configs = { 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; From 022b7d38a5a3b918e950a380b880d9c3939c5208 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Thu, 16 Jul 2026 14:36:41 -0500 Subject: [PATCH 28/35] test: add e2e --- package.json | 3 +- tests/e2e/e2e.test.mjs | 52 +++++++++++++++++++++++++ tests/e2e/fixtures/suitelet.js | 18 +++++++++ tests/e2e/fixtures/user-event-script.js | 19 +++++++++ tests/e2e/fixtures/valid-map-reduce.js | 26 +++++++++++++ 5 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 tests/e2e/e2e.test.mjs create mode 100644 tests/e2e/fixtures/suitelet.js create mode 100644 tests/e2e/fixtures/user-event-script.js create mode 100644 tests/e2e/fixtures/valid-map-reduce.js diff --git a/package.json b/package.json index 1a03823..02557a8 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,8 @@ "check": "biome check", "check:fix": "biome check --fix", "check:types": "tsc --noemit", - "test": "node --test --require tsx tests/rules/**.ts" + "test": "node --test --require tsx tests/rules/**.ts", + "test:e2e": "pnpm build && node --test tests/e2e/e2e.test.mjs" }, "files": [ "LICENSE", diff --git a/tests/e2e/e2e.test.mjs b/tests/e2e/e2e.test.mjs new file mode 100644 index 0000000..fedd1c1 --- /dev/null +++ b/tests/e2e/e2e.test.mjs @@ -0,0 +1,52 @@ +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/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, + }; +}); From 9dea965622b9753b195c0de188a8fe0be6b23c20 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Thu, 16 Jul 2026 14:37:03 -0500 Subject: [PATCH 29/35] docs: add v3 upgrade guide --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5fc7595..c98d3b2 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ export default [ ]; ``` -## Migration from v1.x +## Upgrading to v2 v2 is **flat-config only**. To migrate: @@ -59,6 +59,14 @@ v2 is **flat-config only**. To migrate: Stay on `eslint-plugin-suitescript@^1` if you cannot migrate. +## Upgrading to v3 + +With v3, AMD-specific features have been abstracted to the separate [`@acdvs/eslint-plugin-amd`][eslint-plugin-amd] plugin, which should be installed along with this 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`. + ## List of supported rules - [suitescript/api-version](docs/rules/api-version.md): Enforces valid `@NApiVersion` tag values From 2143f16d2346e93bd58e114d861c9a64ec6d8153 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Thu, 16 Jul 2026 14:48:29 -0500 Subject: [PATCH 30/35] ci: add e2e test --- .github/workflows/ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8fe101b..f1973ca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,6 @@ jobs: - uses: actions/setup-node@v4 with: node-version: 24 - cache: "pnpm" - run: | pnpm install pnpm check @@ -33,7 +32,7 @@ jobs: - uses: actions/setup-node@v4 with: node-version: 24 - cache: "pnpm" - run: | pnpm install pnpm test + pnpm test:e2e From cbffb89bcd4482c66d1760eb9fcabe53f5d3b8c4 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Thu, 16 Jul 2026 14:54:01 -0500 Subject: [PATCH 31/35] ci: upgrade actions --- .github/workflows/ci.yml | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f1973ca..f1793d4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,19 +1,17 @@ name: CI -on: - push: - pull_request: +on: [push, pull_request] jobs: lint: name: Check linting, formatting, types runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 with: - version: 10 - - uses: actions/setup-node@v4 + version: 11 + - uses: actions/setup-node@v7 with: node-version: 24 - run: | @@ -25,11 +23,11 @@ jobs: name: Test rules runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 with: - version: 10 - - uses: actions/setup-node@v4 + version: 11 + - uses: actions/setup-node@v7 with: node-version: 24 - run: | From 1b140d90fe0c1e32f58835c973d5145c40a0da8b Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Thu, 16 Jul 2026 15:18:51 -0500 Subject: [PATCH 32/35] docs: separate upgrade guide --- README.md | 21 ++------------------- docs/upgrade.md | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 19 deletions(-) create mode 100644 docs/upgrade.md diff --git a/README.md b/README.md index c98d3b2..f8ee3c7 100644 --- a/README.md +++ b/README.md @@ -46,26 +46,9 @@ export default [ ]; ``` -## Upgrading to v2 +## 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. - -## Upgrading to v3 - -With v3, AMD-specific features have been abstracted to the separate [`@acdvs/eslint-plugin-amd`][eslint-plugin-amd] plugin, which should be installed along with this 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`. +See the [upgrade guide](docs/upgrade.md) for details on upgrading the package to a new major version. ## List of supported rules 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 From fcfbeeb8a1f6d1e5d99401faf6caba456507ace7 Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Thu, 16 Jul 2026 15:23:53 -0500 Subject: [PATCH 33/35] chore: bump version to 3.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 02557a8..0f70519 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "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://acdvs.dev)", "license": "MIT", From ffb952ae692eecfd05b5f6e4f1927d41fa5bb57a Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Thu, 16 Jul 2026 15:44:08 -0500 Subject: [PATCH 34/35] fix(module-vars): do not report invalid n modules --- lib/rules/module-vars.ts | 2 +- tests/rules/module-vars.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/rules/module-vars.ts b/lib/rules/module-vars.ts index 874cb5c..d469396 100644 --- a/lib/rules/module-vars.ts +++ b/lib/rules/module-vars.ts @@ -47,7 +47,7 @@ const rule: Rule.RuleModule = { const paramName = param.name as ModuleName; const configParamName = config[moduleName]; - if (paramName !== configParamName) { + if (configParamName && paramName !== configParamName) { context.report({ node: param, messageId: 'useCorrectName', diff --git a/tests/rules/module-vars.ts b/tests/rules/module-vars.ts index 88e2144..ae3c05a 100644 --- a/tests/rules/module-vars.ts +++ b/tests/rules/module-vars.ts @@ -23,6 +23,10 @@ const valid = createTests([ 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([ From 67d2f6645e2c8624448d1d2f3729b833fd50216a Mon Sep 17 00:00:00 2001 From: Adam Davies Date: Thu, 16 Jul 2026 15:51:30 -0500 Subject: [PATCH 35/35] test(e2e): remove stale expectation --- tests/e2e/e2e.test.mjs | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/e2e/e2e.test.mjs b/tests/e2e/e2e.test.mjs index fedd1c1..7be1405 100644 --- a/tests/e2e/e2e.test.mjs +++ b/tests/e2e/e2e.test.mjs @@ -25,7 +25,6 @@ const expected = { 'suitescript/log-args', 'suitescript/module-vars', 'suitescript/module-vars', - 'suitescript/module-vars', 'suitescript/no-invalid-modules', 'suitescript/no-log-module', ],