From e9aaa386d975162635f979f999b90ce923167b76 Mon Sep 17 00:00:00 2001 From: Thomasims Date: Mon, 7 Sep 2026 12:28:59 +0200 Subject: [PATCH 1/4] chore: replace Biome with oxlint, oxfmt and Knip Adopts the shared @antelopejs/tooling-configs presets: oxlint with the vendored anti-slop rules, oxfmt for formatting and Knip for dead code. Type-aware linting needs a tsconfig tsgolint accepts, so the removed moduleResolution node10 and baseUrl options go away and the self-referential path mappings the tests use become relative. The module stays on commonjs so the emit keeps using require, which is what the AntelopeJS resolver hooks. import(no-cycle) found two real cycles through index.ts: components.ts needed GetDataControllerMeta and metadata.ts needed the endpoint callback types, both of which index.ts declared. Both now live in metadata.ts, which neither of the other two entry points depends on in reverse, and index.ts re-exports them so the @antelopejs/interface-data-api surface is byte-identical. The components cycle was not theoretical: requiring dist/components.js first threw "Cannot read properties of undefined (reading 'Get')" because index.ts evaluated Parameters.Get() while components was still half-initialized. --- biome.json | 56 - knip.config.ts | 7 + oxfmt.config.ts | 7 + oxlint.config.ts | 7 + package.json | 17 +- pnpm-lock.yaml | 1902 +++++++++++++++-- src/antelope.test.ts | 2 +- src/components.ts | 21 +- src/index.ts | 78 +- src/metadata.ts | 50 +- src/tests/components/access_control.test.ts | 15 +- src/tests/components/computed.test.ts | 5 +- src/tests/components/deferred_joined.test.ts | 33 +- src/tests/components/foreign_joined.test.ts | 5 +- src/tests/components/joined.test.ts | 23 +- src/tests/components/listable.test.ts | 5 +- src/tests/components/mandatory.test.ts | 5 +- src/tests/components/modifier_key.test.ts | 5 +- .../components/per_action_access.test.ts | 3 +- src/tests/components/validator.test.ts | 3 +- src/tests/index/routes.test.ts | 5 +- src/tests/integration.test.ts | 3 +- src/tests/utils.ts | 3 +- tsconfig.json | 6 +- 24 files changed, 1931 insertions(+), 335 deletions(-) delete mode 100644 biome.json create mode 100644 knip.config.ts create mode 100644 oxfmt.config.ts create mode 100644 oxlint.config.ts diff --git a/biome.json b/biome.json deleted file mode 100644 index c60abdf..0000000 --- a/biome.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/2.3.2/schema.json", - "vcs": { - "enabled": true, - "clientKind": "git", - "useIgnoreFile": true - }, - "files": { - "ignoreUnknown": false, - "includes": [ - "**", - "!dist", - "!**/dist", - "!node_modules", - "!**/node_modules", - "!r2-worker", - "!.antelope", - "!nuxt-layer", - "!src/pdf", - "!output" - ] - }, - "formatter": { - "enabled": true, - "indentStyle": "space", - "indentWidth": 2 - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true, - "suspicious": { - "noExplicitAny": "off" - }, - "nursery": { - "noFloatingPromises": "error" - } - } - }, - "javascript": { - "formatter": { - "quoteStyle": "double" - }, - "parser": { - "unsafeParameterDecoratorsEnabled": true - } - }, - "assist": { - "enabled": true, - "actions": { - "source": { - "organizeImports": "on" - } - } - } -} diff --git a/knip.config.ts b/knip.config.ts new file mode 100644 index 0000000..335a3d2 --- /dev/null +++ b/knip.config.ts @@ -0,0 +1,7 @@ +import { antelopeKnipConfig } from "@antelopejs/tooling-configs/knip"; + +export default antelopeKnipConfig({ + // `ajs` comes from @antelopejs/core, which CI installs globally rather than + // pulling the whole CLI into every module's dependency tree. + ignoreBinaries: ["ajs"], +}); diff --git a/oxfmt.config.ts b/oxfmt.config.ts new file mode 100644 index 0000000..bd929ba --- /dev/null +++ b/oxfmt.config.ts @@ -0,0 +1,7 @@ +import { antelopeFmtPreset } from "@antelopejs/tooling-configs/oxc/fmt"; + +export default antelopeFmtPreset({ + // Drop once tooling-configs ships the shared ignore (AntelopeJS/tooling-configs#5): + // these are Markdown templates with a .yml extension, which oxfmt cannot parse. + ignorePatterns: [".github/ISSUE_TEMPLATE/**"], +}); diff --git a/oxlint.config.ts b/oxlint.config.ts new file mode 100644 index 0000000..fbd8c24 --- /dev/null +++ b/oxlint.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "oxlint"; +import { antelopePreset } from "@antelopejs/tooling-configs/oxc/lint"; + +export default defineConfig({ + extends: [antelopePreset()], + options: { typeAware: true }, +}); diff --git a/package.json b/package.json index d88053f..74facfa 100644 --- a/package.json +++ b/package.json @@ -34,12 +34,14 @@ }, "scripts": { "build": "rimraf dist && tsc", - "format": "biome format --write .", - "lint:fix": "biome check --write .", - "lint": "biome check .", + "format": "oxfmt .", + "lint:fix": "oxlint --fix", + "lint": "oxlint", "prepack": "pnpm run build", "release": "pnpm run lint && pnpm run prepack && release-it", - "test": "pnpm run build && ajs module test ." + "test": "pnpm run build && ajs module test .", + "format:check": "oxfmt --check .", + "knip": "knip" }, "devDependencies": { "@antelopejs/interface-api": "^0.0.5", @@ -47,13 +49,18 @@ "@antelopejs/interface-core": "^0.0.5", "@antelopejs/interface-database": "^0.1.3", "@antelopejs/interface-database-decorators": "^0.1.4", - "@biomejs/biome": "2.3.2", + "@antelopejs/tooling-configs": "^0.0.4", "@types/chai": "^4.3.20", "@types/mocha": "^10.0.10", "@types/node": "^22.19.15", "@types/semver": "^7.7.1", "chai": "^4.5.0", + "eslint-plugin-perfectionist": "^5.11.0", + "knip": "^6.34.0", "mongodb-memory-server-core": "^10.4.3", + "oxfmt": "^0.66.0", + "oxlint": "1.81.0", + "oxlint-tsgolint": "^7.0.2001", "release-it": "^19.2.4", "release-it-changelogen": "^0.1.0", "rimraf": "^6.1.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5f59edb..25ce1b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,9 +23,9 @@ importers: '@antelopejs/interface-database-decorators': specifier: ^0.1.4 version: 0.1.4(@antelopejs/interface-api@0.0.5(@antelopejs/interface-core@0.0.5))(@antelopejs/interface-core@0.0.5)(@antelopejs/interface-database@0.1.3(@antelopejs/interface-core@0.0.5)) - '@biomejs/biome': - specifier: 2.3.2 - version: 2.3.2 + '@antelopejs/tooling-configs': + specifier: ^0.0.4 + version: 0.0.4(eslint-plugin-perfectionist@5.11.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.9.3))(knip@6.34.0)(oxfmt@0.66.0)(oxlint@1.81.0(oxlint-tsgolint@7.0.2001)) '@types/chai': specifier: ^4.3.20 version: 4.3.20 @@ -41,9 +41,24 @@ importers: chai: specifier: ^4.5.0 version: 4.5.0 + eslint-plugin-perfectionist: + specifier: ^5.11.0 + version: 5.11.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.9.3) + knip: + specifier: ^6.34.0 + version: 6.34.0 mongodb-memory-server-core: specifier: ^10.4.3 version: 10.4.3(socks@2.8.7) + oxfmt: + specifier: ^0.66.0 + version: 0.66.0 + oxlint: + specifier: 1.81.0 + version: 1.81.0(oxlint-tsgolint@7.0.2001) + oxlint-tsgolint: + specifier: ^7.0.2001 + version: 7.0.2001 release-it: specifier: ^19.2.4 version: 19.2.4(@types/node@22.19.15) @@ -85,58 +100,91 @@ packages: peerDependencies: '@antelopejs/interface-core': '>=0.0.3 <1.0.0' - '@biomejs/biome@2.3.2': - resolution: {integrity: sha512-8e9tzamuDycx7fdrcJ/F/GDZ8SYukc5ud6tDicjjFqURKYFSWMl0H0iXNXZEGmcmNUmABgGuHThPykcM41INgg==} - engines: {node: '>=14.21.3'} - hasBin: true + '@antelopejs/tooling-configs@0.0.4': + resolution: {integrity: sha512-Nfv71Z9DF78mFu817SwTZnzfF/oWhjXWhAY/zhBV9ArevV3ZwJ/JhZD+3QiLf9fXIS2pXCrmCCYGclpc598psA==} + engines: {node: '>=22.18.0'} + peerDependencies: + '@nuxt/eslint-config': '>=1.2.0' + eslint-plugin-perfectionist: '>=5.0.0' + knip: '>=6.0.0' + oxfmt: ^0.66.0 + oxlint: 1.81.0 + peerDependenciesMeta: + '@nuxt/eslint-config': + optional: true + eslint-plugin-perfectionist: + optional: true + knip: + optional: true + oxfmt: + optional: true + oxlint: + optional: true - '@biomejs/cli-darwin-arm64@2.3.2': - resolution: {integrity: sha512-4LECm4kc3If0JISai4c3KWQzukoUdpxy4fRzlrPcrdMSRFksR9ZoXK7JBcPuLBmd2SoT4/d7CQS33VnZpgBjew==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] + '@cacheable/memory@2.2.0': + resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} - '@biomejs/cli-darwin-x64@2.3.2': - resolution: {integrity: sha512-jNMnfwHT4N3wi+ypRfMTjLGnDmKYGzxVr1EYAPBcauRcDnICFXN81wD6wxJcSUrLynoyyYCdfW6vJHS/IAoTDA==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] + '@cacheable/utils@2.5.0': + resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} - '@biomejs/cli-linux-arm64-musl@2.3.2': - resolution: {integrity: sha512-2Zz4usDG1GTTPQnliIeNx6eVGGP2ry5vE/v39nT73a3cKN6t5H5XxjcEoZZh62uVZvED7hXXikclvI64vZkYqw==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] + '@emnapi/core@1.11.2': + resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} - '@biomejs/cli-linux-arm64@2.3.2': - resolution: {integrity: sha512-amnqvk+gWybbQleRRq8TMe0rIv7GHss8mFJEaGuEZYWg1Tw14YKOkeo8h6pf1c+d3qR+JU4iT9KXnBKGON4klw==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] + '@emnapi/runtime@1.11.2': + resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} - '@biomejs/cli-linux-x64-musl@2.3.2': - resolution: {integrity: sha512-gzB19MpRdTuOuLtPpFBGrV3Lq424gHyq2lFj8wfX9tvLMLdmA/R9C7k/mqBp/spcbWuHeIEKgEs3RviOPcWGBA==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} - '@biomejs/cli-linux-x64@2.3.2': - resolution: {integrity: sha512-8BG/vRAhFz1pmuyd24FQPhNeueLqPtwvZk6yblABY2gzL2H8fLQAF/Z2OPIc+BPIVPld+8cSiKY/KFh6k81xfA==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@biomejs/cli-win32-arm64@2.3.2': - resolution: {integrity: sha512-lCruqQlfWjhMlOdyf5pDHOxoNm4WoyY2vZ4YN33/nuZBRstVDuqPPjS0yBkbUlLEte11FbpW+wWSlfnZfSIZvg==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [win32] + '@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} - '@biomejs/cli-win32-x64@2.3.2': - resolution: {integrity: sha512-6Ee9P26DTb4D8sN9nXxgbi9Dw5vSOfH98M7UlmkjKB2vtUbrRqCbZiNfryGiwnPIpd6YUoTl7rLVD2/x1CyEHQ==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [win32] + '@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.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} + 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.3': + resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==} + 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'} '@inquirer/ansi@1.0.2': resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} @@ -272,9 +320,25 @@ packages: '@types/node': optional: true + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.6.0 + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + '@mongodb-js/saslprep@1.4.6': resolution: {integrity: sha512-y+x3H1xBZd38n10NZF/rEBlvDOOMQ6LKUTHqr8R9VkJ+mmQOYtJFxIlkkK8fZrtOiL6VixbOBWMbZGBdal3Z1g==} + '@napi-rs/wasm-runtime@1.2.3': + resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 + '@nodeutils/defaults-deep@1.1.0': resolution: {integrity: sha512-gG44cwQovaOFdSR02jR9IhVRpnDP64VN6JdjYJTfNz4J4fWn7TQnmrf22nSjRqlwlxPcW8PL/L3KbJg3tdwvpg==} @@ -330,6 +394,480 @@ packages: '@octokit/types@16.0.0': resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} + '@oxc-parser/binding-android-arm-eabi@0.147.0': + resolution: {integrity: sha512-fOtoGvIoirkvxQVw9J1WJPxz571XPgLsPf9uhRD+PJteUnvrJHMDmK9pw2yZEGGyismtRoEsp+JcXUdF/JDMDw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.147.0': + resolution: {integrity: sha512-emjQHOYJaomo4ykaXQ1EItunr/I94Nk01oqBmU4dSkKSTupIDx6OysVDf2e8Eytm77rb+4ZxzgElyWP7rcEX7A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.147.0': + resolution: {integrity: sha512-kXvBPJL7RmDPJ2mze/vXPPVQimCDtFr9OFLjf7dyhV5Dx64cgcXh9KKrA1sMWvCObvJll9CZZUO0FBlFwD0l6A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.147.0': + resolution: {integrity: sha512-mgFF8pLU6R64LbT27lSrtVRspVC/3IcZ0qyIikzmi78Y3Ik2OPnlAHHI0UEBRcC3qmNgtjaef7zkFt7/uPxIcw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.147.0': + resolution: {integrity: sha512-v38aiF11qufOTBcCAKL4skgQf0zJ4NEvRlivq7B5kHrlyvjCLjvNrMtNWDTz1SDUL6/xVsJRmLDxv2e+Cp4oWw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.147.0': + resolution: {integrity: sha512-AeIiBbwUaP0H1+4/qGW9l5qHecS/+XA5iMuieVcGb1T+tyc2dVGspFW13BWk/XrLsiGP/CiDJTJqAPLLCzZHkw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.147.0': + resolution: {integrity: sha512-/41MKPW4RgPY4DJco0NCF0RYX3IMZaVlRNMNzvhaxRavc7tN3Txm+qllZbh0aMRs0VHdgUlbI8TcAOiTai4TKg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.147.0': + resolution: {integrity: sha512-bmpw/RPhVXgZbtb3xBDuwW5s8+LvZYdqcDSX/sP2ltL77aTio3DP/B5ZTwwgoJ6Mr9vJs4RrmgEKW9XkLNUU1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-arm64-musl@0.147.0': + resolution: {integrity: sha512-gd7VX/FDVOw6mjQcu45iIcp4QkgybgJwh3a0OFG2NxmPCj628mQWD96QGu1kK8+mZF9qK4b/gIEyC63vQoB7+Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-ppc64-gnu@0.147.0': + resolution: {integrity: sha512-HnAzcfki7dSUNHf510Q2NmbJlz8Ys7rn8l9l588Pkx0tYe1BHLZnmELIgqizJ4WPhHGSwN8Ce+B/menVxS3odA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-gnu@0.147.0': + resolution: {integrity: sha512-qlkOL6wT44U+fT5s/+sR6Shx0OdwvQF83JyIPZUxG/ovqZF5/7atOtjH+JPZ5/7ATQLbFBBSmghcy/+2NVB/ew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-musl@0.147.0': + resolution: {integrity: sha512-DlefD7L7sMXs/3hIBH23Egk0phj8kG0SA81dVGOQ3S1ekjOlmTLH2E+F2Thwfh1slKx6aH+lNc5fQYAw0GU7/g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-s390x-gnu@0.147.0': + resolution: {integrity: sha512-Xqpagk/031IvZ4svrk2FF01YEqM/iN3MJV3SVZadKg/CsGlDCGoREqKHXYnoV5+8SfGe/m6RM1szXFLusTu/Uw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxc-parser/binding-linux-x64-gnu@0.147.0': + resolution: {integrity: sha512-QioQOeUbI4ATUr0S2z88uA3Cds2R3Mm5Ge7U8XNYtlTb2GJF3rWlcj70z0AJhhOlbdm0YgVjqPBldUNbFylDIg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-linux-x64-musl@0.147.0': + resolution: {integrity: sha512-NXy1tv/OdC+pPTwf9RiCZWPK53V/Xq/2cjSnjOSyKopajdaDqMIkgtDY+jXZemp2e8px5FeWfY2L2LwhKZQovg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-openharmony-arm64@0.147.0': + resolution: {integrity: sha512-GpGWZ6oKz4bjCWW9Mz5pCaGPyk2Aaze6zEoaslIQqpSLtpx5pXj/ap5gUNb5Jn2LIbqWyjkGLX9yv3NMuNcBVQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-win32-arm64-msvc@0.147.0': + resolution: {integrity: sha512-a8mlt7CC8z7LUdCfaxhff4kCd+vSjE+NEFL0cxA8ukfuSnvAto/pWTjytW4BuVLnQGcCVdHJwcRKOfs++H+tjw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.147.0': + resolution: {integrity: sha512-M5ViVDBcFLnl2632AuuWuP35zEL5oikK1jTx8r3+902VEDeSNHxFZAB6RZyfZ7MU6Oi5QTOG8MmMkIeHsudSaw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.147.0': + resolution: {integrity: sha512-DUaE13OwnUSlHpLZNcC/nuT10ivlWqc5EZgsfgXuAmWYw0r3nDxGeLD1zlGwYwIgVk1/ZMAxoXpV+05stvbHaA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.147.0': + resolution: {integrity: sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==} + + '@oxc-resolver/binding-android-arm-eabi@11.24.2': + resolution: {integrity: sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA==} + cpu: [arm] + os: [android] + + '@oxc-resolver/binding-android-arm64@11.24.2': + resolution: {integrity: sha512-cl4icWaZFnLdg8m6qtnh5rBMuGbxc/ptStFHLeCNwr+2cZjkjNwQu/jYRS0CHlnPecOJMpuS5M6/BH+0J/YkEg==} + cpu: [arm64] + os: [android] + + '@oxc-resolver/binding-darwin-arm64@11.24.2': + resolution: {integrity: sha512-At29QEMF6HajbQvgY8K6OXnHD1x9rad74xBEfmCB6ZqCGsdq75aK7tOYcTbOanMy8qdIBrfL3SMr3p/lfSlb9w==} + cpu: [arm64] + os: [darwin] + + '@oxc-resolver/binding-darwin-x64@11.24.2': + resolution: {integrity: sha512-A5Kqr1EUj4oIL5CF4WRssq/o5P0Y11cwoFouMRmQ7YnC/A8V93nv1nb7aSU8HwcgmXropjLNkVTl4MN87cu28Q==} + cpu: [x64] + os: [darwin] + + '@oxc-resolver/binding-freebsd-x64@11.24.2': + resolution: {integrity: sha512-R5xkRBRRz7ceH/P5Jrc6G7FmdUdgpLYyESFAUDVTNQ9K0sGPxcp4ljiwEwEqsvNcQ4sYbMRrWcHHBCu7ksAJVw==} + cpu: [x64] + os: [freebsd] + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.24.2': + resolution: {integrity: sha512-k/RuYL4L/R58IBn3wT5ma3Wh4k62bp1eYCFRWCmMsasUOqL+H6sW0VGFadEzKWXFFlz+2uIMoeMk9ySSZJHgbg==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm-musleabihf@11.24.2': + resolution: {integrity: sha512-bnHAak3ujYfH5pKk4NieFNbvYvernfoQDgwLddbZ3OtMYrem87/qjlA+u+aKG0oZcqSLGCful/6/CEA+aeAgaA==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-gnu@11.24.2': + resolution: {integrity: sha512-vDT3KHgzYp47gmtNOqL2VNhCyl5Zv643eyxm//A68J8DeUGXrvD1pZFiaT4jSfe+RInfnn1R2yVHye4enx6RnA==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-musl@11.24.2': + resolution: {integrity: sha512-+kMlQvbzfyEYtu5FcjE4p+ttBLpKW4d/AsAsuE69BxV6V4twZJeIQZFfD8gh/wqglY0MkPSezWXQH0jBV13MUw==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-ppc64-gnu@11.24.2': + resolution: {integrity: sha512-shjfMhmZ3gq9fv/w7bi3PnZlgOPG+2QAOFf0BJF0EgBSIGZ6PMLN2zbGEblTUYB/NKVDRyYhE2ff3dJ1QqNPkA==} + cpu: [ppc64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.24.2': + resolution: {integrity: sha512-zGelwFR5oRo+b69k8Lrzun86DyUHzfKN6cnjbR9l7Z7NIRznOE/2ZvPa1IUKqAL2PzAXOdwkfVqNvO1H2RlpAw==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-musl@11.24.2': + resolution: {integrity: sha512-qxZ1SWCXJY0eyhAlP6Lmo9F2Nrtx7EkYj9oCgL8apDPCwXwCEDA2U697bbT81JIc2IrVjxO4KX6WU2N+oN9Z4w==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-s390x-gnu@11.24.2': + resolution: {integrity: sha512-sGCecF3cx2DFlH4t/z7ApnOnXqN48p5p5mlHDEnHTAukQa2P+qMVE4CwyWE9W+q/m3QJ7kKfGrIjax31f44oFQ==} + cpu: [s390x] + os: [linux] + + '@oxc-resolver/binding-linux-x64-gnu@11.24.2': + resolution: {integrity: sha512-k/VlMMcSzMlahb3/fENM4rTlsJ0s3fFROA0KXPBmKggqmTSaE383sl8F3KCOXPLmVsYfW6hCitMhXCEtNeZxxg==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-linux-x64-musl@11.24.2': + resolution: {integrity: sha512-8hbnZyNi97b/8wapYaIF9+t9GmZKBW2vunaOc3h9HGJptH7b7XpvZqOTBSm/MpTjr7H497BlgOaSfLUdhmy2bw==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-openharmony-arm64@11.24.2': + resolution: {integrity: sha512-MvyGik3a6pVgZ0t/kWlbmFxFLmXQJwgLsY2eYFHLpy0wGwRbfzeIGgDwQ3kXqE30z+kSXennRkCrT7TUvkptNg==} + cpu: [arm64] + os: [openharmony] + + '@oxc-resolver/binding-wasm32-wasi@11.24.2': + resolution: {integrity: sha512-vHcssMPwO08RTvj/c0iOBz90attxyG3wQJ0dTcyEQK43LRpcdLWZlV5feBhv6Isn6ahbQIzHbCgfa81+RiML0Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@11.24.2': + resolution: {integrity: sha512-uokJqro2iBqkFvJdKQLP7d8/BUmFwESQFVmIJUQKj1Xn1a/LysJoe1vmeECLF5b3jsV8CAL5sEMJXX6SdK9Nhg==} + cpu: [arm64] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@11.24.2': + resolution: {integrity: sha512-UqGPmo56KDfLlfXFAFIrNflHT8tFxWGEivWg3Zeyp4Uy2NlKN1FGPr6/BxcLGG3+kZ6Wp14g5Uj+n71boqZfiw==} + cpu: [x64] + os: [win32] + + '@oxfmt/binding-android-arm-eabi@0.66.0': + resolution: {integrity: sha512-2Me9eoptv6ERdEuI2P8AOlYdHHraXebJaM6SC0kc2Dfb+mLrep2db+fedBPKaYn673h/vBgvP4tkOdAbaudX6w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.66.0': + resolution: {integrity: sha512-u7O+bSSF0HGsDKkQQxBqvLGVepu93RA+JKu+ONqvfh4sCnCEbj31wZj4iG5gk3XfRwrmYj0/8catkO2LcblQKQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.66.0': + resolution: {integrity: sha512-/ikyMIVjX/sdo7KtjxoEsSUosfPzveVhT9RWMx9yGqFDKFJ89JAEKuEeLBmurDjrkb4w8tOnAdSO3SBaplY3bw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.66.0': + resolution: {integrity: sha512-q5xUsKeFqawa9NXa6ZGXWimFV19m8MogKPdTaSVDAAk2EQKBmBZRDeluwcl1p8ty/OFc9s9888OKEh3xfPVH0g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.66.0': + resolution: {integrity: sha512-CR+x4VzMY0pRXLK/xFQ/RzsSFkP5t2Z2mef0QY6OP/rTRcMUoMLCOM62/3Fp/t0K+UDoBKxvMyeb6D0zPMjleA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.66.0': + resolution: {integrity: sha512-ZEYmO/LbH9tTQCADILHGZE4GeOXOAj2VzedHkASNwjmwlwtutJCLpCJbIs37wRGTFgWRoEcD72jpMX+IBJUGjQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.66.0': + resolution: {integrity: sha512-hNtR9/oU0CeTkq7JnRkmBQwqe17v2ZaAMLC4VcN7IIOWeRyWDk0knSPWS9iiLmtbZ2RRBBtsG01jQgkZmKCJeQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.66.0': + resolution: {integrity: sha512-uwOVQ8i6I1LT/+eDzfsgrrcZp8Fn6NPVUPn8fF5gdFGekFf0PddF+LEuwsD0/pbNUcKZhDj2rQ5UpITh9gF4iQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-arm64-musl@0.66.0': + resolution: {integrity: sha512-tTkF2Dmx4nGAjmBlZb+UtTGqR/EK4ZrW9qBfzte07a9XWqzoGGKzpFFlyNDhQe+Uwql94+ReCTeNbhOXscw1Dg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-ppc64-gnu@0.66.0': + resolution: {integrity: sha512-F3cKHUav4yXOHn6GFnwpBhSYsJOYKKf9eqO/9jlEuqPxNw9zb98E9ZFct79gcg8pibUGkbveEu9WDlmXJpDzKw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-gnu@0.66.0': + resolution: {integrity: sha512-K5fDaNZfDyQMYA/3qL21bqyN0X9T15LLwwbFPt2aHc94+ZG7bh0vZEsy2y7NlRnjjHFSwN+Hzg6ldJtbOriH4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-musl@0.66.0': + resolution: {integrity: sha512-44Yc+I+qOmTElRcEhm5hUKIUJEQIOugymz4ua4tB0Wox7tGAfIbjzmXz/HDAtw1Ij6gmBwZlzh4hc9679RhWeA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-s390x-gnu@0.66.0': + resolution: {integrity: sha512-1e29Eg9hEj2kRBB19M0seIehPbbXHCk35GvImjDvb79rjjYjXCRmtbUNHJcgoktZAMIzXrTbxDBKmTc1V4bg3A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxfmt/binding-linux-x64-gnu@0.66.0': + resolution: {integrity: sha512-vODY1UQo10gngn0+D4xHKU84F1Twm1LqrzV4SqPXvmQKSd87paehvZ6jqA5wKs6XQrlWul9clYMDVHcoW9CPMA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-linux-x64-musl@0.66.0': + resolution: {integrity: sha512-YDzXx2JsT4+HL4MdkVrYjO55NS5lUKNm8rLC4ZPou8+seu0v0jhecSh+ufoO6+xEa8gccEezMlI2WHJi4ApUgw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-openharmony-arm64@0.66.0': + resolution: {integrity: sha512-mJjUYd8lj0+j4JkYyEM+5qKBf1Rnrpgjn/SVYKJhicVDqLz566ooa7Fs8zflPqt+dnZDV7X054rVIQX6ZcQNlQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.66.0': + resolution: {integrity: sha512-soV+0vESv7e5ntCHWC61x4gg8OSak6IHHnWsZmHrJFlvMj2AK+kmldErCNkVkrvc1Ts2/++rJXn+IuAb2WMXhw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.66.0': + resolution: {integrity: sha512-YCPi23uRIEYuIKTZohAkKbPFpujQ5QBuUM5iDv+UqbCmTPAkaFsxjsSuB8xlBpRT0G7eP/4HMF+cPDSqHtOD9A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.66.0': + resolution: {integrity: sha512-bwTQcv/JVRPkOqQtMF0X7vpvpncDQiBcXHxZ9S2hR12Hlo8bvBdUR5x5XnxzDZ3kM0qoZw1rv7KaD66Ly+pFWA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint-tsgolint/darwin-arm64@7.0.2001': + resolution: {integrity: sha512-CUJEdbSZ54+Xy9OXqOhWLTKZKV0BBiV7C2i/ygyVmXtkUNXx5YCzN8DpSSshTAKktoL7S+tnQ/ftFG/i7X896w==} + cpu: [arm64] + os: [darwin] + + '@oxlint-tsgolint/darwin-x64@7.0.2001': + resolution: {integrity: sha512-pXfBb5BqONCcgrXQNUZWXgiYmRSWJzd97S8i41VVOh6ut0tyo+cJ5FKFpczDHxiVNfj/3e7c9B4MtztNdpIVCw==} + cpu: [x64] + os: [darwin] + + '@oxlint-tsgolint/linux-arm64@7.0.2001': + resolution: {integrity: sha512-roP7zujb/QDPzDwEKsFFpzNHHy91/Y7oX9vQXk78ekyZtcQj1QXDIMH33gjDdHBfRl4K9pZ36xhRgrP4Zr+R8A==} + cpu: [arm64] + os: [linux] + + '@oxlint-tsgolint/linux-x64@7.0.2001': + resolution: {integrity: sha512-UDezNqdECVmngu2TPnjaS1YoAmcTaBoI5lV9vk3VahBxoi+I5r9k3iJTT7qZoYWOXTD/7T7bNcwRgrocR6BscQ==} + cpu: [x64] + os: [linux] + + '@oxlint-tsgolint/win32-arm64@7.0.2001': + resolution: {integrity: sha512-uJZhqB6pdXLuN+AD1F5082byyQti/NPmJA77GtcFlmT2HzRelqbNls3SaIqxpjdFgvSBF9g0yOKGBkGFg7kX8Q==} + cpu: [arm64] + os: [win32] + + '@oxlint-tsgolint/win32-x64@7.0.2001': + resolution: {integrity: sha512-FkDRm8hx9OwzGQqyWG1tO5QrTLRApff9DzSgpz9QZau37BR8d1VYKOxMLGf6shPZntJFoTwIIJYT68VndYDCog==} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.81.0': + resolution: {integrity: sha512-IcCRsXiedJoJopY6mpZUBEeVFsUrutmrG7dZ87zMuKJlhg70Ora9bBl1WcCxZQtyI10YpnVdEso5oCg7YcfSHw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.81.0': + resolution: {integrity: sha512-GRrIPyTGVhx3L3h+0T5xT2A0jFAcdPv4+IfuXpGDLIdl6XeYhgg/zw72A5ILZoUgRqZuM8F1y+V/gfDriXSxzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.81.0': + resolution: {integrity: sha512-qNQ9tXRgLuKbqSV1S2h9h4KPHjbovO7RRR2/enUOtHzTkFZ7B9X5zqqHJua8dRyc7dBy7Aoyq5pqTSLFVcAzGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.81.0': + resolution: {integrity: sha512-q0QTm32jWga2Gv4j7IaVZN0jYMi9UV73sWVgFtDA4iIfqwMCLLZ3ve+9KwfYtsaKZSgQhmPaogeZWqDZpcY1Pw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.81.0': + resolution: {integrity: sha512-/+8wVWDXEC7wHVAhOc59Fw/SkMc1arLkFD8iQCaSsmzenK1X4doFqquL9H1wrtGUzaiycVqkf/sSpcILK6W1UA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.81.0': + resolution: {integrity: sha512-4xt422FEgioRq9hAL4Tq7fujGUWnc8z1BJ+Oi8RN8vB8axaP+sdK6a2xdlcQCCYnJg9QMuMFS0AucuIFx/EacA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.81.0': + resolution: {integrity: sha512-u3vna8KdGplH4DRCW9K54D68fcMo7IxVrkCJWwXnIhwtBdnDnYrmzOUA/XjmBlPpcLsgw9Z5BNdY4za9+Dj+MQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.81.0': + resolution: {integrity: sha512-3j9k+gsYsE7nv71GWotXsqsa2l9/aJenD7dVHNt/CBvsb0SgRjSMnHFeP59IXUAl1wvVFhqGl2wJNMwWU3UBlA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-arm64-musl@1.81.0': + resolution: {integrity: sha512-k5iAp3dNxW0/uDCBY+WSm8jKB2szu7SkEQZdgRRpDXvuDd69vvDcqhB3A/pWCfCwXyenjNjFn9Td1fVoyAc+Yg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-ppc64-gnu@1.81.0': + resolution: {integrity: sha512-TFqLja3uYmVSte6nof9GWrex9Z8WgdZrNiLC6Te5rXGDqXB2y4j/26iFhwosXiAFqDhE9JJVuuCkDKLwptTn1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxlint/binding-linux-riscv64-gnu@1.81.0': + resolution: {integrity: sha512-UEcySvGS0NOVo7h7n7CYyJL9+6gFAh7Zc/ToDXVScFvzHSTIxtzkMVU30rmQ6+nQ1LF+UdiRDdJajpDu+OylLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-riscv64-musl@1.81.0': + resolution: {integrity: sha512-H+diDbhD00+wI1IRP8Kz88x/lat+DgtoBJzoTthS16xkTJGNaEkfb8gzmd1rzc/2uDQQMl7GNl+JFUacVeWxIA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-s390x-gnu@1.81.0': + resolution: {integrity: sha512-8znJ/5TekjOKg1j1Acho4PJMdiAHLtlcXuWEiipOhAMV6rQcXdmDdXCbheyDczN6TjBwiNfjcP81k4AthrKRzw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxlint/binding-linux-x64-gnu@1.81.0': + resolution: {integrity: sha512-Q2Wj70yFsvn5QjlmifFzbj4H+kJy53bwqc41o1fzoM7MpLV1NIbhg/LpWXRfC6KOkSAdUx1Wd8VJsdPmhp/HRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-linux-x64-musl@1.81.0': + resolution: {integrity: sha512-cPInHp/ddEe5qkyK2IiyQ8Q3Mp2oLLEhhsGgTK2oZx4L6+llGam1H1yBvJZ7qHfOXj8N3hxBS8sj4tO+gtFlIg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-openharmony-arm64@1.81.0': + resolution: {integrity: sha512-0CQxSX4ajqm07AHBf5U33qQzXKdd7wtq/oTL/7vpY6RNNuxrRi8W4bqUV1Jyu/vj+9KmxQyDhxfeVX1nQL6kfg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.81.0': + resolution: {integrity: sha512-l0hbeISm9673hVrrQU8j/p2M7YH9Ouoj7p7E/QM55NTrKVLP+P3PF8hLu+OY+x0VtGRW+ggiQKZqmdYps9H+TA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.81.0': + resolution: {integrity: sha512-ksqPP5jbFXcYreEQ7zdJh06rJQBymCTyGRCdaXjfcf2aG4f8KxUWY5wcgYHmaTK+FJ4bPG5sUAdOX+6trnH1JA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.81.0': + resolution: {integrity: sha512-IZuUCwGw9emG5JtCp+fYGB+Z4OWEoeEcM8R5BA1pYw63/ieYFVdcU2ylxTpHbVHSenZnsYE+ZZ20uHAJszQ4cA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint/plugins@1.81.0': + resolution: {integrity: sha512-HhD8kd3r6XpelZkhxhRty/po8V6yK1VV63Eq4kSsOS2IoHUywG3DV2EX+z/ZHw46aLI74Y6aA604NRiAqLKW9w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@phun-ky/typeof@2.0.3': resolution: {integrity: sha512-oeQJs1aa8Ghke8JIK9yuq/+KjMiaYeDZ38jx7MhkXncXlUKjqQ3wEm2X3qCKyjo+ZZofZj+WsEEiqkTtRuE2xQ==} engines: {node: ^20.9.0 || >=22.0.0, npm: '>=10.8.2'} @@ -337,9 +875,21 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/chai@4.3.20': resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/mocha@10.0.10': resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} @@ -359,6 +909,48 @@ packages: '@types/whatwg-url@11.0.5': resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} + '@typescript-eslint/project-service@8.69.0': + resolution: {integrity: sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.69.0': + resolution: {integrity: sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.69.0': + resolution: {integrity: sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.69.0': + resolution: {integrity: sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.69.0': + resolution: {integrity: sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.69.0': + resolution: {integrity: sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.69.0': + resolution: {integrity: sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn@8.17.0: resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} @@ -368,6 +960,9 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -465,6 +1060,10 @@ packages: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -496,6 +1095,9 @@ packages: magicast: optional: true + cacheable@2.5.0: + resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} + camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} @@ -599,6 +1201,9 @@ packages: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + default-browser-id@5.0.1: resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} engines: {node: '>=18'} @@ -635,16 +1240,60 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} hasBin: true + eslint-plugin-perfectionist@5.11.0: + resolution: {integrity: sha512-kZV1otBcu4xT5R1p+0x1N1wRv4pS+OIbxrA47n5a1fTnN3MWbexOx5eQgbQhGyCNbpvF/rqrbnpkGjumHF+Y0Q==} + engines: {node: ^20.0.0 || >=22.0.0} + peerDependencies: + eslint: ^8.45.0 || ^9.0.0 || ^10.0.0 + + 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.10.0: + resolution: {integrity: sha512-NPXn6r5zl4uET1DAVPaOwzX3rut4c0wcmw3dWJAfOsTM5+TogXo0DDjz8pwm/hL8cyVNpHqeK4JpN0NjnyFFNw==} + 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} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + 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'} @@ -670,9 +1319,21 @@ packages: fast-content-type-parse@3.0.0: resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fd-package-json@2.0.0: + resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -682,6 +1343,9 @@ packages: picomatch: optional: true + file-entry-cache@11.1.5: + resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -694,6 +1358,16 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@6.1.23: + resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} + + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} + follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} @@ -703,6 +1377,11 @@ packages: debug: optional: true + formatly@0.7.0: + resolution: {integrity: sha512-7CXJtIIA0zy/u12StsYk25qVKxvdLA2ep2sTNxK3ov0mGNIIDqIvAXDSgTnAfDJFsPfWjuz0WjfYSdpvnLA5Tg==} + engines: {node: '>=18.3.0'} + hasBin: true + fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -723,6 +1402,9 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} + get-tsconfig@4.14.3: + resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} + get-uri@6.0.5: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} engines: {node: '>= 14'} @@ -745,10 +1427,24 @@ packages: 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@13.0.6: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} + hashery@1.5.1: + resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} + engines: {node: '>=20'} + + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} + + hookified@2.2.0: + resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} + http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -765,6 +1461,14 @@ packages: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} + 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'} + inquirer@12.11.1: resolution: {integrity: sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw==} engines: {node: '>=18'} @@ -842,13 +1546,39 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + 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==} + json-with-bigint@3.5.8: resolution: {integrity: sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==} + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} + + knip@6.34.0: + resolution: {integrity: sha512-bbHIrnGspYwe4EBPjjx+lvkUor0F2qfKQc5BPzPI4SOAImYA+k2ueVpIcF7d/W1LEVT7XoJUPt6zELeGZhXBgA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + lodash.capitalize@4.2.1: resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} @@ -919,6 +1649,10 @@ packages: resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -988,6 +1722,13 @@ packages: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + natural-orderby@5.0.0: + resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} + engines: {node: '>=18'} + netmask@2.0.2: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} @@ -1042,6 +1783,10 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + ora@9.0.0: resolution: {integrity: sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==} engines: {node: '>=20'} @@ -1050,14 +1795,59 @@ packages: resolution: {integrity: sha512-zBd1G8HkewNd2A8oQ8c6BN/f/c9EId7rSUueOLGu28govmUctXmM+3765GwsByv9nYUdrLqHphXlYIc86saYsg==} engines: {node: '>=18'} + oxc-parser@0.147.0: + resolution: {integrity: sha512-5xaug6t7GfV3BO5Iv+xHW1rmQkDEQ3BEu3L8g3InsvWO5i8CYGc4tCZ2X985QcwWNycFJam+aOns6Nr2XAThTA==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-resolver@11.24.2: + resolution: {integrity: sha512-FY91FiDBj7ls5MsFS9jN3tjz2o0/zsdSsymlakySaBwVJZorHhkWyICLZMKxlu1R9vYo+sd3z1jwb4J8x7bNDw==} + + oxfmt@0.66.0: + resolution: {integrity: sha512-FfvqR8RFtV6JJpRrpkfqyVCQ7HDvZ/VriWFx7veftCgL1B5ZO9qNr+1rvPieycMQnNfVG0PWyJQiy7p0hq1I5w==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + svelte: ^5.0.0 + vite-plus: '*' + peerDependenciesMeta: + svelte: + optional: true + vite-plus: + optional: true + + oxlint-tsgolint@7.0.2001: + resolution: {integrity: sha512-KjK/XLcXr1DSyonKhsuFqJRiuKqcyG9j3LJ8nkOsrLzGvodBPqzHOKauy10asLMDI0sUpvb+1sxlzff3udZvfg==} + hasBin: true + + oxlint@1.81.0: + resolution: {integrity: sha512-HyrJYqeoOCL0iqaLEzGewGT48ZX99P3hxYh8udAF9RGGIghSamkXE4ClUyBpEDNqasamThgmlPbuMOe7SAZmHg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=7.0.2001' + vite-plus: '*' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + vite-plus: + optional: true + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -1073,6 +1863,9 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@1.8.0: + resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} + parse-path@7.1.0: resolution: {integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==} @@ -1122,6 +1915,10 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -1132,6 +1929,10 @@ packages: pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + protocols@2.0.2: resolution: {integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==} @@ -1146,6 +1947,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qified@0.10.1: + resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} + engines: {node: '>=20'} + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -1180,6 +1985,9 @@ packages: engines: {node: ^20.12.0 || >=22.0.0} hasBin: true + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -1243,6 +2051,10 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + smol-toml@1.8.0: + resolution: {integrity: sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==} + engines: {node: '>= 18'} + socks-proxy-agent@8.0.5: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} @@ -1288,6 +2100,10 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + tar-stream@3.1.8: resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==} @@ -1313,6 +2129,14 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1321,9 +2145,19 @@ packages: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + type-detect@4.1.0: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} @@ -1340,6 +2174,10 @@ packages: ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + unbash@4.0.11: + resolution: {integrity: sha512-FoSOKV7NEofQSkAefMVHam4ZPKYMxjAydxiV72UFEDNV/YofxjGfiZ2A9pZjdL/lRJzTjcu4PABo1JYJX8N5iQ==} + engines: {node: '>=14'} + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -1350,10 +2188,17 @@ packages: universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-join@5.0.0: resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -1374,6 +2219,10 @@ packages: resolution: {integrity: sha512-1lOb3qdzw6OFmOzoY0nauhLG72TpWtb5qgYPiSh/62rjc1XidBSDio2qw0pwHh17VINF217ebIkZJdFLZFn9SA==} engines: {node: '>=18'} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -1398,6 +2247,10 @@ packages: resolution: {integrity: sha512-k1isifdbpNSFEHFJ1ZY4YDewv0IH9FR61lDetaRMD3j2ae3bIXGV+7c+LHCqtQGofSd8PIyV4X6+dHMAnSr60A==} engines: {node: '>=12'} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + yoctocolors-cjs@2.1.3: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} @@ -1406,6 +2259,9 @@ packages: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} + zod@4.5.4: + resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==} + snapshots: '@antelopejs/interface-api-util@0.1.1(@antelopejs/interface-api@0.0.5(@antelopejs/interface-core@0.0.5))(@antelopejs/interface-core@0.0.5)': @@ -1433,40 +2289,88 @@ snapshots: dependencies: '@antelopejs/interface-core': 0.0.5 - '@biomejs/biome@2.3.2': + '@antelopejs/tooling-configs@0.0.4(eslint-plugin-perfectionist@5.11.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.9.3))(knip@6.34.0)(oxfmt@0.66.0)(oxlint@1.81.0(oxlint-tsgolint@7.0.2001))': + dependencies: + '@oxlint/plugins': 1.81.0 optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.3.2 - '@biomejs/cli-darwin-x64': 2.3.2 - '@biomejs/cli-linux-arm64': 2.3.2 - '@biomejs/cli-linux-arm64-musl': 2.3.2 - '@biomejs/cli-linux-x64': 2.3.2 - '@biomejs/cli-linux-x64-musl': 2.3.2 - '@biomejs/cli-win32-arm64': 2.3.2 - '@biomejs/cli-win32-x64': 2.3.2 + eslint-plugin-perfectionist: 5.11.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.9.3) + knip: 6.34.0 + oxfmt: 0.66.0 + oxlint: 1.81.0(oxlint-tsgolint@7.0.2001) - '@biomejs/cli-darwin-arm64@2.3.2': - optional: true + '@cacheable/memory@2.2.0': + dependencies: + '@cacheable/utils': 2.5.0 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 - '@biomejs/cli-darwin-x64@2.3.2': - optional: true + '@cacheable/utils@2.5.0': + dependencies: + hashery: 1.5.1 + keyv: 5.6.0 - '@biomejs/cli-linux-arm64-musl@2.3.2': + '@emnapi/core@1.11.2': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 optional: true - '@biomejs/cli-linux-arm64@2.3.2': + '@emnapi/runtime@1.11.2': + dependencies: + tslib: 2.8.1 optional: true - '@biomejs/cli-linux-x64-musl@2.3.2': + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 optional: true - '@biomejs/cli-linux-x64@2.3.2': - optional: true + '@eslint-community/eslint-utils@4.10.1(eslint@10.10.0(jiti@2.7.0))': + dependencies: + eslint: 10.10.0(jiti@2.7.0) + eslint-visitor-keys: 3.4.3 - '@biomejs/cli-win32-arm64@2.3.2': - optional: true + '@eslint-community/regexpp@4.12.2': {} - '@biomejs/cli-win32-x64@2.3.2': - optional: true + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.6 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.7.0': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.3': + 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': {} '@inquirer/ansi@1.0.2': {} @@ -1562,114 +2466,394 @@ snapshots: optionalDependencies: '@types/node': 22.19.15 - '@inquirer/rawlist@4.1.11(@types/node@22.19.15)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.15) - '@inquirer/type': 3.0.10(@types/node@22.19.15) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 22.19.15 + '@inquirer/rawlist@4.1.11(@types/node@22.19.15)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.15) + '@inquirer/type': 3.0.10(@types/node@22.19.15) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.15 + + '@inquirer/search@3.2.2(@types/node@22.19.15)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.15) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.15) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.15 + + '@inquirer/select@4.4.2(@types/node@22.19.15)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.19.15) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.15) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.15 + + '@inquirer/type@3.0.10(@types/node@22.19.15)': + optionalDependencies: + '@types/node': 22.19.15 + + '@keyv/bigmap@1.3.1(keyv@5.6.0)': + dependencies: + hashery: 1.5.1 + hookified: 1.15.1 + keyv: 5.6.0 + + '@keyv/serialize@1.1.1': {} + + '@mongodb-js/saslprep@1.4.6': + dependencies: + sparse-bitfield: 3.0.3 + + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@nodeutils/defaults-deep@1.1.0': + dependencies: + lodash: 4.17.23 + + '@octokit/auth-token@6.0.0': {} + + '@octokit/core@7.0.6': + dependencies: + '@octokit/auth-token': 6.0.0 + '@octokit/graphql': 9.0.3 + '@octokit/request': 10.0.8 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + before-after-hook: 4.0.0 + universal-user-agent: 7.0.3 + + '@octokit/endpoint@11.0.3': + dependencies: + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 + + '@octokit/graphql@9.0.3': + dependencies: + '@octokit/request': 10.0.8 + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 + + '@octokit/openapi-types@27.0.0': {} + + '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)': + dependencies: + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 + + '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.6)': + dependencies: + '@octokit/core': 7.0.6 + + '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)': + dependencies: + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 + + '@octokit/request-error@7.1.0': + dependencies: + '@octokit/types': 16.0.0 + + '@octokit/request@10.0.8': + dependencies: + '@octokit/endpoint': 11.0.3 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + fast-content-type-parse: 3.0.0 + json-with-bigint: 3.5.8 + universal-user-agent: 7.0.3 + + '@octokit/rest@22.0.1': + dependencies: + '@octokit/core': 7.0.6 + '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6) + '@octokit/plugin-request-log': 6.0.0(@octokit/core@7.0.6) + '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.6) + + '@octokit/types@16.0.0': + dependencies: + '@octokit/openapi-types': 27.0.0 + + '@oxc-parser/binding-android-arm-eabi@0.147.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.147.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.147.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.147.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.147.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.147.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.147.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.147.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.147.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.147.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.147.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.147.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.147.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.147.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.147.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.147.0': + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.147.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.147.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.147.0': + optional: true + + '@oxc-project/types@0.147.0': {} + + '@oxc-resolver/binding-android-arm-eabi@11.24.2': + optional: true + + '@oxc-resolver/binding-android-arm64@11.24.2': + optional: true + + '@oxc-resolver/binding-darwin-arm64@11.24.2': + optional: true + + '@oxc-resolver/binding-darwin-x64@11.24.2': + optional: true + + '@oxc-resolver/binding-freebsd-x64@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-arm-musleabihf@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-arm64-gnu@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-arm64-musl@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-ppc64-gnu@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-riscv64-gnu@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-riscv64-musl@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-s390x-gnu@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@11.24.2': + optional: true + + '@oxc-resolver/binding-openharmony-arm64@11.24.2': + optional: true + + '@oxc-resolver/binding-wasm32-wasi@11.24.2': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + optional: true + + '@oxc-resolver/binding-win32-arm64-msvc@11.24.2': + optional: true + + '@oxc-resolver/binding-win32-x64-msvc@11.24.2': + optional: true + + '@oxfmt/binding-android-arm-eabi@0.66.0': + optional: true + + '@oxfmt/binding-android-arm64@0.66.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.66.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.66.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.66.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.66.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.66.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.66.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.66.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.66.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.66.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.66.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.66.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.66.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.66.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.66.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.66.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.66.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.66.0': + optional: true + + '@oxlint-tsgolint/darwin-arm64@7.0.2001': + optional: true + + '@oxlint-tsgolint/darwin-x64@7.0.2001': + optional: true + + '@oxlint-tsgolint/linux-arm64@7.0.2001': + optional: true + + '@oxlint-tsgolint/linux-x64@7.0.2001': + optional: true + + '@oxlint-tsgolint/win32-arm64@7.0.2001': + optional: true + + '@oxlint-tsgolint/win32-x64@7.0.2001': + optional: true + + '@oxlint/binding-android-arm-eabi@1.81.0': + optional: true - '@inquirer/search@3.2.2(@types/node@22.19.15)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.15) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.15) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 22.19.15 + '@oxlint/binding-android-arm64@1.81.0': + optional: true - '@inquirer/select@4.4.2(@types/node@22.19.15)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.15) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.15) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 22.19.15 + '@oxlint/binding-darwin-arm64@1.81.0': + optional: true - '@inquirer/type@3.0.10(@types/node@22.19.15)': - optionalDependencies: - '@types/node': 22.19.15 + '@oxlint/binding-darwin-x64@1.81.0': + optional: true - '@mongodb-js/saslprep@1.4.6': - dependencies: - sparse-bitfield: 3.0.3 + '@oxlint/binding-freebsd-x64@1.81.0': + optional: true - '@nodeutils/defaults-deep@1.1.0': - dependencies: - lodash: 4.17.23 + '@oxlint/binding-linux-arm-gnueabihf@1.81.0': + optional: true - '@octokit/auth-token@6.0.0': {} + '@oxlint/binding-linux-arm-musleabihf@1.81.0': + optional: true - '@octokit/core@7.0.6': - dependencies: - '@octokit/auth-token': 6.0.0 - '@octokit/graphql': 9.0.3 - '@octokit/request': 10.0.8 - '@octokit/request-error': 7.1.0 - '@octokit/types': 16.0.0 - before-after-hook: 4.0.0 - universal-user-agent: 7.0.3 + '@oxlint/binding-linux-arm64-gnu@1.81.0': + optional: true - '@octokit/endpoint@11.0.3': - dependencies: - '@octokit/types': 16.0.0 - universal-user-agent: 7.0.3 + '@oxlint/binding-linux-arm64-musl@1.81.0': + optional: true - '@octokit/graphql@9.0.3': - dependencies: - '@octokit/request': 10.0.8 - '@octokit/types': 16.0.0 - universal-user-agent: 7.0.3 + '@oxlint/binding-linux-ppc64-gnu@1.81.0': + optional: true - '@octokit/openapi-types@27.0.0': {} + '@oxlint/binding-linux-riscv64-gnu@1.81.0': + optional: true - '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)': - dependencies: - '@octokit/core': 7.0.6 - '@octokit/types': 16.0.0 + '@oxlint/binding-linux-riscv64-musl@1.81.0': + optional: true - '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.6)': - dependencies: - '@octokit/core': 7.0.6 + '@oxlint/binding-linux-s390x-gnu@1.81.0': + optional: true - '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)': - dependencies: - '@octokit/core': 7.0.6 - '@octokit/types': 16.0.0 + '@oxlint/binding-linux-x64-gnu@1.81.0': + optional: true - '@octokit/request-error@7.1.0': - dependencies: - '@octokit/types': 16.0.0 + '@oxlint/binding-linux-x64-musl@1.81.0': + optional: true - '@octokit/request@10.0.8': - dependencies: - '@octokit/endpoint': 11.0.3 - '@octokit/request-error': 7.1.0 - '@octokit/types': 16.0.0 - fast-content-type-parse: 3.0.0 - json-with-bigint: 3.5.8 - universal-user-agent: 7.0.3 + '@oxlint/binding-openharmony-arm64@1.81.0': + optional: true - '@octokit/rest@22.0.1': - dependencies: - '@octokit/core': 7.0.6 - '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6) - '@octokit/plugin-request-log': 6.0.0(@octokit/core@7.0.6) - '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.6) + '@oxlint/binding-win32-arm64-msvc@1.81.0': + optional: true - '@octokit/types@16.0.0': - dependencies: - '@octokit/openapi-types': 27.0.0 + '@oxlint/binding-win32-ia32-msvc@1.81.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.81.0': + optional: true + + '@oxlint/plugins@1.81.0': {} '@phun-ky/typeof@2.0.3': {} '@tootallnate/quickjs-emscripten@0.23.0': {} + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + '@types/chai@4.3.20': {} + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.9': {} + + '@types/json-schema@7.0.15': {} + '@types/mocha@10.0.10': {} '@types/node@22.19.15': @@ -1688,10 +2872,72 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 + '@typescript-eslint/project-service@8.69.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@5.9.3) + '@typescript-eslint/types': 8.69.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.69.0': + dependencies: + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/visitor-keys': 8.69.0 + + '@typescript-eslint/tsconfig-utils@8.69.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/types@8.69.0': {} + + '@typescript-eslint/typescript-estree@8.69.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.69.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@5.9.3) + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/visitor-keys': 8.69.0 + debug: 4.4.3 + minimatch: 10.2.4 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(typescript@5.9.3) + eslint: 10.10.0(jiti@2.7.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.69.0': + dependencies: + '@typescript-eslint/types': 8.69.0 + eslint-visitor-keys: 5.0.1 + + acorn-jsx@5.3.2(acorn@8.17.0): + dependencies: + acorn: 8.17.0 + acorn@8.17.0: {} agent-base@7.1.4: {} + 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 + ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -1765,6 +3011,10 @@ snapshots: dependencies: balanced-match: 4.0.4 + brace-expansion@5.0.9: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -1807,6 +3057,14 @@ snapshots: pkg-types: 2.3.0 rc9: 2.1.2 + cacheable@2.5.0: + dependencies: + '@cacheable/memory': 2.2.0 + '@cacheable/utils': 2.5.0 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.10.1 + camelcase@6.3.0: {} chai@4.5.0: @@ -1914,6 +3172,8 @@ snapshots: dependencies: type-detect: 4.1.0 + deep-is@0.1.4: {} + default-browser-id@5.0.1: {} default-browser@5.5.0: @@ -1941,6 +3201,8 @@ snapshots: emoji-regex@8.0.0: {} + escape-string-regexp@4.0.0: {} + escodegen@2.1.0: dependencies: esprima: 4.0.1 @@ -1949,8 +3211,79 @@ snapshots: optionalDependencies: source-map: 0.6.1 + eslint-plugin-perfectionist@5.11.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.9.3): + dependencies: + '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.9.3) + eslint: 10.10.0(jiti@2.7.0) + natural-orderby: 5.0.0 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.10.0(jiti@2.7.0): + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.7.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.3 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 11.1.5 + 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.6 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.7.0 + transitivePeerDependencies: + - supports-color + + espree@11.2.0: + dependencies: + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + eslint-visitor-keys: 5.0.1 + esprima@4.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: {} @@ -1979,12 +3312,30 @@ snapshots: fast-content-type-parse@3.0.0: {} + fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fd-package-json@2.0.0: + dependencies: + walk-up-path: 4.0.0 + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + file-entry-cache@11.1.5: + dependencies: + flat-cache: 6.1.23 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -2000,10 +3351,28 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@6.1.23: + dependencies: + cacheable: 2.5.0 + flatted: 3.4.4 + hookified: 1.15.1 + + flatted@3.4.4: {} + follow-redirects@1.15.11(debug@4.4.3): optionalDependencies: debug: 4.4.3 + formatly@0.7.0: + dependencies: + fd-package-json: 2.0.0 + package-manager-detector: 1.8.0 + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 @@ -2017,6 +3386,10 @@ snapshots: get-stream@8.0.1: {} + get-tsconfig@4.14.3: + dependencies: + resolve-pkg-maps: 1.0.0 + get-uri@6.0.5: dependencies: basic-ftp: 5.2.0 @@ -2057,12 +3430,24 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + glob@13.0.6: dependencies: minimatch: 10.2.4 minipass: 7.1.3 path-scurry: 2.0.2 + hashery@1.5.1: + dependencies: + hookified: 1.15.1 + + hookified@1.15.1: {} + + hookified@2.2.0: {} + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 @@ -2083,6 +3468,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + ignore@5.3.2: {} + + imurmurhash@0.1.4: {} + inquirer@12.11.1(@types/node@22.19.15): dependencies: '@inquirer/ansi': 1.0.2 @@ -2145,12 +3534,47 @@ snapshots: jiti@2.6.1: {} + jiti@2.7.0: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + json-with-bigint@3.5.8: {} + keyv@5.6.0: + dependencies: + '@keyv/serialize': 1.1.1 + + knip@6.34.0: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + formatly: 0.7.0 + get-tsconfig: 4.14.3 + jiti: 2.7.0 + oxc-parser: 0.147.0 + oxc-resolver: 11.24.2 + picomatch: 4.0.7 + smol-toml: 1.8.0 + strip-json-comments: 5.0.3 + tinyglobby: 0.2.17 + unbash: 4.0.11 + yaml: 2.9.0 + zod: 4.5.4 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + lodash.capitalize@4.2.1: {} lodash.escaperegexp@4.1.2: {} @@ -2202,6 +3626,10 @@ snapshots: dependencies: brace-expansion: 5.0.5 + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.9 + minipass@3.3.6: dependencies: yallist: 4.0.0 @@ -2270,6 +3698,10 @@ snapshots: mute-stream@2.0.0: {} + natural-compare@1.4.0: {} + + natural-orderby@5.0.0: {} + netmask@2.0.2: {} new-find-package-json@2.0.0: @@ -2330,6 +3762,15 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.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 + ora@9.0.0: dependencies: chalk: 5.6.2 @@ -2347,14 +3788,124 @@ snapshots: macos-release: 3.4.0 windows-release: 6.1.0 + oxc-parser@0.147.0: + dependencies: + '@oxc-project/types': 0.147.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.147.0 + '@oxc-parser/binding-android-arm64': 0.147.0 + '@oxc-parser/binding-darwin-arm64': 0.147.0 + '@oxc-parser/binding-darwin-x64': 0.147.0 + '@oxc-parser/binding-freebsd-x64': 0.147.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.147.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.147.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.147.0 + '@oxc-parser/binding-linux-arm64-musl': 0.147.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.147.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.147.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.147.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.147.0 + '@oxc-parser/binding-linux-x64-gnu': 0.147.0 + '@oxc-parser/binding-linux-x64-musl': 0.147.0 + '@oxc-parser/binding-openharmony-arm64': 0.147.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.147.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.147.0 + '@oxc-parser/binding-win32-x64-msvc': 0.147.0 + + oxc-resolver@11.24.2: + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.24.2 + '@oxc-resolver/binding-android-arm64': 11.24.2 + '@oxc-resolver/binding-darwin-arm64': 11.24.2 + '@oxc-resolver/binding-darwin-x64': 11.24.2 + '@oxc-resolver/binding-freebsd-x64': 11.24.2 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.24.2 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.24.2 + '@oxc-resolver/binding-linux-arm64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-arm64-musl': 11.24.2 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-riscv64-musl': 11.24.2 + '@oxc-resolver/binding-linux-s390x-gnu': 11.24.2 + '@oxc-resolver/binding-linux-x64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-x64-musl': 11.24.2 + '@oxc-resolver/binding-openharmony-arm64': 11.24.2 + '@oxc-resolver/binding-wasm32-wasi': 11.24.2 + '@oxc-resolver/binding-win32-arm64-msvc': 11.24.2 + '@oxc-resolver/binding-win32-x64-msvc': 11.24.2 + + oxfmt@0.66.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.66.0 + '@oxfmt/binding-android-arm64': 0.66.0 + '@oxfmt/binding-darwin-arm64': 0.66.0 + '@oxfmt/binding-darwin-x64': 0.66.0 + '@oxfmt/binding-freebsd-x64': 0.66.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.66.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.66.0 + '@oxfmt/binding-linux-arm64-gnu': 0.66.0 + '@oxfmt/binding-linux-arm64-musl': 0.66.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.66.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.66.0 + '@oxfmt/binding-linux-riscv64-musl': 0.66.0 + '@oxfmt/binding-linux-s390x-gnu': 0.66.0 + '@oxfmt/binding-linux-x64-gnu': 0.66.0 + '@oxfmt/binding-linux-x64-musl': 0.66.0 + '@oxfmt/binding-openharmony-arm64': 0.66.0 + '@oxfmt/binding-win32-arm64-msvc': 0.66.0 + '@oxfmt/binding-win32-ia32-msvc': 0.66.0 + '@oxfmt/binding-win32-x64-msvc': 0.66.0 + + oxlint-tsgolint@7.0.2001: + optionalDependencies: + '@oxlint-tsgolint/darwin-arm64': 7.0.2001 + '@oxlint-tsgolint/darwin-x64': 7.0.2001 + '@oxlint-tsgolint/linux-arm64': 7.0.2001 + '@oxlint-tsgolint/linux-x64': 7.0.2001 + '@oxlint-tsgolint/win32-arm64': 7.0.2001 + '@oxlint-tsgolint/win32-x64': 7.0.2001 + + oxlint@1.81.0(oxlint-tsgolint@7.0.2001): + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.81.0 + '@oxlint/binding-android-arm64': 1.81.0 + '@oxlint/binding-darwin-arm64': 1.81.0 + '@oxlint/binding-darwin-x64': 1.81.0 + '@oxlint/binding-freebsd-x64': 1.81.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.81.0 + '@oxlint/binding-linux-arm-musleabihf': 1.81.0 + '@oxlint/binding-linux-arm64-gnu': 1.81.0 + '@oxlint/binding-linux-arm64-musl': 1.81.0 + '@oxlint/binding-linux-ppc64-gnu': 1.81.0 + '@oxlint/binding-linux-riscv64-gnu': 1.81.0 + '@oxlint/binding-linux-riscv64-musl': 1.81.0 + '@oxlint/binding-linux-s390x-gnu': 1.81.0 + '@oxlint/binding-linux-x64-gnu': 1.81.0 + '@oxlint/binding-linux-x64-musl': 1.81.0 + '@oxlint/binding-openharmony-arm64': 1.81.0 + '@oxlint/binding-win32-arm64-msvc': 1.81.0 + '@oxlint/binding-win32-ia32-msvc': 1.81.0 + '@oxlint/binding-win32-x64-msvc': 1.81.0 + oxlint-tsgolint: 7.0.2001 + p-limit@2.3.0: dependencies: p-try: 2.2.0 + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + p-try@2.2.0: {} pac-proxy-agent@7.2.0: @@ -2377,6 +3928,8 @@ snapshots: package-json-from-dist@1.0.1: {} + package-manager-detector@1.8.0: {} + parse-path@7.1.0: dependencies: protocols: 2.0.2 @@ -2413,6 +3966,8 @@ snapshots: picomatch@4.0.4: {} + picomatch@4.0.7: {} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -2429,6 +3984,8 @@ snapshots: exsolve: 1.0.8 pathe: 2.0.3 + prelude-ls@1.2.1: {} + protocols@2.0.2: {} proxy-agent@6.5.0: @@ -2448,6 +4005,10 @@ snapshots: punycode@2.3.1: {} + qified@0.10.1: + dependencies: + hookified: 2.2.0 + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -2511,6 +4072,8 @@ snapshots: - magicast - supports-color + resolve-pkg-maps@1.0.0: {} + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -2553,6 +4116,8 @@ snapshots: smart-buffer@4.2.0: {} + smol-toml@1.8.0: {} + socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 @@ -2607,6 +4172,8 @@ snapshots: strip-final-newline@3.0.0: {} + strip-json-comments@5.0.3: {} + tar-stream@3.1.8: dependencies: b4a: 1.8.0 @@ -2649,6 +4216,13 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + + tinypool@2.1.0: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -2657,8 +4231,16 @@ snapshots: dependencies: punycode: 2.3.1 + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + tslib@2.8.1: {} + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + type-detect@4.1.0: {} type-fest@2.19.0: {} @@ -2667,14 +4249,22 @@ snapshots: ufo@1.6.4: {} + unbash@4.0.11: {} + undici-types@6.21.0: {} undici@6.23.0: {} universal-user-agent@7.0.3: {} + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + url-join@5.0.0: {} + walk-up-path@4.0.0: {} + webidl-conversions@7.0.0: {} whatwg-url@14.2.0: @@ -2692,6 +4282,8 @@ snapshots: dependencies: execa: 8.0.1 + word-wrap@1.2.5: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -2713,6 +4305,10 @@ snapshots: buffer-crc32: 0.2.13 pend: 1.2.0 + yocto-queue@0.1.0: {} + yoctocolors-cjs@2.1.3: {} yoctocolors@2.1.2: {} + + zod@4.5.4: {} diff --git a/src/antelope.test.ts b/src/antelope.test.ts index cdb8592..16dd7fa 100644 --- a/src/antelope.test.ts +++ b/src/antelope.test.ts @@ -1,5 +1,5 @@ -import { defineConfig } from "@antelopejs/interface-core/config"; import { MongoMemoryServer } from "mongodb-memory-server-core"; +import { defineConfig } from "@antelopejs/interface-core/config"; let mongod: MongoMemoryServer; diff --git a/src/components.ts b/src/components.ts index d32d1b7..7bfdd2a 100644 --- a/src/components.ts +++ b/src/components.ts @@ -1,9 +1,11 @@ +import { assert } from "@antelopejs/interface-api-util"; +import type { DataModel } from "@antelopejs/interface-database-decorators/model"; +import type { Constructible } from "@antelopejs/interface-database-decorators/common"; +import { MakeParameterAndPropertyDecorator } from "@antelopejs/interface-core/decorators"; import { type RequestContext, SetParameterProvider, } from "@antelopejs/interface-api"; -import { assert } from "@antelopejs/interface-api-util"; -import { MakeParameterAndPropertyDecorator } from "@antelopejs/interface-core/decorators"; import { type Datum, Schema, @@ -12,8 +14,6 @@ import { type Table, type ValueProxy, } from "@antelopejs/interface-database"; -import type { Constructible } from "@antelopejs/interface-database-decorators/common"; -import type { DataModel } from "@antelopejs/interface-database-decorators/model"; import { fromDatabase, lock, @@ -21,12 +21,13 @@ import { unlock, unlockrequest, } from "@antelopejs/interface-database-decorators/modifiers/common"; -import { GetDataControllerMeta } from "."; -import type { - ComputedFieldData, - DataAPIMeta, - FilterValue, - ForeignJoinedRef, + +import { + type ComputedFieldData, + type DataAPIMeta, + type FilterValue, + type ForeignJoinedRef, + GetDataControllerMeta, } from "./metadata"; export namespace Parameters { diff --git a/src/index.ts b/src/index.ts index 2f2513a..6c5825a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,54 +1,44 @@ import assert_ from "node:assert"; -import { - Context, - type ControllerClass, - ControllerMeta, - RawBody, - RegisterRoute, - type RequestContext, - Route, -} from "@antelopejs/interface-api"; import { assert } from "@antelopejs/interface-api-util"; import { GetMetadata } from "@antelopejs/interface-core"; +import { getTablesForSchema } from "@antelopejs/interface-database-decorators/schema"; +import { triggerEvent } from "@antelopejs/interface-database-decorators/modifiers/common"; import { type Class, MakeClassDecorator, - type ParameterDecorator, } from "@antelopejs/interface-core/decorators"; import { DatumStaticMetadata, getMetadata, } from "@antelopejs/interface-database-decorators"; -import { triggerEvent } from "@antelopejs/interface-database-decorators/modifiers/common"; -import { getTablesForSchema } from "@antelopejs/interface-database-decorators/schema"; +import { + Context, + type ControllerClass, + ControllerMeta, + RawBody, + RegisterRoute, + type RequestContext, + Route, +} from "@antelopejs/interface-api"; + import { Parameters, Query, Validation } from "./components"; -import { DataAPIMeta } from "./metadata"; - -export type DataControllerCallback = { - args: (ParameterDecorator | ParameterDecorator[])[]; - method: string; - func: (ctx: any, opts: O, ...args: any[]) => any; -}; - -export type DataControllerCallbackWithOptions = { - endpoint?: string; - options?: Partial; - callback: DataControllerCallback; -}; - -export type ExtractCallback = T extends DataControllerCallbackWithOptions - ? T["callback"]["func"] - : T extends DataControllerCallback - ? T["func"] - : never; - -export type DataControllerDef = { - [name: string]: DataControllerCallback | DataControllerCallbackWithOptions; -}; - -export type ExtractDefCallbacks = { - [K in keyof T]: ExtractCallback; -}; +import { + DataAPIMeta, + type DataControllerCallback, + type DataControllerCallbackWithOptions, + type DataControllerDef, + type ExtractDefCallbacks, + GetDataControllerMeta, +} from "./metadata"; + +export { + type DataControllerCallback, + type DataControllerCallbackWithOptions, + type DataControllerDef, + type ExtractCallback, + type ExtractDefCallbacks, + GetDataControllerMeta, +} from "./metadata"; abstract class TableHolder { table!: InstanceType; @@ -132,14 +122,6 @@ export const RegisterDataController = MakeClassDecorator((target) => { } }); -export function GetDataControllerMeta(thisObj: any): DataAPIMeta { - return GetMetadata( - Object.getPrototypeOf(thisObj).constructor, - DataAPIMeta, - true, - ); -} - function displayOnlyComputedFields( meta: DataAPIMeta, params: Parameters.ListParameters, @@ -414,7 +396,7 @@ export namespace DefaultRoutes { } else { return { endpoint: endpoint ?? callback.endpoint, - options: { ...(callback.options ?? {}), ...(options ?? {}) }, + options: { ...callback.options, ...options }, callback: callback.callback, }; } diff --git a/src/metadata.ts b/src/metadata.ts index b94eef7..f30c57c 100644 --- a/src/metadata.ts +++ b/src/metadata.ts @@ -1,10 +1,6 @@ -import type { RequestContext } from "@antelopejs/interface-api"; import { GetMetadata } from "@antelopejs/interface-core"; -import { - type Class, - MakeMethodAndPropertyDecorator, - MakePropertyDecorator, -} from "@antelopejs/interface-core/decorators"; +import type { RequestContext } from "@antelopejs/interface-api"; +import type { ContainerModifier } from "@antelopejs/interface-database-decorators/modifiers/common"; import type { Query, SchemaInstance, @@ -17,8 +13,38 @@ import { getTablesForSchema, type Table, } from "@antelopejs/interface-database-decorators"; -import type { ContainerModifier } from "@antelopejs/interface-database-decorators/modifiers/common"; -import type { DataControllerCallbackWithOptions } from "."; +import { + type Class, + MakeMethodAndPropertyDecorator, + MakePropertyDecorator, + type ParameterDecorator, +} from "@antelopejs/interface-core/decorators"; + +export type DataControllerCallback = { + args: (ParameterDecorator | ParameterDecorator[])[]; + method: string; + func: (ctx: any, opts: O, ...args: any[]) => any; +}; + +export type DataControllerCallbackWithOptions = { + endpoint?: string; + options?: Partial; + callback: DataControllerCallback; +}; + +export type ExtractCallback = T extends DataControllerCallbackWithOptions + ? T["callback"]["func"] + : T extends DataControllerCallback + ? T["func"] + : never; + +export type DataControllerDef = { + [name: string]: DataControllerCallback | DataControllerCallbackWithOptions; +}; + +export type ExtractDefCallbacks = { + [K in keyof T]: ExtractCallback; +}; /** * Field access mode enum. @@ -997,3 +1023,11 @@ export const ModifierKey = MakePropertyDecorator( ); }, ); + +export function GetDataControllerMeta(thisObj: any): DataAPIMeta { + return GetMetadata( + Object.getPrototypeOf(thisObj).constructor, + DataAPIMeta, + true, + ); +} diff --git a/src/tests/components/access_control.test.ts b/src/tests/components/access_control.test.ts index 57d00cb..6281a1d 100644 --- a/src/tests/components/access_control.test.ts +++ b/src/tests/components/access_control.test.ts @@ -1,16 +1,17 @@ import path from "node:path"; +import { expect } from "chai"; import { Controller } from "@antelopejs/interface-api"; -import { - DataController, - DefaultRoutes, - RegisterDataController, -} from "@antelopejs/interface-data-api"; +import type { SchemaInstance } from "@antelopejs/interface-database"; import { Access, AccessMode, ModelReference, } from "@antelopejs/interface-data-api/metadata"; -import type { SchemaInstance } from "@antelopejs/interface-database"; +import { + DataController, + DefaultRoutes, + RegisterDataController, +} from "@antelopejs/interface-data-api"; import { BasicDataModel, Field, @@ -20,7 +21,7 @@ import { RegisterTable, Table, } from "@antelopejs/interface-database-decorators"; -import { expect } from "chai"; + import { editRequest, getFunctionName, diff --git a/src/tests/components/computed.test.ts b/src/tests/components/computed.test.ts index 0a54f85..94e7429 100644 --- a/src/tests/components/computed.test.ts +++ b/src/tests/components/computed.test.ts @@ -1,6 +1,8 @@ import path from "node:path"; +import { expect } from "chai"; import { Controller } from "@antelopejs/interface-api"; import { GetMetadata } from "@antelopejs/interface-core"; +import { Schema, type ValueProxy } from "@antelopejs/interface-database"; import { DataController, DefaultRoutes, @@ -16,7 +18,6 @@ import { ModelReference, Sortable, } from "@antelopejs/interface-data-api/metadata"; -import { Schema, type ValueProxy } from "@antelopejs/interface-database"; import { BasicDataModel, Field, @@ -27,7 +28,7 @@ import { Relation, Table, } from "@antelopejs/interface-database-decorators"; -import { expect } from "chai"; + import { editRequest, getFunctionName, diff --git a/src/tests/components/deferred_joined.test.ts b/src/tests/components/deferred_joined.test.ts index e13e702..5b18cdc 100644 --- a/src/tests/components/deferred_joined.test.ts +++ b/src/tests/components/deferred_joined.test.ts @@ -1,13 +1,27 @@ import path from "node:path"; -import type { RequestContext } from "@antelopejs/interface-api"; +import { expect } from "chai"; import { Controller } from "@antelopejs/interface-api"; +import type { RequestContext } from "@antelopejs/interface-api"; +import { Query } from "@antelopejs/interface-data-api/components"; +import { + Schema, + type Stream, + type ValueProxy, +} from "@antelopejs/interface-database"; import { DataController, DefaultRoutes, GetDataControllerMeta, RegisterDataController, } from "@antelopejs/interface-data-api"; -import { Query } from "@antelopejs/interface-data-api/components"; +import { + BasicDataModel, + Field, + Model, + RegisterSchema, + RegisterTable, + Table, +} from "@antelopejs/interface-database-decorators"; import { Access, AccessMode, @@ -17,20 +31,7 @@ import { ModelReference, Sortable, } from "@antelopejs/interface-data-api/metadata"; -import { - Schema, - type Stream, - type ValueProxy, -} from "@antelopejs/interface-database"; -import { - BasicDataModel, - Field, - Model, - RegisterSchema, - RegisterTable, - Table, -} from "@antelopejs/interface-database-decorators"; -import { expect } from "chai"; + import { getSchemaInstance } from "../utils"; const currentTestName = path diff --git a/src/tests/components/foreign_joined.test.ts b/src/tests/components/foreign_joined.test.ts index 3c0f9ea..4383b35 100644 --- a/src/tests/components/foreign_joined.test.ts +++ b/src/tests/components/foreign_joined.test.ts @@ -1,5 +1,7 @@ import path from "node:path"; +import { expect } from "chai"; import { Controller } from "@antelopejs/interface-api"; +import { Schema } from "@antelopejs/interface-database"; import { GetMetadata } from "@antelopejs/interface-core"; import { DataController, @@ -15,7 +17,6 @@ import { Listable, ModelReference, } from "@antelopejs/interface-data-api/metadata"; -import { Schema } from "@antelopejs/interface-database"; import { BasicDataModel, Field, @@ -25,7 +26,7 @@ import { Relation, Table, } from "@antelopejs/interface-database-decorators"; -import { expect } from "chai"; + import { getFunctionName, getRequest, diff --git a/src/tests/components/joined.test.ts b/src/tests/components/joined.test.ts index 9235212..e0fe599 100644 --- a/src/tests/components/joined.test.ts +++ b/src/tests/components/joined.test.ts @@ -1,10 +1,21 @@ import path from "node:path"; +import { expect } from "chai"; import { Controller } from "@antelopejs/interface-api"; +import { Schema, type ValueProxy } from "@antelopejs/interface-database"; import { DataController, DefaultRoutes, RegisterDataController, } from "@antelopejs/interface-data-api"; +import { + BasicDataModel, + Field, + Model, + RegisterSchema, + RegisterTable, + Relation, + Table, +} from "@antelopejs/interface-database-decorators"; import { Access, AccessMode, @@ -15,17 +26,7 @@ import { ModelReference, Sortable, } from "@antelopejs/interface-data-api/metadata"; -import { Schema, type ValueProxy } from "@antelopejs/interface-database"; -import { - BasicDataModel, - Field, - Model, - RegisterSchema, - RegisterTable, - Relation, - Table, -} from "@antelopejs/interface-database-decorators"; -import { expect } from "chai"; + import { editRequest, getFunctionName, diff --git a/src/tests/components/listable.test.ts b/src/tests/components/listable.test.ts index 2150889..b82c561 100644 --- a/src/tests/components/listable.test.ts +++ b/src/tests/components/listable.test.ts @@ -1,5 +1,7 @@ import path from "node:path"; +import { expect } from "chai"; import { Controller } from "@antelopejs/interface-api"; +import { Schema } from "@antelopejs/interface-database"; import { DataController, DefaultRoutes, @@ -12,7 +14,6 @@ import { ModelReference, Sortable, } from "@antelopejs/interface-data-api/metadata"; -import { Schema } from "@antelopejs/interface-database"; import { BasicDataModel, Field, @@ -22,7 +23,7 @@ import { RegisterTable, Table, } from "@antelopejs/interface-database-decorators"; -import { expect } from "chai"; + import { getFunctionName, getSchemaInstance, diff --git a/src/tests/components/mandatory.test.ts b/src/tests/components/mandatory.test.ts index fc91cf3..0623579 100644 --- a/src/tests/components/mandatory.test.ts +++ b/src/tests/components/mandatory.test.ts @@ -1,5 +1,7 @@ import path from "node:path"; +import { expect } from "chai"; import { Controller } from "@antelopejs/interface-api"; +import { Schema } from "@antelopejs/interface-database"; import { DataController, DefaultRoutes, @@ -11,7 +13,6 @@ import { Mandatory, ModelReference, } from "@antelopejs/interface-data-api/metadata"; -import { Schema } from "@antelopejs/interface-database"; import { BasicDataModel, Field, @@ -21,7 +22,7 @@ import { RegisterTable, Table, } from "@antelopejs/interface-database-decorators"; -import { expect } from "chai"; + import { editRequest, getFunctionName, diff --git a/src/tests/components/modifier_key.test.ts b/src/tests/components/modifier_key.test.ts index 1d202fd..cc5f10a 100644 --- a/src/tests/components/modifier_key.test.ts +++ b/src/tests/components/modifier_key.test.ts @@ -1,4 +1,6 @@ import path from "node:path"; +import { expect } from "chai"; +import { Schema } from "@antelopejs/interface-database"; import { Controller, Parameter } from "@antelopejs/interface-api"; import { DataController, @@ -13,7 +15,6 @@ import { ModelReference, ModifierKey, } from "@antelopejs/interface-data-api/metadata"; -import { Schema } from "@antelopejs/interface-database"; import { BasicDataModel, Field, @@ -25,7 +26,7 @@ import { Relation, Table, } from "@antelopejs/interface-database-decorators"; -import { expect } from "chai"; + import { getFunctionName, getRequest, diff --git a/src/tests/components/per_action_access.test.ts b/src/tests/components/per_action_access.test.ts index fa29fec..7aa4c33 100644 --- a/src/tests/components/per_action_access.test.ts +++ b/src/tests/components/per_action_access.test.ts @@ -1,4 +1,5 @@ import path from "node:path"; +import { expect } from "chai"; import { Controller } from "@antelopejs/interface-api"; import { DataController, @@ -20,7 +21,7 @@ import { RegisterTable, Table, } from "@antelopejs/interface-database-decorators"; -import { expect } from "chai"; + import { editRequest, getFunctionName, diff --git a/src/tests/components/validator.test.ts b/src/tests/components/validator.test.ts index 2807647..b8ae22a 100644 --- a/src/tests/components/validator.test.ts +++ b/src/tests/components/validator.test.ts @@ -1,4 +1,5 @@ import path from "node:path"; +import { expect } from "chai"; import { Controller } from "@antelopejs/interface-api"; import { DataController, @@ -20,7 +21,7 @@ import { RegisterTable, Table, } from "@antelopejs/interface-database-decorators"; -import { expect } from "chai"; + import { editRequest, getSchemaInstance, diff --git a/src/tests/index/routes.test.ts b/src/tests/index/routes.test.ts index 4201f67..a406ef2 100644 --- a/src/tests/index/routes.test.ts +++ b/src/tests/index/routes.test.ts @@ -1,5 +1,7 @@ import path from "node:path"; +import { expect } from "chai"; import { Controller } from "@antelopejs/interface-api"; +import { Schema } from "@antelopejs/interface-database"; import { DataController, DefaultRoutes, @@ -11,7 +13,6 @@ import { Listable, ModelReference, } from "@antelopejs/interface-data-api/metadata"; -import { Schema } from "@antelopejs/interface-database"; import { BasicDataModel, Field, @@ -21,7 +22,7 @@ import { RegisterTable, Table, } from "@antelopejs/interface-database-decorators"; -import { expect } from "chai"; + import { deleteRequest, editRequest, diff --git a/src/tests/integration.test.ts b/src/tests/integration.test.ts index 79d9b78..ba69676 100644 --- a/src/tests/integration.test.ts +++ b/src/tests/integration.test.ts @@ -1,4 +1,5 @@ import path from "node:path"; +import { expect } from "chai"; import { Controller } from "@antelopejs/interface-api"; import { DataController, @@ -24,7 +25,7 @@ import { Relation, Table, } from "@antelopejs/interface-database-decorators"; -import { expect } from "chai"; + import { editRequest, getRequest, diff --git a/src/tests/utils.ts b/src/tests/utils.ts index b5e22bf..f18c22e 100644 --- a/src/tests/utils.ts +++ b/src/tests/utils.ts @@ -1,5 +1,6 @@ -import { Schema } from "@antelopejs/interface-database"; import { expect } from "chai"; +import { Schema } from "@antelopejs/interface-database"; + import { URL_BASE } from "./constants"; export function getFunctionName(): string { diff --git a/tsconfig.json b/tsconfig.json index edead90..0ecf41f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,6 @@ "target": "esnext", "module": "commonjs", "lib": ["ES2022"], - "moduleResolution": "node", "types": ["node", "mocha"], "esModuleInterop": true, "strict": true, @@ -13,10 +12,9 @@ "sourceMap": true, "outDir": "dist", "rootDir": "src", - "baseUrl": ".", "paths": { - "@antelopejs/interface-data-api": ["src/index.ts"], - "@antelopejs/interface-data-api/*": ["src/*"] + "@antelopejs/interface-data-api": ["./src/index.ts"], + "@antelopejs/interface-data-api/*": ["./src/*"] } }, "include": ["src"] From 6455daa739abafa590b36ffceb05a60f6131b956 Mon Sep 17 00:00:00 2001 From: Thomasims Date: Mon, 7 Sep 2026 12:29:32 +0200 Subject: [PATCH 2/4] style: format with oxfmt --- .github/workflows/stale.yml | 8 +-- AGENTS.md | 18 ++--- CHANGELOG.md | 3 - docs/1.introduction.md | 14 ++-- docs/10.joined.md | 26 ++++---- docs/11.computed.md | 26 +++----- docs/2.data-controllers.md | 8 +-- docs/3.routes.md | 96 +++++++++++++-------------- docs/4.access-rights.md | 10 +-- docs/6.listable.md | 14 ++-- docs/7.foreign-keys.md | 14 ++-- docs/8.filters.md | 32 ++++----- docs/9.modifiers.md | 4 +- package.json | 40 +++++------ skills/data-api-interface/SKILL.md | 58 ++++++++++++++-- src/tests/components/computed.test.ts | 5 +- 16 files changed, 206 insertions(+), 170 deletions(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 3f89355..1baddef 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -1,8 +1,8 @@ -name: 'Close stale issues' +name: "Close stale issues" on: schedule: - - cron: '30 * * * *' + - cron: "30 * * * *" workflow_dispatch: permissions: @@ -17,8 +17,8 @@ jobs: - uses: actions/stale@v9 with: exempt-issue-labels: pending - stale-issue-message: 'This issue is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 30 days.' - close-issue-message: 'This issue was closed because it has been stalled for 30 days with no activity.' + stale-issue-message: "This issue is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 30 days." + close-issue-message: "This issue was closed because it has been stalled for 30 days with no activity." days-before-stale: 60 days-before-close: 30 operations-per-run: 200 diff --git a/AGENTS.md b/AGENTS.md index 7d6ce44..7806cce 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,7 +8,7 @@ | --------------------- | --------------------------------------------------------------------------------------- | | English only | All code must be in English: variable names, function names, comments | | PNPM only | Always use pnpm, never npm or yarn | -| NO COMMENTS | Code must be self-documenting through clear naming. TSDoc is allowed for public APIs | +| NO COMMENTS | Code must be self-documenting through clear naming. TSDoc is allowed for public APIs | | NO switch/case | Use objects, maps, or arrays instead | | NO inline types | Define proper interfaces/types, never use anonymous types like `{a: string, b: number}` | | Functions ≤ 40 lines | Split into subfunctions if longer | @@ -35,23 +35,23 @@ Never use `switch/case` or `if param === 'XXX'` chains. Instead: // BAD function getStatus(code: string) { switch (code) { - case 'A': - return 'Active'; - case 'I': - return 'Inactive'; + case "A": + return "Active"; + case "I": + return "Inactive"; default: - return 'Unknown'; + return "Unknown"; } } // GOOD const STATUS_MAP: Record = { - A: 'Active', - I: 'Inactive', + A: "Active", + I: "Inactive", }; function getStatus(code: string) { - return STATUS_MAP[code] ?? 'Unknown'; + return STATUS_MAP[code] ?? "Unknown"; } ``` diff --git a/CHANGELOG.md b/CHANGELOG.md index 82e7773..30e18d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,5 @@ # Changelog - ## v0.1.8 [compare changes](https://github.com/AntelopeJS/interface-data-api/compare/v0.1.7...v0.1.8) @@ -175,7 +174,6 @@ ## v0.0.2 - ### 🚀 Enhancements - Add data API interface implementation ([f203c57](https://github.com/AntelopeJS/interface-data-api/commit/f203c57)) @@ -201,4 +199,3 @@ - Antony Rizzitelli - Glastis ([@Glastis](http://github.com/Glastis)) - diff --git a/docs/1.introduction.md b/docs/1.introduction.md index 4505cd1..f5768c2 100644 --- a/docs/1.introduction.md +++ b/docs/1.introduction.md @@ -106,13 +106,13 @@ class UserAPI extends DataController( This generates the following REST endpoints: -| Method | Endpoint | Description | -| ------ | -------- | ----------- | -| GET | `/users/get?id=` | Retrieve a single user | -| GET | `/users/list?limit=10` | List users with pagination | -| POST | `/users/new` | Create a new user | -| PUT | `/users/edit?id=` | Update an existing user | -| DELETE | `/users/delete?id=` | Delete a user | +| Method | Endpoint | Description | +| ------ | ----------------------- | -------------------------- | +| GET | `/users/get?id=` | Retrieve a single user | +| GET | `/users/list?limit=10` | List users with pagination | +| POST | `/users/new` | Create a new user | +| PUT | `/users/edit?id=` | Update an existing user | +| DELETE | `/users/delete?id=` | Delete a user | ## Documentation Sections diff --git a/docs/10.joined.md b/docs/10.joined.md index c41df45..baf5013 100644 --- a/docs/10.joined.md +++ b/docs/10.joined.md @@ -91,13 +91,13 @@ A GET request to `/orders/get?id=order-123` returns the joined value at the top @Joined({ table, localKey, remoteField, remoteIndex?, schema? }) ``` -| Option | Type | Required | Default | Description | -| ------ | ---- | -------- | ------- | ----------- | -| `table` | `Class` or `string` | Yes | - | The remote table class or registered table name string | -| `localKey` | `string` | Yes | - | The field on the local row holding the value matched against the remote table | -| `remoteField` | `string` | Yes | - | The remote field whose value is flattened onto the row | -| `remoteIndex` | `string` | No | `"_id"` | The index on the remote table to match `localKey` against | -| `schema` | `string` | No | Controller schema | Name of the schema the remote table is registered in, when it differs from the controller's schema | +| Option | Type | Required | Default | Description | +| ------------- | -------------------------- | -------- | ----------------- | -------------------------------------------------------------------------------------------------- | +| `table` | `Class
` or `string` | Yes | - | The remote table class or registered table name string | +| `localKey` | `string` | Yes | - | The field on the local row holding the value matched against the remote table | +| `remoteField` | `string` | Yes | - | The remote field whose value is flattened onto the row | +| `remoteIndex` | `string` | No | `"_id"` | The index on the remote table to match `localKey` against | +| `schema` | `string` | No | Controller schema | Name of the schema the remote table is registered in, when it differs from the controller's schema | ## Sorting and Filtering @@ -145,12 +145,12 @@ When a table class is passed, its schema is inferred from its `@RegisterTable` m ## Joined vs. Foreign -| Aspect | `@Joined` | `@Foreign` | -| ------ | --------- | ---------- | -| Result shape | A single scalar value flattened onto the row | The full referenced record (or plucked subset) nested under the field | -| Access | Read-only (enforced) | Configurable via `@Access` | -| Sort / filter | Native (join applied before sort/filter) | Not natively sortable/filterable on remote fields | -| Multiple references | One remote field per decorator | Single or array (`multi`) references | +| Aspect | `@Joined` | `@Foreign` | +| ------------------- | -------------------------------------------- | --------------------------------------------------------------------- | +| Result shape | A single scalar value flattened onto the row | The full referenced record (or plucked subset) nested under the field | +| Access | Read-only (enforced) | Configurable via `@Access` | +| Sort / filter | Native (join applied before sort/filter) | Not natively sortable/filterable on remote fields | +| Multiple references | One remote field per decorator | Single or array (`multi`) references | ## Next Steps diff --git a/docs/11.computed.md b/docs/11.computed.md index 9ff7242..e3f732b 100644 --- a/docs/11.computed.md +++ b/docs/11.computed.md @@ -54,11 +54,7 @@ class GroupAPI extends DataController( // Aggregate: number of devices referencing this group, computed in DB @Listable() @Computed( - (row, db) => - db - .table("devices") - .getAll(row.key("_id"), "group_id") - .count(), + (row, db) => db.table("devices").getAll(row.key("_id"), "group_id").count(), { default: 0 }, ) @Sortable() @@ -88,10 +84,10 @@ A GET request to `/groups/get?id=group-123` returns the computed values at the t @Computed(expr, options?) ``` -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `expr` | `(row, db) => expression` | Yes | Expression receiving the row proxy and the schema instance; returns a `ValueProxy` expression or a subquery (`Datum`) | -| `options.default` | `unknown` | No | Fallback merged over the computed value when the expression yields `null` | +| Parameter | Type | Required | Description | +| ----------------- | ------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------- | +| `expr` | `(row, db) => expression` | Yes | Expression receiving the row proxy and the schema instance; returns a `ValueProxy` expression or a subquery (`Datum`) | +| `options.default` | `unknown` | No | Fallback merged over the computed value when the expression yields `null` | ### The `default` option @@ -134,12 +130,12 @@ declare devices_count: number; ## Computed vs. Joined -| Aspect | `@Computed` | `@Joined` | -| ------ | ----------- | --------- | -| Source | Arbitrary expression: row-local computation or per-row subquery | One scalar field from another table matched by a foreign key | -| Typical use | Aggregates (`count`, `sum`), derived values | Flattening a referenced record's field | -| Access | Read-only (enforced) | Read-only (enforced) | -| Sort / filter | Native, lazily injected only where needed | Native, always applied before sort/filter | +| Aspect | `@Computed` | `@Joined` | +| ------------- | --------------------------------------------------------------- | ------------------------------------------------------------ | +| Source | Arbitrary expression: row-local computation or per-row subquery | One scalar field from another table matched by a foreign key | +| Typical use | Aggregates (`count`, `sum`), derived values | Flattening a referenced record's field | +| Access | Read-only (enforced) | Read-only (enforced) | +| Sort / filter | Native, lazily injected only where needed | Native, always applied before sort/filter | `@Joined` remains the simpler choice for the 1:1 flattening case; `@Computed` generalizes the same merge mechanism to arbitrary expressions. diff --git a/docs/2.data-controllers.md b/docs/2.data-controllers.md index fd54e72..8d9c27c 100644 --- a/docs/2.data-controllers.md +++ b/docs/2.data-controllers.md @@ -81,11 +81,11 @@ DataController( ) ``` -| Parameter | Description | -| --------- | ----------- | +| Parameter | Description | +| ------------ | --------------------------------------------------------------------------------------------------------------------------------- | | `tableClass` | The database table class decorated with `@RegisterTable`. The controller validates that this table exists in the database schema. | -| `routes` | An object mapping endpoint names to route callbacks. Use `DefaultRoutes.All` for standard CRUD or pass a custom subset. | -| `base` | The controller base, typically created with `Controller("/path")`, which sets the URL prefix for all endpoints. | +| `routes` | An object mapping endpoint names to route callbacks. Use `DefaultRoutes.All` for standard CRUD or pass a custom subset. | +| `base` | The controller base, typically created with `Controller("/path")`, which sets the URL prefix for all endpoints. | ## Required Components diff --git a/docs/3.routes.md b/docs/3.routes.md index 0bc6816..ee5fdbf 100644 --- a/docs/3.routes.md +++ b/docs/3.routes.md @@ -12,13 +12,13 @@ The `DefaultRoutes` namespace provides five built-in routes covering standard CR import { DefaultRoutes } from "@antelopejs/interface-data-api"; ``` -| Route | Object | HTTP Method | Endpoint Pattern | -| ----- | ------ | ----------- | ---------------- | -| Get | `DefaultRoutes.Get` | GET | `/resource/get?id=` | -| List | `DefaultRoutes.List` | GET | `/resource/list` | -| New | `DefaultRoutes.New` | POST | `/resource/new` | -| Edit | `DefaultRoutes.Edit` | PUT | `/resource/edit?id=` | -| Delete | `DefaultRoutes.Delete` | DELETE | `/resource/delete?id=` | +| Route | Object | HTTP Method | Endpoint Pattern | +| ------ | ---------------------- | ----------- | -------------------------- | +| Get | `DefaultRoutes.Get` | GET | `/resource/get?id=` | +| List | `DefaultRoutes.List` | GET | `/resource/list` | +| New | `DefaultRoutes.New` | POST | `/resource/new` | +| Edit | `DefaultRoutes.Edit` | PUT | `/resource/edit?id=` | +| Delete | `DefaultRoutes.Delete` | DELETE | `/resource/delete?id=` | Use `DefaultRoutes.All` to include all five routes at once. @@ -62,9 +62,9 @@ Retrieves a single record by its identifier. **Query Parameters:** -| Parameter | Required | Description | -| --------- | -------- | ----------- | -| `id` | Yes | Record identifier | +| Parameter | Required | Description | +| --------- | -------- | ----------------- | +| `id` | Yes | Record identifier | **Example:** @@ -90,12 +90,12 @@ Retrieves multiple records with pagination, sorting, and filtering support. **Query Parameters:** -| Parameter | Required | Default | Description | -| --------- | -------- | ------- | ----------- | -| `limit` | No | `10` | Maximum number of records to return | -| `offset` | No | `0` | Number of records to skip | -| `sortKey` | No | - | Field to sort by (must be marked `@Sortable`) | -| `sortDirection` | No | `asc` | Sort direction: `asc` or `desc` | +| Parameter | Required | Default | Description | +| --------------- | -------- | ------- | --------------------------------------------- | +| `limit` | No | `10` | Maximum number of records to return | +| `offset` | No | `0` | Number of records to skip | +| `sortKey` | No | - | Field to sort by (must be marked `@Sortable`) | +| `sortDirection` | No | `asc` | Sort direction: `asc` or `desc` | **Example:** @@ -154,9 +154,9 @@ Updates an existing record by its identifier. **Query Parameters:** -| Parameter | Required | Description | -| --------- | -------- | ----------- | -| `id` | Yes | Record identifier | +| Parameter | Required | Description | +| --------- | -------- | ----------------- | +| `id` | Yes | Record identifier | **Body:** JSON object with fields to update. @@ -188,9 +188,9 @@ Deletes one or more records by their identifiers. **Query Parameters:** -| Parameter | Required | Description | -| --------- | -------- | ----------- | -| `id` | Yes | Record identifier(s). Pass multiple `id` parameters to delete several records at once. | +| Parameter | Required | Description | +| --------- | -------- | -------------------------------------------------------------------------------------- | +| `id` | Yes | Record identifier(s). Pass multiple `id` parameters to delete several records at once. | **Example:** @@ -212,11 +212,11 @@ The `DefaultRoutes.WithOptions` function customizes route behavior by overriding DefaultRoutes.WithOptions(callback, options?, endpoint?) ``` -| Parameter | Description | -| --------- | ----------- | -| `callback` | The route callback to customize (e.g., `DefaultRoutes.Edit`). | -| `options` | An object with option overrides. These values take precedence over query parameters. | -| `endpoint` | An optional custom endpoint path. Defaults to the route key name. | +| Parameter | Description | +| ---------- | ------------------------------------------------------------------------------------ | +| `callback` | The route callback to customize (e.g., `DefaultRoutes.Edit`). | +| `options` | An object with option overrides. These values take precedence over query parameters. | +| `endpoint` | An optional custom endpoint path. Defaults to the route key name. | ### Example @@ -239,32 +239,32 @@ class UserAPI extends DataController(User, routes, Controller("/users")) { **Get:** -| Option | Type | Description | -| ------ | ---- | ----------- | -| `index` | `string` | Use a secondary index instead of the primary key | -| `noForeign` | `string` | Skip foreign key resolution | +| Option | Type | Description | +| ----------- | -------- | ------------------------------------------------ | +| `index` | `string` | Use a secondary index instead of the primary key | +| `noForeign` | `string` | Skip foreign key resolution | **List:** -| Option | Type | Description | -| ------ | ---- | ----------- | -| `maxPage` | `number` | Maximum allowed value for `limit` (caps the page size) | -| `noForeign` | `boolean` | Skip foreign key resolution | -| `noPluck` | `boolean` | Return all database fields instead of plucked fields | -| `pluckMode` | `string` | Select a named pluck mode (see `@Listable`) | +| Option | Type | Description | +| ----------- | --------- | ------------------------------------------------------ | +| `maxPage` | `number` | Maximum allowed value for `limit` (caps the page size) | +| `noForeign` | `boolean` | Skip foreign key resolution | +| `noPluck` | `boolean` | Return all database fields instead of plucked fields | +| `pluckMode` | `string` | Select a named pluck mode (see `@Listable`) | **New:** -| Option | Type | Description | -| ------ | ---- | ----------- | +| Option | Type | Description | +| ------------- | -------- | ------------------------------- | | `noMandatory` | `string` | Skip mandatory field validation | **Edit:** -| Option | Type | Description | -| ------ | ---- | ----------- | -| `index` | `string` | Use a secondary index instead of the primary key | -| `noMandatory` | `string` | Skip mandatory field validation | +| Option | Type | Description | +| ------------- | -------- | ------------------------------------------------ | +| `index` | `string` | Use a secondary index instead of the primary key | +| `noMandatory` | `string` | Skip mandatory field validation | ## Custom Routes @@ -307,11 +307,11 @@ The `args` array contains parameter decorators that extract values from the requ Default routes return standard HTTP error responses: -| Status | Condition | -| ------ | --------- | -| `400 Bad Request` | Validation fails, missing required fields, or invalid parameters | -| `404 Not Found` | Record does not exist | -| `500 Internal Server Error` | Database operation fails | +| Status | Condition | +| --------------------------- | ---------------------------------------------------------------- | +| `400 Bad Request` | Validation fails, missing required fields, or invalid parameters | +| `404 Not Found` | Record does not exist | +| `500 Internal Server Error` | Database operation fails | Error messages are returned as plain text in the response body. diff --git a/docs/4.access-rights.md b/docs/4.access-rights.md index 3a9e079..f28d30f 100644 --- a/docs/4.access-rights.md +++ b/docs/4.access-rights.md @@ -12,11 +12,11 @@ The `AccessMode` enum defines three permission levels: import { Access, AccessMode } from "@antelopejs/interface-data-api/metadata"; ``` -| Mode | Value | Description | -| ---- | ----- | ----------- | -| `AccessMode.ReadOnly` | `1` | Field appears in GET and LIST responses but is ignored in POST and PUT bodies | -| `AccessMode.WriteOnly` | `2` | Field is accepted in POST and PUT bodies but never appears in responses | -| `AccessMode.ReadWrite` | `3` | Field is both readable and writable | +| Mode | Value | Description | +| ---------------------- | ----- | ----------------------------------------------------------------------------- | +| `AccessMode.ReadOnly` | `1` | Field appears in GET and LIST responses but is ignored in POST and PUT bodies | +| `AccessMode.WriteOnly` | `2` | Field is accepted in POST and PUT bodies but never appears in responses | +| `AccessMode.ReadWrite` | `3` | Field is both readable and writable | ## Basic Usage diff --git a/docs/6.listable.md b/docs/6.listable.md index 53234ac..7cfcc07 100644 --- a/docs/6.listable.md +++ b/docs/6.listable.md @@ -140,10 +140,10 @@ List responses include pagination metadata. The response structure is: ### Query Parameters -| Parameter | Default | Description | -| --------- | ------- | ----------- | -| `limit` | `10` | Maximum number of records to return | -| `offset` | `0` | Number of records to skip | +| Parameter | Default | Description | +| --------- | ------- | ----------------------------------- | +| `limit` | `10` | Maximum number of records to return | +| `offset` | `0` | Number of records to skip | ### Example @@ -214,9 +214,9 @@ class UserAPI extends DataController( ### Sort Query Parameters -| Parameter | Description | -| --------- | ----------- | -| `sortKey` | The field name to sort by. Must be decorated with `@Sortable`. | +| Parameter | Description | +| --------------- | ------------------------------------------------------------------ | +| `sortKey` | The field name to sort by. Must be decorated with `@Sortable`. | | `sortDirection` | `"asc"` (ascending) or `"desc"` (descending). Defaults to `"asc"`. | ### The `noIndex` Option diff --git a/docs/7.foreign-keys.md b/docs/7.foreign-keys.md index 245b1ed..7325fb7 100644 --- a/docs/7.foreign-keys.md +++ b/docs/7.foreign-keys.md @@ -90,13 +90,13 @@ A GET request to `/orders/get?id=order-123` returns the full user object instead @Foreign(table, index?, multi?, pluck?, schema?) ``` -| Parameter | Type | Required | Default | Description | -| --------- | ---- | -------- | ------- | ----------- | -| `table` | `Class
` or `string` | Yes | - | The target table class or table name string | -| `index` | `string` | No | `"_id"` | The index on the target table to match against | -| `multi` | `boolean` | No | `false` | Set to `true` when the field holds an array of foreign keys | -| `pluck` | `string[]` | No | All fields | List of fields to include from the referenced record | -| `schema` | `string` | No | Controller schema | Name of the schema the target table is registered in, when it differs from the controller's schema | +| Parameter | Type | Required | Default | Description | +| --------- | -------------------------- | -------- | ----------------- | -------------------------------------------------------------------------------------------------- | +| `table` | `Class
` or `string` | Yes | - | The target table class or table name string | +| `index` | `string` | No | `"_id"` | The index on the target table to match against | +| `multi` | `boolean` | No | `false` | Set to `true` when the field holds an array of foreign keys | +| `pluck` | `string[]` | No | All fields | List of fields to include from the referenced record | +| `schema` | `string` | No | Controller schema | Name of the schema the target table is registered in, when it differs from the controller's schema | ## Table Reference Methods diff --git a/docs/8.filters.md b/docs/8.filters.md index 7069820..c94c9db 100644 --- a/docs/8.filters.md +++ b/docs/8.filters.md @@ -52,14 +52,14 @@ When no operator is specified, `eq` (equal) is used by default. ### Comparison Operators -| Operator | Description | -| -------- | ----------- | -| `eq` | Equal to (default) | -| `ne` | Not equal to | -| `gt` | Greater than | -| `ge` | Greater than or equal to | -| `lt` | Less than | -| `le` | Less than or equal to | +| Operator | Description | +| -------- | ------------------------ | +| `eq` | Equal to (default) | +| `ne` | Not equal to | +| `gt` | Greater than | +| `ge` | Greater than or equal to | +| `lt` | Less than | +| `le` | Less than or equal to | ### Examples @@ -98,14 +98,14 @@ type FilterFunction = ( ) => ValueProxyOrValue; ``` -| Parameter | Description | -| --------- | ----------- | -| `context` | The request context, extended with `this` referencing the controller instance | -| `proxy` | A `ValueProxy` representing the field value with modifier transformations applied (e.g., decrypted, localized) | -| `key` | The field name being filtered | -| `value` | The filter value from the query parameter | -| `mode` | The comparison operator from the query parameter | -| `row` | The full database row as a `ValueProxy` | +| Parameter | Description | +| --------- | -------------------------------------------------------------------------------------------------------------- | +| `context` | The request context, extended with `this` referencing the controller instance | +| `proxy` | A `ValueProxy` representing the field value with modifier transformations applied (e.g., decrypted, localized) | +| `key` | The field name being filtered | +| `value` | The filter value from the query parameter | +| `mode` | The comparison operator from the query parameter | +| `row` | The full database row as a `ValueProxy` | ### Example: Pattern Matching Filter diff --git a/docs/9.modifiers.md b/docs/9.modifiers.md index 06c69d5..ed1647a 100644 --- a/docs/9.modifiers.md +++ b/docs/9.modifiers.md @@ -20,8 +20,8 @@ import { ModifierKey } from "@antelopejs/interface-data-api/metadata"; @ModifierKey(modifierClass: typeof ContainerModifier) ``` -| Parameter | Description | -| --------- | ----------- | +| Parameter | Description | +| --------------- | ----------------------------------------------------------------------------- | | `modifierClass` | The modifier class that requires a runtime key (e.g., `LocalizationModifier`) | ### Example: Localized Content diff --git a/package.json b/package.json index 74facfa..2fcfb64 100644 --- a/package.json +++ b/package.json @@ -4,23 +4,32 @@ "description": "AntelopeJS interface for data API with CRUD controllers and route generation", "keywords": [ "antelopejs", - "interface", + "crud", "data-api", - "crud" + "interface" ], + "license": "Apache-2.0", "repository": { "type": "git", "url": "git+https://github.com/AntelopeJS/interface-data-api.git" }, - "license": "Apache-2.0", - "packageManager": "pnpm@10.6.5", - "main": "dist/index.js", - "types": "dist/index.d.ts", "files": [ "dist", "docs", "skills" ], + "main": "dist/index.js", + "types": "dist/index.d.ts", + "typesVersions": { + "*": { + "components": [ + "dist/components.d.ts" + ], + "metadata": [ + "dist/metadata.d.ts" + ] + } + }, "exports": { ".": { "types": "./dist/index.d.ts", @@ -32,6 +41,10 @@ }, "./package.json": "./package.json" }, + "publishConfig": { + "access": "public", + "provenance": true + }, "scripts": { "build": "rimraf dist && tsc", "format": "oxfmt .", @@ -73,20 +86,7 @@ "@antelopejs/interface-database": ">=0.1.2 <1.0.0", "@antelopejs/interface-database-decorators": ">=0.1.1 <1.0.0" }, - "publishConfig": { - "access": "public", - "provenance": true - }, - "typesVersions": { - "*": { - "components": [ - "dist/components.d.ts" - ], - "metadata": [ - "dist/metadata.d.ts" - ] - } - }, + "packageManager": "pnpm@10.6.5", "antelopeJs": { "standalone": true, "test": "src/antelope.test.ts", diff --git a/skills/data-api-interface/SKILL.md b/skills/data-api-interface/SKILL.md index 42ea05d..9888b1e 100644 --- a/skills/data-api-interface/SKILL.md +++ b/skills/data-api-interface/SKILL.md @@ -17,9 +17,32 @@ your module must also import those peer interfaces. ## Imports ```typescript -import { DataController, DefaultRoutes, RegisterDataController, GetDataControllerMeta } from "@antelopejs/interface-data-api"; -import { Access, AccessMode, Listable, Mandatory, Optional, Sortable, Filter, Foreign, Joined, Computed, Validator, ModelReference, ModifierKey } from "@antelopejs/interface-data-api/metadata"; -import { Parameters, Query, Validation } from "@antelopejs/interface-data-api/components"; +import { + DataController, + DefaultRoutes, + RegisterDataController, + GetDataControllerMeta, +} from "@antelopejs/interface-data-api"; +import { + Access, + AccessMode, + Listable, + Mandatory, + Optional, + Sortable, + Filter, + Foreign, + Joined, + Computed, + Validator, + ModelReference, + ModifierKey, +} from "@antelopejs/interface-data-api/metadata"; +import { + Parameters, + Query, + Validation, +} from "@antelopejs/interface-data-api/components"; ``` `/components` is only needed for custom route callbacks (query building, validation helpers). @@ -28,9 +51,26 @@ import { Parameters, Query, Validation } from "@antelopejs/interface-data-api/co ```typescript import { Controller } from "@antelopejs/interface-api"; -import { DataController, DefaultRoutes, RegisterDataController } from "@antelopejs/interface-data-api"; -import { Access, AccessMode, Listable, Mandatory, ModelReference, Sortable } from "@antelopejs/interface-data-api/metadata"; -import { BasicDataModel, Field, Model, RegisterTable, Table } from "@antelopejs/interface-database-decorators"; +import { + DataController, + DefaultRoutes, + RegisterDataController, +} from "@antelopejs/interface-data-api"; +import { + Access, + AccessMode, + Listable, + Mandatory, + ModelReference, + Sortable, +} from "@antelopejs/interface-data-api/metadata"; +import { + BasicDataModel, + Field, + Model, + RegisterTable, + Table, +} from "@antelopejs/interface-database-decorators"; @RegisterTable("tasks", "default") class Task extends Table { @@ -43,7 +83,11 @@ class Task extends Table { class TaskModel extends BasicDataModel(Task, "tasks") {} @RegisterDataController() -class TaskAPI extends DataController(Task, DefaultRoutes.All, Controller("/tasks")) { +class TaskAPI extends DataController( + Task, + DefaultRoutes.All, + Controller("/tasks"), +) { @ModelReference() @Model(TaskModel, "my-database") declare taskModel: TaskModel; diff --git a/src/tests/components/computed.test.ts b/src/tests/components/computed.test.ts index 94e7429..f02d0f4 100644 --- a/src/tests/components/computed.test.ts +++ b/src/tests/components/computed.test.ts @@ -297,9 +297,8 @@ async function filtersByComputedAggregate() { } async function ignoresComputedFieldsOnEdit() { - const { groupIds, groupModel } = await _createDataController( - getFunctionName(), - ); + const { groupIds, groupModel } = + await _createDataController(getFunctionName()); const editPayload = { name: "Alpha Prime", From f1e15fcf787449b36b49c268f97e8461648429b6 Mon Sep 17 00:00:00 2001 From: Thomasims Date: Mon, 7 Sep 2026 12:29:32 +0200 Subject: [PATCH 3/4] chore: ignore the oxfmt pass in blame --- .git-blame-ignore-revs | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .git-blame-ignore-revs diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 0000000..e386e1b --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,2 @@ +# Formatted with oxfmt when the repository moved off Biome. +6455daa739abafa590b36ffceb05a60f6131b956 From 24040de55e6502f6a4477a8043c1bac043f8153f Mon Sep 17 00:00:00 2001 From: Thomasims Date: Mon, 7 Sep 2026 13:35:07 +0200 Subject: [PATCH 4/4] ci: gate format:check and knip --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 16be1a1..700f7d9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,4 +28,6 @@ jobs: - run: pnpm add --global @antelopejs/core - run: pnpm prepack - run: pnpm lint + - run: pnpm format:check + - run: pnpm knip - run: pnpm test