diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 26d4459..ceaa9d9 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -22,11 +22,11 @@ jobs: - uses: actions/setup-node@v6 with: node-version: 24 - cache: "yarn" + cache: "pnpm" - - run: yarn install --immutable + - run: pnpm install --frozen-lockfile - - run: yarn build + - run: pnpm build - run: npm pack diff --git a/.gitignore b/.gitignore index 18eb6eb..31ef6e0 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ !.yarn/releases !.yarn/sdks +/test/generated/ /output /dist @@ -19,3 +20,9 @@ node_modules test/* !test/petstore.yaml !test/config.ts +!test/generated/ +!test/generated/.gitkeep +!test/generated/base/ +!test/generated/base/.gitkeep +!test/generated/next/ +!test/generated/next/.gitkeep diff --git a/.oxfmtrc.json b/.oxfmtrc.json index 647b4c8..c99d415 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -1,4 +1,4 @@ { "$schema": "./node_modules/oxfmt/configuration_schema.json", - "ignorePatterns": ["**/*.hbs", "node_modules", ".yarn"] + "ignorePatterns": ["**/*.hbs", "node_modules", ".yarn", "test/generated/**"] } diff --git a/.oxlintrc.json b/.oxlintrc.json index 49679d0..3ace296 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -1,5 +1,6 @@ { "$schema": "node_modules/oxlint/configuration_schema.json", + "ignorePatterns": ["test/generated/**"], "plugins": ["eslint", "typescript", "unicorn", "import", "oxc", "promise", "vitest"], "categories": { "correctness": "off", diff --git a/README.md b/README.md index 2c2cc05..d7e90cd 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ yarn openapi-codegen generate --config my-config.ts --config Path to TS config file (default: 'openapi-codegen.config.ts') --input Path/URL to OpenAPI JSON/YAML document --output Output directory path (default: 'output') + --incremental Skip generation when OpenAPI and config are unchanged (default: true) --format Format the generated code using Oxfmt (default: true) --verbose Display detailed log messages during execution (default: false) @@ -84,11 +85,16 @@ yarn openapi-codegen generate --config my-config.ts --tsPath (Requires `--importPath` to be 'ts') Typescript import path (default: '@/data') --removeOperationPrefixEndingWith Remove operation name prefixes that end with the specified string (default: 'Controller_') --extractEnums Extract enums into separate Zod schemas (default: true) + --modelsInCommon Keep all schema declarations in defaultTag models and emit per-module proxy exports (default: false) --replaceOptionalWithNullish Replace `.optional()` chains with `.nullish()` in generated Zod schemas (default: false) --axiosRequestConfig Include Axios request config parameters in query hooks (default: false) --infiniteQueries Generate infinite queries for paginated API endpoints (default: false) --mutationEffects Add mutation effects options to mutation hooks (default: true) + --workspaceContext Allow generated hooks to resolve path/ACL params from OpenApiWorkspaceContext (default: false) + --inlineEndpoints Inline endpoint implementations into generated query files (default: false) + --inlineEndpointsExcludeModules Comma-separated modules/tags to keep as separate API files while inlineEndpoints=true + --modelsOnly Generate only model files (default: false) --parseRequestParams Add Zod parsing to API endpoints (default: true) --acl Generate ACL related files (default: true) @@ -186,6 +192,63 @@ const config: OpenAPICodegenConfig = { export default config; ``` +### OpenApiWorkspaceContext (Path + ACL defaults) + +Enable `workspaceContext: true` in codegen config (or pass `--workspaceContext`) and wrap your app subtree with `OpenApiWorkspaceContext.Provider` if generated hooks frequently repeat workspace-scoped params (for example `officeId`). + +```tsx +import { OpenApiWorkspaceContext } from "@povio/openapi-codegen-cli"; +// openapi-codegen.config.ts -> { workspaceContext: true } + + + +; +``` + +Generated query/mutation hooks can then omit matching path/ACL params and resolve them from `OpenApiWorkspaceContext`. + +### Generation Modes + +You can control whether API endpoint files are emitted, inlined into query files, or skipped entirely. + +```ts +import type { OpenAPICodegenConfig } from "@povio/openapi-codegen-cli"; + +const config: OpenAPICodegenConfig = { + // 1) Default mode: separate *.api.ts files are generated + // 2) Inline mode: endpoint logic is generated inside *.queries.ts + // and can be used without separate api files: + // inlineEndpoints: true, + // inlineEndpointsExcludeModules: ["Users", "Billing"], + // 3) Models-only mode: generate only *.models.ts files + // modelsOnly: true, + // 4) Keep all model declarations in common.models and generate per-module model proxies + // modelsInCommon: true, +}; +``` + +### Vite Plugin + +You can run codegen directly from Vite config (without CLI config file): + +```ts +import { defineConfig } from "vite"; +import { openApiCodegen } from "@povio/openapi-codegen-cli/vite"; + +export default defineConfig({ + plugins: [ + openApiCodegen({ + input: "./openapi.yaml", + output: "./src/data", + inlineEndpoints: true, + incremental: true, + }), + ], +}); +``` + +The plugin runs on both `vite serve` and `vite build`, and watches local OpenAPI files in dev mode. + ### Enums If you're using Enums in your backend DTOs with `@Expose()` and `@IsEnum`, they may still not appear correctly in the OpenAPI schema unless you also provide both `enum` **and** `enumName` to `@ApiProperty`. diff --git a/esbuild.mjs b/esbuild.mjs deleted file mode 100644 index ac78c66..0000000 --- a/esbuild.mjs +++ /dev/null @@ -1,27 +0,0 @@ -import fs from "fs"; - -import { build } from "esbuild"; - -const packageJson = JSON.parse(fs.readFileSync("package.json", "utf-8")); - -const external = [...Object.keys(packageJson.dependencies || {}), ...Object.keys(packageJson.peerDependencies || {})]; - -// CLI and Node.js builds - run in Node.js -const nodeBuildOptions = { - bundle: true, - sourcemap: false, - platform: "node", - minify: true, - metafile: false, - keepNames: true, - external, - target: "node14", - logLevel: "info", - define: { - "process.env.OPENAPI_CODEGEN_VERSION": `"${packageJson.version}"`, - "process.env.NODE_ENV": `"production"`, - }, -}; - -await build({ ...nodeBuildOptions, entryPoints: ["./src/sh.ts"], outfile: "./dist/sh.js" }); -await build({ ...nodeBuildOptions, entryPoints: ["./src/generator.ts"], outfile: "./dist/generator.js" }); diff --git a/openapi-codegen.config.mjs b/openapi-codegen.config.mjs new file mode 100644 index 0000000..b108e6e --- /dev/null +++ b/openapi-codegen.config.mjs @@ -0,0 +1,11 @@ +/** @type {import('./src/generators/types/config').OpenAPICodegenConfig} */ +const config = { + input: "http://127.0.0.1:4000/docs-json", + output: "./test/generated/next", + excludeTags: ["auth"], + replaceOptionalWithNullish: true, + builderConfigs: true, + infiniteQueries: true, +}; + +export default config; diff --git a/package.json b/package.json index 1ee6441..1f3e90b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@povio/openapi-codegen-cli", - "version": "2.0.8-rc.5", + "version": "2.0.8-rc.8", "keywords": [ "codegen", "openapi", @@ -16,7 +16,7 @@ "url": "git+https://github.com/povio/openapi-codegen-cli.git" }, "bin": { - "openapi-codegen": "./dist/sh.js" + "openapi-codegen": "./dist/sh.mjs" }, "files": [ "README.md", @@ -24,50 +24,62 @@ "src/assets/**", "src/generators/templates/**" ], + "type": "module", "main": "./dist/index.mjs", - "types": "./dist/index.d.ts", + "types": "./dist/index.d.mts", "exports": { ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.mjs", - "require": "./dist/index.mjs" + "types": "./dist/index.d.mts", + "import": "./dist/index.mjs" + }, + "./vite": { + "types": "./dist/vite.d.mts", + "import": "./dist/vite.mjs" }, "./generator": { - "types": "./dist/generator.d.ts", - "import": "./dist/generator.js", - "require": "./dist/generator.js" + "types": "./dist/generator.d.mts", + "import": "./dist/generator.mjs" }, "./acl": { - "types": "./dist/acl.d.ts", - "import": "./dist/acl.mjs", - "require": "./dist/acl.mjs" + "types": "./dist/acl.d.mts", + "import": "./dist/acl.mjs" } }, "scripts": { "start": "node --import tsx ./src/sh.ts", "test": "vitest run", "test:watch": "vitest", - "build:clean": "rm -rf ./dist", - "build:client": "vite build", - "build:cli": "node ./esbuild.mjs && chmod +x ./dist/sh.js", - "build": "yarn build:clean && yarn build:cli && yarn build:client", - "start:dist": "node ./dist/sh.js", + "build": "tsdown", + "start:dist": "node ./dist/sh.mjs", + "gen:base": "rm -rf ./test/generated/base && mkdir -p ./test/generated/base && pnpm start generate --config ./test/config.mjs --output ./test/generated/base --no-prettier", + "gen:next": "rm -rf ./test/generated/next && mkdir -p ./test/generated/next && pnpm start generate --config ./test/config.mjs --output ./test/generated/next --no-prettier", + "test:generated-eq": "vitest run ./src/generators/generated-output-eq.test.ts", + "gen:verify": "pnpm gen:base && pnpm gen:next && pnpm test:generated-eq", "typecheck": "tsc --noEmit", "lint": "oxlint --type-aware --fix", "lint:check": "oxlint --type-aware", "format": "oxfmt", "format:check": "oxfmt --check", - "check": "yarn typecheck && yarn lint && yarn test", - "push": "yarn exec ./scripts/publish.sh", - "dev:generate": "rm -rf ./output && yarn start generate --config ./test/config.ts", - "dev:check": "yarn start check --config ./test/config.ts" + "check": "pnpm typecheck && pnpm lint && pnpm test", + "push": "node ./scripts/publish.mjs", + "dev:generate": "rm -rf ./output && pnpm start generate --config ./test/config.mjs", + "dev:check": "pnpm start check --config ./test/config.mjs", + "snapshot:openapi-localhost": "node ./scripts/snapshot-openapi-localhost.mjs", + "bench:vite-codegen": "node ./scripts/benchmark-vite-codegen.mjs" }, "dependencies": { - "i18next": "^25.8.11", - "import-fresh": "^3.3.1" + "@apidevtools/swagger-parser": "^10.1.0", + "handlebars": "^4.7.8", + "i18next": "^25.8.13", + "import-fresh": "^3.3.1", + "prompt-sync": "^4.2.0", + "reflect-metadata": "^0.2.2", + "ts-pattern": "^5.9.0", + "typescript": "^5.9.3", + "yargs": "^18.0.0", + "openapi-types": "^12.1.3" }, "devDependencies": { - "@apidevtools/swagger-parser": "^10.1.0", "@casl/ability": "^6.8.0", "@casl/react": "^5.0.1", "@tanstack/react-query": "~5.90.21", @@ -76,25 +88,16 @@ "@types/react": "^19.2.14", "@types/yargs": "^17.0.35", "@vitejs/plugin-react": "^5.1.4", - "axios": "^1.13.5", - "esbuild": "0.27.3", - "handlebars": "^4.7.8", - "openapi-types": "^12.1.3", "oxfmt": "^0.34.0", - "oxlint": "^1.49.0", - "oxlint-tsgolint": "^0.14.1", - "prompt-sync": "^4.2.0", + "oxlint": "^1.50.0", + "oxlint-tsgolint": "^0.15.0", "react": "^19.2.4", - "reflect-metadata": "^0.2.2", - "ts-pattern": "^5.9.0", + "tsdown": "^0.21.0-beta.1", "tsx": "^4.21.0", "type-fest": "^5.4.4", - "typescript": "^5.9.3", - "vite": "^7.3.1", + "vite": "npm:rolldown-vite@^7.3.1", "vite-plugin-dts": "^4.5.4", - "vitest": "4.0.18", - "yargs": "^18.0.0", - "zod": "^4.3.6" + "vitest": "4.0.18" }, "peerDependencies": { "@casl/ability": "^6.7.3", @@ -102,6 +105,7 @@ "@tanstack/react-query": "^5.90.21", "axios": "^1.13.1", "react": "^19.1.0", + "vite": "^6.0.0 || ^7.0.0", "zod": "^4.1.12" }, "peerDependenciesMeta": { @@ -110,12 +114,14 @@ }, "@casl/react": { "optional": true + }, + "vite": { + "optional": true } }, "engines": { "node": ">= 14", - "npm": ">= 8", - "yarn": ">= 3.2" + "pnpm": ">= 9" }, - "packageManager": "yarn@4.2.2" + "packageManager": "pnpm@10.4.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..3fa7cee --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3870 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@apidevtools/swagger-parser': + specifier: ^10.1.0 + version: 10.1.1(openapi-types@12.1.3) + axios: + specifier: ^1.13.1 + version: 1.13.5 + handlebars: + specifier: ^4.7.8 + version: 4.7.8 + i18next: + specifier: ^25.8.13 + version: 25.8.13(typescript@5.9.3) + import-fresh: + specifier: ^3.3.1 + version: 3.3.1 + openapi-types: + specifier: ^12.1.3 + version: 12.1.3 + prompt-sync: + specifier: ^4.2.0 + version: 4.2.0 + reflect-metadata: + specifier: ^0.2.2 + version: 0.2.2 + ts-pattern: + specifier: ^5.9.0 + version: 5.9.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + yargs: + specifier: ^18.0.0 + version: 18.0.0 + zod: + specifier: ^4.1.12 + version: 4.3.6 + devDependencies: + '@casl/ability': + specifier: ^6.8.0 + version: 6.8.0 + '@casl/react': + specifier: ^5.0.1 + version: 5.0.1(@casl/ability@6.8.0)(react@19.2.4) + '@tanstack/react-query': + specifier: ~5.90.21 + version: 5.90.21(react@19.2.4) + '@types/node': + specifier: ^25.3.0 + version: 25.3.1 + '@types/prompt-sync': + specifier: ^4.2.3 + version: 4.2.3 + '@types/react': + specifier: ^19.2.14 + version: 19.2.14 + '@types/yargs': + specifier: ^17.0.35 + version: 17.0.35 + '@vitejs/plugin-react': + specifier: ^5.1.4 + version: 5.1.4(rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0)) + oxfmt: + specifier: ^0.34.0 + version: 0.34.0 + oxlint: + specifier: ^1.50.0 + version: 1.50.0(oxlint-tsgolint@0.15.0) + oxlint-tsgolint: + specifier: ^0.15.0 + version: 0.15.0 + react: + specifier: ^19.2.4 + version: 19.2.4 + tsdown: + specifier: ^0.21.0-beta.1 + version: 0.21.0-beta.2(typescript@5.9.3) + tsx: + specifier: ^4.21.0 + version: 4.21.0 + type-fest: + specifier: ^5.4.4 + version: 5.4.4 + vite: + specifier: npm:rolldown-vite@^7.3.1 + version: rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0) + vite-plugin-dts: + specifier: ^4.5.4 + version: 4.5.4(@types/node@25.3.1)(rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0))(rollup@4.59.0)(typescript@5.9.3) + vitest: + specifier: 4.0.18 + version: 4.0.18(@types/node@25.3.1)(lightningcss@1.31.1)(tsx@4.21.0) + +packages: + + '@apidevtools/json-schema-ref-parser@11.7.2': + resolution: {integrity: sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==} + engines: {node: '>= 16'} + + '@apidevtools/openapi-schemas@2.1.0': + resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} + engines: {node: '>=10'} + + '@apidevtools/swagger-methods@3.0.2': + resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} + + '@apidevtools/swagger-parser@10.1.1': + resolution: {integrity: sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA==} + peerDependencies: + openapi-types: '>=7' + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@8.0.0-rc.1': + resolution: {integrity: sha512-3ypWOOiC4AYHKr8vYRVtWtWmyvcoItHtVqF8paFax+ydpmUdPsJpLBkBBs5ItmhdrwC3a0ZSqqFAdzls4ODP3w==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@8.0.0-rc.2': + resolution: {integrity: sha512-noLx87RwlBEMrTzncWd/FvTxoJ9+ycHNg0n8yyYydIoDsLZuxknKgWRJUqcrVkNrJ74uGyhWQzQaS3q8xfGAhQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@8.0.0-rc.1': + resolution: {integrity: sha512-I4YnARytXC2RzkLNVnf5qFNFMzp679qZpmtw/V3Jt2uGnWiIxyJtaukjG7R8pSx8nG2NamICpGfljQsogj+FbQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@8.0.0-rc.1': + resolution: {integrity: sha512-6HyyU5l1yK/7h9Ki52i5h6mDAx4qJdiLQO4FdCyJNoB/gy3T3GGJdhQzzbZgvgZCugYBvwtQiWRt94QKedHnkA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@babel/types@8.0.0-rc.1': + resolution: {integrity: sha512-ubmJ6TShyaD69VE9DQrlXcdkvJbmwWPB8qYj0H2kaJi29O7vJT9ajSdBd2W8CG34pwL9pYA74fi7RHC1qbLoVQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@casl/ability@6.8.0': + resolution: {integrity: sha512-Ipt4mzI4gSgnomFdaPjaLgY2MWuXqAEZLrU6qqWBB7khGiBBuuEp6ytYDnq09bRXqcjaeeHiaCvCGFbBA2SpvA==} + + '@casl/react@5.0.1': + resolution: {integrity: sha512-8E3GkvwlxEW+bkxWTdvjn6SALNJZa9khNk591xTpU27nPK/nzgfqsVfEvrFjYIQ2LODrxXsWLmw7iHPEI0/TaQ==} + peerDependencies: + '@casl/ability': ^4.0.0 || ^5.1.0 || ^6.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + + '@microsoft/api-extractor-model@7.33.4': + resolution: {integrity: sha512-u1LTaNTikZAQ9uK6KG1Ms7nvNedsnODnspq/gH2dcyETWvH4hVNGNDvRAEutH66kAmxA4/necElqGNs1FggC8w==} + + '@microsoft/api-extractor@7.57.6': + resolution: {integrity: sha512-0rFv/D8Grzw1Mjs2+8NGUR+o4h9LVm5zKRtMeWnpdB5IMJF4TeHCL1zR5LMCIudkOvyvjbhMG5Wjs0B5nqsrRQ==} + hasBin: true + + '@microsoft/tsdoc-config@0.18.1': + resolution: {integrity: sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==} + + '@microsoft/tsdoc@0.16.0': + resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} + + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + + '@oxc-project/runtime@0.101.0': + resolution: {integrity: sha512-t3qpfVZIqSiLQ5Kqt/MC4Ge/WCOGrrcagAdzTcDaggupjiGxUx4nJF2v6wUCXWSzWHn5Ns7XLv13fCJEwCOERQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@oxc-project/types@0.101.0': + resolution: {integrity: sha512-nuFhqlUzJX+gVIPPfuE6xurd4lST3mdcWOhyK/rZO0B9XWMKm79SuszIQEnSMmmDhq1DC8WWVYGVd+6F93o1gQ==} + + '@oxc-project/types@0.114.0': + resolution: {integrity: sha512-//nBfbzHQHvJs8oFIjv6coZ6uxQ4alLfiPe6D5vit6c4pmxATHHlVwgB1k+Hv4yoAMyncdxgRBF5K4BYWUCzvA==} + + '@oxfmt/binding-android-arm-eabi@0.34.0': + resolution: {integrity: sha512-sqkqjh/Z38l+duOb1HtVqJTAj1grt2ttkobCopC/72+a4Xxz4xUgZPFyQ4HxrYMvyqO/YA0tvM1QbfOu70Gk1Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.34.0': + resolution: {integrity: sha512-1KRCtasHcVcGOMwfOP9d5Bus2NFsN8yAYM5cBwi8LBg5UtXC3C49WHKrlEa8iF1BjOS6CR2qIqiFbGoA0DJQNQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.34.0': + resolution: {integrity: sha512-b+Rmw9Bva6e/7PBES2wLO8sEU7Mi0+/Kv+pXSe/Y8i4fWNftZZlGwp8P01eECaUqpXATfSgNxdEKy7+ssVNz7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.34.0': + resolution: {integrity: sha512-QGjpevWzf1T9COEokZEWt80kPOtthW1zhRbo7x4Qoz646eTTfi6XsHG2uHeDWJmTbgBoJZPMgj2TAEV/ppEZaA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.34.0': + resolution: {integrity: sha512-VMSaC02cG75qL59M9M/szEaqq/RsLfgpzQ4nqUu8BUnX1zkiZIW2gTpUv3ZJ6qpWnHxIlAXiRZjQwmcwpvtbcg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.34.0': + resolution: {integrity: sha512-Klm367PFJhH6vYK3vdIOxFepSJZHPaBfIuqwxdkOcfSQ4qqc/M8sgK0UTFnJWWTA/IkhMIh1kW6uEqiZ/xtQqg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.34.0': + resolution: {integrity: sha512-nqn0QueVXRfbN9m58/E9Zij0Ap8lzayx591eWBYn0sZrGzY1IRv9RYS7J/1YUXbb0Ugedo0a8qIWzUHU9bWQuA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.34.0': + resolution: {integrity: sha512-DDn+dcqW+sMTCEjvLoQvC/VWJjG7h8wcdN/J+g7ZTdf/3/Dx730pQElxPPGsCXPhprb11OsPyMp5FwXjMY3qvA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-arm64-musl@0.34.0': + resolution: {integrity: sha512-H+F8+71gHQoGTFPPJ6z4dD0Fzfzi0UP8Zx94h5kUmIFThLvMq5K1Y/bUUubiXwwHfwb5C3MPjUpYijiy0rj51Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-ppc64-gnu@0.34.0': + resolution: {integrity: sha512-dIGnzTNhCXqQD5pzBwduLg8pClm+t8R53qaE9i5h8iua1iaFAJyLffh4847CNZSlASb7gn1Ofuv7KoG/EpoGZg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-gnu@0.34.0': + resolution: {integrity: sha512-FGQ2GTTooilDte/ogwWwkHuuL3lGtcE3uKM2EcC7kOXNWdUfMY6Jx3JCodNVVbFoybv4A+HuCj8WJji2uu1Ceg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-musl@0.34.0': + resolution: {integrity: sha512-2dGbGneJ7ptOIVKMwEIHdCkdZEomh74X3ggo4hCzEXL/rl9HwfsZDR15MkqfQqAs6nVXMvtGIOMxjDYa5lwKaA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-s390x-gnu@0.34.0': + resolution: {integrity: sha512-cCtGgmrTrxq3OeSG0UAO+w6yLZTMeOF4XM9SAkNrRUxYhRQELSDQ/iNPCLyHhYNi38uHJQbS5RQweLUDpI4ajA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxfmt/binding-linux-x64-gnu@0.34.0': + resolution: {integrity: sha512-7AvMzmeX+k7GdgitXp99GQoIV/QZIpAS7rwxQvC/T541yWC45nwvk4mpnU8N+V6dE5SPEObnqfhCjO80s7qIsg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-linux-x64-musl@0.34.0': + resolution: {integrity: sha512-uNiglhcmivJo1oDMh3hoN/Z0WsbEXOpRXZdQ3W/IkOpyV8WF308jFjSC1ZxajdcNRXWej0zgge9QXba58Owt+g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-openharmony-arm64@0.34.0': + resolution: {integrity: sha512-5eFsTjCyji25j6zznzlMc+wQAZJoL9oWy576xhqd2efv+N4g1swIzuSDcb1dz4gpcVC6veWe9pAwD7HnrGjLwg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.34.0': + resolution: {integrity: sha512-6id8kK0t5hKfbV6LHDzRO21wRTA6ctTlKGTZIsG/mcoir0rssvaYsedUymF4HDj7tbCUlnxCX/qOajKlEuqbIw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.34.0': + resolution: {integrity: sha512-QHaz+w673mlYqn9v/+fuiKZpjkmagleXQ+NygShDv8tdHpRYX2oYhTJwwt9j1ZfVhRgza1EIUW3JmzCXmtPdhQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.34.0': + resolution: {integrity: sha512-CXKQM/VaF+yuvGru8ktleHLJoBdjBtTFmAsLGePiESiTN0NjCI/PiaiOCfHMJ1HdP1LykvARUwMvgaN3tDhcrg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint-tsgolint/darwin-arm64@0.15.0': + resolution: {integrity: sha512-d7Ch+A6hic+RYrm32+Gh1o4lOrQqnFsHi721ORdHUDBiQPea+dssKUEMwIbA6MKmCy6TVJ02sQyi24OEfCiGzw==} + cpu: [arm64] + os: [darwin] + + '@oxlint-tsgolint/darwin-x64@0.15.0': + resolution: {integrity: sha512-Aoai2wAkaUJqp/uEs1gml6TbaPW4YmyO5Ai/vOSkiizgHqVctjhjKqmRiWTX2xuPY94VkwOLqp+Qr3y/0qSpWQ==} + cpu: [x64] + os: [darwin] + + '@oxlint-tsgolint/linux-arm64@0.15.0': + resolution: {integrity: sha512-4og13a7ec4Vku5t2Y7s3zx6YJP6IKadb1uA9fOoRH6lm/wHWoCnxjcfJmKHXRZJII81WmbdJMSPxaBfwN/S68Q==} + cpu: [arm64] + os: [linux] + + '@oxlint-tsgolint/linux-x64@0.15.0': + resolution: {integrity: sha512-9b9xzh/1Harn3a+XiKTK/8LrWw3VcqLfYp/vhV5/zAVR2Mt0d63WSp4FL+wG7DKnI2T/CbMFUFHwc7kCQjDMzQ==} + cpu: [x64] + os: [linux] + + '@oxlint-tsgolint/win32-arm64@0.15.0': + resolution: {integrity: sha512-nNac5hewHdkk5mowOwTqB1ZD76zB/FsUiyUvdCyupq5cG54XyKqSLEp9QGbx7wFJkWCkeWmuwRed4sfpAlKaeA==} + cpu: [arm64] + os: [win32] + + '@oxlint-tsgolint/win32-x64@0.15.0': + resolution: {integrity: sha512-ioAY2XLpy83E2EqOLH9p1cEgj0G2qB1lmAn0a3yFV1jHQB29LIPIKGNsu/tYCClpwmHN79pT5KZAHZOgWxxqNg==} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.50.0': + resolution: {integrity: sha512-G7MRGk/6NCe+L8ntonRdZP7IkBfEpiZ/he3buLK6JkLgMHgJShXZ+BeOwADmspXez7U7F7L1Anf4xLSkLHiGTg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.50.0': + resolution: {integrity: sha512-GeSuMoJWCVpovJi/e3xDSNgjeR8WEZ6MCXL6EtPiCIM2NTzv7LbflARINTXTJy2oFBYyvdf/l2PwHzYo6EdXvg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.50.0': + resolution: {integrity: sha512-w3SY5YtxGnxCHPJ8Twl3KmS9oja1gERYk3AMoZ7Hv8P43ZtB6HVfs02TxvarxfL214Tm3uzvc2vn+DhtUNeKnw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.50.0': + resolution: {integrity: sha512-hNfogDqy7tvmllXKBSlHo6k5x7dhTUVOHbMSE15CCAcXzmqf5883aPvBYPOq9AE7DpDUQUZ1kVE22YbiGW+tuw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.50.0': + resolution: {integrity: sha512-ykZevOWEyu0nsxolA911ucxpEv0ahw8jfEeGWOwwb/VPoE4xoexuTOAiPNlWZNJqANlJl7yp8OyzCtXTUAxotw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.50.0': + resolution: {integrity: sha512-hif3iDk7vo5GGJ4OLCCZAf2vjnU9FztGw4L0MbQL0M2iY9LKFtDMMiQAHmkF0PQGQMVbTYtPdXCLKVgdkiqWXQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.50.0': + resolution: {integrity: sha512-dVp9iSssiGAnTNey2Ruf6xUaQhdnvcFOJyRWd/mu5o2jVbFK15E5fbWGeFRfmuobu5QXuROtFga44+7DOS3PLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.50.0': + resolution: {integrity: sha512-1cT7yz2HA910CKA9NkH1ZJo50vTtmND2fkoW1oyiSb0j6WvNtJ0Wx2zoySfXWc/c+7HFoqRK5AbEoL41LOn9oA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-arm64-musl@1.50.0': + resolution: {integrity: sha512-++B3k/HEPFVlj89cOz8kWfQccMZB/aWL9AhsW7jPIkG++63Mpwb2cE9XOEsd0PATbIan78k2Gky+09uWM1d/gQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-ppc64-gnu@1.50.0': + resolution: {integrity: sha512-Z9b/KpFMkx66w3gVBqjIC1AJBTZAGoI9+U+K5L4QM0CB/G0JSNC1es9b3Y0Vcrlvtdn8A+IQTkYjd/Q0uCSaZw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxlint/binding-linux-riscv64-gnu@1.50.0': + resolution: {integrity: sha512-jvmuIw8wRSohsQlFNIST5uUwkEtEJmOQYr33bf/K2FrFPXHhM4KqGekI3ShYJemFS/gARVacQFgBzzJKCAyJjg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-riscv64-musl@1.50.0': + resolution: {integrity: sha512-x+UrN47oYNh90nmAAyql8eQaaRpHbDPu5guasDg10+OpszUQ3/1+1J6zFMmV4xfIEgTcUXG/oI5fxJhF4eWCNA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-s390x-gnu@1.50.0': + resolution: {integrity: sha512-i/JLi2ljLUIVfekMj4ISmdt+Hn11wzYUdRRrkVUYsCWw7zAy5xV7X9iA+KMyM156LTFympa7s3oKBjuCLoTAUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxlint/binding-linux-x64-gnu@1.50.0': + resolution: {integrity: sha512-/C7brhn6c6UUPccgSPCcpLQXcp+xKIW/3sji/5VZ8/OItL3tQ2U7KalHz887UxxSQeEOmd1kY6lrpuwFnmNqOA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-linux-x64-musl@1.50.0': + resolution: {integrity: sha512-oDR1f+bGOYU8LfgtEW8XtotWGB63ghtcxk5Jm6IDTCk++rTA/IRMsjOid2iMd+1bW+nP9Mdsmcdc7VbPD3+iyQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-openharmony-arm64@1.50.0': + resolution: {integrity: sha512-4CmRGPp5UpvXyu4jjP9Tey/SrXDQLRvZXm4pb4vdZBxAzbFZkCyh0KyRy4txld/kZKTJlW4TO8N1JKrNEk+mWw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.50.0': + resolution: {integrity: sha512-Fq0M6vsGcFsSfeuWAACDhd5KJrO85ckbEfe1EGuBj+KPyJz7KeWte2fSFrFGmNKNXyhEMyx4tbgxiWRujBM2KQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.50.0': + resolution: {integrity: sha512-qTdWR9KwY/vxJGhHVIZG2eBOhidOQvOwzDxnX+jhW/zIVacal1nAhR8GLkiywW8BIFDkQKXo/zOfT+/DY+ns/w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.50.0': + resolution: {integrity: sha512-682t7npLC4G2Ca+iNlI9fhAKTcFPYYXJjwoa88H4q+u5HHHlsnL/gHULapX3iqp+A8FIJbgdylL5KMYo2LaluQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + + '@rolldown/binding-android-arm64@1.0.0-beta.53': + resolution: {integrity: sha512-Ok9V8o7o6YfSdTTYA/uHH30r3YtOxLD6G3wih/U9DO0ucBBFq8WPt/DslU53OgfteLRHITZny9N/qCUxMf9kjQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-android-arm64@1.0.0-rc.5': + resolution: {integrity: sha512-zCEmUrt1bggwgBgeKLxNj217J1OrChrp3jJt24VK9jAharSTeVaHODNL+LpcQVhRz+FktYWfT9cjo5oZ99ZLpg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.53': + resolution: {integrity: sha512-yIsKqMz0CtRnVa6x3Pa+mzTihr4Ty+Z6HfPbZ7RVbk1Uxnco4+CUn7Qbm/5SBol1JD/7nvY8rphAgyAi7Lj6Vg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.5': + resolution: {integrity: sha512-ZP9xb9lPAex36pvkNWCjSEJW/Gfdm9I3ssiqOFLmpZ/vosPXgpoGxCmh+dX1Qs+/bWQE6toNFXWWL8vYoKoK9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.53': + resolution: {integrity: sha512-GTXe+mxsCGUnJOFMhfGWmefP7Q9TpYUseHvhAhr21nCTgdS8jPsvirb0tJwM3lN0/u/cg7bpFNa16fQrjKrCjQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.5': + resolution: {integrity: sha512-7IdrPunf6dp9mywMgTOKMMGDnMHQ6+h5gRl6LW8rhD8WK2kXX0IwzcM5Zc0B5J7xQs8QWOlKjv8BJsU/1CD3pg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.53': + resolution: {integrity: sha512-9Tmp7bBvKqyDkMcL4e089pH3RsjD3SUungjmqWtyhNOxoQMh0fSmINTyYV8KXtE+JkxYMPWvnEt+/mfpVCkk8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.5': + resolution: {integrity: sha512-o/JCk+dL0IN68EBhZ4DqfsfvxPfMeoM6cJtxORC1YYoxGHZyth2Kb2maXDb4oddw2wu8iIbnYXYPEzBtAF5CAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.53': + resolution: {integrity: sha512-a1y5fiB0iovuzdbjUxa7+Zcvgv+mTmlGGC4XydVIsyl48eoxgaYkA3l9079hyTyhECsPq+mbr0gVQsFU11OJAQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.5': + resolution: {integrity: sha512-IIBwTtA6VwxQLcEgq2mfrUgam7VvPZjhd/jxmeS1npM+edWsrrpRLHUdze+sk4rhb8/xpP3flemgcZXXUW6ukw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.53': + resolution: {integrity: sha512-bpIGX+ov9PhJYV+wHNXl9rzq4F0QvILiURn0y0oepbQx+7stmQsKA0DhPGwmhfvF856wq+gbM8L92SAa/CBcLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.5': + resolution: {integrity: sha512-KSol1De1spMZL+Xg7K5IBWXIvRWv7+pveaxFWXpezezAG7CS6ojzRjtCGCiLxQricutTAi/LkNWKMsd2wNhMKQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.53': + resolution: {integrity: sha512-bGe5EBB8FVjHBR1mOLOPEFg1Lp3//7geqWkU5NIhxe+yH0W8FVrQ6WRYOap4SUTKdklD/dC4qPLREkMMQ855FA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.5': + resolution: {integrity: sha512-WFljyDkxtXRlWxMjxeegf7xMYXxUr8u7JdXlOEWKYgDqEgxUnSEsVDxBiNWQ1D5kQKwf8Wo4sVKEYPRhCdsjwA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.53': + resolution: {integrity: sha512-qL+63WKVQs1CMvFedlPt0U9PiEKJOAL/bsHMKUDS6Vp2Q+YAv/QLPu8rcvkfIMvQ0FPU2WL0aX4eWwF6e/GAnA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.5': + resolution: {integrity: sha512-CUlplTujmbDWp2gamvrqVKi2Or8lmngXT1WxsizJfts7JrvfGhZObciaY/+CbdbS9qNnskvwMZNEhTPrn7b+WA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.53': + resolution: {integrity: sha512-VGl9JIGjoJh3H8Mb+7xnVqODajBmrdOOb9lxWXdcmxyI+zjB2sux69br0hZJDTyLJfvBoYm439zPACYbCjGRmw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.5': + resolution: {integrity: sha512-wdf7g9NbVZCeAo2iGhsjJb7I8ZFfs6X8bumfrWg82VK+8P6AlLXwk48a1ASiJQDTS7Svq2xVzZg3sGO2aXpHRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.53': + resolution: {integrity: sha512-B4iIserJXuSnNzA5xBLFUIjTfhNy7d9sq4FUMQY3GhQWGVhS2RWWzzDnkSU6MUt7/aHUrep0CdQfXUJI9D3W7A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.5': + resolution: {integrity: sha512-0CWY7ubu12nhzz+tkpHjoG3IRSTlWYe0wrfJRf4qqjqQSGtAYgoL9kwzdvlhaFdZ5ffVeyYw9qLsChcjUMEloQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.53': + resolution: {integrity: sha512-BUjAEgpABEJXilGq/BPh7jeU3WAJ5o15c1ZEgHaDWSz3LB881LQZnbNJHmUiM4d1JQWMYYyR1Y490IBHi2FPJg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.5': + resolution: {integrity: sha512-LztXnGzv6t2u830mnZrFLRVqT/DPJ9DL4ZTz/y93rqUVkeHjMMYIYaFj+BUthiYxbVH9dH0SZYufETspKY/NhA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.53': + resolution: {integrity: sha512-s27uU7tpCWSjHBnxyVXHt3rMrQdJq5MHNv3BzsewCIroIw3DJFjMH1dzCPPMUFxnh1r52Nf9IJ/eWp6LDoyGcw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.5': + resolution: {integrity: sha512-jUct1XVeGtyjqJXEAfvdFa8xoigYZ2rge7nYEm70ppQxpfH9ze2fbIrpHmP2tNM2vL/F6Dd0CpXhpjPbC6bSxQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.53': + resolution: {integrity: sha512-cjWL/USPJ1g0en2htb4ssMjIycc36RvdQAx1WlXnS6DpULswiUTVXPDesTifSKYSyvx24E0YqQkEm0K/M2Z/AA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.5': + resolution: {integrity: sha512-VQ8F9ld5gw29epjnVGdrx8ugiLTe8BMqmhDYy7nGbdeDo4HAt4bgdZvLbViEhg7DZyHLpiEUlO5/jPSUrIuxRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.53': + resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} + + '@rolldown/pluginutils@1.0.0-rc.3': + resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} + + '@rolldown/pluginutils@1.0.0-rc.5': + resolution: {integrity: sha512-RxlLX/DPoarZ9PtxVrQgZhPoor987YtKQqCo5zkjX+0S0yLJ7Vv515Wk6+xtTL67VONKJKxETWZwuZjss2idYw==} + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.59.0': + resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.59.0': + resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.59.0': + resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.59.0': + resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.59.0': + resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.59.0': + resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.59.0': + resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.59.0': + resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.59.0': + resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.59.0': + resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.59.0': + resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.59.0': + resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.59.0': + resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.59.0': + resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.59.0': + resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.59.0': + resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.59.0': + resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.59.0': + resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.59.0': + resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.59.0': + resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.59.0': + resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.59.0': + resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.59.0': + resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.59.0': + resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} + cpu: [x64] + os: [win32] + + '@rushstack/node-core-library@5.20.3': + resolution: {integrity: sha512-95JgEPq2k7tHxhF9/OJnnyHDXfC9cLhhta0An/6MlkDsX2A6dTzDrTUG18vx4vjc280V0fi0xDH9iQczpSuWsw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/problem-matcher@0.2.1': + resolution: {integrity: sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.7.2': + resolution: {integrity: sha512-9XbFWuqMYcHUso4mnETfhGVUSaADBRj6HUAAEYk50nMPn8WRICmBuCphycQGNB3duIR6EEZX3Xj3SYc2XiP+9A==} + + '@rushstack/terminal@0.22.3': + resolution: {integrity: sha512-gHC9pIMrUPzAbBiI4VZMU7Q+rsCzb8hJl36lFIulIzoceKotyKL3Rd76AZ2CryCTKEg+0bnTj406HE5YY5OQvw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/ts-command-line@5.3.3': + resolution: {integrity: sha512-c+ltdcvC7ym+10lhwR/vWiOhsrm/bP3By2VsFcs5qTKv+6tTmxgbVrtJ5NdNjANiV5TcmOZgUN+5KYQ4llsvEw==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@tanstack/query-core@5.90.20': + resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} + + '@tanstack/react-query@5.90.21': + resolution: {integrity: sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==} + peerDependencies: + react: ^18 || ^19 + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@25.3.1': + resolution: {integrity: sha512-hj9YIJimBCipHVfHKRMnvmHg+wfhKc0o4mTtXh9pKBjC8TLJzz0nzGmLi5UJsYAUgSvXFHgb0V2oY10DUFtImw==} + + '@types/prompt-sync@4.2.3': + resolution: {integrity: sha512-Ox77gCSx0YyeakGt/qfOZUSFNSSi+sh3ABoGOiCwiO2KODx492BJnUm9oIXS+AHJtqp12iM4RduY6viTJ9bYwA==} + + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + + '@ucast/core@1.10.2': + resolution: {integrity: sha512-ons5CwXZ/51wrUPfoduC+cO7AS1/wRb0ybpQJ9RrssossDxVy4t49QxWoWgfBDvVKsz9VXzBk9z0wqTdZ+Cq8g==} + + '@ucast/js@3.1.0': + resolution: {integrity: sha512-eJ7yQeYtMK85UZjxoxBEbTWx6UMxEXKbjVyp+NlzrT5oMKV5Gpo/9bjTl3r7msaXTVC8iD9NJacqJ8yp7joX+Q==} + + '@ucast/mongo2js@1.4.1': + resolution: {integrity: sha512-9aeg5cmqwRQnKCXHN6I17wk83Rcm487bHelaG8T4vfpWneAI469wSI3Srnbu+PuZ5znWRbnwtVq9RgPL+bN6CA==} + + '@ucast/mongo@2.4.3': + resolution: {integrity: sha512-XcI8LclrHWP83H+7H2anGCEeDq0n+12FU2mXCTz6/Tva9/9ddK/iacvvhCyW6cijAAOILmt0tWplRyRhVyZLsA==} + + '@vitejs/plugin-react@5.1.4': + resolution: {integrity: sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + + '@vue/compiler-core@3.5.29': + resolution: {integrity: sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==} + + '@vue/compiler-dom@3.5.29': + resolution: {integrity: sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/language-core@2.2.0': + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/shared@3.5.29': + resolution: {integrity: sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==} + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + + alien-signals@0.4.14: + resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} + + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-kit@3.0.0-beta.1: + resolution: {integrity: sha512-trmleAnZ2PxN/loHWVhhx1qeOHSRXq4TDsBBxq3GqeJitfk3+jTQ+v/C1km/KYq9M7wKqCewMh+/NAvVH7m+bw==} + engines: {node: '>=20.19.0'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.13.5: + resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.10.0: + resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} + engines: {node: '>=6.0.0'} + hasBin: true + + birpc@4.0.0: + resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} + + brace-expansion@5.0.3: + resolution: {integrity: sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==} + engines: {node: 18 || 20 || >=22} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001774: + resolution: {integrity: sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==} + + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + engines: {node: '>=0.3.1'} + + dts-resolver@2.1.3: + resolution: {integrity: sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw==} + engines: {node: '>=20.19.0'} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.302: + resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fs-extra@11.3.3: + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.5.0: + resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.13.6: + resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hookable@6.0.1: + resolution: {integrity: sha512-uKGyY8BuzN/a5gvzvA+3FVWo0+wUjgtfSdnmjtrOVwQCZPHpHDH2WRO3VZSOeluYrHoDCiXFffZXs8Dj1ULWtw==} + + i18next@25.8.13: + resolution: {integrity: sha512-E0vzjBY1yM+nsFrtgkjLhST2NBkirkvOVoQa0MSldhsuZ3jUge7ZNpuwG0Cfc74zwo5ZwRzg3uOgT+McBn32iA==} + peerDependencies: + typescript: ^5 + peerDependenciesMeta: + typescript: + optional: true + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + import-without-cache@0.2.5: + resolution: {integrity: sha512-B6Lc2s6yApwnD2/pMzFh/d5AVjdsDXjgkeJ766FmFuJELIGHNycKRj+l3A39yZPM4CchqNCB4RITEAYB1KUM6A==} + engines: {node: '>=20.19.0'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + lightningcss-android-arm64@1.31.1: + resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.31.1: + resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.31.1: + resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.31.1: + resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.31.1: + resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.31.1: + resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.31.1: + resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.31.1: + resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.31.1: + resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.31.1: + resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.31.1: + resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.31.1: + resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} + engines: {node: '>= 12.0.0'} + + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@10.2.1: + resolution: {integrity: sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==} + engines: {node: 20 || >=22} + + minimatch@9.0.8: + resolution: {integrity: sha512-reYkDYtj/b19TeqbNZCV4q9t+Yxylf/rYBsLb42SXJatTv4/ylq5lEiAmhA/IToxO7NI2UzNMghHoHuaqDkAjw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + + oxfmt@0.34.0: + resolution: {integrity: sha512-t+zTE4XGpzPTK+Zk9gSwcJcFi4pqjl6PwO/ZxPBJiJQ2XCKMucwjPlHxvPHyVKJtkMSyrDGfQ7Ntg/hUr4OgHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + oxlint-tsgolint@0.15.0: + resolution: {integrity: sha512-iwvFmhKQVZzVTFygUVI4t2S/VKEm+Mqkw3jQRJwfDuTcUYI5LCIYzdO5Dbuv4mFOkXZCcXaRRh0m+uydB5xdqw==} + hasBin: true + + oxlint@1.50.0: + resolution: {integrity: sha512-iSJ4IZEICBma8cZX7kxIIz9PzsYLF2FaLAYN6RKu7VwRVKdu7RIgpP99bTZaGl//Yao7fsaGZLSEo5xBrI5ReQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.14.1' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prompt-sync@4.2.0: + resolution: {integrity: sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} + + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} + + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + rolldown-plugin-dts@0.22.2: + resolution: {integrity: sha512-Ge+XF962Kobjr0hRPx1neVnLU2jpKkD2zevZTfPKf/0el4eYo9SyGPm0stiHDG2JQuL0Q3HLD0Kn+ST8esvVdA==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@ts-macro/tsc': ^0.3.6 + '@typescript/native-preview': '>=7.0.0-dev.20250601.1' + rolldown: ^1.0.0-rc.3 + typescript: ^5.0.0 || ^6.0.0-beta + vue-tsc: ~3.2.0 + peerDependenciesMeta: + '@ts-macro/tsc': + optional: true + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown-vite@7.3.1: + resolution: {integrity: sha512-LYzdNAjRHhF2yA4JUQm/QyARyi216N2rpJ0lJZb8E9FU2y5v6Vk+xq/U4XBOxMefpWixT5H3TslmAHm1rqIq2w==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + esbuild: ^0.27.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + rolldown@1.0.0-beta.53: + resolution: {integrity: sha512-Qd9c2p0XKZdgT5AYd+KgAMggJ8ZmCs3JnS9PTMWkyUfteKlfmKtxJbWTHkVakxwXs1Ub7jrRYVeFeF7N0sQxyw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rolldown@1.0.0-rc.5: + resolution: {integrity: sha512-0AdalTs6hNTioaCYIkAa7+xsmHBfU5hCNclZnM/lp7lGGDuUOb6N4BVNtwiomybbencDjq/waKjTImqiGCs5sw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup@4.59.0: + resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-pattern@5.9.0: + resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} + + tsdown@0.21.0-beta.2: + resolution: {integrity: sha512-OKj8mKf0ws1ucxuEi3mO/OGyfRQxO9MY2D6SoIE/7RZcbojsZSBhJr4xC4MNivMqrQvi3Ke2e+aRZDemPBWPCw==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + '@vitejs/devtools': '*' + publint: ^0.3.0 + typescript: ^5.0.0 + unplugin-lightningcss: ^0.4.0 + unplugin-unused: ^0.5.0 + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + '@vitejs/devtools': + optional: true + publint: + optional: true + typescript: + optional: true + unplugin-lightningcss: + optional: true + unplugin-unused: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-fest@5.4.4: + resolution: {integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==} + engines: {node: '>=20'} + + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + unconfig-core@7.5.0: + resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} + + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unrun@0.2.28: + resolution: {integrity: sha512-LqMrI3ZEUMZ2476aCsbUTfy95CHByqez05nju4AQv4XFPkxh5yai7Di1/Qb0FoELHEEPDWhQi23EJeFyrBV0Og==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + synckit: ^0.11.11 + peerDependenciesMeta: + synckit: + optional: true + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + vite-plugin-dts@4.5.4: + resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.0.18: + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + +snapshots: + + '@apidevtools/json-schema-ref-parser@11.7.2': + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + js-yaml: 4.1.1 + + '@apidevtools/openapi-schemas@2.1.0': {} + + '@apidevtools/swagger-methods@3.0.2': {} + + '@apidevtools/swagger-parser@10.1.1(openapi-types@12.1.3)': + dependencies: + '@apidevtools/json-schema-ref-parser': 11.7.2 + '@apidevtools/openapi-schemas': 2.1.0 + '@apidevtools/swagger-methods': 3.0.2 + '@jsdevtools/ono': 7.1.3 + ajv: 8.18.0 + ajv-draft-04: 1.0.0(ajv@8.18.0) + call-me-maybe: 1.0.2 + openapi-types: 12.1.3 + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.0': {} + + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/generator@8.0.0-rc.1': + dependencies: + '@babel/parser': 8.0.0-rc.1 + '@babel/types': 8.0.0-rc.1 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-string-parser@8.0.0-rc.2': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-identifier@8.0.0-rc.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + + '@babel/parser@8.0.0-rc.1': + dependencies: + '@babel/types': 8.0.0-rc.1 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/runtime@7.28.6': {} + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@babel/types@8.0.0-rc.1': + dependencies: + '@babel/helper-string-parser': 8.0.0-rc.2 + '@babel/helper-validator-identifier': 8.0.0-rc.1 + + '@casl/ability@6.8.0': + dependencies: + '@ucast/mongo2js': 1.4.1 + + '@casl/react@5.0.1(@casl/ability@6.8.0)(react@19.2.4)': + dependencies: + '@casl/ability': 6.8.0 + react: 19.2.4 + + '@emnapi/core@1.8.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.27.3': + optional: true + + '@esbuild/android-arm64@0.27.3': + optional: true + + '@esbuild/android-arm@0.27.3': + optional: true + + '@esbuild/android-x64@0.27.3': + optional: true + + '@esbuild/darwin-arm64@0.27.3': + optional: true + + '@esbuild/darwin-x64@0.27.3': + optional: true + + '@esbuild/freebsd-arm64@0.27.3': + optional: true + + '@esbuild/freebsd-x64@0.27.3': + optional: true + + '@esbuild/linux-arm64@0.27.3': + optional: true + + '@esbuild/linux-arm@0.27.3': + optional: true + + '@esbuild/linux-ia32@0.27.3': + optional: true + + '@esbuild/linux-loong64@0.27.3': + optional: true + + '@esbuild/linux-mips64el@0.27.3': + optional: true + + '@esbuild/linux-ppc64@0.27.3': + optional: true + + '@esbuild/linux-riscv64@0.27.3': + optional: true + + '@esbuild/linux-s390x@0.27.3': + optional: true + + '@esbuild/linux-x64@0.27.3': + optional: true + + '@esbuild/netbsd-arm64@0.27.3': + optional: true + + '@esbuild/netbsd-x64@0.27.3': + optional: true + + '@esbuild/openbsd-arm64@0.27.3': + optional: true + + '@esbuild/openbsd-x64@0.27.3': + optional: true + + '@esbuild/openharmony-arm64@0.27.3': + optional: true + + '@esbuild/sunos-x64@0.27.3': + optional: true + + '@esbuild/win32-arm64@0.27.3': + optional: true + + '@esbuild/win32-ia32@0.27.3': + optional: true + + '@esbuild/win32-x64@0.27.3': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jsdevtools/ono@7.1.3': {} + + '@microsoft/api-extractor-model@7.33.4(@types/node@25.3.1)': + dependencies: + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.1 + '@rushstack/node-core-library': 5.20.3(@types/node@25.3.1) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.57.6(@types/node@25.3.1)': + dependencies: + '@microsoft/api-extractor-model': 7.33.4(@types/node@25.3.1) + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.1 + '@rushstack/node-core-library': 5.20.3(@types/node@25.3.1) + '@rushstack/rig-package': 0.7.2 + '@rushstack/terminal': 0.22.3(@types/node@25.3.1) + '@rushstack/ts-command-line': 5.3.3(@types/node@25.3.1) + diff: 8.0.3 + lodash: 4.17.23 + minimatch: 10.2.1 + resolve: 1.22.11 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.8.2 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.18.1': + dependencies: + '@microsoft/tsdoc': 0.16.0 + ajv: 8.18.0 + jju: 1.4.0 + resolve: 1.22.11 + + '@microsoft/tsdoc@0.16.0': {} + + '@napi-rs/wasm-runtime@1.1.1': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@oxc-project/runtime@0.101.0': {} + + '@oxc-project/types@0.101.0': {} + + '@oxc-project/types@0.114.0': {} + + '@oxfmt/binding-android-arm-eabi@0.34.0': + optional: true + + '@oxfmt/binding-android-arm64@0.34.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.34.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.34.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.34.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.34.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.34.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.34.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.34.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.34.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.34.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.34.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.34.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.34.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.34.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.34.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.34.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.34.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.34.0': + optional: true + + '@oxlint-tsgolint/darwin-arm64@0.15.0': + optional: true + + '@oxlint-tsgolint/darwin-x64@0.15.0': + optional: true + + '@oxlint-tsgolint/linux-arm64@0.15.0': + optional: true + + '@oxlint-tsgolint/linux-x64@0.15.0': + optional: true + + '@oxlint-tsgolint/win32-arm64@0.15.0': + optional: true + + '@oxlint-tsgolint/win32-x64@0.15.0': + optional: true + + '@oxlint/binding-android-arm-eabi@1.50.0': + optional: true + + '@oxlint/binding-android-arm64@1.50.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.50.0': + optional: true + + '@oxlint/binding-darwin-x64@1.50.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.50.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.50.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.50.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.50.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.50.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.50.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.50.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.50.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.50.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.50.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.50.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.50.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.50.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.50.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.50.0': + optional: true + + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + + '@rolldown/binding-android-arm64@1.0.0-beta.53': + optional: true + + '@rolldown/binding-android-arm64@1.0.0-rc.5': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.53': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.5': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.53': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.5': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.53': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.5': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.53': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.5': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.53': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.5': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.53': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.5': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.53': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.5': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.53': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.5': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.53': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.5': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.53': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.5': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.53': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.5': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.53': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.5': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.53': {} + + '@rolldown/pluginutils@1.0.0-rc.3': {} + + '@rolldown/pluginutils@1.0.0-rc.5': {} + + '@rollup/pluginutils@5.3.0(rollup@4.59.0)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.59.0 + + '@rollup/rollup-android-arm-eabi@4.59.0': + optional: true + + '@rollup/rollup-android-arm64@4.59.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.59.0': + optional: true + + '@rollup/rollup-darwin-x64@4.59.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.59.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.59.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.59.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.59.0': + optional: true + + '@rollup/rollup-openbsd-x64@4.59.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.59.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.59.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.59.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.59.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.59.0': + optional: true + + '@rushstack/node-core-library@5.20.3(@types/node@25.3.1)': + dependencies: + ajv: 8.18.0 + ajv-draft-04: 1.0.0(ajv@8.18.0) + ajv-formats: 3.0.1(ajv@8.18.0) + fs-extra: 11.3.3 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.11 + semver: 7.5.4 + optionalDependencies: + '@types/node': 25.3.1 + + '@rushstack/problem-matcher@0.2.1(@types/node@25.3.1)': + optionalDependencies: + '@types/node': 25.3.1 + + '@rushstack/rig-package@0.7.2': + dependencies: + resolve: 1.22.11 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.22.3(@types/node@25.3.1)': + dependencies: + '@rushstack/node-core-library': 5.20.3(@types/node@25.3.1) + '@rushstack/problem-matcher': 0.2.1(@types/node@25.3.1) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 25.3.1 + + '@rushstack/ts-command-line@5.3.3(@types/node@25.3.1)': + dependencies: + '@rushstack/terminal': 0.22.3(@types/node@25.3.1) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@standard-schema/spec@1.1.0': {} + + '@tanstack/query-core@5.90.20': {} + + '@tanstack/react-query@5.90.21(react@19.2.4)': + dependencies: + '@tanstack/query-core': 5.90.20 + react: 19.2.4 + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/argparse@1.0.38': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.0 + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} + + '@types/jsesc@2.5.1': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@25.3.1': + dependencies: + undici-types: 7.18.2 + + '@types/prompt-sync@4.2.3': {} + + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.35': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@ucast/core@1.10.2': {} + + '@ucast/js@3.1.0': + dependencies: + '@ucast/core': 1.10.2 + + '@ucast/mongo2js@1.4.1': + dependencies: + '@ucast/core': 1.10.2 + '@ucast/js': 3.1.0 + '@ucast/mongo': 2.4.3 + + '@ucast/mongo@2.4.3': + dependencies: + '@ucast/core': 1.10.2 + + '@vitejs/plugin-react@5.1.4(rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@rolldown/pluginutils': 1.0.0-rc.3 + '@types/babel__core': 7.20.5 + react-refresh: 0.18.0 + vite: rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@4.0.18': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + chai: 6.2.2 + tinyrainbow: 3.0.3 + + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.3.1)(lightningcss@1.31.1)(tsx@4.21.0))': + dependencies: + '@vitest/spy': 4.0.18 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.1(@types/node@25.3.1)(lightningcss@1.31.1)(tsx@4.21.0) + + '@vitest/pretty-format@4.0.18': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.18': + dependencies: + '@vitest/utils': 4.0.18 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.0.18': {} + + '@vitest/utils@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + tinyrainbow: 3.0.3 + + '@volar/language-core@2.4.28': + dependencies: + '@volar/source-map': 2.4.28 + + '@volar/source-map@2.4.28': {} + + '@volar/typescript@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.29': + dependencies: + '@babel/parser': 7.29.0 + '@vue/shared': 3.5.29 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.29': + dependencies: + '@vue/compiler-core': 3.5.29 + '@vue/shared': 3.5.29 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/language-core@2.2.0(typescript@5.9.3)': + dependencies: + '@volar/language-core': 2.4.28 + '@vue/compiler-dom': 3.5.29 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.29 + alien-signals: 0.4.14 + minimatch: 9.0.8 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.9.3 + + '@vue/shared@3.5.29': {} + + acorn@8.16.0: {} + + ajv-draft-04@1.0.0(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + + ajv-formats@3.0.1(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + + ajv@8.18.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + alien-signals@0.4.14: {} + + ansi-regex@4.1.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@6.2.3: {} + + ansis@4.2.0: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + assertion-error@2.0.1: {} + + ast-kit@3.0.0-beta.1: + dependencies: + '@babel/parser': 8.0.0-rc.1 + estree-walker: 3.0.3 + pathe: 2.0.3 + + asynckit@0.4.0: {} + + axios@1.13.5: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.0: {} + + birpc@4.0.0: {} + + brace-expansion@5.0.3: + dependencies: + balanced-match: 4.0.4 + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.10.0 + caniuse-lite: 1.0.30001774 + electron-to-chromium: 1.5.302 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-me-maybe@1.0.2: {} + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001774: {} + + chai@6.2.2: {} + + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + compare-versions@6.1.1: {} + + confbox@0.1.8: {} + + confbox@0.2.4: {} + + convert-source-map@2.0.0: {} + + csstype@3.2.3: {} + + de-indent@1.0.2: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + defu@6.1.4: {} + + delayed-stream@1.0.0: {} + + detect-libc@2.1.2: {} + + diff@8.0.3: {} + + dts-resolver@2.1.3: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.302: {} + + emoji-regex@10.6.0: {} + + empathic@2.0.0: {} + + entities@7.0.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.27.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 + + escalade@3.2.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + expect-type@1.3.0: {} + + exsolve@1.0.8: {} + + fast-deep-equal@3.1.3: {} + + fast-uri@3.1.0: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + follow-redirects@1.15.11: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fs-extra@11.3.3: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.5.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-tsconfig@4.13.6: + dependencies: + resolve-pkg-maps: 1.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hookable@6.0.1: {} + + i18next@25.8.13(typescript@5.9.3): + dependencies: + '@babel/runtime': 7.28.6 + optionalDependencies: + typescript: 5.9.3 + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@4.0.0: {} + + import-without-cache@0.2.5: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + jju@1.4.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + kolorist@1.8.0: {} + + lightningcss-android-arm64@1.31.1: + optional: true + + lightningcss-darwin-arm64@1.31.1: + optional: true + + lightningcss-darwin-x64@1.31.1: + optional: true + + lightningcss-freebsd-x64@1.31.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.31.1: + optional: true + + lightningcss-linux-arm64-gnu@1.31.1: + optional: true + + lightningcss-linux-arm64-musl@1.31.1: + optional: true + + lightningcss-linux-x64-gnu@1.31.1: + optional: true + + lightningcss-linux-x64-musl@1.31.1: + optional: true + + lightningcss-win32-arm64-msvc@1.31.1: + optional: true + + lightningcss-win32-x64-msvc@1.31.1: + optional: true + + lightningcss@1.31.1: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.31.1 + lightningcss-darwin-arm64: 1.31.1 + lightningcss-darwin-x64: 1.31.1 + lightningcss-freebsd-x64: 1.31.1 + lightningcss-linux-arm-gnueabihf: 1.31.1 + lightningcss-linux-arm64-gnu: 1.31.1 + lightningcss-linux-arm64-musl: 1.31.1 + lightningcss-linux-x64-gnu: 1.31.1 + lightningcss-linux-x64-musl: 1.31.1 + lightningcss-win32-arm64-msvc: 1.31.1 + lightningcss-win32-x64-msvc: 1.31.1 + + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + + lodash@4.17.23: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + math-intrinsics@1.1.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@10.2.1: + dependencies: + brace-expansion: 5.0.3 + + minimatch@9.0.8: + dependencies: + brace-expansion: 5.0.3 + + minimist@1.2.8: {} + + mlly@1.8.0: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.3 + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.11: {} + + neo-async@2.6.2: {} + + node-releases@2.0.27: {} + + obug@2.1.1: {} + + openapi-types@12.1.3: {} + + oxfmt@0.34.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.34.0 + '@oxfmt/binding-android-arm64': 0.34.0 + '@oxfmt/binding-darwin-arm64': 0.34.0 + '@oxfmt/binding-darwin-x64': 0.34.0 + '@oxfmt/binding-freebsd-x64': 0.34.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.34.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.34.0 + '@oxfmt/binding-linux-arm64-gnu': 0.34.0 + '@oxfmt/binding-linux-arm64-musl': 0.34.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.34.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.34.0 + '@oxfmt/binding-linux-riscv64-musl': 0.34.0 + '@oxfmt/binding-linux-s390x-gnu': 0.34.0 + '@oxfmt/binding-linux-x64-gnu': 0.34.0 + '@oxfmt/binding-linux-x64-musl': 0.34.0 + '@oxfmt/binding-openharmony-arm64': 0.34.0 + '@oxfmt/binding-win32-arm64-msvc': 0.34.0 + '@oxfmt/binding-win32-ia32-msvc': 0.34.0 + '@oxfmt/binding-win32-x64-msvc': 0.34.0 + + oxlint-tsgolint@0.15.0: + optionalDependencies: + '@oxlint-tsgolint/darwin-arm64': 0.15.0 + '@oxlint-tsgolint/darwin-x64': 0.15.0 + '@oxlint-tsgolint/linux-arm64': 0.15.0 + '@oxlint-tsgolint/linux-x64': 0.15.0 + '@oxlint-tsgolint/win32-arm64': 0.15.0 + '@oxlint-tsgolint/win32-x64': 0.15.0 + + oxlint@1.50.0(oxlint-tsgolint@0.15.0): + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.50.0 + '@oxlint/binding-android-arm64': 1.50.0 + '@oxlint/binding-darwin-arm64': 1.50.0 + '@oxlint/binding-darwin-x64': 1.50.0 + '@oxlint/binding-freebsd-x64': 1.50.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.50.0 + '@oxlint/binding-linux-arm-musleabihf': 1.50.0 + '@oxlint/binding-linux-arm64-gnu': 1.50.0 + '@oxlint/binding-linux-arm64-musl': 1.50.0 + '@oxlint/binding-linux-ppc64-gnu': 1.50.0 + '@oxlint/binding-linux-riscv64-gnu': 1.50.0 + '@oxlint/binding-linux-riscv64-musl': 1.50.0 + '@oxlint/binding-linux-s390x-gnu': 1.50.0 + '@oxlint/binding-linux-x64-gnu': 1.50.0 + '@oxlint/binding-linux-x64-musl': 1.50.0 + '@oxlint/binding-openharmony-arm64': 1.50.0 + '@oxlint/binding-win32-arm64-msvc': 1.50.0 + '@oxlint/binding-win32-ia32-msvc': 1.50.0 + '@oxlint/binding-win32-x64-msvc': 1.50.0 + oxlint-tsgolint: 0.15.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-browserify@1.0.1: {} + + path-parse@1.0.7: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.4 + exsolve: 1.0.8 + pathe: 2.0.3 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prompt-sync@4.2.0: + dependencies: + strip-ansi: 5.2.0 + + proxy-from-env@1.1.0: {} + + quansync@0.2.11: {} + + quansync@1.0.0: {} + + react-refresh@0.18.0: {} + + react@19.2.4: {} + + reflect-metadata@0.2.2: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rolldown-plugin-dts@0.22.2(rolldown@1.0.0-rc.5)(typescript@5.9.3): + dependencies: + '@babel/generator': 8.0.0-rc.1 + '@babel/helper-validator-identifier': 8.0.0-rc.1 + '@babel/parser': 8.0.0-rc.1 + '@babel/types': 8.0.0-rc.1 + ast-kit: 3.0.0-beta.1 + birpc: 4.0.0 + dts-resolver: 2.1.3 + get-tsconfig: 4.13.6 + obug: 2.1.1 + rolldown: 1.0.0-rc.5 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - oxc-resolver + + rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0): + dependencies: + '@oxc-project/runtime': 0.101.0 + fdir: 6.5.0(picomatch@4.0.3) + lightningcss: 1.31.1 + picomatch: 4.0.3 + postcss: 8.5.6 + rolldown: 1.0.0-beta.53 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.3.1 + esbuild: 0.27.3 + fsevents: 2.3.3 + tsx: 4.21.0 + + rolldown@1.0.0-beta.53: + dependencies: + '@oxc-project/types': 0.101.0 + '@rolldown/pluginutils': 1.0.0-beta.53 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.53 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.53 + '@rolldown/binding-darwin-x64': 1.0.0-beta.53 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.53 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.53 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.53 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.53 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.53 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.53 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.53 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.53 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.53 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.53 + + rolldown@1.0.0-rc.5: + dependencies: + '@oxc-project/types': 0.114.0 + '@rolldown/pluginutils': 1.0.0-rc.5 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.5 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.5 + '@rolldown/binding-darwin-x64': 1.0.0-rc.5 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.5 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.5 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.5 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.5 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.5 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.5 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.5 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.5 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.5 + + rollup@4.59.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.59.0 + '@rollup/rollup-android-arm64': 4.59.0 + '@rollup/rollup-darwin-arm64': 4.59.0 + '@rollup/rollup-darwin-x64': 4.59.0 + '@rollup/rollup-freebsd-arm64': 4.59.0 + '@rollup/rollup-freebsd-x64': 4.59.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 + '@rollup/rollup-linux-arm-musleabihf': 4.59.0 + '@rollup/rollup-linux-arm64-gnu': 4.59.0 + '@rollup/rollup-linux-arm64-musl': 4.59.0 + '@rollup/rollup-linux-loong64-gnu': 4.59.0 + '@rollup/rollup-linux-loong64-musl': 4.59.0 + '@rollup/rollup-linux-ppc64-gnu': 4.59.0 + '@rollup/rollup-linux-ppc64-musl': 4.59.0 + '@rollup/rollup-linux-riscv64-gnu': 4.59.0 + '@rollup/rollup-linux-riscv64-musl': 4.59.0 + '@rollup/rollup-linux-s390x-gnu': 4.59.0 + '@rollup/rollup-linux-x64-gnu': 4.59.0 + '@rollup/rollup-linux-x64-musl': 4.59.0 + '@rollup/rollup-openbsd-x64': 4.59.0 + '@rollup/rollup-openharmony-arm64': 4.59.0 + '@rollup/rollup-win32-arm64-msvc': 4.59.0 + '@rollup/rollup-win32-ia32-msvc': 4.59.0 + '@rollup/rollup-win32-x64-gnu': 4.59.0 + '@rollup/rollup-win32-x64-msvc': 4.59.0 + fsevents: 2.3.3 + + semver@6.3.1: {} + + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + + semver@7.7.4: {} + + siginfo@2.0.0: {} + + source-map-js@1.2.1: {} + + source-map@0.6.1: {} + + sprintf-js@1.0.3: {} + + stackback@0.0.2: {} + + std-env@3.10.0: {} + + string-argv@0.3.2: {} + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.5.0 + strip-ansi: 7.1.2 + + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-json-comments@3.1.1: {} + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tagged-tag@1.0.0: {} + + tinybench@2.9.0: {} + + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@2.1.0: {} + + tinyrainbow@3.0.3: {} + + tree-kill@1.2.2: {} + + ts-pattern@5.9.0: {} + + tsdown@0.21.0-beta.2(typescript@5.9.3): + dependencies: + ansis: 4.2.0 + cac: 6.7.14 + defu: 6.1.4 + empathic: 2.0.0 + hookable: 6.0.1 + import-without-cache: 0.2.5 + obug: 2.1.1 + picomatch: 4.0.3 + rolldown: 1.0.0-rc.5 + rolldown-plugin-dts: 0.22.2(rolldown@1.0.0-rc.5)(typescript@5.9.3) + semver: 7.7.4 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + unconfig-core: 7.5.0 + unrun: 0.2.28 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@ts-macro/tsc' + - '@typescript/native-preview' + - oxc-resolver + - synckit + - vue-tsc + + tslib@2.8.1: + optional: true + + tsx@4.21.0: + dependencies: + esbuild: 0.27.3 + get-tsconfig: 4.13.6 + optionalDependencies: + fsevents: 2.3.3 + + type-fest@5.4.4: + dependencies: + tagged-tag: 1.0.0 + + typescript@5.8.2: {} + + typescript@5.9.3: {} + + ufo@1.6.3: {} + + uglify-js@3.19.3: + optional: true + + unconfig-core@7.5.0: + dependencies: + '@quansync/fs': 1.0.0 + quansync: 1.0.0 + + undici-types@7.18.2: {} + + universalify@2.0.1: {} + + unrun@0.2.28: + dependencies: + rolldown: 1.0.0-rc.5 + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + vite-plugin-dts@4.5.4(@types/node@25.3.1)(rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0))(rollup@4.59.0)(typescript@5.9.3): + dependencies: + '@microsoft/api-extractor': 7.57.6(@types/node@25.3.1) + '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@volar/typescript': 2.4.28 + '@vue/language-core': 2.2.0(typescript@5.9.3) + compare-versions: 6.1.1 + debug: 4.4.3 + kolorist: 1.8.0 + local-pkg: 1.1.2 + magic-string: 0.30.21 + typescript: 5.9.3 + optionalDependencies: + vite: rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite@7.3.1(@types/node@25.3.1)(lightningcss@1.31.1)(tsx@4.21.0): + dependencies: + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.59.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.3.1 + fsevents: 2.3.3 + lightningcss: 1.31.1 + tsx: 4.21.0 + + vitest@4.0.18(@types/node@25.3.1)(lightningcss@1.31.1)(tsx@4.21.0): + dependencies: + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.3.1)(lightningcss@1.31.1)(tsx@4.21.0)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.3.1(@types/node@25.3.1)(lightningcss@1.31.1)(tsx@4.21.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 25.3.1 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + vscode-uri@3.1.0: {} + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wordwrap@1.0.0: {} + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yargs-parser@22.0.0: {} + + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + + zod@4.3.6: {} diff --git a/scripts/benchmark-vite-codegen.mjs b/scripts/benchmark-vite-codegen.mjs new file mode 100644 index 0000000..ec673af --- /dev/null +++ b/scripts/benchmark-vite-codegen.mjs @@ -0,0 +1,102 @@ +import fs from "fs"; +import { spawnSync } from "child_process"; +import path from "path"; + +const ROOT = process.cwd(); +const EXAMPLE_ROOT = path.join(ROOT, "test/vite-example"); +const DATA_DIR = path.join(EXAMPLE_ROOT, "src/data"); +const DIST_INDEX = path.join(ROOT, "dist/index.mjs"); +const DIST_VITE = path.join(ROOT, "dist/vite.mjs"); +const SNAPSHOT_OPENAPI = path.join(ROOT, "test/benchmarks/openapi.localhost4000.json"); + +function run(command, args, env = {}) { + const start = process.hrtime.bigint(); + const result = spawnSync(command, args, { + cwd: ROOT, + stdio: "pipe", + shell: process.platform === "win32", + env: { ...process.env, ...env }, + encoding: "utf-8", + }); + const elapsedMs = Number(process.hrtime.bigint() - start) / 1_000_000; + + if (result.status !== 0) { + const stdout = result.stdout?.toString() ?? ""; + const stderr = result.stderr?.toString() ?? ""; + throw new Error(`Command failed: ${command} ${args.join(" ")}\n${stdout}\n${stderr}`); + } + + return elapsedMs; +} + +function ensureBuiltPackage() { + if (!fs.existsSync(DIST_INDEX) || !fs.existsSync(DIST_VITE)) { + console.log("Building package (dist)..."); + run("yarn", ["build"]); + } +} + +function ensureBaselineGeneratedData() { + fs.rmSync(DATA_DIR, { recursive: true, force: true }); + run("yarn", [ + "start", + "generate", + "--input", + "./test/petstore.yaml", + "--output", + "./test/vite-example/src/data", + "--importPath", + "relative", + "--no-prettier", + ]); +} + +function buildBaseline() { + return run("yarn", ["vite", "build", "--config", "test/vite-example/vite.base.config.ts"]); +} + +function buildWithCodegen(incremental) { + if (!incremental) { + fs.rmSync(DATA_DIR, { recursive: true, force: true }); + } + const openApiInput = fs.existsSync(SNAPSHOT_OPENAPI) ? SNAPSHOT_OPENAPI : path.join(ROOT, "test/petstore.yaml"); + return run("yarn", ["vite", "build", "--config", "test/vite-example/vite.codegen.config.ts"], { + OPENAPI_CODEGEN_INCREMENTAL: incremental ? "true" : "false", + OPENAPI_CODEGEN_INPUT: openApiInput, + }); +} + +function pctDiff(value, baseline) { + return ((value - baseline) / baseline) * 100; +} + +function printMs(label, ms) { + console.log(`${label}: ${ms.toFixed(1)}ms`); +} + +function main() { + ensureBuiltPackage(); + ensureBaselineGeneratedData(); + + const baselineMs = buildBaseline(); + const codegenColdMs = buildWithCodegen(false); + + // Prime cache once; measure second incremental run. + buildWithCodegen(true); + const codegenWarmMs = buildWithCodegen(true); + + console.log("\nVite build benchmark (test/vite-example):"); + console.log( + `OpenAPI input: ${fs.existsSync(SNAPSHOT_OPENAPI) ? "test/benchmarks/openapi.localhost4000.json" : "test/petstore.yaml (fallback)"}`, + ); + printMs("baseline (no plugin)", baselineMs); + printMs("with openApiCodegen (incremental=false)", codegenColdMs); + printMs("with openApiCodegen (incremental=true, warm)", codegenWarmMs); + console.log( + `\nOverhead vs baseline:\n` + + `cold: ${pctDiff(codegenColdMs, baselineMs).toFixed(1)}%\n` + + `warm: ${pctDiff(codegenWarmMs, baselineMs).toFixed(1)}%`, + ); +} + +main(); diff --git a/scripts/publish.mjs b/scripts/publish.mjs new file mode 100644 index 0000000..ce9a530 --- /dev/null +++ b/scripts/publish.mjs @@ -0,0 +1,53 @@ +import { execSync } from "child_process"; +import fs from "fs"; +import path from "path"; +import readline from "readline"; + +function exec(command) { + try { + return execSync(command, { encoding: "utf8", stdio: ["inherit", "pipe", "inherit"] }).trim(); + } catch (error) { + process.exit(1); + } +} + +function main() { + // check if the working directory is clean + const status = execSync("git status --porcelain", { encoding: "utf8" }).trim(); + if (status) { + console.error("Working directory not clean. Please commit all changes before publishing."); + process.exit(1); + } + + // build, just in case + console.log("Building..."); + execSync("pnpm build", { stdio: "inherit" }); + + // read version from package.json + const pkg = JSON.parse(fs.readFileSync(path.resolve(process.cwd(), "package.json"), "utf8")); + const version = pkg.version; + + // create a new git tag + console.log(`Creating tag v${version}...`); + try { + execSync(`git tag -a v${version} -m "v${version}"`, { stdio: "inherit" }); + } catch (error) { + console.error(`Failed to create tag v${version}. It might already exist.`); + process.exit(1); + } + + console.log(`Publishing version: v${version}`); + + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + + rl.question("Press enter to continue (or Ctrl+C to cancel)", () => { + rl.close(); + console.log("Pushing tag..."); + execSync(`git push origin "v${version}"`, { stdio: "inherit" }); + }); +} + +main(); diff --git a/scripts/publish.sh b/scripts/publish.sh deleted file mode 100755 index 3ae5eaa..0000000 --- a/scripts/publish.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -set -e - -# check if the working directory is clean -if [ -n "$(git status --porcelain)" ]; then - echo "Working directory not clean. Please commit all changes before publishing." - exit 1 -fi - -# build, just in case -yarn build - -# read version from package.json -VERSION=$(node -p -e "require('./package.json').version") - -# create a new git tag or error out if the tag already exists -git tag -a v$VERSION -m "v$VERSION" - -echo "Publishing version: v$VERSION" - -read -p "Press enter to continue" - -git push origin "v$VERSION" \ No newline at end of file diff --git a/scripts/snapshot-openapi-localhost.mjs b/scripts/snapshot-openapi-localhost.mjs new file mode 100644 index 0000000..ae75fa5 --- /dev/null +++ b/scripts/snapshot-openapi-localhost.mjs @@ -0,0 +1,23 @@ +import fs from "fs"; +import path from "path"; + +const ROOT = process.cwd(); +const URL = process.env.OPENAPI_SNAPSHOT_URL ?? "http://localhost:4000/docs-json"; +const OUTPUT = path.resolve(ROOT, process.env.OPENAPI_SNAPSHOT_OUTPUT ?? "test/benchmarks/openapi.localhost4000.json"); + +async function main() { + const res = await fetch(URL); + if (!res.ok) { + throw new Error(`Failed to fetch OpenAPI (${res.status} ${res.statusText}) from ${URL}`); + } + + const json = await res.json(); + fs.mkdirSync(path.dirname(OUTPUT), { recursive: true }); + fs.writeFileSync(OUTPUT, `${JSON.stringify(json, null, 2)}\n`, "utf-8"); + console.log(`Saved OpenAPI snapshot to ${OUTPUT}`); +} + +main().catch((error) => { + console.error(error instanceof Error ? error.message : String(error)); + process.exit(1); +}); diff --git a/src/commands/generate.command.ts b/src/commands/generate.command.ts index 51af9c1..f3181ad 100644 --- a/src/commands/generate.command.ts +++ b/src/commands/generate.command.ts @@ -16,6 +16,9 @@ class GenerateOptions implements GenerateParams { @YargOption({ envAlias: "output" }) output?: string; + @YargOption({ envAlias: "incremental", type: "boolean" }) + incremental?: boolean; + @YargOption({ envAlias: "tsNamespaces", type: "boolean" }) tsNamespaces?: boolean; @@ -43,6 +46,9 @@ class GenerateOptions implements GenerateParams { @YargOption({ envAlias: "extractEnums", type: "boolean" }) extractEnums?: boolean; + @YargOption({ envAlias: "modelsInCommon", type: "boolean" }) + modelsInCommon?: boolean; + @YargOption({ envAlias: "removeOperationPrefixEndingWith" }) removeOperationPrefixEndingWith?: string; @@ -64,9 +70,21 @@ class GenerateOptions implements GenerateParams { @YargOption({ envAlias: "mutationEffects", type: "boolean" }) mutationEffects?: boolean; + @YargOption({ envAlias: "workspaceContext", type: "boolean" }) + workspaceContext?: boolean; + @YargOption({ envAlias: "parseRequestParams", type: "boolean" }) parseRequestParams?: boolean; + @YargOption({ envAlias: "inlineEndpoints", type: "boolean" }) + inlineEndpoints?: boolean; + + @YargOption({ envAlias: "inlineEndpointsExcludeModules" }) + inlineEndpointsExcludeModules?: string; + + @YargOption({ envAlias: "modelsOnly", type: "boolean" }) + modelsOnly?: boolean; + @YargOption({ envAlias: "axiosRequestConfig", type: "boolean" }) axiosRequestConfig?: boolean; diff --git a/src/commands/generate.ts b/src/commands/generate.ts index 4117ec3..421b079 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -1,25 +1,22 @@ import { exec } from "child_process"; - -import { OpenAPIV3 } from "openapi-types"; - -import { resolveConfig } from "@/generators/core/resolveConfig"; -import { generateCodeFromOpenAPIDoc } from "@/generators/generateCodeFromOpenAPIDoc"; +import { runGenerate } from "@/generators/run/generate.runner"; import { GenerateOptions } from "@/generators/types/options"; -import { writeGenerateFileData } from "@/generators/utils/file.utils"; import { logError, logInfo, logSuccess } from "@/helpers/cli.helper"; import { loadConfig } from "@/helpers/config.helper"; -import SwaggerParser from "@apidevtools/swagger-parser"; +import { Profiler } from "@/helpers/profile.helper"; export type GenerateParams = { config?: string; excludeTags?: string; - format?: boolean; + inlineEndpointsExcludeModules?: string; + prettier?: boolean; verbose?: boolean; } & Partial< Pick< GenerateOptions, | "input" | "output" + | "incremental" | "tsNamespaces" | "tsPath" | "splitByTags" @@ -27,61 +24,61 @@ export type GenerateParams = { | "removeOperationPrefixEndingWith" | "importPath" | "extractEnums" + | "modelsInCommon" | "acl" | "checkAcl" + | "standalone" | "baseUrl" | "replaceOptionalWithNullish" | "infiniteQueries" | "axiosRequestConfig" | "mutationEffects" + | "workspaceContext" | "parseRequestParams" + | "inlineEndpoints" | "builderConfigs" + | "modelsOnly" > >; -export async function generate({ format, verbose, config: configParam, ...params }: GenerateParams) { +export async function generate({ prettier, verbose, config: configParam, ...params }: GenerateParams) { const start = Date.now(); + const profiler = new Profiler(process.env.OPENAPI_CODEGEN_PROFILE === "1"); - if (verbose) { - logInfo("Resolving config..."); - } - const fileConfig = await loadConfig(configParam); - const config = resolveConfig({ fileConfig, params }); - - if (verbose) { - logInfo("Parsing OpenAPI spec..."); - } - const openApiDoc = (await SwaggerParser.bundle(config.input)) as OpenAPIV3.Document; - + const fileConfig = await profiler.runAsync("config.load", async () => await loadConfig(configParam)); if (verbose) { logInfo("Generating code..."); } - const filesData = generateCodeFromOpenAPIDoc(openApiDoc, config); + const result = await runGenerate({ fileConfig, params, profiler }); + const config = result.config; - if (verbose) { - logInfo("Writing files..."); + if (result.skipped && verbose) { + logInfo("OpenAPI and config unchanged. Skipping generation."); } - writeGenerateFileData(filesData); if (verbose) { logSuccess(`Time: ${Date.now() - start}ms`); + if (profiler.enabled) { + logInfo("Profile breakdown:"); + profiler.formatLines().forEach((line) => logInfo(` ${line}`)); + } } - if (format) { - execOxfmt({ output: config.output, verbose }); + if (prettier) { + execPrettier({ output: config.output, verbose }); } } -function execOxfmt({ output, verbose }: Pick) { +function execPrettier({ output, verbose }: Pick) { if (verbose) { - logInfo("Running Oxfmt..."); + logInfo("Running Prettier..."); } - - exec(`oxfmt ${output}`, (error) => { + const ignorePathArg = process.env.NODE_ENV === "production" ? "" : "--ignore-path .prettierignore"; + exec(`prettier --write ${output} ${ignorePathArg}`, (error) => { if (verbose) { if (error) { - logError(error, "Oxfmt error"); + logError(error, "Prettier error"); } else { - logSuccess("Oxfmt finished."); + logSuccess("Prettier finished."); } } }); diff --git a/src/generators/const/options.const.ts b/src/generators/const/options.const.ts index 58f1aa1..a6649ac 100644 --- a/src/generators/const/options.const.ts +++ b/src/generators/const/options.const.ts @@ -8,6 +8,7 @@ export const DEFAULT_GENERATE_OPTIONS: GenerateOptions = { // Base options input: "http://localhost:4000/docs-json/", output: "output", + incremental: true, splitByTags: true, defaultTag: "Common", excludeTags: [], @@ -39,20 +40,27 @@ export const DEFAULT_GENERATE_OPTIONS: GenerateOptions = { }, }, baseUrl: "", + modelsOnly: false, + standalone: false, // Zod options schemaSuffix: SCHEMA_SUFFIX, enumSuffix: ENUM_SUFFIX, + modelsInCommon: false, withDefaultValues: true, extractEnums: true, replaceOptionalWithNullish: false, // Endpoints options restClientImportPath: "", + errorHandlingImportPath: "", removeOperationPrefixEndingWith: "Controller_", parseRequestParams: true, + inlineEndpoints: false, + inlineEndpointsExcludeModules: [], // Queries options queryTypesImportPath: PACKAGE_IMPORT_PATH, axiosRequestConfig: false, mutationEffects: true, + workspaceContext: false, // Infinite queries options infiniteQueries: false, infiniteQueryParamNames: { @@ -67,6 +75,7 @@ export const DEFAULT_GENERATE_OPTIONS: GenerateOptions = { acl: true, checkAcl: true, abilityContextGenericAppAbilities: false, + abilityContextImportPath: "", // Builder Configs options builderConfigs: false, filterParamName: "filter", diff --git a/src/generators/core/SchemaResolver.class.ts b/src/generators/core/SchemaResolver.class.ts index 49b544e..0612642 100644 --- a/src/generators/core/SchemaResolver.class.ts +++ b/src/generators/core/SchemaResolver.class.ts @@ -1,6 +1,7 @@ import { OpenAPIV3 } from "openapi-types"; import { ALLOWED_METHODS } from "@/generators/const/openapi.const"; +import { Profiler } from "@/helpers/profile.helper"; import { OperationObject } from "@/generators/types/openapi"; import { GenerateOptions } from "@/generators/types/options"; import { ValidationError } from "@/generators/types/validation"; @@ -52,6 +53,23 @@ interface ZodSchemaData { tags: string[]; } +export interface OperationContext { + path: string; + method: OpenAPIV3.HttpMethods; + operation: OperationObject; + tag: string; + operationName: string; + isUniqueOperationName: boolean; + parameters: OpenAPIV3.ParameterObject[]; + deepRefs: string[]; + responses: { + statusCode: string; + responseObj: OpenAPIV3.ResponseObject; + matchingMediaType?: string; + schema?: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject; + }[]; +} + interface CompositeZodSchemaData { code: string; zodSchemas: { @@ -83,12 +101,25 @@ export class SchemaResolver { private readonly schemaData: SchemaData[] = []; private readonly zodSchemaData: ZodSchemaData[] = []; private readonly compositeZodSchemaData: CompositeZodSchemaData[] = []; + private readonly schemaRefs: string[]; + private readonly schemaByRef = new Map(); + private readonly schemaDataByRef = new Map(); + private readonly schemaDataByName = new Map(); + private readonly refByZodSchemaName = new Map(); + private readonly zodSchemaDataByName = new Map(); + private readonly compositeByCode = new Map(); + private readonly compositeSchemaByZodSchemaName = new Map< + string, + { zodSchema: ZodSchema; schema?: OpenAPIV3.SchemaObject } + >(); readonly dependencyGraph: DependencyGraph; readonly enumZodSchemas: EnumZodSchemaData[] = []; readonly extractedEnumZodSchemaData: ExtractedEnumZodSchemaData[] = []; readonly operationsByTag: Record = {}; readonly operationNames: string[] = []; + private readonly operationNameCounts = new Map(); + private readonly operationContexts: OperationContext[] = []; readonly validationErrors: ValidationError[] = []; @@ -96,28 +127,37 @@ export class SchemaResolver { return this.openApiDoc.components?.schemas ?? {}; } - private get schemaRefs() { - return Object.keys(this.docSchemas).map(getSchemaRef); - } - constructor( public readonly openApiDoc: OpenAPIV3.Document, public readonly options: GenerateOptions, + private readonly profiler?: Profiler, ) { + this.schemaRefs = Object.keys(this.docSchemas).map(getSchemaRef); this.dependencyGraph = getOpenAPISchemaDependencyGraph(this.schemaRefs, this.getSchemaByRef.bind(this)); this.enumZodSchemas = getEnumZodSchemasFromOpenAPIDoc(this); this.operationsByTag = getOperationsByTag(openApiDoc, options); this.operationNames = getUniqueOperationNamesWithoutSplitByTags(openApiDoc, this.operationsByTag, options); + for (const name of this.operationNames) { + this.operationNameCounts.set(name, (this.operationNameCounts.get(name) ?? 0) + 1); + } this.initialize(); } getSchemaByRef(ref: string) { - return this.docSchemas[getSchemaNameByRef(ref)] as OpenAPIV3.SchemaObject; + const correctRef = autocorrectRef(ref); + const cachedSchema = this.schemaByRef.get(correctRef); + if (cachedSchema) { + return cachedSchema; + } + + const schema = this.docSchemas[getSchemaNameByRef(correctRef)] as OpenAPIV3.SchemaObject; + this.schemaByRef.set(correctRef, schema); + return schema; } getSchemaDataByName(name: string) { - return this.schemaData.find((data) => data.name === name); + return this.schemaDataByName.get(name); } getZodSchemaNameByRef(ref: string) { @@ -131,7 +171,7 @@ export class SchemaResolver { } getRefByZodSchemaName(zodSchemaName: string) { - return this.schemaData.find((data) => data.zodSchemaName === zodSchemaName)?.ref; + return this.refByZodSchemaName.get(zodSchemaName); } getTagByZodSchemaName(zodSchemaName: string) { @@ -146,7 +186,7 @@ export class SchemaResolver { const schemaRef = this.getRefByZodSchemaName(zodSchemaName); const schemaTags = schemaRef ? (this.getSchemaDataByRef(schemaRef)?.tags ?? []) : []; - const zodSchemaTags = this.zodSchemaData.find((data) => data.zodSchemaName === zodSchemaName)?.tags ?? []; + const zodSchemaTags = this.zodSchemaDataByName.get(zodSchemaName)?.tags ?? []; const tags = getUniqueArray(schemaTags, zodSchemaTags); const tag = tags.length === 1 ? tags[0] : this.options.defaultTag; @@ -154,22 +194,22 @@ export class SchemaResolver { } getCodeByZodSchemaName(name: string) { - return this.zodSchemaData.find((data) => data.zodSchemaName === name)?.code; + return this.zodSchemaDataByName.get(name)?.code; } getZodSchemaNamesByCompositeCode(code: string) { - return this.compositeZodSchemaData - .find((data) => data.code === code) - ?.zodSchemas.map((schema) => schema.zodSchemaName); + return this.compositeByCode.get(code)?.zodSchemas.map((schema) => schema.zodSchemaName); } setZodSchema(name: string, code: string, tag: string) { - const zodSchema = this.zodSchemaData.find((data) => data.zodSchemaName === name); + const zodSchema = this.zodSchemaDataByName.get(name); if (zodSchema) { zodSchema.code = code; zodSchema.tags = (zodSchema.tags ?? []).concat(tag); } else { - this.zodSchemaData.push({ zodSchemaName: name, code, tags: [tag] }); + const newZodSchemaData = { zodSchemaName: name, code, tags: [tag] }; + this.zodSchemaData.push(newZodSchemaData); + this.zodSchemaDataByName.set(name, newZodSchemaData); } } @@ -180,25 +220,23 @@ export class SchemaResolver { schema?: OpenAPIV3.SchemaObject, ) { const compositeZodSchema = { zodSchemaName, zodSchema, schema }; - const compositeData = this.compositeZodSchemaData.find((data) => data.code === code); + const compositeData = this.compositeByCode.get(code); if (compositeData) { compositeData.zodSchemas.push(compositeZodSchema); } else { - this.compositeZodSchemaData.push({ code, zodSchemas: [compositeZodSchema] }); + const newCompositeData = { code, zodSchemas: [compositeZodSchema] }; + this.compositeZodSchemaData.push(newCompositeData); + this.compositeByCode.set(code, newCompositeData); } + this.compositeSchemaByZodSchemaName.set(zodSchemaName, { zodSchema, schema }); } getCompositeZodSchemaByZodSchemaName(zodSchemaName: string) { - const compositeZodSchema = this.compositeZodSchemaData.find((data) => - data.zodSchemas.some((schema) => schema.zodSchemaName === zodSchemaName), - ); - return compositeZodSchema?.zodSchemas.find((schema) => schema.zodSchemaName === zodSchemaName)?.zodSchema; + return this.compositeSchemaByZodSchemaName.get(zodSchemaName)?.zodSchema; } getSchemaByCompositeZodSchemaName(compositeZodSchemaName: string) { - return this.compositeZodSchemaData - .find((data) => data.zodSchemas.some((schema) => schema.zodSchemaName === compositeZodSchemaName)) - ?.zodSchemas.find((schema) => schema.zodSchemaName === compositeZodSchemaName)?.schema; + return this.compositeSchemaByZodSchemaName.get(compositeZodSchemaName)?.schema; } getEnumZodSchemaDataByCode(code: string) { @@ -219,14 +257,21 @@ export class SchemaResolver { } getZodSchemas() { - return this.zodSchemaData.reduce((acc, { zodSchemaName, code }) => ({ ...acc, [zodSchemaName]: code }), {}); + const zodSchemas = {} as Record; + for (const { zodSchemaName, code } of this.zodSchemaData) { + zodSchemas[zodSchemaName] = code; + } + return zodSchemas; } getExtractedEnumZodSchemas() { - return this.extractedEnumZodSchemaData.reduce( - (acc, { zodSchemaName, code }) => (zodSchemaName ? { ...acc, [zodSchemaName]: code } : acc), - {}, - ); + const zodSchemas = {} as Record; + for (const { zodSchemaName, code } of this.extractedEnumZodSchemaData) { + if (zodSchemaName) { + zodSchemas[zodSchemaName] = code; + } + } + return zodSchemas; } resolveObject(obj: OpenAPIV3.ReferenceObject | T): T { @@ -259,6 +304,14 @@ export class SchemaResolver { return this.options.baseUrl; } + isOperationNameUnique(operationName: string) { + return (this.operationNameCounts.get(operationName) ?? 0) <= 1; + } + + getOperationContexts() { + return this.operationContexts; + } + getZodSchemaObj(zodSchemaName: string) { const ref = this.getRefByZodSchemaName(zodSchemaName); if (ref) { @@ -272,15 +325,16 @@ export class SchemaResolver { const enumZodSchemaData = this.getExtractedEnumZodSchemaDataByName(zodSchemaName); if (enumZodSchemaData) { - return enumZodSchemaData.meta.schemas.reduce( - (acc, curr) => ({ ...acc, ...this.resolveObject(curr) }), - {} as OpenAPIV3.SchemaObject, - ); + const schemaObject = {} as OpenAPIV3.SchemaObject; + for (const schema of enumZodSchemaData.meta.schemas) { + Object.assign(schemaObject, this.resolveObject(schema)); + } + return schemaObject; } } private getSchemaDataByRef(ref: string) { - return this.schemaData.find((data) => data.ref === ref); + return this.schemaDataByRef.get(ref); } private getExtractedEnumZodSchemaDataByName(enumZodSchemaName: string) { @@ -288,131 +342,183 @@ export class SchemaResolver { } private initialize() { - this.schemaRefs.forEach((ref) => { - const correctRef = autocorrectRef(ref); - const name = getSchemaNameByRef(correctRef); - const zodSchemaName = getZodSchemaName(name, this.options.schemaSuffix); - this.schemaData.push({ ref: correctRef, name, zodSchemaName, tags: [], deepRefOperations: [] }); - }); - - for (const path in this.openApiDoc.paths) { - if (isPathExcluded(path, this.options)) { - continue; - } + const p = this.profiler ?? new Profiler(false); - const pathItemObj = this.openApiDoc.paths[path] as OpenAPIV3.PathItemObject; + p.runSync("resolver.init.seedSchemas", () => { + this.schemaRefs.forEach((ref) => { + const correctRef = autocorrectRef(ref); + const name = getSchemaNameByRef(correctRef); + const zodSchemaName = getZodSchemaName(name, this.options.schemaSuffix); + const data = { ref: correctRef, name, zodSchemaName, tags: [], deepRefOperations: [] }; + this.schemaData.push(data); + this.schemaDataByRef.set(correctRef, data); + this.schemaDataByName.set(name, data); + this.refByZodSchemaName.set(zodSchemaName, correctRef); + }); + }); - const pathItem = pick(pathItemObj, ALLOWED_METHODS); - for (const method in pathItem) { - const operation = pathItem[method as keyof typeof pathItem] as OperationObject | undefined; - if (!operation || isOperationExcluded(operation, this.options)) { + p.runSync("resolver.init.operationsLoop", () => { + for (const path in this.openApiDoc.paths) { + if (isPathExcluded(path, this.options)) { continue; } - const tag = getOperationTag(operation, this.options); - const operationName = getUniqueOperationName({ - path, - method, - operation, - operationsByTag: this.operationsByTag, - options: this.options, - }); - const isUniqueOperationName = this.operationNames.filter((name) => name === operationName).length <= 1; - const zodSchemaOperationName = snakeToCamel( - getZodSchemaOperationName(operationName, isUniqueOperationName, tag), - ); - const schemaRefObjs = [] as OpenAPIV3.ReferenceObject[]; - - operation.parameters?.map((parameter) => { - const parameterObject = parameter as OpenAPIV3.ParameterObject; - const parameterSchema = parameterObject.schema; - const schemaInfo = `Operation ${operation.operationId ?? path} parameter ${parameterObject.name}`; - - schemaRefObjs.push(...getSchemaRefObjs(this, parameterSchema, schemaInfo)); - - if (this.options.extractEnums) { - updateExtractedEnumZodSchemaData({ - resolver: this, - schema: parameterSchema, - schemaInfo, - tags: [tag], - nameSegments: [zodSchemaOperationName, parameterObject.name], - includeSelf: true, - }); - } - }); + const pathItemObj = this.openApiDoc.paths[path] as OpenAPIV3.PathItemObject; + const pathParameters = this.getParameters(pathItemObj.parameters ?? []); - if (operation.requestBody) { - const requestBodyObj = this.resolveObject(operation.requestBody); - const mediaTypes = Object.keys(requestBodyObj.content ?? {}); - const matchingMediaType = mediaTypes.find(isParamMediaTypeAllowed); - if (matchingMediaType) { - const matchingMediaSchema = requestBodyObj.content?.[matchingMediaType]?.schema; - const schemaInfo = `Operation ${operation.operationId} request body`; - - schemaRefObjs.push(...getSchemaRefObjs(this, matchingMediaSchema, schemaInfo)); - - if (this.options.extractEnums) { - updateExtractedEnumZodSchemaData({ - resolver: this, - schema: matchingMediaSchema, - schemaInfo, - tags: [tag], - nameSegments: [getBodyZodSchemaName(zodSchemaOperationName)], - }); - } + const pathItem = pick(pathItemObj, ALLOWED_METHODS); + for (const method in pathItem) { + const operation = pathItem[method as keyof typeof pathItem] as OperationObject | undefined; + if (!operation || isOperationExcluded(operation, this.options)) { + continue; } - } - for (const statusCode in operation.responses) { - const responseObj = this.resolveObject(operation.responses[statusCode]); - const mediaTypes = Object.keys(responseObj?.content ?? {}); - const matchingMediaType = mediaTypes.find(isMediaTypeAllowed); - if (matchingMediaType) { - const matchingMediaSchema = responseObj.content?.[matchingMediaType]?.schema; - const schemaInfo = `Operation ${operation.operationId} response body`; - - schemaRefObjs.push(...getSchemaRefObjs(this, matchingMediaSchema, schemaInfo)); - - if (this.options.extractEnums) { - updateExtractedEnumZodSchemaData({ - resolver: this, - schema: matchingMediaSchema, - schemaInfo, - tags: [tag], - nameSegments: [getResponseZodSchemaName({ statusCode, operationName, isUniqueOperationName, tag })], - }); + const tag = getOperationTag(operation, this.options); + const operationName = getUniqueOperationName({ + path, + method, + operation, + operationsByTag: this.operationsByTag, + options: this.options, + }); + const isUniqueOperationName = this.isOperationNameUnique(operationName); + const parameters = p.runSync("resolver.init.parameters.mergeResolve", () => + Object.entries({ + ...pathParameters, + ...this.getParameters(operation.parameters ?? []), + }).map(([, param]) => this.resolveObject(param as OpenAPIV3.ReferenceObject | OpenAPIV3.ParameterObject)), + ); + const responses = p.runSync("resolver.init.responses.prepare", () => + Object.entries(operation.responses).map(([statusCode, response]) => { + const responseObj = this.resolveObject(response) as OpenAPIV3.ResponseObject; + const mediaTypes = Object.keys(responseObj?.content ?? {}); + const matchingMediaType = mediaTypes.find(isMediaTypeAllowed); + const schema = matchingMediaType ? responseObj.content?.[matchingMediaType]?.schema : undefined; + return { statusCode, responseObj, matchingMediaType, schema }; + }), + ); + const zodSchemaOperationName = snakeToCamel( + getZodSchemaOperationName(operationName, isUniqueOperationName, tag), + ); + const schemaRefObjs = [] as OpenAPIV3.ReferenceObject[]; + + p.runSync("resolver.init.parameters.refs", () => { + parameters.forEach((parameter) => { + const parameterObject = this.resolveObject( + parameter as OpenAPIV3.ReferenceObject | OpenAPIV3.ParameterObject, + ); + const parameterSchema = parameterObject.schema; + const schemaInfo = `Operation ${operation.operationId ?? path} parameter ${parameterObject.name}`; + + schemaRefObjs.push(...getSchemaRefObjs(this, parameterSchema, schemaInfo)); + + if (this.options.extractEnums) { + updateExtractedEnumZodSchemaData({ + resolver: this, + schema: parameterSchema, + schemaInfo, + tags: [tag], + nameSegments: [zodSchemaOperationName, parameterObject.name], + includeSelf: true, + }); + } + }); + }); + + p.runSync("resolver.init.requestBody.refs", () => { + if (operation.requestBody) { + const requestBodyObj = this.resolveObject(operation.requestBody); + const mediaTypes = Object.keys(requestBodyObj.content ?? {}); + const matchingMediaType = mediaTypes.find(isParamMediaTypeAllowed); + if (matchingMediaType) { + const matchingMediaSchema = requestBodyObj.content?.[matchingMediaType]?.schema; + const schemaInfo = `Operation ${operation.operationId} request body`; + + schemaRefObjs.push(...getSchemaRefObjs(this, matchingMediaSchema, schemaInfo)); + + if (this.options.extractEnums) { + updateExtractedEnumZodSchemaData({ + resolver: this, + schema: matchingMediaSchema, + schemaInfo, + tags: [tag], + nameSegments: [getBodyZodSchemaName(zodSchemaOperationName)], + }); + } + } } - } + }); + + p.runSync("resolver.init.responses.refs", () => { + for (const responseData of responses) { + if (!responseData.matchingMediaType) { + continue; + } + + const schemaInfo = `Operation ${operation.operationId} response body`; + schemaRefObjs.push(...getSchemaRefObjs(this, responseData.schema, schemaInfo)); + + if (this.options.extractEnums) { + updateExtractedEnumZodSchemaData({ + resolver: this, + schema: responseData.schema, + schemaInfo, + tags: [tag], + nameSegments: [ + getResponseZodSchemaName({ + statusCode: responseData.statusCode, + operationName, + isUniqueOperationName, + tag, + }), + ], + }); + } + } + }); + + const deepRefs = p.runSync("resolver.init.deepRefs", () => getDeepSchemaRefObjs(this, schemaRefObjs)); + const operationContext: OperationContext = { + path, + method: method as OpenAPIV3.HttpMethods, + operation, + tag, + operationName, + isUniqueOperationName, + parameters, + deepRefs, + responses, + }; + this.operationContexts.push(operationContext); + deepRefs.forEach((schemaRef) => { + const schemaData = this.getSchemaDataByRef(schemaRef); + if (schemaData) { + schemaData.tags.push(tag); + schemaData.deepRefOperations.push(operation); + } + }); } - - const deepRefs = getDeepSchemaRefObjs(this, schemaRefObjs); - deepRefs.forEach((schemaRef) => { - const schemaData = this.getSchemaDataByRef(schemaRef); - if (schemaData) { - schemaData.tags.push(tag); - schemaData.deepRefOperations.push(operation); - } - }); } - } + }); if (this.options.extractEnums) { - this.schemaRefs.forEach((ref) => { - const schemaRef = autocorrectRef(ref); - - updateExtractedEnumZodSchemaData({ - resolver: this, - schema: this.getSchemaByRef(schemaRef), - schemaRef, - tags: this.getSchemaDataByRef(schemaRef)?.tags ?? [], - nameSegments: [getSchemaNameByRef(schemaRef)], + p.runSync("resolver.init.enums.finalize", () => { + this.schemaRefs.forEach((ref) => { + const schemaRef = autocorrectRef(ref); + + updateExtractedEnumZodSchemaData({ + resolver: this, + schema: this.getSchemaByRef(schemaRef), + schemaRef, + tags: this.getSchemaDataByRef(schemaRef)?.tags ?? [], + nameSegments: [getSchemaNameByRef(schemaRef)], + }); }); - }); - resolveExtractedEnumZodSchemaTags(this); - this.handleDuplicateEnumZodSchemas(); - resolveExtractedEnumZodSchemaNames(this); + resolveExtractedEnumZodSchemaTags(this); + this.handleDuplicateEnumZodSchemas(); + resolveExtractedEnumZodSchemaNames(this); + }); } } @@ -452,4 +558,10 @@ export class SchemaResolver { ...this.extractedEnumZodSchemaData.filter(({ code }) => !codes.has(code)), ); } + + private getParameters(parameters: NonNullable) { + return Object.fromEntries( + (parameters ?? []).map((param) => [isReferenceObject(param) ? param.$ref : param.name, param] as const), + ); + } } diff --git a/src/generators/core/endpoints/getEndpointBody.ts b/src/generators/core/endpoints/getEndpointBody.ts index 8f18f8e..97a48e2 100644 --- a/src/generators/core/endpoints/getEndpointBody.ts +++ b/src/generators/core/endpoints/getEndpointBody.ts @@ -1,12 +1,10 @@ import { BODY_PARAMETER_NAME } from "@/generators/const/endpoints.const"; import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; -import { getZodChain } from "@/generators/core/zod/getZodChain"; -import { getZodSchema } from "@/generators/core/zod/getZodSchema"; -import { resolveZodSchemaName } from "@/generators/core/zod/resolveZodSchemaName"; import { EndpointParameter } from "@/generators/types/endpoint"; import { OperationObject } from "@/generators/types/openapi"; import { isParamMediaTypeAllowed } from "@/generators/utils/openapi.utils"; import { getBodyZodSchemaName, getZodSchemaOperationName } from "@/generators/utils/zod-schema.utils"; +import { resolveEndpointZodSchema } from "./resolveEndpointZodSchema"; export function getEndpointBody({ resolver, @@ -37,31 +35,21 @@ export function getEndpointBody({ return; } - const zodSchema = getZodSchema({ - schema, + const zodSchema = resolveEndpointZodSchema({ resolver, + schema, meta: { isRequired: requestBodyObj.required ?? true }, tag, - }); - - const schemaObject = resolver.resolveObject(schema); - - const zodSchemaName = resolveZodSchemaName({ - schema: schemaObject, - zodSchema, fallbackName: getBodyZodSchemaName(getZodSchemaOperationName(operationName, isUniqueOperationName, tag)), - resolver, - tag, + composeBeforeResolve: false, }); - const zodChain = getZodChain({ schema: schemaObject, meta: zodSchema.meta, options: resolver.options }); - return { endpointParameter: { name: BODY_PARAMETER_NAME, type: "Body", description: requestBodyObj.description, - zodSchema: zodSchemaName + zodChain, + zodSchema, bodyObject: requestBodyObj, }, requestFormat: matchingMediaType, diff --git a/src/generators/core/endpoints/getEndpointParameter.ts b/src/generators/core/endpoints/getEndpointParameter.ts index ae670c5..be0a4f0 100644 --- a/src/generators/core/endpoints/getEndpointParameter.ts +++ b/src/generators/core/endpoints/getEndpointParameter.ts @@ -3,9 +3,7 @@ import { match } from "ts-pattern"; import { ALLOWED_PATH_IN } from "@/generators/const/openapi.const"; import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; -import { getZodChain } from "@/generators/core/zod/getZodChain"; -import { getEnumZodSchemaCodeFromEnumNames, getZodSchema } from "@/generators/core/zod/getZodSchema"; -import { resolveZodSchemaName } from "@/generators/core/zod/resolveZodSchemaName"; +import { getEnumZodSchemaCodeFromEnumNames } from "@/generators/core/zod/getZodSchema"; import { EndpointParameter } from "@/generators/types/endpoint"; import { ParameterObject } from "@/generators/types/openapi"; import { @@ -18,6 +16,7 @@ import { getParamZodSchemaName, getZodSchemaOperationName, } from "@/generators/utils/zod-schema.utils"; +import { resolveEndpointZodSchema } from "./resolveEndpointZodSchema"; export function getEndpointParameter({ resolver, @@ -80,23 +79,13 @@ export function getEndpointParameter({ parameterSortingEnumSchemaName = enumZodSchemaName; } - const zodSchema = getZodSchema({ - schema, + const zodSchemaName = resolveEndpointZodSchema({ resolver, + schema, meta: { isRequired: paramObj.in === "path" ? true : (paramObj.required ?? false) }, tag, - }); - - const schemaObject = resolver.resolveObject(schema); - - const zodChain = getZodChain({ schema: schemaObject, meta: zodSchema.meta, options: resolver.options }); - - const zodSchemaName = resolveZodSchemaName({ - schema: schemaObject, - zodSchema: zodSchema.assign(zodSchema.getCodeString(tag) + zodChain), fallbackName, - resolver, - tag, + composeBeforeResolve: true, }); return { diff --git a/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.ts b/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.ts index 28f116e..ffcf67a 100644 --- a/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.ts +++ b/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.ts @@ -1,27 +1,14 @@ import { OpenAPIV3 } from "openapi-types"; import { JSON_APPLICATION_FORMAT } from "@/generators/const/endpoints.const"; -import { ALLOWED_METHODS } from "@/generators/const/openapi.const"; import { HttpStatusCode } from "@/generators/const/validation.const"; import { STRING_SCHEMA, VOID_SCHEMA } from "@/generators/const/zod.const"; -import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; -import { getZodChain } from "@/generators/core/zod/getZodChain"; -import { getZodSchema } from "@/generators/core/zod/getZodSchema"; -import { resolveZodSchemaName } from "@/generators/core/zod/resolveZodSchemaName"; +import { Profiler } from "@/helpers/profile.helper"; import { Endpoint, EndpointParameter } from "@/generators/types/endpoint"; -import { OperationObject } from "@/generators/types/openapi"; import { invalidVariableNameCharactersToCamel } from "@/generators/utils/js.utils"; -import { pick } from "@/generators/utils/object.utils"; import { isReferenceObject } from "@/generators/utils/openapi-schema.utils"; -import { - isErrorStatus, - isMainResponseStatus, - isMediaTypeAllowed, - isPathExcluded, - replaceHyphenatedPath, -} from "@/generators/utils/openapi.utils"; -import { getUniqueOperationName, isOperationExcluded } from "@/generators/utils/operation.utils"; -import { formatTag, getOperationTag } from "@/generators/utils/tag.utils"; +import { isErrorStatus, isMainResponseStatus, replaceHyphenatedPath } from "@/generators/utils/openapi.utils"; +import { formatTag } from "@/generators/utils/tag.utils"; import { getInvalidOperationIdError, getInvalidStatusCodeError, @@ -34,183 +21,158 @@ import { getResponseZodSchemaName } from "@/generators/utils/zod-schema.utils"; import { getEndpointAcl } from "./getEndpointAcl"; import { getEndpointBody } from "./getEndpointBody"; import { getEndpointParameter } from "./getEndpointParameter"; +import { resolveEndpointZodSchema } from "./resolveEndpointZodSchema"; +import type { OperationContext, SchemaResolver } from "../SchemaResolver.class"; -export function getEndpointsFromOpenAPIDoc(resolver: SchemaResolver) { +export function getEndpointsFromOpenAPIDoc(resolver: SchemaResolver, profiler?: Profiler) { const endpoints = []; + const p = profiler ?? new Profiler(false); - for (const path in resolver.openApiDoc.paths) { - if (isPathExcluded(path, resolver.options)) { - continue; - } + for (const context of resolver.getOperationContexts()) { + endpoints.push(buildEndpointFromOperationContext(resolver, context, p)); + } + + return endpoints; +} - const pathItemObj = resolver.openApiDoc.paths[path] as OpenAPIV3.PathItemObject; - const pathItem = pick(pathItemObj, ALLOWED_METHODS); - const pathParameters = getParameters(pathItemObj.parameters ?? []); +export function buildEndpointFromOperationContext( + resolver: SchemaResolver, + context: OperationContext, + profiler?: Profiler, +) { + const p = profiler ?? new Profiler(false); + const { path, method, operation, operationName, isUniqueOperationName, tag, parameters, responses } = context; + + const invalidOperationId = + operation.operationId && operation.operationId !== invalidVariableNameCharactersToCamel(operation.operationId); + if (operation.operationId && invalidOperationId) { + resolver.validationErrors.push(getInvalidOperationIdError(operation.operationId)); + } - for (const method in pathItem) { - const operation = pathItem[method as keyof typeof pathItem] as OperationObject | undefined; - if (!operation || isOperationExcluded(operation, resolver.options)) { - continue; - } + const endpoint: Endpoint = { + method, + path: replaceHyphenatedPath(path), + operationName, + description: operation.description, + summary: operation.summary, + tags: operation.tags?.map(formatTag), + requestFormat: JSON_APPLICATION_FORMAT, + parameters: [], + response: "", + errors: [], + responseStatusCodes: [], + mediaUpload: !!operation["x-media-upload"], + mediaDownload: !!operation["x-media-download"], + }; - const invalidOperationId = - operation.operationId && operation.operationId !== invalidVariableNameCharactersToCamel(operation.operationId); - if (operation.operationId && invalidOperationId) { - resolver.validationErrors.push(getInvalidOperationIdError(operation.operationId)); + p.runSync("endpoints.requestBody", () => { + if (operation.requestBody) { + const body = getEndpointBody({ resolver, operation, operationName, isUniqueOperationName, tag }); + if (body) { + endpoint.parameters.push(body.endpointParameter); + endpoint.requestFormat = body.requestFormat; } + } + }); - const parameters = Object.entries({ - ...pathParameters, - ...getParameters(operation.parameters ?? []), - }).map(([, param]) => param); - const operationName = getUniqueOperationName({ - path, - method, - operation, - operationsByTag: resolver.operationsByTag, - options: resolver.options, - }); - const isUniqueOperationName = resolver.operationNames.filter((name) => name === operationName).length <= 1; - const tag = getOperationTag(operation, resolver.options); - const endpoint: Endpoint = { - method: method as OpenAPIV3.HttpMethods, - path: replaceHyphenatedPath(path), + p.runSync("endpoints.params", () => { + for (const param of parameters) { + const endpointParameter = getEndpointParameter({ + resolver, + param, operationName, - description: operation.description, - summary: operation.summary, - tags: operation.tags?.map(formatTag), - requestFormat: JSON_APPLICATION_FORMAT, - parameters: [], - response: "", - errors: [], - responseStatusCodes: [], - mediaUpload: !!operation["x-media-upload"], - mediaDownload: !!operation["x-media-download"], - }; - - if (operation.requestBody) { - const body = getEndpointBody({ resolver, operation, operationName, isUniqueOperationName, tag }); - if (body) { - endpoint.parameters.push(body.endpointParameter); - endpoint.requestFormat = body.requestFormat; + isUniqueOperationName, + tag, + }); + if (endpointParameter) { + endpoint.parameters.push(endpointParameter); + } + } + }); + + p.runSync("endpoints.pathParams", () => { + const missingPathParameters = getMissingPathParameters(endpoint); + missingPathParameters.forEach((pathParam) => { + endpoint.parameters.push(pathParam); + }); + if (missingPathParameters.length > 0) { + resolver.validationErrors.push(getMissingPathParameterError(missingPathParameters, path)); + } + }); + + p.runSync("endpoints.responses", () => { + for (const responseData of responses) { + const { statusCode, responseObj, matchingMediaType, schema } = responseData; + endpoint.responseStatusCodes.push(statusCode); + let responseZodSchema: string | undefined; + if (matchingMediaType) { + endpoint.responseFormat = matchingMediaType; + } else { + responseZodSchema = VOID_SCHEMA; + if (statusCode === "200") { + resolver.validationErrors.push( + getInvalidStatusCodeError({ received: "200", expected: "204" }, operation, endpoint), + ); } } - for (const param of parameters) { - const endpointParameter = getEndpointParameter({ + if (schema) { + responseZodSchema = resolveEndpointZodSchema({ resolver, - param, - operationName, - isUniqueOperationName, + schema, + meta: { isRequired: true }, tag, + fallbackName: isReferenceObject(schema) + ? undefined + : getResponseZodSchemaName({ statusCode, operationName, isUniqueOperationName, tag }), + composeBeforeResolve: false, }); - if (endpointParameter) { - endpoint.parameters.push(endpointParameter); - } } - const missingPathParameters = getMissingPathParameters(endpoint); - missingPathParameters.forEach((pathParam) => { - endpoint.parameters.push(pathParam); - }); - if (missingPathParameters.length > 0) { - resolver.validationErrors.push(getMissingPathParameterError(missingPathParameters, path)); - } - - for (const statusCode in operation.responses) { - endpoint.responseStatusCodes.push(statusCode); - - const responseObj = resolver.resolveObject(operation.responses[statusCode]); - const mediaTypes = Object.keys(responseObj?.content ?? {}); - const matchingMediaType = mediaTypes.find(isMediaTypeAllowed); - - let schema: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject | undefined; - let responseZodSchema: string | undefined; - if (matchingMediaType) { - endpoint.responseFormat = matchingMediaType; - schema = responseObj.content?.[matchingMediaType]?.schema; - } else { - responseZodSchema = VOID_SCHEMA; - if (statusCode === "200") { - resolver.validationErrors.push( - getInvalidStatusCodeError({ received: "200", expected: "204" }, operation, endpoint), - ); - } - } - - if (schema) { - const zodSchema = getZodSchema({ - schema, - resolver, - meta: { isRequired: true }, - tag, + if (responseZodSchema) { + const status = Number(statusCode); + + if (isMainResponseStatus(status) && !endpoint.response) { + endpoint.response = responseZodSchema; + endpoint.responseObject = responseObj; + endpoint.responseDescription = responseObj?.description; + } else if (statusCode !== "default" && isErrorStatus(status)) { + endpoint.errors.push({ + zodSchema: responseZodSchema, + status, + description: responseObj?.description, }); - - const schemaObject = resolver.resolveObject(schema); - - const zodSchemaName = resolveZodSchemaName({ - schema: schemaObject, - zodSchema, - fallbackName: zodSchema.ref - ? undefined - : getResponseZodSchemaName({ statusCode, operationName, isUniqueOperationName, tag }), - resolver, - tag, - }); - - responseZodSchema = - zodSchemaName + getZodChain({ schema: schemaObject, meta: zodSchema.meta, options: resolver.options }); } - - if (responseZodSchema) { - const status = Number(statusCode); - - if (isMainResponseStatus(status) && !endpoint.response) { - endpoint.response = responseZodSchema; - endpoint.responseObject = responseObj; - endpoint.responseDescription = responseObj?.description; - } else if (statusCode !== "default" && isErrorStatus(status)) { - endpoint.errors.push({ - zodSchema: responseZodSchema, - status, - description: responseObj?.description, - }); - } - } - } - - if (!endpoint.response) { - endpoint.response = VOID_SCHEMA; - } - - const mainStatusCodes = Object.keys(operation.responses).map(Number).filter(isMainResponseStatus); - if (mainStatusCodes.length > 1) { - resolver.validationErrors.push( - getMultipleSuccessStatusCodesError(mainStatusCodes.map(String) as HttpStatusCode[], operation, endpoint), - ); } + } + }); - endpoint.acl = getEndpointAcl({ resolver, endpoint, operation }); + if (!endpoint.response) { + endpoint.response = VOID_SCHEMA; + } - if (operation.security?.[0].Authorization && !endpoint.responseStatusCodes.includes("401")) { - resolver.validationErrors.push(getMissingStatusCodeError("401", operation, endpoint)); - } + p.runSync("endpoints.statusValidation", () => { + const mainStatusCodes = Object.keys(operation.responses).map(Number).filter(isMainResponseStatus); + if (mainStatusCodes.length > 1) { + resolver.validationErrors.push( + getMultipleSuccessStatusCodesError(mainStatusCodes.map(String) as HttpStatusCode[], operation, endpoint), + ); + } + }); - if (endpoint.acl?.[0] && !endpoint.responseStatusCodes.includes("403")) { - resolver.validationErrors.push(getMissingStatusCodeError("403", operation, endpoint)); - } + p.runSync("endpoints.acl", () => { + endpoint.acl = getEndpointAcl({ resolver, endpoint, operation }); + }); - endpoints.push(endpoint); - } + if (operation.security?.[0].Authorization && !endpoint.responseStatusCodes.includes("401")) { + resolver.validationErrors.push(getMissingStatusCodeError("401", operation, endpoint)); } - return endpoints; -} + if (endpoint.acl?.[0] && !endpoint.responseStatusCodes.includes("403")) { + resolver.validationErrors.push(getMissingStatusCodeError("403", operation, endpoint)); + } -function getParameters(parameters: NonNullable) { - return Object.fromEntries( - (parameters ?? []).map((param) => [isReferenceObject(param) ? param.$ref : param.name, param] as const), - ); + return endpoint; } function getMissingPathParameters(endpoint: Endpoint): EndpointParameter[] { diff --git a/src/generators/core/endpoints/resolveEndpointZodSchema.ts b/src/generators/core/endpoints/resolveEndpointZodSchema.ts new file mode 100644 index 0000000..7ee32b7 --- /dev/null +++ b/src/generators/core/endpoints/resolveEndpointZodSchema.ts @@ -0,0 +1,92 @@ +import { OpenAPIV3 } from "openapi-types"; + +import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; +import { getZodChain } from "@/generators/core/zod/getZodChain"; +import { getZodSchema } from "@/generators/core/zod/getZodSchema"; +import { resolveZodSchemaName } from "@/generators/core/zod/resolveZodSchemaName"; +import { ZodSchemaMetaData } from "@/generators/core/zod/ZodSchema.class"; +import { isReferenceObject } from "@/generators/utils/openapi-schema.utils"; + +type EndpointZodSchemaCache = { + byObject: WeakMap>; + byRef: Map>; +}; + +const resolverEndpointZodSchemaCache = new WeakMap(); + +function getResolverSchemaCache(resolver: SchemaResolver) { + let schemaCache = resolverEndpointZodSchemaCache.get(resolver); + if (!schemaCache) { + schemaCache = { + byObject: new WeakMap(), + byRef: new Map(), + }; + resolverEndpointZodSchemaCache.set(resolver, schemaCache); + } + return schemaCache; +} + +function getOrCreateSchemaEntries( + schemaCache: EndpointZodSchemaCache, + schema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject, +) { + if (isReferenceObject(schema)) { + let entries = schemaCache.byRef.get(schema.$ref); + if (!entries) { + entries = new Map(); + schemaCache.byRef.set(schema.$ref, entries); + } + return entries; + } + + let entries = schemaCache.byObject.get(schema); + if (!entries) { + entries = new Map(); + schemaCache.byObject.set(schema, entries); + } + return entries; +} + +export function resolveEndpointZodSchema({ + resolver, + schema, + meta, + tag, + fallbackName, + composeBeforeResolve, +}: { + resolver: SchemaResolver; + schema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject; + meta: ZodSchemaMetaData; + tag: string; + fallbackName?: string; + composeBeforeResolve: boolean; +}) { + const schemaCache = getResolverSchemaCache(resolver); + const entries = getOrCreateSchemaEntries(schemaCache, schema); + const isRefSchema = isReferenceObject(schema); + const normalizedFallbackName = isRefSchema ? "" : (fallbackName ?? ""); + const normalizedTag = isRefSchema ? "" : tag; + const metaKey = `required:${Boolean(meta.isRequired)}|name:${meta.name ?? ""}|parentPartial:${Boolean(meta.isParentPartial)}|fallback:${normalizedFallbackName}|tag:${normalizedTag}|compose:${composeBeforeResolve ? 1 : 0}`; + const cached = entries.get(metaKey); + if (cached) { + return cached; + } + + const zodSchema = getZodSchema({ schema, resolver, meta, tag }); + const schemaObject = resolver.resolveObject(schema); + const zodChain = getZodChain({ schema: schemaObject, meta: zodSchema.meta, options: resolver.options }); + + const resolved = composeBeforeResolve + ? resolveZodSchemaName({ + schema: schemaObject, + zodSchema: zodSchema.assign(zodSchema.getCodeString(tag) + zodChain), + fallbackName, + resolver, + tag, + }) + : `${resolveZodSchemaName({ schema: schemaObject, zodSchema, fallbackName, resolver, tag })}${zodChain}`; + + entries.set(metaKey, resolved); + return resolved; +} diff --git a/src/generators/core/getDataFromOpenAPIDoc.ts b/src/generators/core/getDataFromOpenAPIDoc.ts index c0b6fd4..d4aa46c 100644 --- a/src/generators/core/getDataFromOpenAPIDoc.ts +++ b/src/generators/core/getDataFromOpenAPIDoc.ts @@ -1,30 +1,33 @@ import { OpenAPIV3 } from "openapi-types"; - -import { Endpoint } from "@/generators/types/endpoint"; -import { GenerateData } from "@/generators/types/generate"; -import { GenerateOptions } from "@/generators/types/options"; -import { getEndpointTag } from "@/generators/utils/tag.utils"; - +import { Profiler } from "../../helpers/profile.helper"; +import { Endpoint } from "../types/endpoint"; +import { GenerateData } from "../types/generate"; +import { GenerateOptions } from "../types/options"; +import { getEndpointTag } from "../utils/tag.utils"; import { getEndpointsFromOpenAPIDoc } from "./endpoints/getEndpointsFromOpenAPIDoc"; import { SchemaResolver } from "./SchemaResolver.class"; import { getZodSchemasFromOpenAPIDoc } from "./zod/getZodSchemasFromOpenAPIDoc"; import { sortZodSchemasByTopology } from "./zod/sortZodSchemasByTopology"; -export function getDataFromOpenAPIDoc(openApiDoc: OpenAPIV3.Document, options: GenerateOptions) { - const resolver = new SchemaResolver(openApiDoc, options); +export function getDataFromOpenAPIDoc(openApiDoc: OpenAPIV3.Document, options: GenerateOptions, profiler?: Profiler) { + const p = profiler ?? new Profiler(false); + const resolver = p.runSync("data.resolver.init", () => new SchemaResolver(openApiDoc, options, p)); - const endpoints = getEndpointsFromOpenAPIDoc(resolver); - const zodSchemasFromDocSchemas = getZodSchemasFromOpenAPIDoc(resolver); + const endpoints = p.runSync("data.endpoints.extract", () => getEndpointsFromOpenAPIDoc(resolver, p)); + const zodSchemasFromDocSchemas = p.runSync("data.zod.extract", () => getZodSchemasFromOpenAPIDoc(resolver, p)); let zodSchemas = { ...zodSchemasFromDocSchemas.zodSchemas, ...resolver.getZodSchemas(), ...zodSchemasFromDocSchemas.enumZodSchemas, }; - zodSchemas = sortZodSchemasByTopology(resolver, zodSchemas); + zodSchemas = p.runSync("data.zod.sortTopology", () => sortZodSchemasByTopology(resolver, zodSchemas)); zodSchemas = { ...resolver.getExtractedEnumZodSchemas(), ...zodSchemas }; - return { resolver, data: splitDataByTags({ resolver, endpoints, zodSchemas, options }) }; + return { + resolver, + data: p.runSync("data.splitByTags", () => splitDataByTags({ resolver, endpoints, zodSchemas, options })), + }; } function splitDataByTags({ @@ -51,7 +54,7 @@ function splitDataByTags({ }); Object.entries(zodSchemas).forEach(([zodSchemaName, zodSchemaCode]) => { - const tag = resolver.getTagByZodSchemaName(zodSchemaName); + const tag = options.modelsInCommon ? options.defaultTag : resolver.getTagByZodSchemaName(zodSchemaName); if (tag) { getTagElement(tag, data).zodSchemas[zodSchemaName] = zodSchemaCode; } diff --git a/src/generators/core/resolveConfig.ts b/src/generators/core/resolveConfig.ts index bc01962..1392784 100644 --- a/src/generators/core/resolveConfig.ts +++ b/src/generators/core/resolveConfig.ts @@ -4,14 +4,20 @@ import { deepMerge } from "@/generators/utils/object.utils"; export function resolveConfig({ fileConfig = {}, - params: { excludeTags, ...options }, + params: { excludeTags, inlineEndpointsExcludeModules, ...options }, }: { fileConfig?: Partial | null; - params: Partial & { excludeTags: string }>; + params: Partial< + Omit & { + excludeTags: string; + inlineEndpointsExcludeModules: string; + } + >; }) { const resolvedConfig = deepMerge(DEFAULT_GENERATE_OPTIONS, fileConfig ?? {}, { ...options, excludeTags: excludeTags?.split(","), + inlineEndpointsExcludeModules: inlineEndpointsExcludeModules?.split(","), }); resolvedConfig.checkAcl = resolvedConfig.acl && resolvedConfig.checkAcl; return resolvedConfig; diff --git a/src/generators/core/zod/getZodChain.ts b/src/generators/core/zod/getZodChain.ts index ce64c2d..a6df93d 100644 --- a/src/generators/core/zod/getZodChain.ts +++ b/src/generators/core/zod/getZodChain.ts @@ -24,11 +24,7 @@ export function getZodChain({ .otherwise(() => void 0); if (typeof schema.description === "string" && schema.description !== "" && options.withDescription) { - if (["\n", "\r", "\r\n"].some((c) => String.prototype.includes.call(schema.description, c))) { - chains.push(`describe(\`${schema.description}\`)`); - } else { - chains.push(`describe("${schema.description}")`); - } + chains.push(`describe(${JSON.stringify(schema.description)})`); } const output = chains diff --git a/src/generators/core/zod/getZodSchemasFromOpenAPIDoc.ts b/src/generators/core/zod/getZodSchemasFromOpenAPIDoc.ts index ef221b7..b8d4017 100644 --- a/src/generators/core/zod/getZodSchemasFromOpenAPIDoc.ts +++ b/src/generators/core/zod/getZodSchemasFromOpenAPIDoc.ts @@ -1,38 +1,44 @@ import { EnumZodSchemaData, SchemaResolver } from "@/generators/core/SchemaResolver.class"; +import { Profiler } from "@/helpers/profile.helper"; import { getZodSchemaName } from "@/generators/utils/zod-schema.utils"; import { getEnumZodSchemaCode, getZodSchema } from "./getZodSchema"; -export function getZodSchemasFromOpenAPIDoc(resolver: SchemaResolver) { +export function getZodSchemasFromOpenAPIDoc(resolver: SchemaResolver, profiler?: Profiler) { + const p = profiler ?? new Profiler(false); const zodSchemas = {} as Record; const enumZodSchemas = {} as Record; - Object.entries(resolver.openApiDoc.components?.schemas ?? {}).forEach(([name, schema]) => { - const schemaData = resolver.getSchemaDataByName(name); - if ( - resolver.options.excludeRedundantZodSchemas && - (!schemaData || (schemaData.deepRefOperations.length === 0 && schemaData.tags.length === 0)) - ) { - return; - } - - const zodSchemaName = getZodSchemaName(name, resolver.options.schemaSuffix); - if (zodSchemas[zodSchemaName]) { - return; - } - - const tag = resolver.getTagByZodSchemaName(zodSchemaName); - const schemaObject = resolver.resolveObject(schema); - if (schemaObject.enum) { - enumZodSchemas[zodSchemaName] = getEnumZodSchemaCode(schemaObject); - } else { - zodSchemas[zodSchemaName] = getZodSchema({ - schema, - resolver, - tag, - }).getCodeString(tag); - } - }); + Object.entries(resolver.openApiDoc.components?.schemas ?? {}).forEach(([name, schema]) => + p.runSync("zod.extract.schemaEntry", () => { + const schemaData = resolver.getSchemaDataByName(name); + if ( + resolver.options.excludeRedundantZodSchemas && + (!schemaData || (schemaData.deepRefOperations.length === 0 && schemaData.tags.length === 0)) + ) { + return; + } + + const zodSchemaName = getZodSchemaName(name, resolver.options.schemaSuffix); + if (zodSchemas[zodSchemaName]) { + return; + } + + const tag = resolver.getTagByZodSchemaName(zodSchemaName); + const schemaObject = resolver.resolveObject(schema); + if (schemaObject.enum) { + enumZodSchemas[zodSchemaName] = getEnumZodSchemaCode(schemaObject); + } else { + zodSchemas[zodSchemaName] = p.runSync("zod.extract.schemaToCode", () => + getZodSchema({ + schema, + resolver, + tag, + }).getCodeString(tag), + ); + } + }), + ); return { zodSchemas, enumZodSchemas }; } diff --git a/src/generators/core/zod/resolveZodSchemaName.ts b/src/generators/core/zod/resolveZodSchemaName.ts index 9f201c2..b6f1b84 100644 --- a/src/generators/core/zod/resolveZodSchemaName.ts +++ b/src/generators/core/zod/resolveZodSchemaName.ts @@ -7,6 +7,8 @@ import { getZodSchemaName, isNamedZodSchema } from "@/generators/utils/zod-schem import { ZodSchema } from "./ZodSchema.class"; +const resolverResolveZodSchemaNameCache = new WeakMap>(); + export function resolveZodSchemaName({ schema, zodSchema, @@ -21,6 +23,16 @@ export function resolveZodSchemaName({ tag: string; }): string { const result = zodSchema.getCodeString(); + const cacheKey = `${zodSchema.ref ?? ""}|${fallbackName ?? ""}|${tag}|${zodSchema.complexity}|${result}`; + let cacheForResolver = resolverResolveZodSchemaNameCache.get(resolver); + if (!cacheForResolver) { + cacheForResolver = new Map(); + resolverResolveZodSchemaNameCache.set(resolver, cacheForResolver); + } + const cachedName = cacheForResolver.get(cacheKey); + if (cachedName) { + return cachedName; + } if ((!isNamedZodSchema(result) || zodSchema.ref === undefined) && fallbackName) { // result is simple enough that it doesn't need to be assigned to a variable @@ -43,6 +55,7 @@ export function resolveZodSchemaName({ resolver.setZodSchema(zodSchemaName, result, tag); resolver.addZodSchemaForCompositeCode(result, zodSchema, zodSchemaName, schema); + cacheForResolver.set(cacheKey, zodSchemaName); return zodSchemaName; } @@ -57,14 +70,19 @@ export function resolveZodSchemaName({ // ref result is simple enough that it doesn't need to be assigned to a variable if (complexity < COMPLEXITY_THRESHOLD) { - return resolver.getCodeByZodSchemaName(result)!; + const resolvedName = resolver.getCodeByZodSchemaName(result)!; + cacheForResolver.set(cacheKey, resolvedName); + return resolvedName; } + cacheForResolver.set(cacheKey, result); return result; } if (zodSchema.ref) { - return resolver.getZodSchemaNameByRef(zodSchema.ref); + const resolvedRefName = resolver.getZodSchemaNameByRef(zodSchema.ref); + cacheForResolver.set(cacheKey, resolvedRefName); + return resolvedRefName; } throw new Error(`Invalid ref: ${zodSchema.ref}`); diff --git a/src/generators/generate/generateAcl.ts b/src/generators/generate/generateAcl.ts index 967eae2..2e42065 100644 --- a/src/generators/generate/generateAcl.ts +++ b/src/generators/generate/generateAcl.ts @@ -1,7 +1,18 @@ import { ACL_APP_ABILITIES, CASL_ABILITY_BINDING, CASL_ABILITY_IMPORT } from "@/generators/const/acl.const"; +import { Endpoint } from "@/generators/types/endpoint"; import { GenerateType, GenerateTypeParams, Import } from "@/generators/types/generate"; -import { getAclData, getAppAbilitiesType } from "@/generators/utils/generate/generate.acl.utils"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; +import { + getAbilityAction, + getAbilityConditionsTypes, + getAbilityDescription, + getAbilityFunctionName, + getAbilitySubject, + getAbilitySubjectTypes, + getAclData, + getAppAbilitiesType, + hasAbilityConditions, +} from "@/generators/utils/generate/generate.acl.utils"; +import { getInfiniteQueryName, getQueryName } from "@/generators/utils/generate/generate.query.utils"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; export function generateAcl({ resolver, data, tag }: GenerateTypeParams) { @@ -20,15 +31,27 @@ export function generateAcl({ resolver, data, tag }: GenerateTypeParams) { from: CASL_ABILITY_IMPORT.from, }; - const hbsTemplate = getHbsTemplateDelegate(resolver, "acl"); + const lines: string[] = []; + lines.push(renderImport(caslAbilityTupleImport)); + for (const modelsImport of modelsImports) { + lines.push(renderImport(modelsImport)); + } + lines.push(""); + + if (resolver.options.tsNamespaces) { + lines.push(`export namespace ${getNamespaceName({ type: GenerateType.Acl, tag, options: resolver.options })} {`); + } + + for (const endpoint of endpoints) { + lines.push(renderAbilityFunction(endpoint)); + lines.push(""); + } + + if (resolver.options.tsNamespaces) { + lines.push("}"); + } - return hbsTemplate({ - caslAbilityTupleImport, - modelsImports, - includeNamespace: resolver.options.tsNamespaces, - namespace: getNamespaceName({ type: GenerateType.Acl, tag, options: resolver.options }), - endpoints, - }); + return lines.join("\n").trimEnd() + "\n"; } export function generateAppAcl({ resolver, data }: Omit) { @@ -44,14 +67,84 @@ export function generateAppAcl({ resolver, data }: Omit`); + } + } else { + lines.push( + `export type ${ACL_APP_ABILITIES} = ${CASL_ABILITY_BINDING.abilityTuple};`, + ); + } + lines.push(""); + lines.push(`export type AppAbility = PureAbility<${ACL_APP_ABILITIES}>;`); + return lines.join("\n"); +} + +function renderImport(importData: Import) { + const names = [ + ...(importData.defaultImport ? [importData.defaultImport] : []), + ...(importData.bindings ? [`{ ${importData.bindings.join(", ")} }`] : []), + ].join(", "); + return `import ${names} from "${importData.from}";`; +} - return hbsTemplate({ - caslAbilityTupleImport, - modelsImports, - appAbilitiesType, - appAbilities: ACL_APP_ABILITIES, - abilityTuple: CASL_ABILITY_BINDING.abilityTuple, - subjectType: CASL_ABILITY_BINDING.subjectType, - }); +function renderAbilityFunction(endpoint: Endpoint) { + const abilityConditionsTypes = getAbilityConditionsTypes(endpoint) ?? []; + const hasConditions = hasAbilityConditions(endpoint); + const lines: string[] = []; + const abilityQuery = + endpoint.method === "get" + ? endpoint.mediaDownload + ? `\`${getQueryName(endpoint)}\` query or \`${getQueryName(endpoint, true)}\` mutation` + : `\`${getQueryName(endpoint)}\` query` + : `\`${getQueryName(endpoint)}\` mutation`; + lines.push("/**"); + lines.push( + ` * Use for ${abilityQuery} ability. ${hasConditions ? "For global ability, omit the object parameter." : ""}${getAbilityDescription(endpoint) ? "" : ""}`, + ); + if (getAbilityDescription(endpoint)) { + lines.push(` * @description ${getAbilityDescription(endpoint)}`); + } + if (hasConditions) { + for (const propertyType of abilityConditionsTypes) { + lines.push( + ` * @param { ${(propertyType.type ?? "") + (propertyType.zodSchemaName ?? "")} } object.${propertyType.name} ${propertyType.name} from ${propertyType.info}`, + ); + } + } + lines.push(` * @returns { AbilityTuple } An ability tuple indicating the user's ability to use ${abilityQuery}`); + lines.push(" */"); + lines.push(`export const ${getAbilityFunctionName(endpoint)} = (`); + if (hasConditions) { + lines.push( + ` object?: { ${abilityConditionsTypes + .map( + (propertyType) => + `${propertyType.name}${propertyType.required ? "" : "?"}: ${(propertyType.type ?? "") + (propertyType.zodSchemaName ?? "")}, `, + ) + .join("")} } `, + ); + } + lines.push(") => ["); + lines.push(` "${getAbilityAction(endpoint)}",`); + lines.push( + ` ${ + hasConditions + ? `object ? subject("${getAbilitySubject(endpoint)}", object) : "${getAbilitySubject(endpoint)}"` + : `"${getAbilitySubject(endpoint)}"` + }`, + ); + lines.push( + `] as ${CASL_ABILITY_BINDING.abilityTuple}<"${getAbilityAction(endpoint)}", ${getAbilitySubjectTypes(endpoint).join(" | ")}>;`, + ); + return lines.join("\n"); } diff --git a/src/generators/generate/generateAclCheck.ts b/src/generators/generate/generateAclCheck.ts index c41c598..688da2f 100644 --- a/src/generators/generate/generateAclCheck.ts +++ b/src/generators/generate/generateAclCheck.ts @@ -1,47 +1,39 @@ +import { ACL_APP_ABILITIES, ACL_CHECK_HOOK, CASL_ABILITY_BINDING } from "@/generators/const/acl.const"; import { - ACL_APP_ABILITIES, - ACL_CHECK_HOOK, - CASL_ABILITY_BINDING, - CASL_ABILITY_IMPORT, -} from "@/generators/const/acl.const"; -import { ABILITY_CONTEXT, ABILITY_CONTEXT_IMPORT, ERROR_HANDLERS } from "@/generators/const/deps.const"; -import { PACKAGE_IMPORT_PATH } from "@/generators/const/package.const"; + ABILITY_CONTEXT, + ABILITY_CONTEXT_IMPORT, + ERROR_HANDLERS, + ERROR_HANDLING_IMPORT, +} from "@/generators/const/deps.const"; import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; -import { Import } from "@/generators/types/generate"; import { getAppAbilitiesImportPath } from "@/generators/utils/generate/generate.utils"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; export function generateAclCheck(resolver: SchemaResolver) { - const hbsTemplate = getHbsTemplateDelegate(resolver, "acl-check"); + const abilityContextImportPath = resolver.options.abilityContextImportPath ?? ABILITY_CONTEXT_IMPORT.from; + const appAbilitiesImportPath = getAppAbilitiesImportPath(resolver.options); + const errorHandlingImportPath = resolver.options.errorHandlingImportPath ?? ERROR_HANDLING_IMPORT.from; - const abilityTupleImport: Import = { - bindings: [CASL_ABILITY_BINDING.abilityTuple], - from: CASL_ABILITY_IMPORT.from, - typeOnly: true, - }; + const genericAppAbilities = resolver.options.abilityContextGenericAppAbilities ? `<${ACL_APP_ABILITIES}>` : ""; + return `import { ${CASL_ABILITY_BINDING.abilityTuple} } from "@casl/ability"; +import { type ${ERROR_HANDLERS.ErrorHandler}, ${ERROR_HANDLERS.SharedErrorHandler} } from "${errorHandlingImportPath}"; +import { ${ABILITY_CONTEXT} } from "${abilityContextImportPath}"; +import { useCallback } from "react"; +import { ${ACL_APP_ABILITIES} } from "${appAbilitiesImportPath}"; - const errorHandlingImport: Import = { - bindings: [`type ${ERROR_HANDLERS.ErrorHandler}`, ERROR_HANDLERS.SharedErrorHandler], - from: PACKAGE_IMPORT_PATH, - }; +interface UseAclCheckProps { + errorHandler?: ${ERROR_HANDLERS.ErrorHandler}; +} + +export function ${ACL_CHECK_HOOK}({ errorHandler }: UseAclCheckProps = {}) { + const ability = ${ABILITY_CONTEXT}.useAbility${genericAppAbilities}(); - const appAbilitiesImport: Import = { - bindings: [ACL_APP_ABILITIES], - from: getAppAbilitiesImportPath(resolver.options), - typeOnly: true, - }; + const checkAcl = useCallback((appAbility: ${ACL_APP_ABILITIES}) => { + if (!ability.can(...(appAbility as ${CASL_ABILITY_BINDING.abilityTuple}))) { + (errorHandler ?? ${ERROR_HANDLERS.SharedErrorHandler}).rethrowError(new Error("ACL check failed")); + } + }, [ability, errorHandler]); - return hbsTemplate({ - abilityTupleImport, - appAbilitiesImport, - errorHandlingImport, - abilityContextImport: ABILITY_CONTEXT_IMPORT, - abilityContext: ABILITY_CONTEXT, - appAbilities: ACL_APP_ABILITIES, - abilityTuple: CASL_ABILITY_BINDING.abilityTuple, - errorHandler: ERROR_HANDLERS.ErrorHandler, - sharedErrorHandler: ERROR_HANDLERS.SharedErrorHandler, - aclCheckHook: ACL_CHECK_HOOK, - hasGenericAppAbilities: resolver.options.abilityContextGenericAppAbilities, - }); + return { checkAcl }; +} +`; } diff --git a/src/generators/generate/generateAppRestClient.ts b/src/generators/generate/generateAppRestClient.ts index 219af99..f9b3134 100644 --- a/src/generators/generate/generateAppRestClient.ts +++ b/src/generators/generate/generateAppRestClient.ts @@ -1,14 +1,14 @@ import { APP_REST_CLIENT_NAME } from "@/generators/const/deps.const"; import { PACKAGE_IMPORT_PATH } from "@/generators/const/package.const"; import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; export function generateAppRestClient(resolver: SchemaResolver) { - const hbsTemplate = getHbsTemplateDelegate(resolver, "app-rest-client"); + return `import { RestClient } from "${PACKAGE_IMPORT_PATH}"; - return hbsTemplate({ - appRestClientName: APP_REST_CLIENT_NAME, - baseUrl: resolver.getBaseUrl(), - restClientImportPath: PACKAGE_IMPORT_PATH, - }); +export const ${APP_REST_CLIENT_NAME} = new RestClient({ + config: { + baseURL: "${resolver.getBaseUrl()}" + }, +}); +`; } diff --git a/src/generators/generate/generateConfigs.ts b/src/generators/generate/generateConfigs.ts index 756fd31..088b041 100644 --- a/src/generators/generate/generateConfigs.ts +++ b/src/generators/generate/generateConfigs.ts @@ -1,8 +1,8 @@ import { BUILDERS_UTILS } from "@/generators/const/deps.const"; import { ZOD_IMPORT } from "@/generators/const/zod.const"; +import { BuilderConfig, DynamicColumnsConfig, DynamicInputsConfig } from "@/generators/types/builder-config"; import { GenerateType, GenerateTypeParams, Import } from "@/generators/types/generate"; import { getBuilderConfigs } from "@/generators/utils/generate/generate.configs.utils"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; export function generateConfigs(generateTypeParams: GenerateTypeParams) { @@ -27,22 +27,161 @@ export function generateConfigs(generateTypeParams: GenerateTypeParams) { from: resolver.options.dynamicColumnsImportPath, }; - const hbsTemplate = getHbsTemplateDelegate(resolver, "configs"); - - return hbsTemplate({ - hasZodImport, - zodImport: ZOD_IMPORT, - hasDynamicInputsImport, - dynamicInputsImport, - hasDynamicColumnsImport, - dynamicColumnsImport, - modelsImports, - queriesImports, - aclImports, - includeNamespace: resolver.options.tsNamespaces, - namespace: getNamespaceName({ type: GenerateType.Configs, tag, options: resolver.options }), - configs, - dynamicInputs: BUILDERS_UTILS.dynamicInputs, - dynamicColumns: BUILDERS_UTILS.dynamicColumns, - }); + const lines: string[] = []; + if (hasZodImport) { + lines.push(renderImport(ZOD_IMPORT)); + } + if (hasDynamicInputsImport) { + lines.push(renderImport(dynamicInputsImport)); + } + if (hasDynamicColumnsImport) { + lines.push(renderImport(dynamicColumnsImport)); + } + for (const modelsImport of modelsImports) { + lines.push(renderImport(modelsImport)); + } + for (const queriesImport of queriesImports) { + lines.push(renderImport(queriesImport)); + } + for (const aclImport of aclImports) { + lines.push(renderImport(aclImport)); + } + lines.push(""); + + if (resolver.options.tsNamespaces) { + lines.push( + `export namespace ${getNamespaceName({ type: GenerateType.Configs, tag, options: resolver.options })} {`, + ); + } + + for (const config of configs) { + lines.push(renderBuilderConfig(config)); + lines.push(""); + } + + if (resolver.options.tsNamespaces) { + lines.push("}"); + } + + return lines.join("\n").trimEnd() + "\n"; +} + +function renderImport(importData: Import) { + const names = [ + ...(importData.defaultImport ? [importData.defaultImport] : []), + ...(importData.bindings ? [`{ ${importData.bindings.join(", ")} }`] : []), + ].join(", "); + return `import ${names} from "${importData.from}";`; +} + +function renderInputsConfig(inputsConfig: DynamicInputsConfig) { + const lines: string[] = []; + lines.push("{"); + lines.push(` schema: ${inputsConfig.schema},`); + lines.push(" options: {"); + lines.push(" inputs: {"); + for (const key of Object.keys(inputsConfig.options.inputs)) { + lines.push(` ${key}: true,`); + } + lines.push(" },"); + lines.push(" },"); + lines.push("}"); + return lines.join("\n"); +} + +function renderColumnsConfig(columnsConfig: DynamicColumnsConfig) { + const lines: string[] = []; + lines.push("{"); + lines.push(` schema: ${columnsConfig.schema},`); + lines.push(" options: {"); + lines.push(" columns: {"); + for (const key of Object.keys(columnsConfig.options.columns)) { + lines.push(` ${key}: true,`); + } + lines.push(" },"); + if (columnsConfig.options.sortable) { + lines.push(` sortable: ${columnsConfig.options.sortable},`); + } + lines.push(" },"); + lines.push("}"); + return lines.join("\n"); +} + +function renderBuilderConfig(config: BuilderConfig) { + const lines: string[] = []; + lines.push(`export const ${config.name} = {`); + lines.push(" meta: {"); + lines.push(` title: "${config.title}",`); + lines.push(" },"); + lines.push(" readAll: {"); + if (config.readAll.acl) { + lines.push(` acl: ${config.readAll.acl},`); + } + lines.push(` schema: ${config.readAll.columns.schema},`); + lines.push(` paginated: ${config.readAll.paginated},`); + if (config.readAll.infinite) { + lines.push(` infinite: ${config.readAll.infinite},`); + } + if (config.readAll.filters) { + lines.push(" filters: {"); + lines.push(` schema: ${config.readAll.filters.schema},`); + lines.push( + ` filterDefs: ${BUILDERS_UTILS.dynamicInputs}(${renderInputsConfig(config.readAll.filters)})`, + ); + lines.push(" },"); + } + lines.push(` columns: ${BUILDERS_UTILS.dynamicColumns}(${renderColumnsConfig(config.readAll.columns)}),`); + lines.push(" },"); + + if (config.read) { + lines.push(" read: {"); + if (config.read.acl) { + lines.push(` acl: ${config.read.acl},`); + } + lines.push(` schema: ${config.read.schema},`); + lines.push(` query: ${config.read.query},`); + lines.push(" },"); + } + + if (config.create) { + lines.push(" create: {"); + if (config.create.acl) { + lines.push(` acl: ${config.create.acl},`); + } + if (config.create.inputDefs) { + lines.push(` schema: ${config.create.inputDefs.schema},`); + } + lines.push(` mutation: ${config.create.mutation},`); + if (config.create.inputDefs) { + lines.push(` inputDefs: ${BUILDERS_UTILS.dynamicInputs}(${renderInputsConfig(config.create.inputDefs)})`); + } + lines.push(" },"); + } + + if (config.update) { + lines.push(" update: {"); + if (config.update.acl) { + lines.push(` acl: ${config.update.acl},`); + } + if (config.update.inputDefs) { + lines.push(` schema: ${config.update.inputDefs.schema},`); + } + lines.push(` mutation: ${config.update.mutation},`); + if (config.update.inputDefs) { + lines.push(` inputDefs: ${BUILDERS_UTILS.dynamicInputs}(${renderInputsConfig(config.update.inputDefs)})`); + } + lines.push(" },"); + } + + if (config.delete) { + lines.push(" delete: {"); + if (config.delete.acl) { + lines.push(` acl: ${config.delete.acl},`); + } + lines.push(` mutation: ${config.delete.mutation},`); + lines.push(" },"); + } + + lines.push("};"); + return lines.join("\n"); } diff --git a/src/generators/generate/generateEndpoints.ts b/src/generators/generate/generateEndpoints.ts index 33db6cf..c54ffd3 100644 --- a/src/generators/generate/generateEndpoints.ts +++ b/src/generators/generate/generateEndpoints.ts @@ -1,16 +1,30 @@ import { APP_REST_CLIENT_NAME, ZOD_EXTENDED } from "@/generators/const/deps.const"; import { AXIOS_IMPORT, AXIOS_REQUEST_CONFIG_NAME, AXIOS_REQUEST_CONFIG_TYPE } from "@/generators/const/endpoints.const"; import { ZOD_IMPORT } from "@/generators/const/zod.const"; -import { EndpointParameter } from "@/generators/types/endpoint"; +import { Endpoint, EndpointParameter } from "@/generators/types/endpoint"; import { GenerateType, GenerateTypeParams, Import } from "@/generators/types/generate"; import { getUniqueArray } from "@/generators/utils/array.utils"; import { getModelsImports } from "@/generators/utils/generate/generate.imports.utils"; +import { + getEndpointBody, + getEndpointConfig, + getEndpointName, + getEndpointPath, + hasEndpointConfig, + mapEndpointParamsToFunctionParams, + requiresBody, +} from "@/generators/utils/generate/generate.endpoints.utils"; import { getAppRestClientImportPath, getZodExtendedImportPath } from "@/generators/utils/generate/generate.utils"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; +import { shouldInlineEndpointsForTag } from "@/generators/utils/tag.utils"; +import { getImportedZodSchemaName } from "@/generators/utils/generate/generate.zod.utils"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; import { isNamedZodSchema } from "@/generators/utils/zod-schema.utils"; export function generateEndpoints({ resolver, data, tag }: GenerateTypeParams) { + if (shouldInlineEndpointsForTag(tag, resolver.options)) { + return; + } + const endpoints = data.get(tag)?.endpoints; if (!endpoints || endpoints.length === 0) { return; @@ -30,7 +44,7 @@ export function generateEndpoints({ resolver, data, tag }: GenerateTypeParams) { const generateParse = resolver.options.parseRequestParams; - const endpointParams = endpoints.reduce((prev, curr) => [...prev, ...curr.parameters], [] as EndpointParameter[]); + const endpointParams = endpoints.flatMap((endpoint) => endpoint.parameters) as EndpointParameter[]; const endpointParamsParseSchemas = endpointParams .filter((param) => !["Path", "Header"].includes(param.type)) .map((param) => param.parameterSortingEnumSchemaName ?? param.zodSchema); @@ -52,24 +66,143 @@ export function generateEndpoints({ resolver, data, tag }: GenerateTypeParams) { zodSchemasAsTypes: getUniqueArray(endpointParams.map((param) => param.zodSchema).filter(isNamedZodSchema)), }); - const hbsTemplate = getHbsTemplateDelegate(resolver, "endpoints"); - - return hbsTemplate({ - appRestClientImport, - hasAxiosImport, - axiosImport, - hasZodImport, - zodImport: ZOD_IMPORT, - hasZodExtendedImport, - zodExtendedImport, - modelsImports, - includeNamespace: resolver.options.tsNamespaces, - namespace: getNamespaceName({ type: GenerateType.Endpoints, tag, options: resolver.options }), - restClientName: APP_REST_CLIENT_NAME, - hasAxiosRequestConfig, - axiosRequestConfigName: AXIOS_REQUEST_CONFIG_NAME, - axiosRequestConfigType: AXIOS_REQUEST_CONFIG_TYPE, - endpoints, - generateParse, - }); + const lines: string[] = []; + lines.push(renderImport(appRestClientImport)); + if (hasAxiosImport) { + lines.push(renderImport(axiosImport)); + } + if (hasZodImport) { + lines.push(renderImport(ZOD_IMPORT)); + } + if (hasZodExtendedImport) { + lines.push(renderImport(zodExtendedImport)); + } + for (const modelsImport of modelsImports) { + lines.push(renderImport(modelsImport)); + } + lines.push(""); + + if (resolver.options.tsNamespaces) { + lines.push( + `export namespace ${getNamespaceName({ type: GenerateType.Endpoints, tag, options: resolver.options })} {`, + ); + } + + for (const endpoint of endpoints) { + const endpointParams = renderEndpointParams(resolver, endpoint, {}); + const endpointArgs = renderEndpointArgs(resolver, endpoint, {}); + const endpointBody = getEndpointBody(endpoint); + const hasUndefinedEndpointBody = requiresBody(endpoint) && !endpointBody && hasEndpointConfig(endpoint, resolver); + const endpointConfig = renderEndpointConfig(resolver, endpoint); + + lines.push( + `export const ${getEndpointName(endpoint)} = (${endpointParams}${hasAxiosRequestConfig ? `${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, + ); + lines.push(` return ${APP_REST_CLIENT_NAME}.${endpoint.method}(`); + lines.push(` { resSchema: ${getImportedZodSchemaName(resolver, endpoint.response)} },`); + lines.push(` \`${getEndpointPath(endpoint)}\`,`); + + if (endpointBody) { + lines.push( + ` ${generateParse ? renderEndpointParamParse(resolver, endpointBody, endpointBody.name) : endpointBody.name},`, + ); + } else if (hasUndefinedEndpointBody) { + lines.push(" undefined,"); + } + + lines.push(` ${endpointConfig}`); + lines.push(" )"); + lines.push("};"); + } + + if (resolver.options.tsNamespaces) { + lines.push("}"); + } + + return lines.join("\n").trimEnd() + "\n"; +} + +function renderImport(importData: Import) { + const names = [ + ...(importData.defaultImport ? [importData.defaultImport] : []), + ...(importData.bindings ? [`{ ${importData.bindings.join(", ")} }`] : []), + ].join(", "); + return `import ${names} from "${importData.from}";`; +} + +function renderEndpointParams( + resolver: GenerateTypeParams["resolver"], + endpoint: Parameters[1], + options: Parameters[2], +) { + return mapEndpointParamsToFunctionParams(resolver, endpoint, options) + .map((param) => `${param.name}${param.required ? "" : "?"}: ${param.type}, `) + .join(""); +} + +function renderEndpointArgs( + resolver: GenerateTypeParams["resolver"], + endpoint: Parameters[1], + options: Parameters[2], +) { + return mapEndpointParamsToFunctionParams(resolver, endpoint, options) + .map((param) => param.name) + .join(", "); +} + +function renderEndpointParamParse( + resolver: GenerateTypeParams["resolver"], + param: EndpointParameter, + paramName: string, +) { + const addOptional = + !(param.parameterObject ?? param.bodyObject)?.required && + (Boolean(param.parameterSortingEnumSchemaName) || isNamedZodSchema(param.zodSchema)); + const schemaValue = param.parameterSortingEnumSchemaName + ? `${ZOD_EXTENDED.namespace}.${ZOD_EXTENDED.exports.sortExp}(${getImportedZodSchemaName( + resolver, + param.parameterSortingEnumSchemaName, + )})${addOptional ? ".optional()" : ""}` + : `${getImportedZodSchemaName(resolver, param.zodSchema)}${addOptional ? ".optional()" : ""}`; + const queryArgs = param.type === "Query" ? `, { type: "query", name: "${paramName}" }` : ""; + return `${ZOD_EXTENDED.namespace}.${ZOD_EXTENDED.exports.parse}(${schemaValue}, ${paramName}${queryArgs})`; +} + +function renderEndpointConfig(resolver: GenerateTypeParams["resolver"], endpoint: Endpoint) { + const endpointConfig = getEndpointConfig(endpoint); + const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; + if (Object.keys(endpointConfig).length === 0) { + return hasAxiosRequestConfig ? AXIOS_REQUEST_CONFIG_NAME : ""; + } + + const lines: string[] = []; + lines.push("{"); + if (hasAxiosRequestConfig) { + lines.push(` ...${AXIOS_REQUEST_CONFIG_NAME},`); + } + if (endpointConfig.params) { + lines.push(" params: {"); + for (const param of endpointConfig.params) { + const value = resolver.options.parseRequestParams + ? renderEndpointParamParse(resolver, param, param.value) + : param.value; + lines.push(` ${param.name}: ${value},`); + } + lines.push(" },"); + } + if (endpointConfig.headers) { + lines.push(" headers: {"); + for (const [key, value] of Object.entries(endpointConfig.headers)) { + lines.push(` '${key}': ${value},`); + } + lines.push(" },"); + } + if (endpoint.response === "z.instanceof(Blob)") { + lines.push(' responseType: "blob",'); + } + if (endpoint.mediaDownload) { + lines.push(" rawResponse: true,"); + } + lines.push("}"); + return lines.join("\n "); } diff --git a/src/generators/generate/generateModels.ts b/src/generators/generate/generateModels.ts index 92f1862..c3380b0 100644 --- a/src/generators/generate/generateModels.ts +++ b/src/generators/generate/generateModels.ts @@ -1,20 +1,38 @@ import { ZOD_IMPORT } from "@/generators/const/zod.const"; import { getZodSchemaRefs } from "@/generators/core/zod/getZodSchemaRefs"; -import { GenerateType, GenerateTypeParams, GenerateZodSchemaData } from "@/generators/types/generate"; -import { getModelsImports } from "@/generators/utils/generate/generate.imports.utils"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; +import { Endpoint } from "@/generators/types/endpoint"; +import { GenerateType, GenerateTypeParams, GenerateZodSchemaData, Import } from "@/generators/types/generate"; +import { getModelsImports, getImportPath } from "@/generators/utils/generate/generate.imports.utils"; +import { getTagImportPath } from "@/generators/utils/generate/generate.utils"; +import { + getZodSchemaDescription, + getZodSchemaInferedTypeName, + getZodSchemaPropertyDescriptions, + getZodSchemaType, +} from "@/generators/utils/generate/generate.zod.utils"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; -import { isEnumZodSchema } from "@/generators/utils/zod-schema.utils"; +import { isEnumZodSchema, isNamedZodSchema } from "@/generators/utils/zod-schema.utils"; +import { getUniqueArray } from "@/generators/utils/array.utils"; export function generateModels({ resolver, data, tag }: GenerateTypeParams) { + if (resolver.options.modelsInCommon && resolver.options.splitByTags && tag !== resolver.options.defaultTag) { + return renderModelsProxy({ resolver, data, tag }); + } + const zodSchemas = data.get(tag)?.zodSchemas; if (!zodSchemas || Object.keys(zodSchemas).length === 0) { return; } - const refZodSchemas = Object.keys(zodSchemas) - .reduce((acc, zodSchema) => [...acc, ...getZodSchemaRefs(resolver, zodSchema)], [] as string[]) - .filter((zodSchema) => !zodSchemas[zodSchema]); + const refZodSchemas = [] as string[]; + for (const zodSchema of Object.keys(zodSchemas)) { + const refs = getZodSchemaRefs(resolver, zodSchema); + for (const ref of refs) { + if (!zodSchemas[ref]) { + refZodSchemas.push(ref); + } + } + } const modelsImports = getModelsImports({ resolver, @@ -22,29 +40,180 @@ export function generateModels({ resolver, data, tag }: GenerateTypeParams) { zodSchemas: refZodSchemas, }); - const zodSchemasData: Record = Object.entries(zodSchemas).reduce( - (acc, [key, code]) => { - const schemaObj = resolver.getZodSchemaObj(key); + const zodSchemasData: Record = {}; + for (const [key, code] of Object.entries(zodSchemas)) { + const schemaRef = resolver.getRefByZodSchemaName(key); + zodSchemasData[key] = { + code, + isCiruclar: schemaRef ? resolver.isSchemaCircular(schemaRef) : false, + isEnum: isEnumZodSchema(code), + schemaObj: resolver.getZodSchemaObj(key), + }; + } - const value = { - code, - isEnum: isEnumZodSchema(code), - schemaObj, - }; + const lines: string[] = []; + lines.push(renderImport(ZOD_IMPORT)); + for (const modelsImport of modelsImports) { + lines.push(renderImport(modelsImport)); + } + lines.push(""); - return { ...acc, [key]: value }; - }, - {}, - ); + if (resolver.options.tsNamespaces) { + lines.push(`export namespace ${getNamespaceName({ type: GenerateType.Models, tag, options: resolver.options })} {`); + } - const hbsTemplate = getHbsTemplateDelegate(resolver, "models"); + for (const [name, zodSchema] of Object.entries(zodSchemasData)) { + lines.push(renderModelJsDocs({ name, zodSchema, tag, resolver })); + lines.push(`export const ${name} = ${zodSchema.code};`); + lines.push(`export type ${getZodSchemaInferedTypeName(name, resolver.options)} = z.infer;`); + if (zodSchema.isEnum) { + lines.push(`export const ${getZodSchemaInferedTypeName(name, resolver.options)} = ${name}.enum;`); + } + lines.push(""); + } - return hbsTemplate({ - zodImport: ZOD_IMPORT, - modelsImports, - includeNamespace: resolver.options.tsNamespaces, - namespace: getNamespaceName({ type: GenerateType.Models, tag, options: resolver.options }), - tag, - zodSchemasData, + if (resolver.options.tsNamespaces) { + lines.push("}"); + } + + return lines.join("\n").trimEnd() + "\n"; +} + +function renderModelsProxy({ resolver, data, tag }: GenerateTypeParams) { + const commonZodSchemas = data.get(resolver.options.defaultTag)?.zodSchemas ?? {}; + const endpoints = data.get(tag)?.endpoints ?? []; + const schemaNames = getUsedSchemaNames({ resolver, endpoints }).filter((schemaName) => + Boolean(commonZodSchemas[schemaName]), + ); + if (schemaNames.length === 0) { + return; + } + + const modelsNamespace = getNamespaceName({ type: GenerateType.Models, tag, options: resolver.options }); + const commonNamespace = getNamespaceName({ + type: GenerateType.Models, + tag: resolver.options.defaultTag, + options: resolver.options, }); + const commonModelsPath = `${getImportPath(resolver.options)}${getTagImportPath({ + type: GenerateType.Models, + tag: resolver.options.defaultTag, + includeTagDir: true, + options: resolver.options, + })}`; + const inferredTypeNames = schemaNames.map((schemaName) => getZodSchemaInferedTypeName(schemaName, resolver.options)); + const enumInferredTypeNames = schemaNames + .filter((schemaName) => isEnumZodSchema(commonZodSchemas[schemaName] ?? "")) + .map((schemaName) => getZodSchemaInferedTypeName(schemaName, resolver.options)); + + if (resolver.options.tsNamespaces) { + const lines: string[] = []; + lines.push(`import { ${commonNamespace} } from "${commonModelsPath}";`); + lines.push(""); + lines.push(`export namespace ${modelsNamespace} {`); + for (const schemaName of schemaNames) { + lines.push(` export const ${schemaName} = ${commonNamespace}.${schemaName};`); + } + for (const typeName of inferredTypeNames) { + lines.push(` export type ${typeName} = ${commonNamespace}.${typeName};`); + } + for (const enumName of enumInferredTypeNames) { + lines.push(` export const ${enumName} = ${commonNamespace}.${enumName};`); + } + lines.push("}"); + lines.push(""); + return lines.join("\n"); + } + + const valueExports = getUniqueArray([...schemaNames, ...enumInferredTypeNames]); + + const lines: string[] = []; + if (valueExports.length > 0) { + lines.push(`export { ${valueExports.join(", ")} } from "${commonModelsPath}";`); + } + if (inferredTypeNames.length > 0) { + lines.push(`export type { ${inferredTypeNames.join(", ")} } from "${commonModelsPath}";`); + } + + return lines.join("\n") + "\n"; +} + +function getUsedSchemaNames({ + resolver, + endpoints, +}: { + resolver: GenerateTypeParams["resolver"]; + endpoints: Endpoint[]; +}) { + const usedSchemaNames = new Set(); + const queue: string[] = []; + + const enqueue = (schemaName?: string) => { + if (!schemaName || !isNamedZodSchema(schemaName) || usedSchemaNames.has(schemaName)) { + return; + } + usedSchemaNames.add(schemaName); + queue.push(schemaName); + }; + + for (const endpoint of endpoints) { + enqueue(endpoint.response); + for (const error of endpoint.errors) { + enqueue(error.zodSchema); + } + for (const param of endpoint.parameters) { + enqueue(param.zodSchema); + enqueue(param.parameterSortingEnumSchemaName); + } + } + + while (queue.length > 0) { + const schemaName = queue.shift(); + if (!schemaName) { + continue; + } + const refs = getZodSchemaRefs(resolver, schemaName); + for (const ref of refs) { + enqueue(ref); + } + } + + return Array.from(usedSchemaNames); +} + +function renderImport(importData: Import) { + const names = [ + ...(importData.defaultImport ? [importData.defaultImport] : []), + ...(importData.bindings ? [`{ ${importData.bindings.join(", ")} }`] : []), + ].join(", "); + return `import ${names} from "${importData.from}";`; +} + +function renderModelJsDocs({ + name, + zodSchema, + tag, + resolver, +}: { + name: string; + zodSchema: GenerateZodSchemaData; + tag: string; + resolver: GenerateTypeParams["resolver"]; +}) { + const lines = [`/** `, ` * ${name} `, ` * @type { ${getZodSchemaType(zodSchema)} }`]; + + const description = getZodSchemaDescription(zodSchema); + if (description) { + lines.push(` * @description ${description.replace(/\n/g, "\n *")}`); + } + + const propertyDescriptions = getZodSchemaPropertyDescriptions(resolver, zodSchema, tag); + if (propertyDescriptions) { + for (const [property, info] of Object.entries(propertyDescriptions)) { + lines.push(` * @property { ${info.type} } ${property} ${info.description.replace(/\n/g, "\n *")} `); + } + } + + lines.push(" */"); + return lines.join("\n"); } diff --git a/src/generators/generate/generateQueries.ts b/src/generators/generate/generateQueries.ts index 1c64619..33c3710 100644 --- a/src/generators/generate/generateQueries.ts +++ b/src/generators/generate/generateQueries.ts @@ -1,30 +1,80 @@ import { ACL_CHECK_HOOK } from "@/generators/const/acl.const"; -import { MUTATION_EFFECTS, QUERY_MODULE_ENUM, QUERY_OPTIONS_TYPES } from "@/generators/const/deps.const"; -import { AXIOS_DEFAULT_IMPORT_NAME, AXIOS_IMPORT, AXIOS_REQUEST_CONFIG_TYPE } from "@/generators/const/endpoints.const"; +import { + APP_REST_CLIENT_NAME, + MUTATION_EFFECTS, + QUERY_MODULE_ENUM, + QUERY_OPTIONS_TYPES, + ZOD_EXTENDED, +} from "@/generators/const/deps.const"; +import { + AXIOS_DEFAULT_IMPORT_NAME, + AXIOS_IMPORT, + AXIOS_REQUEST_CONFIG_NAME, + AXIOS_REQUEST_CONFIG_TYPE, +} from "@/generators/const/endpoints.const"; +import { PACKAGE_IMPORT_PATH } from "@/generators/const/package.const"; import { QUERIES_MODULE_NAME, QUERY_HOOKS, QUERY_IMPORT } from "@/generators/const/queries.const"; -import { EndpointParameter } from "@/generators/types/endpoint"; +import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; +import { Endpoint, EndpointParameter } from "@/generators/types/endpoint"; import { GenerateType, GenerateTypeParams, Import } from "@/generators/types/generate"; import { getUniqueArray } from "@/generators/utils/array.utils"; +import { + getAbilityConditionsTypes, + getAbilityFunctionName, + getImportedAbilityFunctionName, + hasAbilityConditions, +} from "@/generators/utils/generate/generate.acl.utils"; +import { + getEndpointBody, + getEndpointConfig, + getEndpointName, + getEndpointPath, + hasEndpointConfig, + getImportedEndpointName, + mapEndpointParamsToFunctionParams, + requiresBody, +} from "@/generators/utils/generate/generate.endpoints.utils"; +import { getSchemaDescriptions } from "@/generators/utils/generate/generate.openapi.utils"; import { getAclImports, getEndpointsImports, getModelsImports, } from "@/generators/utils/generate/generate.imports.utils"; +import { getInfiniteQueryName, getQueryName } from "@/generators/utils/generate/generate.query.utils"; import { + getAppRestClientImportPath, getAclCheckImportPath, getMutationEffectsImportPath, getQueryModulesImportPath, + getQueryTypesImportPath, + getZodExtendedImportPath, } from "@/generators/utils/generate/generate.utils"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; +import { + getImportedZodSchemaInferedTypeName, + getImportedZodSchemaName, +} from "@/generators/utils/generate/generate.zod.utils"; +import { ZOD_IMPORT } from "@/generators/const/zod.const"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; -import { isInfiniteQuery, isMutation, isQuery } from "@/generators/utils/query.utils"; +import { isSchemaObject } from "@/generators/utils/openapi-schema.utils"; +import { isParamMediaTypeAllowed } from "@/generators/utils/openapi.utils"; +import { getDestructuredVariables, isInfiniteQuery, isMutation, isQuery } from "@/generators/utils/query.utils"; +import { shouldInlineEndpointsForTag } from "@/generators/utils/tag.utils"; import { isNamedZodSchema } from "@/generators/utils/zod-schema.utils"; +import { invalidVariableNameCharactersToCamel } from "@/generators/utils/js.utils"; -export function generateQueries({ resolver, data, tag }: GenerateTypeParams) { +const endpointParamMappingCache = new WeakMap< + SchemaResolver, + WeakMap>> +>(); + +export function generateQueries(params: GenerateTypeParams) { + const { resolver, data, tag } = params; + const inlineEndpoints = shouldInlineEndpointsForTag(tag, resolver.options); const endpoints = data.get(tag)?.endpoints; if (!endpoints || endpoints.length === 0) { return; } + const endpointGroups = groupEndpoints(endpoints, resolver); const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; const hasAxiosDefaultImport = endpoints.some(({ mediaUpload }) => mediaUpload); @@ -35,9 +85,7 @@ export function generateQueries({ resolver, data, tag }: GenerateTypeParams) { from: AXIOS_IMPORT.from, }; - const queryEndpoints = endpoints.filter(isQuery); - const infiniteQueryEndpoints = queryEndpoints.filter((endpoint) => isInfiniteQuery(endpoint, resolver.options)); - const mutationEndpoints = endpoints.filter(isMutation); + const { queryEndpoints, infiniteQueryEndpoints, mutationEndpoints, aclEndpoints } = endpointGroups; const queryImport: Import = { bindings: [ @@ -56,11 +104,10 @@ export function generateQueries({ resolver, data, tag }: GenerateTypeParams) { const hasMutationEffectsImport = hasMutationEffects && mutationEndpoints.length > 0; const mutationEffectsImport: Import = { - bindings: mutationEndpoints.length > 0 ? [MUTATION_EFFECTS.optionsType, MUTATION_EFFECTS.hookName] : [], + bindings: [...(mutationEndpoints.length > 0 ? [MUTATION_EFFECTS.optionsType, MUTATION_EFFECTS.hookName] : [])], from: getMutationEffectsImportPath(resolver.options), }; - const aclEndpoints = endpoints.filter((endpoint) => endpoint.acl); const hasAclCheck = resolver.options.checkAcl && aclEndpoints.length > 0; const aclCheckImport: Import = { bindings: [ACL_CHECK_HOOK], @@ -69,27 +116,59 @@ export function generateQueries({ resolver, data, tag }: GenerateTypeParams) { const queryTypesImport: Import = { bindings: [ + "OpenApiQueryConfig", ...(queryEndpoints.length > 0 ? [QUERY_OPTIONS_TYPES.query] : []), ...(resolver.options.infiniteQueries && infiniteQueryEndpoints.length > 0 ? [QUERY_OPTIONS_TYPES.infiniteQuery] : []), ...(mutationEndpoints.length > 0 ? [QUERY_OPTIONS_TYPES.mutation] : []), ], - from: resolver.options.queryTypesImportPath, + from: getQueryTypesImportPath(resolver.options), + }; + + const hasWorkspaceContext = + resolver.options.workspaceContext && + endpoints.some((endpoint) => getWorkspaceParamNames(resolver, endpoint).length > 0); + const workspaceContextImport: Import = { + bindings: ["OpenApiWorkspaceContext"], + from: PACKAGE_IMPORT_PATH, + }; + + const endpointParams = endpoints.flatMap((endpoint) => endpoint.parameters) as EndpointParameter[]; + const endpointParamsParseSchemas = endpointParams + .filter((param) => !["Path", "Header"].includes(param.type)) + .map((param) => param.parameterSortingEnumSchemaName ?? param.zodSchema); + const endpointResponseSchemas = endpoints.map((endpoint) => endpoint.response); + const endpointRuntimeSchemas = getUniqueArray([ + ...endpointResponseSchemas, + ...(resolver.options.parseRequestParams ? endpointParamsParseSchemas : []), + ]); + const hasZodImport = inlineEndpoints && endpointRuntimeSchemas.some((schema) => !isNamedZodSchema(schema)); + const hasZodExtendedImport = + inlineEndpoints && resolver.options.parseRequestParams && endpointParamsParseSchemas.length > 0; + const appRestClientImport: Import = { + bindings: [APP_REST_CLIENT_NAME], + from: getAppRestClientImportPath(resolver.options), + }; + const zodExtendedImport: Import = { + bindings: [ZOD_EXTENDED.namespace], + from: getZodExtendedImportPath(resolver.options), }; - const endpointParams = endpoints.reduce((prev, curr) => [...prev, ...curr.parameters], [] as EndpointParameter[]); const modelsImports = getModelsImports({ resolver, tag, + zodSchemas: inlineEndpoints ? endpointRuntimeSchemas.filter(isNamedZodSchema) : [], zodSchemasAsTypes: getUniqueArray(endpointParams.map((param) => param.zodSchema).filter(isNamedZodSchema)), }); - const endpointsImports = getEndpointsImports({ - tag, - endpoints, - options: resolver.options, - }); + const endpointsImports = inlineEndpoints + ? [] + : getEndpointsImports({ + tag, + endpoints, + options: resolver.options, + }); const aclImports = getAclImports({ tag, @@ -97,28 +176,773 @@ export function generateQueries({ resolver, data, tag }: GenerateTypeParams) { options: resolver.options, }); - const hbsTemplate = getHbsTemplateDelegate(resolver, "queries"); - - return hbsTemplate({ - hasAxiosImport, - axiosImport, - queryImport, - hasMutationEffects, - queryModulesImport, - hasMutationEffectsImport, - mutationEffectsImport, - hasAclCheck, - aclCheckImport, - queryTypesImport, - modelsImports, - endpointsImports, - aclImports, - includeNamespace: resolver.options.tsNamespaces, - tag, - namespace: getNamespaceName({ type: GenerateType.Queries, tag, options: resolver.options }), - queriesModuleName: QUERIES_MODULE_NAME, - queryModuleEnum: QUERY_MODULE_ENUM, - endpoints, + const namespace = getNamespaceName({ type: GenerateType.Queries, tag, options: resolver.options }); + const lines: string[] = []; + + if (hasAxiosImport) { + lines.push(renderImport(axiosImport)); + } + if (inlineEndpoints) { + lines.push(renderImport(appRestClientImport)); + if (hasZodImport) { + lines.push(renderImport(ZOD_IMPORT)); + } + if (hasZodExtendedImport) { + lines.push(renderImport(zodExtendedImport)); + } + } + lines.push(renderImport(queryImport)); + if (hasMutationEffects) { + lines.push(renderImport(queryModulesImport)); + } + if (hasMutationEffectsImport) { + lines.push(renderImport(mutationEffectsImport)); + } + if (hasAclCheck) { + lines.push(renderImport(aclCheckImport)); + for (const aclImport of aclImports) { + lines.push(renderImport(aclImport)); + } + } + lines.push(renderImport(queryTypesImport)); + if (hasWorkspaceContext) { + lines.push(renderImport(workspaceContextImport)); + } + for (const modelsImport of modelsImports) { + lines.push(renderImport(modelsImport)); + } + for (const endpointsImport of endpointsImports) { + lines.push(renderImport(endpointsImport)); + } + lines.push(""); + + if (resolver.options.tsNamespaces) { + lines.push(`export namespace ${namespace} {`); + } + + if (inlineEndpoints) { + lines.push(...renderInlineEndpoints({ resolver, endpoints })); + lines.push(""); + } + + lines.push( + `export const ${QUERIES_MODULE_NAME} = ${hasMutationEffects ? `${QUERY_MODULE_ENUM}.${tag}` : `"${namespace}"`};`, + ); + lines.push(""); + + lines.push(renderQueryKeys({ resolver, queryEndpoints })); + lines.push(""); + + for (const endpoint of endpoints) { + const endpointInfo = endpointGroups.infoByEndpoint.get(endpoint); + if (endpointInfo?.query) { + lines.push(renderQuery({ resolver, endpoint, inlineEndpoints })); + lines.push(""); + } + if (endpointInfo?.mutation) { + lines.push( + renderMutation({ + resolver, + endpoint, + inlineEndpoints, + precomputed: endpointGroups.mutationDataByEndpoint.get(endpoint), + }), + ); + lines.push(""); + } + if (endpointInfo?.infiniteQuery) { + lines.push(renderInfiniteQuery({ resolver, endpoint, inlineEndpoints })); + lines.push(""); + } + } + + if (resolver.options.tsNamespaces) { + lines.push("}"); + } + + return lines.join("\n").trimEnd() + "\n"; +} + +function getEndpointParamMapping( + resolver: SchemaResolver, + endpoint: Endpoint, + options: Parameters[2], +) { + let resolverCache = endpointParamMappingCache.get(resolver); + if (!resolverCache) { + resolverCache = new WeakMap(); + endpointParamMappingCache.set(resolver, resolverCache); + } + + let endpointCache = resolverCache.get(endpoint); + if (!endpointCache) { + endpointCache = new Map(); + resolverCache.set(endpoint, endpointCache); + } + + const key = JSON.stringify( + Object.entries(options ?? {}) + .sort(([left], [right]) => left.localeCompare(right)) + .map(([optionName, optionValue]) => [optionName, Boolean(optionValue)]), + ); + const cached = endpointCache.get(key); + if (cached) { + return cached; + } + + const computed = mapEndpointParamsToFunctionParams(resolver, endpoint, options); + endpointCache.set(key, computed); + return computed; +} + +function renderImport(importData: Import) { + const names = [ + ...(importData.defaultImport ? [importData.defaultImport] : []), + ...(importData.bindings ? [`{ ${importData.bindings.join(", ")} }`] : []), + ].join(", "); + return `import ${names} from "${importData.from}";`; +} + +function renderEndpointParams( + resolver: SchemaResolver, + endpoint: Endpoint, + options: Parameters[2], +) { + return getEndpointParamMapping(resolver, endpoint, options) + .map((param) => `${param.name}${param.required ? "" : "?"}: ${param.type}`) + .join(", "); +} + +function renderEndpointArgs( + resolver: SchemaResolver, + endpoint: Endpoint, + options: Parameters[2], + replacements?: Record, +) { + return getEndpointParamMapping(resolver, endpoint, options) + .map((param) => replacements?.[param.name] ?? param.name) + .join(", "); +} + +function renderEndpointParamDescription(endpointParam: ReturnType[0]) { + const strs = [`${endpointParam.paramType} parameter`]; + const description = endpointParam.parameterObject?.description || endpointParam.bodyObject?.description; + if (description) { + strs.push(description); + } + + let schema: any = undefined; + let mediaTypeObject: any = undefined; + if (endpointParam.parameterObject?.schema && isSchemaObject(endpointParam.parameterObject.schema)) { + schema = endpointParam.parameterObject?.schema; + } + if (endpointParam.bodyObject?.content) { + const mediaTypes = Object.keys(endpointParam.bodyObject.content ?? {}); + const matchingMediaType = mediaTypes.find(isParamMediaTypeAllowed); + if (matchingMediaType) { + mediaTypeObject = endpointParam.bodyObject.content[matchingMediaType]; + if (mediaTypeObject.schema && isSchemaObject(mediaTypeObject.schema)) { + schema = mediaTypeObject.schema; + } + } + } + + if (schema) { + strs.push(...getSchemaDescriptions(schema)); + } + if (mediaTypeObject?.example) { + strs.push(`Example: \`${mediaTypeObject.example}\``); + } + return strs.join(". "); +} + +function getWorkspaceParamNames(resolver: SchemaResolver, endpoint: Endpoint) { + const endpointParams = getEndpointParamMapping(resolver, endpoint, {}); + const endpointParamNames = new Set(endpointParams.map((param) => param.name)); + const workspaceParamNames = endpointParams.filter((param) => param.paramType === "Path").map((param) => param.name); + + const aclParamNames = (getAbilityConditionsTypes(endpoint) ?? []) + .map((condition) => invalidVariableNameCharactersToCamel(condition.name)) + .filter((name) => endpointParamNames.has(name)); + + return getUniqueArray([...workspaceParamNames, ...aclParamNames]); +} + +function getWorkspaceParamReplacements(resolver: SchemaResolver, endpoint: Endpoint) { + return Object.fromEntries( + getWorkspaceParamNames(resolver, endpoint).map((name) => [name, `${name}FromWorkspace`]), + ) as Record; +} + +function renderWorkspaceParamResolutions({ + replacements, + indent, +}: { + replacements: Record; + indent: string; +}) { + const workspaceParamNames = Object.keys(replacements); + if (workspaceParamNames.length === 0) { + return []; + } + + const lines = [`${indent}const workspaceContext = OpenApiWorkspaceContext.useContext();`]; + for (const paramName of workspaceParamNames) { + lines.push( + `${indent}const ${replacements[paramName]} = OpenApiWorkspaceContext.resolveParam(workspaceContext, "${paramName}", ${paramName});`, + ); + } + return lines; +} + +function renderAclCheckCall( + resolver: SchemaResolver, + endpoint: Endpoint, + replacements?: Record, + indent = "", +) { + const checkParams = getAbilityConditionsTypes(endpoint)?.map((condition) => + invalidVariableNameCharactersToCamel(condition.name), + ); + const paramNames = new Set(endpoint.parameters.map((param) => invalidVariableNameCharactersToCamel(param.name))); + const hasAllCheckParams = checkParams?.every((param) => paramNames.has(param)); + const args = + hasAbilityConditions(endpoint) && hasAllCheckParams + ? `{ ${(checkParams ?? []) + .map((param) => { + const resolvedParam = replacements?.[param] ?? param; + return resolvedParam === param ? param : `${param}: ${resolvedParam}`; + }) + .join(", ")} } ` + : ""; + return `${indent}checkAcl(${getImportedAbilityFunctionName(endpoint, resolver.options)}(${args}));`; +} + +function addAsteriskAfterNewLine(str: string) { + return str.replace(/\n/g, "\n *"); +} + +function renderQueryJsDocs({ + resolver, + endpoint, + mode, +}: { + resolver: SchemaResolver; + endpoint: Endpoint; + mode: "query" | "mutation" | "infiniteQuery"; +}) { + // TODO(perf-migration): parity mismatch vs legacy HBS around infinite-query JSDoc param lines + // for some endpoints; keep experimental renderer opt-in until this is resolved. + const lines: string[] = ["/** "]; + + if (mode === "infiniteQuery") { + lines.push(` * Infinite query \`${getInfiniteQueryName(endpoint)}${endpoint.summary ? "" : ""}`); + } else if (mode === "query") { + lines.push( + ` * Query \`${getQueryName(endpoint)}\`${endpoint.summary && endpoint.mediaDownload ? " - recommended when file should be cached" : ""}`, + ); + } else { + lines.push( + ` * Mutation \`${getQueryName(endpoint, true)}\`${endpoint.summary && endpoint.mediaDownload ? " - recommended when file should not be cached" : ""}`, + ); + } + + if (endpoint.summary) { + lines.push(` * @summary ${addAsteriskAfterNewLine(endpoint.summary)}`); + } + if (endpoint.description) { + lines.push(` * @description ${addAsteriskAfterNewLine(endpoint.description)}`); + } + if (endpoint.acl) { + lines.push(` * @permission Requires \`${getAbilityFunctionName(endpoint)}\` ability `); + } + + const params = getEndpointParamMapping(resolver, endpoint, { + ...(mode !== "infiniteQuery" ? { includeFileParam: true } : {}), + }); + for (const endpointParam of params) { + const source = mode === "mutation" ? "mutation" : "object"; + lines.push( + ` * @param { ${endpointParam.type} } ${source}.${endpointParam.name} ${renderEndpointParamDescription(endpointParam)}`, + ); + } + + if (mode === "query") { + lines.push(" * @param { AppQueryOptions } options Query options"); + } else if (mode === "mutation") { + lines.push( + ` * @param { AppMutationOptions${resolver.options.mutationEffects ? ` & ${MUTATION_EFFECTS.optionsType}` : ""} } options Mutation options`, + ); + } else { + lines.push(" * @param { AppInfiniteQueryOptions } options Infinite query options"); + } + + const withAxiosResponse = endpoint.mediaDownload && mode !== "infiniteQuery"; + const resultType = `${withAxiosResponse ? "AxiosResponse<" : ""}${getImportedZodSchemaInferedTypeName( + resolver, + endpoint.response, + )}${withAxiosResponse ? ">" : ""}`; + + if (mode === "query") { + lines.push(` * @returns { UseQueryResult<${resultType}> } ${endpoint.responseDescription ?? ""}`); + } else if (mode === "mutation") { + lines.push(` * @returns { UseMutationResult<${resultType}> } ${endpoint.responseDescription ?? ""}`); + } else { + lines.push(` * @returns { UseInfiniteQueryResult<${resultType}> } ${endpoint.responseDescription ?? ""}`); + } + + lines.push(` * @statusCodes [${endpoint.responseStatusCodes.join(", ")}]`); + lines.push(" */"); + return lines.join("\n"); +} + +function renderQueryKeys({ resolver, queryEndpoints }: { resolver: SchemaResolver; queryEndpoints: Endpoint[] }) { + if (queryEndpoints.length === 0) { + return ""; + } + + const lines: string[] = []; + lines.push("export const keys = {"); + lines.push(` all: [${QUERIES_MODULE_NAME}] as const,`); + for (const endpoint of queryEndpoints) { + lines.push( + ` ${getEndpointName(endpoint)}: (${renderEndpointParams(resolver, endpoint, { pathParamsRequiredOnly: true })}) => [...keys.all, "${endpoint.path}", ${renderEndpointArgs( + resolver, + endpoint, + {}, + )}] as const,`, + ); + if (resolver.options.infiniteQueries && isInfiniteQuery(endpoint, resolver.options)) { + lines.push( + ` ${getEndpointName(endpoint)}Infinite: (${renderEndpointParams(resolver, endpoint, { + excludePageParam: true, + pathParamsRequiredOnly: true, + })}) => [...keys.all, "${endpoint.path}", "infinite", ${renderEndpointArgs(resolver, endpoint, { + excludePageParam: true, + })}] as const,`, + ); + } + } + lines.push("};"); + return lines.join("\n"); +} + +function renderInlineEndpoints({ resolver, endpoints }: { resolver: SchemaResolver; endpoints: Endpoint[] }) { + const lines: string[] = []; + for (const endpoint of endpoints) { + const endpointParams = renderEndpointParams(resolver, endpoint, {}); + const endpointBody = getEndpointBody(endpoint); + const hasUndefinedEndpointBody = requiresBody(endpoint) && !endpointBody && hasEndpointConfig(endpoint, resolver); + const endpointConfig = renderInlineEndpointConfig(resolver, endpoint); + + lines.push( + `const ${getEndpointName(endpoint)} = (${endpointParams}${resolver.options.axiosRequestConfig ? `${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, + ); + lines.push(` return ${APP_REST_CLIENT_NAME}.${endpoint.method}(`); + lines.push(` { resSchema: ${getImportedZodSchemaName(resolver, endpoint.response)} },`); + lines.push(` \`${getEndpointPath(endpoint)}\`,`); + + if (endpointBody) { + lines.push( + ` ${resolver.options.parseRequestParams ? renderInlineEndpointParamParse(resolver, endpointBody, endpointBody.name) : endpointBody.name},`, + ); + } else if (hasUndefinedEndpointBody) { + lines.push(" undefined,"); + } + + lines.push(` ${endpointConfig}`); + lines.push(" );"); + lines.push("};"); + lines.push(""); + } + return lines; +} + +function renderInlineEndpointParamParse(resolver: SchemaResolver, param: EndpointParameter, paramName: string) { + const addOptional = + !(param.parameterObject ?? param.bodyObject)?.required && + (Boolean(param.parameterSortingEnumSchemaName) || isNamedZodSchema(param.zodSchema)); + const schemaValue = param.parameterSortingEnumSchemaName + ? `${ZOD_EXTENDED.namespace}.${ZOD_EXTENDED.exports.sortExp}(${getImportedZodSchemaName( + resolver, + param.parameterSortingEnumSchemaName, + )})${addOptional ? ".optional()" : ""}` + : `${getImportedZodSchemaName(resolver, param.zodSchema)}${addOptional ? ".optional()" : ""}`; + const queryArgs = param.type === "Query" ? `, { type: "query", name: "${paramName}" }` : ""; + return `${ZOD_EXTENDED.namespace}.${ZOD_EXTENDED.exports.parse}(${schemaValue}, ${paramName}${queryArgs})`; +} + +function renderInlineEndpointConfig(resolver: SchemaResolver, endpoint: Endpoint) { + const endpointConfig = getEndpointConfig(endpoint); + const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; + if (Object.keys(endpointConfig).length === 0) { + return hasAxiosRequestConfig ? AXIOS_REQUEST_CONFIG_NAME : ""; + } + + const lines: string[] = []; + lines.push("{"); + if (hasAxiosRequestConfig) { + lines.push(` ...${AXIOS_REQUEST_CONFIG_NAME},`); + } + if (endpointConfig.params) { + lines.push(" params: {"); + for (const param of endpointConfig.params) { + const value = resolver.options.parseRequestParams + ? renderInlineEndpointParamParse(resolver, param, param.value) + : param.value; + lines.push(` ${param.name}: ${value},`); + } + lines.push(" },"); + } + if (endpointConfig.headers) { + lines.push(" headers: {"); + for (const [key, value] of Object.entries(endpointConfig.headers)) { + lines.push(` '${key}': ${value},`); + } + lines.push(" },"); + } + if (endpoint.response === "z.instanceof(Blob)") { + lines.push(' responseType: "blob",'); + } + if (endpoint.mediaDownload) { + lines.push(" rawResponse: true,"); + } + lines.push(" }"); + return lines.join("\n"); +} + +function renderQuery({ + resolver, + endpoint, + inlineEndpoints, +}: { + resolver: SchemaResolver; + endpoint: Endpoint; + inlineEndpoints: boolean; +}) { + const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; + const hasAclCheck = resolver.options.checkAcl && endpoint.acl; + const workspaceParamReplacements = resolver.options.workspaceContext + ? getWorkspaceParamReplacements(resolver, endpoint) + : {}; + const endpointArgs = renderEndpointArgs(resolver, endpoint, {}); + const resolvedEndpointArgs = renderEndpointArgs(resolver, endpoint, {}, workspaceParamReplacements); + const endpointParams = renderEndpointParams(resolver, endpoint, { + optionalPathParams: resolver.options.workspaceContext, + }); + const hasQueryFn = endpointArgs.length > 0 || hasAxiosRequestConfig || hasAclCheck; + const hasQueryFnBody = Boolean(hasAclCheck) || Object.keys(workspaceParamReplacements).length > 0; + const importedEndpoint = inlineEndpoints + ? getEndpointName(endpoint) + : getImportedEndpointName(endpoint, resolver.options); + + const lines: string[] = []; + lines.push(renderQueryJsDocs({ resolver, endpoint, mode: "query" })); + lines.push( + `export const ${getQueryName(endpoint)} = (${endpointParams ? `{ ${endpointArgs} }: { ${endpointParams} }, ` : ""}options?: AppQueryOptions${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, + ); + lines.push(" const queryConfig = OpenApiQueryConfig.useConfig();"); + if (hasAclCheck) { + lines.push(` const { checkAcl } = ${ACL_CHECK_HOOK}();`); + } + lines.push(...renderWorkspaceParamResolutions({ replacements: workspaceParamReplacements, indent: " " })); + lines.push(" "); + lines.push(` return ${QUERY_HOOKS.query}({`); + lines.push(` queryKey: keys.${getEndpointName(endpoint)}(${resolvedEndpointArgs}),`); + if (hasQueryFn) { + lines.push(` queryFn: () => ${hasQueryFnBody ? "{ " : ""}`); + if (hasAclCheck) { + lines.push(renderAclCheckCall(resolver, endpoint, workspaceParamReplacements, " ")); + } + lines.push( + ` ${hasQueryFnBody ? "return " : ""}${importedEndpoint}(${resolvedEndpointArgs}${hasAxiosRequestConfig ? `${resolvedEndpointArgs ? ", " : ""}${AXIOS_REQUEST_CONFIG_NAME}` : ""})${hasQueryFnBody ? " }" : ""},`, + ); + } else { + lines.push(` queryFn: ${importedEndpoint},`); + } + lines.push(" ...options,"); + lines.push(" });"); + lines.push("};"); + return lines.join("\n"); +} + +function renderMutation({ + resolver, + endpoint, + inlineEndpoints, + precomputed, +}: { + resolver: SchemaResolver; + endpoint: Endpoint; + inlineEndpoints: boolean; + precomputed?: { updateQueryEndpoints: Endpoint[]; destructuredVariables: string[] }; +}) { + const hasAclCheck = resolver.options.checkAcl && endpoint.acl; + const hasMutationEffects = resolver.options.mutationEffects; + const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; + const workspaceParamReplacements = resolver.options.workspaceContext + ? getWorkspaceParamReplacements(resolver, endpoint) + : {}; + const endpointParams = renderEndpointParams(resolver, endpoint, { + includeFileParam: true, + optionalPathParams: resolver.options.workspaceContext, + }); + const resolvedEndpointArgs = renderEndpointArgs(resolver, endpoint, {}, workspaceParamReplacements); + const destructuredMutationArgs = renderEndpointArgs(resolver, endpoint, { includeFileParam: true }); + const endpointFunction = inlineEndpoints + ? getEndpointName(endpoint) + : getImportedEndpointName(endpoint, resolver.options); + + const updateQueryEndpoints = precomputed?.updateQueryEndpoints ?? []; + const destructuredVariables = + precomputed?.destructuredVariables ?? getDestructuredVariables(resolver, endpoint, updateQueryEndpoints); + const hasMutationFnBody = endpoint.mediaUpload || hasAclCheck || Object.keys(workspaceParamReplacements).length > 0; + + const mutationVariablesType = endpoint.mediaUpload + ? `${endpointParams}${endpointParams ? "; " : ""}abortController?: AbortController; onUploadProgress?: (progress: { loaded: number; total: number }) => void` + : endpointParams; + + const lines: string[] = []; + lines.push(renderQueryJsDocs({ resolver, endpoint, mode: "mutation" })); + lines.push( + `export const ${getQueryName(endpoint, true)} = (options?: AppMutationOptions${hasMutationEffects ? ` & ${MUTATION_EFFECTS.optionsType}` : ""}${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, + ); + lines.push(" const queryConfig = OpenApiQueryConfig.useConfig();"); + if (hasAclCheck) { + lines.push(` const { checkAcl } = ${ACL_CHECK_HOOK}();`); + } + if (Object.keys(workspaceParamReplacements).length > 0) { + lines.push(" const workspaceContext = OpenApiWorkspaceContext.useContext();"); + } + if (hasMutationEffects) { + lines.push(` const { runMutationEffects } = useMutationEffects({ currentModule: ${QUERIES_MODULE_NAME} });`); + } + lines.push(""); + lines.push(` return ${QUERY_HOOKS.mutation}({`); + + const mutationFnArg = endpointParams + ? `{ ${destructuredMutationArgs}${endpoint.mediaUpload ? `${destructuredMutationArgs ? ", " : ""}abortController, onUploadProgress` : ""} }` + : ""; + lines.push( + ` mutationFn: ${endpoint.mediaUpload ? "async " : ""}(${mutationFnArg}) => ${hasMutationFnBody ? "{ " : ""}`, + ); + for (const [paramName, resolvedParamName] of Object.entries(workspaceParamReplacements)) { + lines.push( + ` const ${resolvedParamName} = OpenApiWorkspaceContext.resolveParam(workspaceContext, "${paramName}", ${paramName});`, + ); + } + if (hasAclCheck) { + lines.push(renderAclCheckCall(resolver, endpoint, workspaceParamReplacements, " ")); + } + if (endpoint.mediaUpload) { + lines.push( + ` const uploadInstructions = await ${endpointFunction}(${resolvedEndpointArgs}${hasAxiosRequestConfig ? `${resolvedEndpointArgs ? ", " : ""}${AXIOS_REQUEST_CONFIG_NAME}` : ""});`, + ); + lines.push(" "); + lines.push(" if (file && uploadInstructions.url) {"); + lines.push(' const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post";'); + lines.push(" let dataToSend: File | FormData = file;"); + lines.push(' if (method === "post") {'); + lines.push(" dataToSend = new FormData();"); + lines.push(" if (uploadInstructions.fields) {"); + lines.push(" for (const [key, value] of uploadInstructions.fields) {"); + lines.push(" dataToSend.append(key, value);"); + lines.push(" }"); + lines.push(" }"); + lines.push(' dataToSend.append("file", file);'); + lines.push(" }"); + lines.push(" await axios[method](uploadInstructions.url, dataToSend, {"); + lines.push(" headers: {"); + lines.push(' "Content-Type": file.type,'); + lines.push(" },"); + lines.push(" signal: abortController?.signal,"); + lines.push(" onUploadProgress: onUploadProgress"); + lines.push( + " ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 })", + ); + lines.push(" : undefined,"); + lines.push(" });"); + lines.push(" }"); + lines.push(" "); + lines.push(" return uploadInstructions;"); + } else { + lines.push( + ` ${hasMutationFnBody ? "return " : ""}${endpointFunction}(${resolvedEndpointArgs}${hasAxiosRequestConfig ? `${resolvedEndpointArgs ? ", " : ""}${AXIOS_REQUEST_CONFIG_NAME}` : ""})`, + ); + } + if (hasMutationFnBody) { + lines.push(" },"); + } else { + lines.push(","); + } + + lines.push(" ...options,"); + if (hasMutationEffects) { + lines.push(" onSuccess: async (resData, variables, onMutateResult, context) => {"); + if (updateQueryEndpoints.length > 0) { + if (destructuredVariables.length > 0) { + lines.push(` const { ${destructuredVariables.join(", ")} } = variables;`); + } + for (const [paramName, resolvedParamName] of Object.entries(workspaceParamReplacements)) { + lines.push( + ` const ${resolvedParamName} = OpenApiWorkspaceContext.resolveParam(workspaceContext, "${paramName}", ${paramName});`, + ); + } + lines.push( + ` const updateKeys = [${updateQueryEndpoints + .map( + (e) => + `keys.${getEndpointName(e)}(${renderEndpointArgs( + resolver, + e, + { + includeOnlyRequiredParams: true, + }, + workspaceParamReplacements, + )})`, + ) + .join(", ")}];`, + ); + lines.push(` await runMutationEffects(resData, variables, options, updateKeys);`); + } else { + lines.push(" await runMutationEffects(resData, variables, options);"); + } + lines.push(" options?.onSuccess?.(resData, variables, onMutateResult, context);"); + lines.push(" },"); + } + + lines.push(" });"); + lines.push("};"); + return lines.join("\n"); +} + +function groupEndpoints(endpoints: Endpoint[], resolver: SchemaResolver) { + const queryEndpoints: Endpoint[] = []; + const mutationEndpoints: Endpoint[] = []; + const infiniteQueryEndpoints: Endpoint[] = []; + const aclEndpoints: Endpoint[] = []; + const infoByEndpoint = new Map(); + const mutationDataByEndpoint = new Map< + Endpoint, + { updateQueryEndpoints: Endpoint[]; destructuredVariables: string[] } + >(); + + for (const endpoint of endpoints) { + const query = isQuery(endpoint); + const mutation = isMutation(endpoint); + const infiniteQuery = Boolean( + resolver.options.infiniteQueries && query && isInfiniteQuery(endpoint, resolver.options), + ); + + if (query) { + queryEndpoints.push(endpoint); + } + if (mutation) { + mutationEndpoints.push(endpoint); + } + if (infiniteQuery) { + infiniteQueryEndpoints.push(endpoint); + } + if (endpoint.acl) { + aclEndpoints.push(endpoint); + } + + infoByEndpoint.set(endpoint, { query, mutation, infiniteQuery }); + } + + for (const endpoint of mutationEndpoints) { + const updateQueryEndpoints = queryEndpoints.filter( + (queryEndpoint) => + queryEndpoint.parameters + .filter((param) => param.parameterObject?.required) + .every((pathParam) => endpoint.parameters.some((param) => param.name === pathParam.name)) && + queryEndpoint.response === endpoint.response, + ); + + mutationDataByEndpoint.set(endpoint, { + updateQueryEndpoints, + destructuredVariables: getDestructuredVariables(resolver, endpoint, updateQueryEndpoints), + }); + } + + return { queryEndpoints, + mutationEndpoints, + infiniteQueryEndpoints, + aclEndpoints, + infoByEndpoint, + mutationDataByEndpoint, + }; +} + +function renderInfiniteQuery({ + resolver, + endpoint, + inlineEndpoints, +}: { + resolver: SchemaResolver; + endpoint: Endpoint; + inlineEndpoints: boolean; +}) { + const hasAclCheck = resolver.options.checkAcl && endpoint.acl; + const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; + const workspaceParamReplacements = resolver.options.workspaceContext + ? getWorkspaceParamReplacements(resolver, endpoint) + : {}; + const endpointParams = renderEndpointParams(resolver, endpoint, { + excludePageParam: true, + optionalPathParams: resolver.options.workspaceContext, }); + const endpointArgsWithoutPage = renderEndpointArgs(resolver, endpoint, { excludePageParam: true }); + const resolvedEndpointArgsWithoutPage = renderEndpointArgs( + resolver, + endpoint, + { excludePageParam: true }, + workspaceParamReplacements, + ); + const endpointArgsWithPage = renderEndpointArgs(resolver, endpoint, { replacePageParam: true }); + const resolvedEndpointArgsWithPage = renderEndpointArgs( + resolver, + endpoint, + { replacePageParam: true }, + workspaceParamReplacements, + ); + const endpointFunction = inlineEndpoints + ? getEndpointName(endpoint) + : getImportedEndpointName(endpoint, resolver.options); + const hasQueryFnBody = Boolean(hasAclCheck) || Object.keys(workspaceParamReplacements).length > 0; + + const lines: string[] = []; + lines.push(renderQueryJsDocs({ resolver, endpoint, mode: "infiniteQuery" })); + lines.push( + `export const ${getInfiniteQueryName(endpoint)} = (${endpointParams ? `{ ${endpointArgsWithoutPage} }: { ${endpointParams} }, ` : ""}options?: AppInfiniteQueryOptions${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, + ); + lines.push(" const queryConfig = OpenApiQueryConfig.useConfig();"); + if (hasAclCheck) { + lines.push(` const { checkAcl } = ${ACL_CHECK_HOOK}();`); + } + lines.push(...renderWorkspaceParamResolutions({ replacements: workspaceParamReplacements, indent: " " })); + lines.push(""); + lines.push(` return ${QUERY_HOOKS.infiniteQuery}({`); + lines.push(` queryKey: keys.${getEndpointName(endpoint)}Infinite(${resolvedEndpointArgsWithoutPage}),`); + lines.push(` queryFn: ({ pageParam }) => ${hasQueryFnBody ? "{ " : ""}`); + if (hasAclCheck) { + lines.push(renderAclCheckCall(resolver, endpoint, workspaceParamReplacements, " ")); + } + lines.push( + ` ${hasQueryFnBody ? "return " : ""}${endpointFunction}(${resolvedEndpointArgsWithPage}${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}` : ""})${hasQueryFnBody ? " }" : ""},`, + ); + lines.push(" initialPageParam: 1,"); + lines.push( + ` getNextPageParam: ({ ${resolver.options.infiniteQueryResponseParamNames.page}, ${resolver.options.infiniteQueryResponseParamNames.totalItems}, ${resolver.options.infiniteQueryResponseParamNames.limit}: limitParam }) => {`, + ); + lines.push(` const pageParam = ${resolver.options.infiniteQueryResponseParamNames.page} ?? 1;`); + lines.push( + ` return pageParam * limitParam < ${resolver.options.infiniteQueryResponseParamNames.totalItems} ? pageParam + 1 : null;`, + ); + lines.push(" },"); + lines.push(" ...options,"); + lines.push(" });"); + lines.push("};"); + return lines.join("\n"); } diff --git a/src/generators/generate/generateQueryModules.ts b/src/generators/generate/generateQueryModules.ts index f8a75b0..46d9cae 100644 --- a/src/generators/generate/generateQueryModules.ts +++ b/src/generators/generate/generateQueryModules.ts @@ -1,5 +1,4 @@ import { GenerateType, GenerateTypeParams } from "@/generators/types/generate"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; export function generateQueryModules({ resolver, data }: Omit) { @@ -17,7 +16,11 @@ export function generateQueryModules({ resolver, data }: Omit; + } + + export function ${ZOD_EXTENDED.exports.parse}( + schema: z.ZodType, + data: unknown, + { type, name, errorHandler }: ParseOptions = { type: "body" }, + ) { + try { + return schema.parse(data); + } catch (e) { + if (e instanceof z.ZodError) { + e.name = \`FE Request \${type === "body" ? "body" : "query param"}\${name ? \` ("\${name}")\` : ""} schema mismatch - ZodError\`; + } + (errorHandler ?? ${ERROR_HANDLERS.SharedErrorHandler}).rethrowError(e); + throw e; + } + } + + function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { + if (data === undefined || data === "" || enumSchema.options.length === 0) { + return true; + } + + const prefixedEnumOptions = \`([+-]?(\${enumSchema.options.join("|")}))\`; + const commaSeparatedOptions = \`(\${prefixedEnumOptions})(\\s*,\\s*\${prefixedEnumOptions})*\`; + return new RegExp(\`^\${commaSeparatedOptions}$\`).test(data); + } + + export const ${ZOD_EXTENDED.exports.sortExp} = (enumSchema: z.ZodEnum) => + z.string().superRefine((arg, ctx) => { + if (!isSortExpValid(enumSchema, arg)) { + ctx.addIssue({ + code: "invalid_value", + message: "Invalid sorting string.", + values: [], + }); + } + }); +} +`; +} + +function renderImport(importData: Import) { + const names = [ + ...(importData.defaultImport ? [importData.defaultImport] : []), + ...(importData.bindings ? [`{ ${importData.bindings.join(", ")} }`] : []), + ].join(", "); + return `import ${names} from "${importData.from}";`; } diff --git a/src/generators/generateCodeFromOpenAPIDoc.ts b/src/generators/generateCodeFromOpenAPIDoc.ts index 61f96b8..d248d71 100644 --- a/src/generators/generateCodeFromOpenAPIDoc.ts +++ b/src/generators/generateCodeFromOpenAPIDoc.ts @@ -1,5 +1,4 @@ import { OpenAPIV3 } from "openapi-types"; - import { getDataFromOpenAPIDoc } from "./core/getDataFromOpenAPIDoc"; import { generateAcl } from "./generate/generateAcl"; import { generateConfigs } from "./generate/generateConfigs"; @@ -16,19 +15,34 @@ import { getZodExtendedFiles, } from "./utils/generate-files.utils"; import { getTagFileName } from "./utils/generate/generate.utils"; +import { shouldInlineEndpointsForTag } from "./utils/tag.utils"; +import { Profiler } from "../helpers/profile.helper"; -export function generateCodeFromOpenAPIDoc(openApiDoc: OpenAPIV3.Document, options: GenerateOptions) { - const { resolver, data } = getDataFromOpenAPIDoc(openApiDoc, options); +export function generateCodeFromOpenAPIDoc( + openApiDoc: OpenAPIV3.Document, + options: GenerateOptions, + profiler?: Profiler, +) { + const p = profiler ?? new Profiler(false); + const importPath = options.standalone && options.importPath === "ts" ? "relative" : options.importPath; + const { resolver, data } = p.runSync("data.extract", () => + getDataFromOpenAPIDoc(openApiDoc, { ...options, importPath }, p), + ); const generateFilesData: GenerateFileData[] = []; const appAclTags: string[] = []; - const generateTypes = [ - GenerateType.Models, - GenerateType.Endpoints, - GenerateType.Queries, - ...(resolver.options.acl ? [GenerateType.Acl] : []), - ...(resolver.options.builderConfigs ? [GenerateType.Configs] : []), - ]; + const modelsOnly = Boolean(resolver.options.modelsOnly); + const shouldGenerateEndpoints = + !modelsOnly && Array.from(data.keys()).some((tag) => !shouldInlineEndpointsForTag(tag, resolver.options)); + const generateTypes = modelsOnly + ? [GenerateType.Models] + : [ + GenerateType.Models, + ...(shouldGenerateEndpoints ? [GenerateType.Endpoints] : []), + GenerateType.Queries, + ...(resolver.options.acl ? [GenerateType.Acl] : []), + ...(resolver.options.builderConfigs ? [GenerateType.Configs] : []), + ]; const generateFunctions: Record string | undefined> = { [GenerateType.Models]: generateModels, [GenerateType.Endpoints]: generateEndpoints, @@ -39,7 +53,7 @@ export function generateCodeFromOpenAPIDoc(openApiDoc: OpenAPIV3.Document, optio data.forEach((_, tag) => { generateTypes.forEach((type) => { - const content = generateFunctions[type]({ resolver, data, tag }); + const content = p.runSync(`render.${type}`, () => generateFunctions[type]({ resolver, data, tag })); if (content) { const fileName = getOutputFileName({ output: options.output, @@ -53,12 +67,14 @@ export function generateCodeFromOpenAPIDoc(openApiDoc: OpenAPIV3.Document, optio }); }); - generateFilesData.push( - ...getAclFiles(data, resolver), - ...getMutationEffectsFiles(data, resolver), - ...getZodExtendedFiles(data, resolver), - ...getAppRestClientFiles(resolver), - ); + if (!modelsOnly) { + generateFilesData.push( + ...p.runSync("render.AclShared", () => getAclFiles(data, resolver)), + ...p.runSync("render.MutationEffects", () => getMutationEffectsFiles(data, resolver)), + ...p.runSync("render.ZodExtended", () => getZodExtendedFiles(data, resolver)), + ...p.runSync("render.Standalone", () => getAppRestClientFiles(resolver)), + ); + } return generateFilesData; } diff --git a/src/generators/generated-output-eq.test.ts b/src/generators/generated-output-eq.test.ts new file mode 100644 index 0000000..baea74e --- /dev/null +++ b/src/generators/generated-output-eq.test.ts @@ -0,0 +1,62 @@ +import fs from "fs"; +import path from "path"; +import { describe, expect, it } from "vitest"; + +const BASE_DIR = path.resolve(process.cwd(), "test/generated/base"); +const NEXT_DIR = path.resolve(process.cwd(), "test/generated/next"); + +function toPosixPath(filePath: string) { + return filePath.split(path.sep).join("/"); +} + +function getAllFiles(dir: string, rootDir = dir): string[] { + const entries = fs.readdirSync(dir, { withFileTypes: true }); + const files: string[] = []; + + for (const entry of entries) { + if (entry.name === ".gitkeep") { + continue; + } + + const entryPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + files.push(...getAllFiles(entryPath, rootDir)); + continue; + } + + files.push(toPosixPath(path.relative(rootDir, entryPath))); + } + + return files.sort(); +} + +async function normalizeContent(filePath: string, content: string) { + void filePath; + return content + .replace(/\r\n/g, "\n") + .replace(/[ \t]+$/gm, "") + .replace(/\n[ \t]*\n+/g, "\n") + .trim(); +} + +describe("Generated output parity", () => { + it("matches between base and next output folders", async () => { + expect(fs.existsSync(BASE_DIR), `${BASE_DIR} does not exist`).toBe(true); + expect(fs.existsSync(NEXT_DIR), `${NEXT_DIR} does not exist`).toBe(true); + + const baseFiles = getAllFiles(BASE_DIR); + const nextFiles = getAllFiles(NEXT_DIR); + + expect(nextFiles).toEqual(baseFiles); + + for (const relativeFilePath of baseFiles) { + const baseContent = fs.readFileSync(path.join(BASE_DIR, relativeFilePath), "utf-8"); + const nextContent = fs.readFileSync(path.join(NEXT_DIR, relativeFilePath), "utf-8"); + + const normalizedBase = await normalizeContent(relativeFilePath, baseContent); + const normalizedNext = await normalizeContent(relativeFilePath, nextContent); + + expect(normalizedNext).toBe(normalizedBase); + } + }); +}); diff --git a/src/generators/run/generate.runner.ts b/src/generators/run/generate.runner.ts new file mode 100644 index 0000000..12c4ff5 --- /dev/null +++ b/src/generators/run/generate.runner.ts @@ -0,0 +1,154 @@ +import fs from "fs"; +import path from "path"; + +import SwaggerParser from "@apidevtools/swagger-parser"; +import { OpenAPIV3 } from "openapi-types"; + +import { resolveConfig } from "@/generators/core/resolveConfig"; +import { generateCodeFromOpenAPIDoc } from "@/generators/generateCodeFromOpenAPIDoc"; +import { GenerateOptions } from "@/generators/types/options"; +import { writeGenerateFileData } from "@/generators/utils/file.utils"; +import { Profiler } from "@/helpers/profile.helper"; + +const CACHE_FILE_NAME = ".openapi-codegen-cache.json"; + +type CacheData = { + openApiHash: string; + optionsHash: string; +}; + +export async function runGenerate({ + fileConfig, + params, + profiler = new Profiler(process.env.OPENAPI_CODEGEN_PROFILE === "1"), +}: { + fileConfig?: Partial | null; + params?: Partial< + Omit & { + excludeTags: string; + inlineEndpointsExcludeModules: string; + } + >; + profiler?: Profiler; +}) { + const config = profiler.runSync("config.resolve", () => resolveConfig({ fileConfig, params: params ?? {} })); + const openApiDoc = await getOpenApiDoc(config.input, profiler); + + const openApiHash = hashString(stableStringify(openApiDoc)); + const optionsHash = hashString(stableStringify(getCacheableConfig(config))); + const cacheFilePath = path.resolve(config.output, CACHE_FILE_NAME); + + if (config.incremental) { + const cached = readCache(cacheFilePath); + if (cached && cached.openApiHash === openApiHash && cached.optionsHash === optionsHash) { + return { skipped: true, config }; + } + } + + const filesData = profiler.runSync("generate.total", () => generateCodeFromOpenAPIDoc(openApiDoc, config, profiler)); + profiler.runSync("files.write", () => writeGenerateFileData(filesData)); + + if (config.incremental) { + writeCache(cacheFilePath, { openApiHash, optionsHash }); + } + + return { skipped: false, config }; +} + +async function getOpenApiDoc(input: string, profiler: Profiler): Promise { + const parsedDoc = (await profiler.runAsync( + "openapi.parse", + async () => await SwaggerParser.parse(input), + )) as OpenAPIV3.Document; + const hasExternalRefs = profiler.runSync("openapi.detectExternalRefs", () => hasExternalRef(parsedDoc)); + if (!hasExternalRefs) { + return parsedDoc; + } + + return (await profiler.runAsync( + "openapi.bundle", + async () => await SwaggerParser.bundle(input), + )) as OpenAPIV3.Document; +} + +function hasExternalRef(value: unknown): boolean { + const stack = [value]; + const visited = new Set(); + + while (stack.length > 0) { + const current = stack.pop(); + if (!current || typeof current !== "object") { + continue; + } + + if (visited.has(current)) { + continue; + } + visited.add(current); + + if ( + "$ref" in current && + typeof (current as { $ref?: unknown }).$ref === "string" && + !(current as { $ref: string }).$ref.startsWith("#/") + ) { + return true; + } + + for (const nested of Object.values(current)) { + if (nested && typeof nested === "object") { + stack.push(nested); + } + } + } + + return false; +} + +function getCacheableConfig(config: GenerateOptions) { + const { output, incremental, ...cacheableConfig } = config; + void output; + void incremental; + return cacheableConfig; +} + +function readCache(filePath: string): CacheData | null { + if (!fs.existsSync(filePath)) { + return null; + } + try { + return JSON.parse(fs.readFileSync(filePath, "utf-8")) as CacheData; + } catch { + return null; + } +} + +function writeCache(filePath: string, data: CacheData) { + const dir = path.dirname(filePath); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + fs.writeFileSync(filePath, JSON.stringify(data), "utf-8"); +} + +function hashString(input: string) { + let hash = 2166136261; + for (let i = 0; i < input.length; i += 1) { + hash ^= input.charCodeAt(i); + hash = Math.imul(hash, 16777619); + } + return (hash >>> 0).toString(16); +} + +function stableStringify(input: unknown): string { + if (input === null || typeof input !== "object") { + return JSON.stringify(input); + } + + if (Array.isArray(input)) { + return `[${input.map((item) => stableStringify(item)).join(",")}]`; + } + + const obj = input as Record; + const keys = Object.keys(obj).sort((a, b) => a.localeCompare(b)); + return `{${keys.map((key) => `${JSON.stringify(key)}:${stableStringify(obj[key])}`).join(",")}}`; +} diff --git a/src/generators/templates/endpoints.hbs b/src/generators/templates/endpoints.hbs index 974707f..a533c75 100644 --- a/src/generators/templates/endpoints.hbs +++ b/src/generators/templates/endpoints.hbs @@ -37,7 +37,6 @@ export const {{endpointName endpoint}} = ({{{genEndpointParams endpoint}}}{{#if {{/if}}{{{genEndpointConfig endpoint}}} ) }; - {{/each}} {{#if includeNamespace}} } diff --git a/src/generators/types/options.ts b/src/generators/types/options.ts index e9d68d3..1f15007 100644 --- a/src/generators/types/options.ts +++ b/src/generators/types/options.ts @@ -3,6 +3,7 @@ import { GenerateType } from "./generate"; interface ZodGenerateOptions { schemaSuffix: string; enumSuffix: string; + modelsInCommon?: boolean; withImplicitRequiredProps?: boolean; withDefaultValues?: boolean; withDescription?: boolean; @@ -13,15 +14,19 @@ interface ZodGenerateOptions { interface EndpointsGenerateOptions { restClientImportPath: string; + errorHandlingImportPath?: string; withDeprecatedEndpoints?: boolean; removeOperationPrefixEndingWith?: string; parseRequestParams?: boolean; + inlineEndpoints?: boolean; + inlineEndpointsExcludeModules?: string[]; } interface QueriesGenerateOptions { queryTypesImportPath: string; axiosRequestConfig?: boolean; mutationEffects?: boolean; + workspaceContext?: boolean; } interface InfiniteQueriesGenerateOptions { @@ -40,6 +45,7 @@ interface ACLGenerateOptions { acl: boolean; checkAcl?: boolean; abilityContextGenericAppAbilities: boolean; + abilityContextImportPath?: string; } interface BuilderConfigsGenerateOptions { @@ -58,6 +64,7 @@ interface GenerateConfig { interface BaseGenerateOptions { input: string; output: string; + incremental?: boolean; splitByTags: boolean; defaultTag: string; excludeTags: string[]; @@ -68,6 +75,8 @@ interface BaseGenerateOptions { importPath: "ts" | "relative" | "absolute"; configs: Record; baseUrl: string; + modelsOnly?: boolean; + standalone?: boolean; } export interface GenerateOptions diff --git a/src/generators/utils/file.utils.ts b/src/generators/utils/file.utils.ts index d39f447..c9c1a24 100644 --- a/src/generators/utils/file.utils.ts +++ b/src/generators/utils/file.utils.ts @@ -1,19 +1,24 @@ import fs from "fs"; import path from "path"; +import { fileURLToPath } from "url"; import { GenerateFileData } from "@/generators/types/generate"; function readFileSync(filePath: string) { - if (process.env.NODE_ENV === "production") { - return fs.readFileSync(path.join(__dirname, `../${filePath}`), "utf-8"); + const moduleDir = path.dirname(fileURLToPath(import.meta.url)); + const candidates = [ + path.resolve(process.cwd(), filePath), + path.resolve(moduleDir, "../../../", filePath), + path.resolve(moduleDir, "../", filePath), + ]; + + for (const candidatePath of candidates) { + if (fs.existsSync(candidatePath)) { + return fs.readFileSync(candidatePath, "utf-8"); + } } - return fs.readFileSync(filePath, "utf-8"); -} - -export function readHbsTemplateSync(fileName: string) { - const templatePath = `src/generators/templates/${fileName}.hbs`; - return readFileSync(templatePath); + throw new Error(`Cannot read file: ${filePath}`); } export function readAssetSync(fileName: string) { @@ -21,6 +26,11 @@ export function readAssetSync(fileName: string) { return readFileSync(assetPath); } +export function readHbsTemplateSync(templateName: string) { + const templatePath = `src/generators/templates/${templateName}.hbs`; + return readFileSync(templatePath); +} + export function getOutputFileName({ output, fileName }: { output: string; fileName: string }) { return `${output}/${fileName}`; } @@ -32,6 +42,13 @@ function writeFileWithDirSync(file: string, data: string) { fs.mkdirSync(dir, { recursive: true }); } + if (fs.existsSync(file)) { + const existingData = fs.readFileSync(file, "utf-8"); + if (existingData === data) { + return; + } + } + fs.writeFileSync(file, data, "utf-8"); } diff --git a/src/generators/utils/generate-files.utils.ts b/src/generators/utils/generate-files.utils.ts index b8bbd6a..3c998d0 100644 --- a/src/generators/utils/generate-files.utils.ts +++ b/src/generators/utils/generate-files.utils.ts @@ -97,7 +97,7 @@ export function getAppRestClientFiles(resolver: SchemaResolver): GenerateFileDat } function getAssetFiles(files: GenerateFile[], resolver: SchemaResolver): GenerateFileData[] { - return files.reduce((acc, file) => [...acc, getAssetFile(file, resolver)], [] as GenerateFileData[]); + return files.map((file) => getAssetFile(file, resolver)); } function getAssetFile(file: GenerateFile, resolver: SchemaResolver): GenerateFileData { diff --git a/src/generators/utils/generate/generate.configs.utils.ts b/src/generators/utils/generate/generate.configs.utils.ts index 3cd3a30..e1ecab1 100644 --- a/src/generators/utils/generate/generate.configs.utils.ts +++ b/src/generators/utils/generate/generate.configs.utils.ts @@ -38,7 +38,13 @@ import { getImportedZodSchemaName } from "./generate.zod.utils"; export function getBuilderConfigs({ data, tag, resolver }: GenerateTypeParams) { const endpoints = data.get(tag)?.endpoints; if (!endpoints || endpoints.length === 0) { - return { configs: [] }; + return { + configs: [], + hasZodImport: false, + modelsImports: [], + queriesImports: [], + aclImports: [], + }; } const extendedEndpoints: ExtendedEndpoint[] = endpoints.map((endpoint) => ({ diff --git a/src/generators/utils/generate/generate.endpoints.utils.ts b/src/generators/utils/generate/generate.endpoints.utils.ts index 7cd205b..dadd3b7 100644 --- a/src/generators/utils/generate/generate.endpoints.utils.ts +++ b/src/generators/utils/generate/generate.endpoints.utils.ts @@ -48,6 +48,7 @@ export function mapEndpointParamsToFunctionParams( includeFileParam?: boolean; includeOnlyRequiredParams?: boolean; pathParamsRequiredOnly?: boolean; + optionalPathParams?: boolean; }, ) { const params = endpoint.parameters.map((param) => { @@ -102,7 +103,10 @@ export function mapEndpointParamsToFunctionParams( options?.replacePageParam && param.name === resolver.options.infiniteQueryParamNames.page ? "pageParam" : param.name, - required: param.required && (param.paramType === "Path" || !options?.pathParamsRequiredOnly), + required: + options?.optionalPathParams && param.paramType === "Path" + ? false + : param.required && (param.paramType === "Path" || !options?.pathParamsRequiredOnly), })); } diff --git a/src/generators/utils/generate/generate.imports.utils.ts b/src/generators/utils/generate/generate.imports.utils.ts index a9b467d..ed16361 100644 --- a/src/generators/utils/generate/generate.imports.utils.ts +++ b/src/generators/utils/generate/generate.imports.utils.ts @@ -181,7 +181,8 @@ function getImports({ }) { const imports = new Map(); entities.forEach((entity) => { - const tag = getTag(entity); + const tag = + type === GenerateType.Models && options.modelsInCommon && options.splitByTags ? currentTag : getTag(entity); if (!imports.has(tag)) { const sameTagDir = currentTag === tag; imports.set(tag, { diff --git a/src/generators/utils/generate/generate.openapi.utils.ts b/src/generators/utils/generate/generate.openapi.utils.ts index e75842b..e9e3dad 100644 --- a/src/generators/utils/generate/generate.openapi.utils.ts +++ b/src/generators/utils/generate/generate.openapi.utils.ts @@ -2,7 +2,14 @@ import { OpenAPIV3 } from "openapi-types"; import { camelToSpaceSeparated, capitalize } from "@/generators/utils/string.utils"; +const schemaDescriptionsCache = new WeakMap(); + export function getSchemaDescriptions(schemaObj: OpenAPIV3.SchemaObject) { + const cachedSchemaDescriptions = schemaDescriptionsCache.get(schemaObj); + if (cachedSchemaDescriptions) { + return cachedSchemaDescriptions; + } + const schemaKeys: (keyof OpenAPIV3.SchemaObject)[] = [ "minimum", "exclusiveMinimum", @@ -22,5 +29,6 @@ export function getSchemaDescriptions(schemaObj: OpenAPIV3.SchemaObject) { .filter((key) => schemaObj[key] !== undefined) .reduce((acc, key) => [...acc, `${capitalize(camelToSpaceSeparated(key))}: \`${schemaObj[key]}\``], [] as string[]); + schemaDescriptionsCache.set(schemaObj, schemaDescriptions); return schemaDescriptions; } diff --git a/src/generators/utils/generate/generate.utils.ts b/src/generators/utils/generate/generate.utils.ts index d398d0d..0856358 100644 --- a/src/generators/utils/generate/generate.utils.ts +++ b/src/generators/utils/generate/generate.utils.ts @@ -53,6 +53,10 @@ export function getQueryModulesImportPath(options: GenerateOptions) { return `${getImportPath(options)}${QUERY_MODULES_FILE.fileName}`; } +export function getQueryTypesImportPath(options: GenerateOptions) { + return options.queryTypesImportPath; +} + export function getMutationEffectsImportPath(options: GenerateOptions) { return `${getImportPath(options)}${MUTATION_EFFECTS_FILE.fileName}`; } diff --git a/src/generators/utils/hbs/hbs-template.utils.ts b/src/generators/utils/hbs/hbs-template.utils.ts index 71348c6..702a446 100644 --- a/src/generators/utils/hbs/hbs-template.utils.ts +++ b/src/generators/utils/hbs/hbs-template.utils.ts @@ -11,8 +11,14 @@ import { registerPartialsHbsHelpers } from "./hbs.partials.utils"; import { registerQueryHbsHelpers } from "./hbs.query.utils"; import { registerZodHbsHelpers } from "./hbs.zod.utils"; -export function getHbsTemplateDelegate(resolver: SchemaResolver, templateName: string) { - const template = readHbsTemplateSync(templateName); +const registeredResolvers = new WeakSet(); +const templateDelegateCache = new Map(); +const partialTemplateDelegateCache = new Map(); + +function registerHelpersIfNeeded(resolver: SchemaResolver) { + if (registeredResolvers.has(resolver)) { + return; + } registerCommonHbsHelpers(); registerImportsHbsHelpers(); @@ -22,10 +28,31 @@ export function getHbsTemplateDelegate(resolver: SchemaResolver, templateName: s registerAclHbsHelpers(resolver); registerPartialsHbsHelpers(resolver); - return Handlebars.compile(template); + registeredResolvers.add(resolver); +} + +export function getHbsTemplateDelegate(resolver: SchemaResolver, templateName: string) { + registerHelpersIfNeeded(resolver); + + const cachedTemplateDelegate = templateDelegateCache.get(templateName); + if (cachedTemplateDelegate) { + return cachedTemplateDelegate; + } + + const template = readHbsTemplateSync(templateName); + const templateDelegate = Handlebars.compile(template); + templateDelegateCache.set(templateName, templateDelegate); + return templateDelegate; } export function getHbsPartialTemplateDelegate(templateName: string) { + const cachedTemplateDelegate = partialTemplateDelegateCache.get(templateName); + if (cachedTemplateDelegate) { + return cachedTemplateDelegate; + } + const template = readHbsTemplateSync(`partials/${templateName}`); - return Handlebars.compile(template); + const templateDelegate = Handlebars.compile(template); + partialTemplateDelegateCache.set(templateName, templateDelegate); + return templateDelegate; } diff --git a/src/generators/utils/tag.utils.ts b/src/generators/utils/tag.utils.ts index 77d46b6..d46cdcb 100644 --- a/src/generators/utils/tag.utils.ts +++ b/src/generators/utils/tag.utils.ts @@ -21,3 +21,14 @@ export function getEndpointTag(endpoint: Endpoint, options: GenerateOptions) { export function isTagExcluded(tag: string, options: GenerateOptions) { return options.excludeTags.some((excludeTag) => excludeTag.toLowerCase() === tag.toLowerCase()); } + +export function shouldInlineEndpointsForTag(tag: string, options: GenerateOptions) { + if (!options.inlineEndpoints) { + return false; + } + + const isExcludedModule = (options.inlineEndpointsExcludeModules ?? []).some( + (moduleName) => formatTag(moduleName).toLowerCase() === tag.toLowerCase(), + ); + return !isExcludedModule; +} diff --git a/src/helpers/config.helper.ts b/src/helpers/config.helper.ts index ef621c1..0891322 100644 --- a/src/helpers/config.helper.ts +++ b/src/helpers/config.helper.ts @@ -6,7 +6,7 @@ import { OpenAPICodegenConfig } from "@/generators/types/config"; import { logError } from "./cli.helper"; -const CONFIG_FILE_NAMES = ["openapi-codegen.config.ts"]; +const CONFIG_FILE_NAMES = ["openapi-codegen.config.mjs", "openapi-codegen.config.ts"]; export async function loadConfig(configPath?: string): Promise { try { @@ -36,13 +36,26 @@ async function loadConfigFromPath(filePath: string): Promise { + const imported = (await import(`${pathToFileURL(filePath).href}?t=${Date.now()}`)) as { + default?: OpenAPICodegenConfig; + }; + if (!imported.default) { + throw new Error(`ESM config must have a default export: ${filePath}`); + } + return imported.default; +} + let importFresh: typeof import("import-fresh"); export const loadJsSync = function loadJsSync(filepath: string) { if (importFresh === undefined) { @@ -100,3 +113,12 @@ function resolveTsConfig(directory: string) { return config; } + +function pathToFileURL(filePath: string) { + const resolvedPath = path.resolve(filePath); + const normalizedPath = resolvedPath.replace(/\\/g, "/"); + const hasLeadingSlash = normalizedPath.startsWith("/"); + return { + href: hasLeadingSlash ? `file://${normalizedPath}` : `file:///${normalizedPath}`, + }; +} diff --git a/src/helpers/profile.helper.ts b/src/helpers/profile.helper.ts new file mode 100644 index 0000000..4693cd0 --- /dev/null +++ b/src/helpers/profile.helper.ts @@ -0,0 +1,68 @@ +type ProfileEntry = { + totalMs: number; + count: number; +}; + +function nowMs() { + return Number(process.hrtime.bigint()) / 1_000_000; +} + +export class Profiler { + private readonly entries = new Map(); + + constructor(public readonly enabled: boolean) {} + + add(label: string, elapsedMs: number) { + if (!this.enabled) { + return; + } + + const prev = this.entries.get(label); + if (prev) { + prev.totalMs += elapsedMs; + prev.count += 1; + return; + } + + this.entries.set(label, { totalMs: elapsedMs, count: 1 }); + } + + runSync(label: string, fn: () => T): T { + if (!this.enabled) { + return fn(); + } + + const startMs = nowMs(); + try { + return fn(); + } finally { + this.add(label, nowMs() - startMs); + } + } + + async runAsync(label: string, fn: () => Promise): Promise { + if (!this.enabled) { + return await fn(); + } + + const startMs = nowMs(); + try { + return await fn(); + } finally { + this.add(label, nowMs() - startMs); + } + } + + formatLines() { + if (!this.enabled) { + return [] as string[]; + } + + return Array.from(this.entries.entries()) + .sort((a, b) => b[1].totalMs - a[1].totalMs) + .map(([label, entry]) => { + const avgMs = entry.totalMs / entry.count; + return `${label}: ${entry.totalMs.toFixed(1)}ms (count: ${entry.count}, avg: ${avgMs.toFixed(2)}ms)`; + }); + } +} diff --git a/src/index.ts b/src/index.ts index c4f617a..ce071d3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,6 +18,7 @@ export type { AppQueryOptions, AppMutationOptions, AppInfiniteQueryOptions } fro export { OpenApiRouter } from "./lib/config/router.context"; export { OpenApiQueryConfig } from "./lib/config/queryConfig.context"; export type { InvalidationMap } from "./lib/config/queryConfig.context"; +export { OpenApiWorkspaceContext } from "./lib/config/workspace.context"; // i18n resources (for consumer apps to merge into their i18n config) export { ns, resources } from "./lib/config/i18n"; diff --git a/src/lib/config/queryConfig.context.tsx b/src/lib/config/queryConfig.context.tsx index 77e4fec..401d6e0 100644 --- a/src/lib/config/queryConfig.context.tsx +++ b/src/lib/config/queryConfig.context.tsx @@ -17,6 +17,7 @@ export namespace OpenApiQueryConfig { invalidateCurrentModule?: boolean; invalidationMap?: InvalidationMap; crossTabInvalidation?: boolean; + onError?: (error: unknown) => void; } const Context = createContext({}); @@ -28,12 +29,13 @@ export namespace OpenApiQueryConfig { invalidateCurrentModule, invalidationMap, crossTabInvalidation, + onError, children, }: PropsWithChildren) => { const value = useMemo( - () => ({ preferUpdate, invalidateCurrentModule, invalidationMap, crossTabInvalidation }), - [preferUpdate, invalidateCurrentModule, invalidationMap, crossTabInvalidation], + () => ({ preferUpdate, invalidateCurrentModule, invalidationMap, crossTabInvalidation, onError }), + [preferUpdate, invalidateCurrentModule, invalidationMap, crossTabInvalidation, onError], ); return {children}; diff --git a/src/lib/config/workspace.context.tsx b/src/lib/config/workspace.context.tsx new file mode 100644 index 0000000..7a61695 --- /dev/null +++ b/src/lib/config/workspace.context.tsx @@ -0,0 +1,33 @@ +import { type PropsWithChildren, createContext, use, useMemo } from "react"; + +type WorkspaceValues = Record; + +interface WorkspaceProviderProps { + values?: WorkspaceValues; +} + +export namespace OpenApiWorkspaceContext { + const Context = createContext({}); + + export const Provider = ({ values, children }: PropsWithChildren) => { + const contextValues = useMemo(() => values ?? {}, [values]); + return {children}; + }; + + export const useContext = () => { + return use(Context); + }; + + export const resolveParam = (context: WorkspaceValues, name: string, value: T | null | undefined): T => { + if (value != null) { + return value; + } + + const workspaceValue = context[name]; + if (workspaceValue == null) { + throw new Error(`Missing workspace context param "${name}"`); + } + + return workspaceValue as T; + }; +} diff --git a/src/vite.ts b/src/vite.ts new file mode 100644 index 0000000..7afb9fb --- /dev/null +++ b/src/vite.ts @@ -0,0 +1,2 @@ +export { openApiCodegen } from "./vite/openapi-codegen.plugin"; +export type { OpenAPICodegenConfig } from "./generators/types/config"; diff --git a/src/vite/openapi-codegen.plugin.ts b/src/vite/openapi-codegen.plugin.ts new file mode 100644 index 0000000..da376ff --- /dev/null +++ b/src/vite/openapi-codegen.plugin.ts @@ -0,0 +1,72 @@ +import path from "path"; + +import { runGenerate } from "@/generators/run/generate.runner"; +import { OpenAPICodegenConfig } from "@/generators/types/config"; +import { Profiler } from "@/helpers/profile.helper"; + +import type { Plugin, ResolvedConfig, ViteDevServer } from "vite"; + +export function openApiCodegen(config: OpenAPICodegenConfig): Plugin { + let resolvedViteConfig: ResolvedConfig | undefined; + let queue: Promise = Promise.resolve(); + const isLocalInput = typeof config.input === "string" && !/^https?:\/\//i.test(config.input); + const normalizedConfig = { ...config }; + + const enqueueGenerate = () => { + queue = queue.then(async () => { + const currentConfig = resolvedViteConfig; + if (!currentConfig) { + return; + } + + const fileConfig = normalizePaths(normalizedConfig, currentConfig.root); + const profiler = new Profiler(process.env.OPENAPI_CODEGEN_PROFILE === "1"); + await runGenerate({ fileConfig, profiler }); + }); + }; + + const setupWatcher = (server: ViteDevServer) => { + if (!isLocalInput || !config.input) { + return; + } + + const openApiPath = path.resolve(server.config.root, config.input); + server.watcher.add(openApiPath); + server.watcher.on("change", (changedPath) => { + if (path.resolve(changedPath) === openApiPath) { + enqueueGenerate(); + } + }); + }; + + return { + name: "openapi-codegen", + configResolved(config) { + resolvedViteConfig = config; + }, + buildStart() { + enqueueGenerate(); + }, + configureServer(server) { + setupWatcher(server); + }, + }; +} + +function normalizePaths(config: OpenAPICodegenConfig, root: string): OpenAPICodegenConfig { + const normalized = { ...config }; + + if (typeof normalized.output === "string" && !path.isAbsolute(normalized.output)) { + normalized.output = path.resolve(root, normalized.output); + } + + if ( + typeof normalized.input === "string" && + !path.isAbsolute(normalized.input) && + !/^https?:\/\//i.test(normalized.input) + ) { + normalized.input = path.resolve(root, normalized.input); + } + + return normalized; +} diff --git a/tsdown.config.ts b/tsdown.config.ts new file mode 100644 index 0000000..d77680e --- /dev/null +++ b/tsdown.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from "tsdown"; +import packageJson from "./package.json" with { type: "json" }; + +export default defineConfig({ + entry: ["./src/sh.ts", "./src/generator.ts", "./src/index.ts", "./src/vite.ts", "./src/acl.ts"], + format: "esm", + platform: "node", + target: "esnext", + dts: true, + define: { + "process.env.OPENAPI_CODEGEN_VERSION": JSON.stringify(packageJson.version), + "process.env.NODE_ENV": JSON.stringify("production"), + }, +}); diff --git a/vite.config.mjs b/vite.config.mjs deleted file mode 100644 index 3948c67..0000000 --- a/vite.config.mjs +++ /dev/null @@ -1,62 +0,0 @@ -import { readFileSync } from "fs"; -import { resolve } from "path"; - -import { defineConfig } from "vite"; -import dts from "vite-plugin-dts"; - -import react from "@vitejs/plugin-react"; - -const pkg = JSON.parse(readFileSync("./package.json", "utf-8")); - -export default defineConfig({ - plugins: [ - react(), - dts({ - insertTypesEntry: true, - tsconfigPath: "./tsconfig.json", - entryRoot: "src", - outDir: "dist", - compilerOptions: { - paths: { - "@/*": ["./src/*"], - }, - }, - }), - ], - resolve: { - alias: { - "@": resolve(process.cwd(), "./src"), - }, - }, - build: { - sourcemap: false, - emptyOutDir: false, - lib: { - formats: ["es"], - entry: { - index: "src/index.ts", - acl: "src/acl.ts", - }, - }, - minify: false, - outDir: "dist", - rollupOptions: { - external: [ - // Externalize all dependencies and peerDependencies - ...Object.keys(pkg.dependencies || {}), - ...Object.keys(pkg.peerDependencies || {}), - /^react($|\/)/, - /^react-dom($|\/)/, - /^@[\w-]+\//, - ], - output: { - preserveModules: true, - preserveModulesRoot: "src", - globals: { - react: "React", - "react-dom": "ReactDOM", - }, - }, - }, - }, -}); diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 9f89097..0000000 --- a/yarn.lock +++ /dev/null @@ -1,4651 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 8 - cacheKey: 10c0 - -"@apidevtools/json-schema-ref-parser@npm:9.0.6": - version: 9.0.6 - resolution: "@apidevtools/json-schema-ref-parser@npm:9.0.6" - dependencies: - "@jsdevtools/ono": "npm:^7.1.3" - call-me-maybe: "npm:^1.0.1" - js-yaml: "npm:^3.13.1" - checksum: 10c0/fc2cde5d8f99480bce78d9578d8c691f4a24fe1360aa52c22015d69ebb71c9caf27f9baa64239b69224ddc0d3c34792fc368a1a7fa3c55e26902cbbcd2f7ae53 - languageName: node - linkType: hard - -"@apidevtools/openapi-schemas@npm:^2.1.0": - version: 2.1.0 - resolution: "@apidevtools/openapi-schemas@npm:2.1.0" - checksum: 10c0/f4aa0f9df32e474d166c84ef91bceb18fa1c4f44b5593879529154ef340846811ea57dc2921560f157f692262827d28d988dd6e19fb21f00320e9961964176b4 - languageName: node - linkType: hard - -"@apidevtools/swagger-methods@npm:^3.0.2": - version: 3.0.2 - resolution: "@apidevtools/swagger-methods@npm:3.0.2" - checksum: 10c0/8c390e8e50c0be7787ba0ba4c3758488bde7c66c2d995209b4b48c1f8bc988faf393cbb24a4bd1cd2d42ce5167c26538e8adea5c85eb922761b927e4dab9fa1c - languageName: node - linkType: hard - -"@apidevtools/swagger-parser@npm:^10.1.0": - version: 10.1.0 - resolution: "@apidevtools/swagger-parser@npm:10.1.0" - dependencies: - "@apidevtools/json-schema-ref-parser": "npm:9.0.6" - "@apidevtools/openapi-schemas": "npm:^2.1.0" - "@apidevtools/swagger-methods": "npm:^3.0.2" - "@jsdevtools/ono": "npm:^7.1.3" - ajv: "npm:^8.6.3" - ajv-draft-04: "npm:^1.0.0" - call-me-maybe: "npm:^1.0.1" - peerDependencies: - openapi-types: ">=7" - checksum: 10c0/9a81529af6498a26e1d981bbbaccc02d1c7513ec4fdaa56c5f8fd048a73c171f6f92e55e85befa6fafc1bc4901be93c8af476fedc969cbf71b264c4f69cece84 - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/code-frame@npm:7.29.0" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.28.5" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.1.1" - checksum: 10c0/d34cc504e7765dfb576a663d97067afb614525806b5cad1a5cc1a7183b916fec8ff57fa233585e3926fd5a9e6b31aae6df91aa81ae9775fb7a28f658d3346f0d - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.28.6": - version: 7.29.0 - resolution: "@babel/compat-data@npm:7.29.0" - checksum: 10c0/08f348554989d23aa801bf1405aa34b15e841c0d52d79da7e524285c77a5f9d298e70e11d91cc578d8e2c9542efc586d50c5f5cf8e1915b254a9dcf786913a94 - languageName: node - linkType: hard - -"@babel/core@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/core@npm:7.29.0" - dependencies: - "@babel/code-frame": "npm:^7.29.0" - "@babel/generator": "npm:^7.29.0" - "@babel/helper-compilation-targets": "npm:^7.28.6" - "@babel/helper-module-transforms": "npm:^7.28.6" - "@babel/helpers": "npm:^7.28.6" - "@babel/parser": "npm:^7.29.0" - "@babel/template": "npm:^7.28.6" - "@babel/traverse": "npm:^7.29.0" - "@babel/types": "npm:^7.29.0" - "@jridgewell/remapping": "npm:^2.3.5" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10c0/5127d2e8e842ae409e11bcbb5c2dff9874abf5415e8026925af7308e903f4f43397341467a130490d1a39884f461bc2b67f3063bce0be44340db89687fd852aa - languageName: node - linkType: hard - -"@babel/generator@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/generator@npm:7.29.0" - dependencies: - "@babel/parser": "npm:^7.29.0" - "@babel/types": "npm:^7.29.0" - "@jridgewell/gen-mapping": "npm:^0.3.12" - "@jridgewell/trace-mapping": "npm:^0.3.28" - jsesc: "npm:^3.0.2" - checksum: 10c0/5c3df8f2475bfd5f97ad0211c52171aff630088b148e7b89d056b39d69855179bc9f2d1ee200263c76c2398a49e4fdbb38b9709ebc4f043cc04d9ee09a66668a - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helper-compilation-targets@npm:7.28.6" - dependencies: - "@babel/compat-data": "npm:^7.28.6" - "@babel/helper-validator-option": "npm:^7.27.1" - browserslist: "npm:^4.24.0" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10c0/3fcdf3b1b857a1578e99d20508859dbd3f22f3c87b8a0f3dc540627b4be539bae7f6e61e49d931542fe5b557545347272bbdacd7f58a5c77025a18b745593a50 - languageName: node - linkType: hard - -"@babel/helper-globals@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/helper-globals@npm:7.28.0" - checksum: 10c0/5a0cd0c0e8c764b5f27f2095e4243e8af6fa145daea2b41b53c0c1414fe6ff139e3640f4e2207ae2b3d2153a1abd346f901c26c290ee7cb3881dd922d4ee9232 - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helper-module-imports@npm:7.28.6" - dependencies: - "@babel/traverse": "npm:^7.28.6" - "@babel/types": "npm:^7.28.6" - checksum: 10c0/b49d8d8f204d9dbfd5ac70c54e533e5269afb3cea966a9d976722b13e9922cc773a653405f53c89acb247d5aebdae4681d631a3ae3df77ec046b58da76eda2ac - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helper-module-transforms@npm:7.28.6" - dependencies: - "@babel/helper-module-imports": "npm:^7.28.6" - "@babel/helper-validator-identifier": "npm:^7.28.5" - "@babel/traverse": "npm:^7.28.6" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/6f03e14fc30b287ce0b839474b5f271e72837d0cafe6b172d759184d998fbee3903a035e81e07c2c596449e504f453463d58baa65b6f40a37ded5bec74620b2b - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.27.1": - version: 7.28.6 - resolution: "@babel/helper-plugin-utils@npm:7.28.6" - checksum: 10c0/3f5f8acc152fdbb69a84b8624145ff4f9b9f6e776cb989f9f968f8606eb7185c5c3cfcf3ba08534e37e1e0e1c118ac67080610333f56baa4f7376c99b5f1143d - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-string-parser@npm:7.27.1" - checksum: 10c0/8bda3448e07b5583727c103560bcf9c4c24b3c1051a4c516d4050ef69df37bb9a4734a585fe12725b8c2763de0a265aa1e909b485a4e3270b7cfd3e4dbe4b602 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/helper-validator-identifier@npm:7.28.5" - checksum: 10c0/42aaebed91f739a41f3d80b72752d1f95fd7c72394e8e4bd7cdd88817e0774d80a432451bcba17c2c642c257c483bf1d409dd4548883429ea9493a3bc4ab0847 - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-validator-option@npm:7.27.1" - checksum: 10c0/6fec5f006eba40001a20f26b1ef5dbbda377b7b68c8ad518c05baa9af3f396e780bdfded24c4eef95d14bb7b8fd56192a6ed38d5d439b97d10efc5f1a191d148 - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helpers@npm:7.28.6" - dependencies: - "@babel/template": "npm:^7.28.6" - "@babel/types": "npm:^7.28.6" - checksum: 10c0/c4a779c66396bb0cf619402d92f1610601ff3832db2d3b86b9c9dd10983bf79502270e97ac6d5280cea1b1a37de2f06ecbac561bd2271545270407fbe64027cb - languageName: node - linkType: hard - -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.28.5, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/parser@npm:7.29.0" - dependencies: - "@babel/types": "npm:^7.29.0" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/333b2aa761264b91577a74bee86141ef733f9f9f6d4fc52548e4847dc35dfbf821f58c46832c637bfa761a6d9909d6a68f7d1ed59e17e4ffbb958dc510c17b62 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx-self@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/00a4f917b70a608f9aca2fb39aabe04a60aa33165a7e0105fd44b3a8531630eb85bf5572e9f242f51e6ad2fa38c2e7e780902176c863556c58b5ba6f6e164031 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx-source@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/5e67b56c39c4d03e59e03ba80692b24c5a921472079b63af711b1d250fc37c1733a17069b63537f750f3e937ec44a42b1ee6a46cd23b1a0df5163b17f741f7f2 - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.28.4": - version: 7.28.4 - resolution: "@babel/runtime@npm:7.28.4" - checksum: 10c0/792ce7af9750fb9b93879cc9d1db175701c4689da890e6ced242ea0207c9da411ccf16dc04e689cc01158b28d7898c40d75598f4559109f761c12ce01e959bf7 - languageName: node - linkType: hard - -"@babel/template@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/template@npm:7.28.6" - dependencies: - "@babel/code-frame": "npm:^7.28.6" - "@babel/parser": "npm:^7.28.6" - "@babel/types": "npm:^7.28.6" - checksum: 10c0/66d87225ed0bc77f888181ae2d97845021838c619944877f7c4398c6748bcf611f216dfd6be74d39016af502bca876e6ce6873db3c49e4ac354c56d34d57e9f5 - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/traverse@npm:7.29.0" - dependencies: - "@babel/code-frame": "npm:^7.29.0" - "@babel/generator": "npm:^7.29.0" - "@babel/helper-globals": "npm:^7.28.0" - "@babel/parser": "npm:^7.29.0" - "@babel/template": "npm:^7.28.6" - "@babel/types": "npm:^7.29.0" - debug: "npm:^4.3.1" - checksum: 10c0/f63ef6e58d02a9fbf3c0e2e5f1c877da3e0bc57f91a19d2223d53e356a76859cbaf51171c9211c71816d94a0e69efa2732fd27ffc0e1bbc84b636e60932333eb - languageName: node - linkType: hard - -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/types@npm:7.29.0" - dependencies: - "@babel/helper-string-parser": "npm:^7.27.1" - "@babel/helper-validator-identifier": "npm:^7.28.5" - checksum: 10c0/23cc3466e83bcbfab8b9bd0edaafdb5d4efdb88b82b3be6728bbade5ba2f0996f84f63b1c5f7a8c0d67efded28300898a5f930b171bb40b311bca2029c4e9b4f - languageName: node - linkType: hard - -"@casl/ability@npm:^6.8.0": - version: 6.8.0 - resolution: "@casl/ability@npm:6.8.0" - dependencies: - "@ucast/mongo2js": "npm:^1.3.0" - checksum: 10c0/82ad74b64af7b25caffc9bac3dd75d2ac3304ac25a616e09d55b8b750311187a01e291216d9f26fe36f40d190eedcb7d07b69bfd8702bdb78986b7da0c41036e - languageName: node - linkType: hard - -"@casl/react@npm:^5.0.1": - version: 5.0.1 - resolution: "@casl/react@npm:5.0.1" - peerDependencies: - "@casl/ability": ^4.0.0 || ^5.1.0 || ^6.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/d66877b3c3c651f4bb1f9cc08db53d468483c52a2c0da4cea3b6b9dcfebbc815986e274cbfabd6238731f9af8950191fe382b3a1a59f02ffc9cd6504d3f599d0 - languageName: node - linkType: hard - -"@esbuild/aix-ppc64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/aix-ppc64@npm:0.27.2" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/aix-ppc64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/aix-ppc64@npm:0.27.3" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/android-arm64@npm:0.27.2" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/android-arm64@npm:0.27.3" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/android-arm@npm:0.27.2" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/android-arm@npm:0.27.3" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/android-x64@npm:0.27.2" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/android-x64@npm:0.27.3" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/darwin-arm64@npm:0.27.2" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/darwin-arm64@npm:0.27.3" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/darwin-x64@npm:0.27.2" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/darwin-x64@npm:0.27.3" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/freebsd-arm64@npm:0.27.2" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/freebsd-arm64@npm:0.27.3" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/freebsd-x64@npm:0.27.2" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/freebsd-x64@npm:0.27.3" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-arm64@npm:0.27.2" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-arm64@npm:0.27.3" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-arm@npm:0.27.2" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-arm@npm:0.27.3" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-ia32@npm:0.27.2" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-ia32@npm:0.27.3" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-loong64@npm:0.27.2" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-loong64@npm:0.27.3" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-mips64el@npm:0.27.2" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-mips64el@npm:0.27.3" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-ppc64@npm:0.27.2" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-ppc64@npm:0.27.3" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-riscv64@npm:0.27.2" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-riscv64@npm:0.27.3" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-s390x@npm:0.27.2" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-s390x@npm:0.27.3" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-x64@npm:0.27.2" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-x64@npm:0.27.3" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/netbsd-arm64@npm:0.27.2" - conditions: os=netbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/netbsd-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/netbsd-arm64@npm:0.27.3" - conditions: os=netbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/netbsd-x64@npm:0.27.2" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/netbsd-x64@npm:0.27.3" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/openbsd-arm64@npm:0.27.2" - conditions: os=openbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/openbsd-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/openbsd-arm64@npm:0.27.3" - conditions: os=openbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/openbsd-x64@npm:0.27.2" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/openbsd-x64@npm:0.27.3" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openharmony-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/openharmony-arm64@npm:0.27.2" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/openharmony-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/openharmony-arm64@npm:0.27.3" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/sunos-x64@npm:0.27.2" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/sunos-x64@npm:0.27.3" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/win32-arm64@npm:0.27.2" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/win32-arm64@npm:0.27.3" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/win32-ia32@npm:0.27.2" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/win32-ia32@npm:0.27.3" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/win32-x64@npm:0.27.2" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/win32-x64@npm:0.27.3" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@isaacs/balanced-match@npm:^4.0.1": - version: 4.0.1 - resolution: "@isaacs/balanced-match@npm:4.0.1" - checksum: 10c0/7da011805b259ec5c955f01cee903da72ad97c5e6f01ca96197267d3f33103d5b2f8a1af192140f3aa64526c593c8d098ae366c2b11f7f17645d12387c2fd420 - languageName: node - linkType: hard - -"@isaacs/brace-expansion@npm:^5.0.0": - version: 5.0.1 - resolution: "@isaacs/brace-expansion@npm:5.0.1" - dependencies: - "@isaacs/balanced-match": "npm:^4.0.1" - checksum: 10c0/e5d67c7bbf1f17b88132a35bc638af306d48acbb72810d48fa6e6edd8ab375854773108e8bf70f021f7ef6a8273455a6d1f0c3b5aa2aff06ce7894049ab77fb8 - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: "npm:^5.1.2" - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: "npm:^7.0.1" - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: "npm:^8.1.0" - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.12": - version: 0.3.13 - resolution: "@jridgewell/gen-mapping@npm:0.3.13" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.0" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/9a7d65fb13bd9aec1fbab74cda08496839b7e2ceb31f5ab922b323e94d7c481ce0fc4fd7e12e2610915ed8af51178bdc61e168e92a8c8b8303b030b03489b13b - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" - dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb - languageName: node - linkType: hard - -"@jridgewell/remapping@npm:^2.3.5": - version: 2.3.5 - resolution: "@jridgewell/remapping@npm:2.3.5" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/3de494219ffeb2c5c38711d0d7bb128097edf91893090a2dbc8ee0b55d092bb7347b1fd0f478486c5eab010e855c73927b1666f2107516d472d24a73017d1194 - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.2 - resolution: "@jridgewell/resolve-uri@npm:3.1.2" - checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.5.5": - version: 1.5.5 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" - checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.24": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.28": - version: 0.3.31 - resolution: "@jridgewell/trace-mapping@npm:0.3.31" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9 - languageName: node - linkType: hard - -"@jsdevtools/ono@npm:^7.1.3": - version: 7.1.3 - resolution: "@jsdevtools/ono@npm:7.1.3" - checksum: 10c0/a9f7e3e8e3bc315a34959934a5e2f874c423cf4eae64377d3fc9de0400ed9f36cb5fd5ebce3300d2e8f4085f557c4a8b591427a583729a87841fda46e6c216b9 - languageName: node - linkType: hard - -"@microsoft/api-extractor-model@npm:7.32.2": - version: 7.32.2 - resolution: "@microsoft/api-extractor-model@npm:7.32.2" - dependencies: - "@microsoft/tsdoc": "npm:~0.16.0" - "@microsoft/tsdoc-config": "npm:~0.18.0" - "@rushstack/node-core-library": "npm:5.19.1" - checksum: 10c0/26c7cf56d8b74dbe20270a767ae365a9b93178cd378363c20c15823a68124d55af5c2b4aea5f30dc2b4a93194db3041b4861e39ace79e3d649f06b4b0a6bfb87 - languageName: node - linkType: hard - -"@microsoft/api-extractor@npm:^7.50.1": - version: 7.56.0 - resolution: "@microsoft/api-extractor@npm:7.56.0" - dependencies: - "@microsoft/api-extractor-model": "npm:7.32.2" - "@microsoft/tsdoc": "npm:~0.16.0" - "@microsoft/tsdoc-config": "npm:~0.18.0" - "@rushstack/node-core-library": "npm:5.19.1" - "@rushstack/rig-package": "npm:0.6.0" - "@rushstack/terminal": "npm:0.21.0" - "@rushstack/ts-command-line": "npm:5.1.7" - diff: "npm:~8.0.2" - lodash: "npm:~4.17.15" - minimatch: "npm:10.0.3" - resolve: "npm:~1.22.1" - semver: "npm:~7.5.4" - source-map: "npm:~0.6.1" - typescript: "npm:5.8.2" - bin: - api-extractor: bin/api-extractor - checksum: 10c0/18147cb9dd827377a8a7cbb4bc93b8d5984b5b746bb74f830d2fffe3d3a8ded3db313c423f679bba6fad7c32493aee6cdcf535dff0105f87e3fa336eb860cfc6 - languageName: node - linkType: hard - -"@microsoft/tsdoc-config@npm:~0.18.0": - version: 0.18.0 - resolution: "@microsoft/tsdoc-config@npm:0.18.0" - dependencies: - "@microsoft/tsdoc": "npm:0.16.0" - ajv: "npm:~8.12.0" - jju: "npm:~1.4.0" - resolve: "npm:~1.22.2" - checksum: 10c0/6e2c3bfde3e5fa4c0360127c86fe016dcf1b09d0091d767c06ce916284d3f6aeea3617a33b855c5bb2615ab0f2840eeebd4c7f4a1f879f951828d213bf306cfd - languageName: node - linkType: hard - -"@microsoft/tsdoc@npm:0.16.0, @microsoft/tsdoc@npm:~0.16.0": - version: 0.16.0 - resolution: "@microsoft/tsdoc@npm:0.16.0" - checksum: 10c0/8883bb0ed22753af7360e9222687fda4eb448f0a574ea34b4596c11e320148b3ae0d24e00f8923df8ba7bc62a46a6f53b9343243a348640d923dfd55d52cd6bb - languageName: node - linkType: hard - -"@npmcli/agent@npm:^2.0.0": - version: 2.2.2 - resolution: "@npmcli/agent@npm:2.2.2" - dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/325e0db7b287d4154ecd164c0815c08007abfb07653cc57bceded17bb7fd240998a3cbdbe87d700e30bef494885eccc725ab73b668020811d56623d145b524ae - languageName: node - linkType: hard - -"@npmcli/fs@npm:^3.1.0": - version: 3.1.1 - resolution: "@npmcli/fs@npm:3.1.1" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/c37a5b4842bfdece3d14dfdb054f73fe15ed2d3da61b34ff76629fb5b1731647c49166fd2a8bf8b56fcfa51200382385ea8909a3cbecdad612310c114d3f6c99 - languageName: node - linkType: hard - -"@oxfmt/binding-android-arm-eabi@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-android-arm-eabi@npm:0.34.0" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@oxfmt/binding-android-arm64@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-android-arm64@npm:0.34.0" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@oxfmt/binding-darwin-arm64@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-darwin-arm64@npm:0.34.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@oxfmt/binding-darwin-x64@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-darwin-x64@npm:0.34.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@oxfmt/binding-freebsd-x64@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-freebsd-x64@npm:0.34.0" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@oxfmt/binding-linux-arm-gnueabihf@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-arm-gnueabihf@npm:0.34.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@oxfmt/binding-linux-arm-musleabihf@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-arm-musleabihf@npm:0.34.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@oxfmt/binding-linux-arm64-gnu@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-arm64-gnu@npm:0.34.0" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@oxfmt/binding-linux-arm64-musl@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-arm64-musl@npm:0.34.0" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@oxfmt/binding-linux-ppc64-gnu@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-ppc64-gnu@npm:0.34.0" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@oxfmt/binding-linux-riscv64-gnu@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-riscv64-gnu@npm:0.34.0" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@oxfmt/binding-linux-riscv64-musl@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-riscv64-musl@npm:0.34.0" - conditions: os=linux & cpu=riscv64 & libc=musl - languageName: node - linkType: hard - -"@oxfmt/binding-linux-s390x-gnu@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-s390x-gnu@npm:0.34.0" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@oxfmt/binding-linux-x64-gnu@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-x64-gnu@npm:0.34.0" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@oxfmt/binding-linux-x64-musl@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-x64-musl@npm:0.34.0" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@oxfmt/binding-openharmony-arm64@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-openharmony-arm64@npm:0.34.0" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@oxfmt/binding-win32-arm64-msvc@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-win32-arm64-msvc@npm:0.34.0" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@oxfmt/binding-win32-ia32-msvc@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-win32-ia32-msvc@npm:0.34.0" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@oxfmt/binding-win32-x64-msvc@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-win32-x64-msvc@npm:0.34.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@oxlint-tsgolint/darwin-arm64@npm:0.14.1": - version: 0.14.1 - resolution: "@oxlint-tsgolint/darwin-arm64@npm:0.14.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@oxlint-tsgolint/darwin-x64@npm:0.14.1": - version: 0.14.1 - resolution: "@oxlint-tsgolint/darwin-x64@npm:0.14.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@oxlint-tsgolint/linux-arm64@npm:0.14.1": - version: 0.14.1 - resolution: "@oxlint-tsgolint/linux-arm64@npm:0.14.1" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@oxlint-tsgolint/linux-x64@npm:0.14.1": - version: 0.14.1 - resolution: "@oxlint-tsgolint/linux-x64@npm:0.14.1" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@oxlint-tsgolint/win32-arm64@npm:0.14.1": - version: 0.14.1 - resolution: "@oxlint-tsgolint/win32-arm64@npm:0.14.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@oxlint-tsgolint/win32-x64@npm:0.14.1": - version: 0.14.1 - resolution: "@oxlint-tsgolint/win32-x64@npm:0.14.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@oxlint/binding-android-arm-eabi@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-android-arm-eabi@npm:1.49.0" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@oxlint/binding-android-arm64@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-android-arm64@npm:1.49.0" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@oxlint/binding-darwin-arm64@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-darwin-arm64@npm:1.49.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@oxlint/binding-darwin-x64@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-darwin-x64@npm:1.49.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@oxlint/binding-freebsd-x64@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-freebsd-x64@npm:1.49.0" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@oxlint/binding-linux-arm-gnueabihf@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-arm-gnueabihf@npm:1.49.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@oxlint/binding-linux-arm-musleabihf@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-arm-musleabihf@npm:1.49.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@oxlint/binding-linux-arm64-gnu@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-arm64-gnu@npm:1.49.0" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@oxlint/binding-linux-arm64-musl@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-arm64-musl@npm:1.49.0" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@oxlint/binding-linux-ppc64-gnu@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-ppc64-gnu@npm:1.49.0" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@oxlint/binding-linux-riscv64-gnu@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-riscv64-gnu@npm:1.49.0" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@oxlint/binding-linux-riscv64-musl@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-riscv64-musl@npm:1.49.0" - conditions: os=linux & cpu=riscv64 & libc=musl - languageName: node - linkType: hard - -"@oxlint/binding-linux-s390x-gnu@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-s390x-gnu@npm:1.49.0" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@oxlint/binding-linux-x64-gnu@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-x64-gnu@npm:1.49.0" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@oxlint/binding-linux-x64-musl@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-x64-musl@npm:1.49.0" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@oxlint/binding-openharmony-arm64@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-openharmony-arm64@npm:1.49.0" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@oxlint/binding-win32-arm64-msvc@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-win32-arm64-msvc@npm:1.49.0" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@oxlint/binding-win32-ia32-msvc@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-win32-ia32-msvc@npm:1.49.0" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@oxlint/binding-win32-x64-msvc@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-win32-x64-msvc@npm:1.49.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd - languageName: node - linkType: hard - -"@povio/openapi-codegen-cli@workspace:.": - version: 0.0.0-use.local - resolution: "@povio/openapi-codegen-cli@workspace:." - dependencies: - "@apidevtools/swagger-parser": "npm:^10.1.0" - "@casl/ability": "npm:^6.8.0" - "@casl/react": "npm:^5.0.1" - "@tanstack/react-query": "npm:~5.90.21" - "@types/node": "npm:^25.3.0" - "@types/prompt-sync": "npm:^4.2.3" - "@types/react": "npm:^19.2.14" - "@types/yargs": "npm:^17.0.35" - "@vitejs/plugin-react": "npm:^5.1.4" - axios: "npm:^1.13.5" - esbuild: "npm:0.27.3" - handlebars: "npm:^4.7.8" - i18next: "npm:^25.8.11" - import-fresh: "npm:^3.3.1" - openapi-types: "npm:^12.1.3" - oxfmt: "npm:^0.34.0" - oxlint: "npm:^1.49.0" - oxlint-tsgolint: "npm:^0.14.1" - prompt-sync: "npm:^4.2.0" - react: "npm:^19.2.4" - reflect-metadata: "npm:^0.2.2" - ts-pattern: "npm:^5.9.0" - tsx: "npm:^4.21.0" - type-fest: "npm:^5.4.4" - typescript: "npm:^5.9.3" - vite: "npm:^7.3.1" - vite-plugin-dts: "npm:^4.5.4" - vitest: "npm:4.0.18" - yargs: "npm:^18.0.0" - zod: "npm:^4.3.6" - peerDependencies: - "@casl/ability": ^6.7.3 - "@casl/react": ^5.0.0 - "@tanstack/react-query": ^5.90.21 - axios: ^1.13.1 - react: ^19.1.0 - zod: ^4.1.12 - peerDependenciesMeta: - "@casl/ability": - optional: true - "@casl/react": - optional: true - bin: - openapi-codegen: ./dist/sh.js - languageName: unknown - linkType: soft - -"@rolldown/pluginutils@npm:1.0.0-rc.3": - version: 1.0.0-rc.3 - resolution: "@rolldown/pluginutils@npm:1.0.0-rc.3" - checksum: 10c0/3928b6282a30f307d1b075d2f217180ae173ea9e00638ce46ab65f089bd5f7a0b2c488ae1ce530f509387793c656a2910337c4cd68fa9d37d7e439365989e699 - languageName: node - linkType: hard - -"@rollup/pluginutils@npm:^5.1.4": - version: 5.3.0 - resolution: "@rollup/pluginutils@npm:5.3.0" - dependencies: - "@types/estree": "npm:^1.0.0" - estree-walker: "npm:^2.0.2" - picomatch: "npm:^4.0.2" - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10c0/001834bf62d7cf5bac424d2617c113f7f7d3b2bf3c1778cbcccb72cdc957b68989f8e7747c782c2b911f1dde8257f56f8ac1e779e29e74e638e3f1e2cac2bcd0 - languageName: node - linkType: hard - -"@rollup/rollup-android-arm-eabi@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.57.1" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@rollup/rollup-android-arm64@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-android-arm64@npm:4.57.1" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-arm64@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-darwin-arm64@npm:4.57.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-x64@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-darwin-x64@npm:4.57.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-arm64@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.57.1" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-x64@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-freebsd-x64@npm:4.57.1" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-gnueabihf@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.57.1" - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-musleabihf@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.57.1" - conditions: os=linux & cpu=arm & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-gnu@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.57.1" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-musl@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.57.1" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-loong64-gnu@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.57.1" - conditions: os=linux & cpu=loong64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-loong64-musl@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-loong64-musl@npm:4.57.1" - conditions: os=linux & cpu=loong64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-ppc64-gnu@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.57.1" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-ppc64-musl@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-ppc64-musl@npm:4.57.1" - conditions: os=linux & cpu=ppc64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-riscv64-gnu@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.57.1" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-riscv64-musl@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.57.1" - conditions: os=linux & cpu=riscv64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-s390x-gnu@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.57.1" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-gnu@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.57.1" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-musl@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.57.1" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-openbsd-x64@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-openbsd-x64@npm:4.57.1" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-openharmony-arm64@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-openharmony-arm64@npm:4.57.1" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-arm64-msvc@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.57.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-ia32-msvc@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.57.1" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-gnu@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-win32-x64-gnu@npm:4.57.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-msvc@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.57.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rushstack/node-core-library@npm:5.19.1": - version: 5.19.1 - resolution: "@rushstack/node-core-library@npm:5.19.1" - dependencies: - ajv: "npm:~8.13.0" - ajv-draft-04: "npm:~1.0.0" - ajv-formats: "npm:~3.0.1" - fs-extra: "npm:~11.3.0" - import-lazy: "npm:~4.0.0" - jju: "npm:~1.4.0" - resolve: "npm:~1.22.1" - semver: "npm:~7.5.4" - peerDependencies: - "@types/node": "*" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/1c9174e1d38ce6d1cf5dfff394d800de6a5cb43666da67df7d07b93243a61b0479f5ef04e9c5f8c31759309203a0d7e174157c515c869bab26d23187202bff1c - languageName: node - linkType: hard - -"@rushstack/problem-matcher@npm:0.1.1": - version: 0.1.1 - resolution: "@rushstack/problem-matcher@npm:0.1.1" - peerDependencies: - "@types/node": "*" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/c847e721d3536ebb316fdd90b3e4033a7d24ff8c70e38e3eaeaadf167c4d14a7f16377ae4af8097532386bcfa81c15cfec7d2da517542c07882d273d56861d78 - languageName: node - linkType: hard - -"@rushstack/rig-package@npm:0.6.0": - version: 0.6.0 - resolution: "@rushstack/rig-package@npm:0.6.0" - dependencies: - resolve: "npm:~1.22.1" - strip-json-comments: "npm:~3.1.1" - checksum: 10c0/303c5c010a698343124036414dbeed44b24e67585307ffa6effd052624b0384cc08a12aeb153e8466b7abd6f516900ecf8629600230f0f2c33cd5c0c3dace65e - languageName: node - linkType: hard - -"@rushstack/terminal@npm:0.21.0": - version: 0.21.0 - resolution: "@rushstack/terminal@npm:0.21.0" - dependencies: - "@rushstack/node-core-library": "npm:5.19.1" - "@rushstack/problem-matcher": "npm:0.1.1" - supports-color: "npm:~8.1.1" - peerDependencies: - "@types/node": "*" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/47f5688674a10785b65a07760fdb4b010bd9dbad141ea2ae78c8c0c320daecd66363d1c4fad78137e87582cabd6432f2919f7f4eb7557c0f836ce24b58ca45ca - languageName: node - linkType: hard - -"@rushstack/ts-command-line@npm:5.1.7": - version: 5.1.7 - resolution: "@rushstack/ts-command-line@npm:5.1.7" - dependencies: - "@rushstack/terminal": "npm:0.21.0" - "@types/argparse": "npm:1.0.38" - argparse: "npm:~1.0.9" - string-argv: "npm:~0.3.1" - checksum: 10c0/5ec13fcde7fe66ea0af6dac78908c9887810044656269c296db0c4311b703aa73ee7b4d5ace00c51062598da936f94695ce0d5caec0d1c0c6022040d335b77ac - languageName: node - linkType: hard - -"@standard-schema/spec@npm:^1.0.0": - version: 1.1.0 - resolution: "@standard-schema/spec@npm:1.1.0" - checksum: 10c0/d90f55acde4b2deb983529c87e8025fa693de1a5e8b49ecc6eb84d1fd96328add0e03d7d551442156c7432fd78165b2c26ff561b970a9a881f046abb78d6a526 - languageName: node - linkType: hard - -"@tanstack/query-core@npm:5.90.20": - version: 5.90.20 - resolution: "@tanstack/query-core@npm:5.90.20" - checksum: 10c0/70637dfcecd5ed9d810629aa27f1632af8a4bcd083e75cf29408d058c32f8234704a3231ec280e2c4016ea0485b16124fdf70ab97793b5a7b670f43f7659e9fe - languageName: node - linkType: hard - -"@tanstack/react-query@npm:~5.90.21": - version: 5.90.21 - resolution: "@tanstack/react-query@npm:5.90.21" - dependencies: - "@tanstack/query-core": "npm:5.90.20" - peerDependencies: - react: ^18 || ^19 - checksum: 10c0/e8994c57f6ceb2c886a4d6486a8c6a3f89bc6b1220de3e732448d7fcbeb386e9358f03c73804de72004c6ac2668d0bf1b44cedbb273d3e4b33afcbaee7b7d24d - languageName: node - linkType: hard - -"@types/argparse@npm:1.0.38": - version: 1.0.38 - resolution: "@types/argparse@npm:1.0.38" - checksum: 10c0/4fc892da5df16923f48180da2d1f4562fa8b0507cf636b24780444fa0a1d7321d4dc0c0ecbee6152968823f5a2ae0d321b4f8c705a489bf1ae1245bdeb0868fd - languageName: node - linkType: hard - -"@types/babel__core@npm:^7.20.5": - version: 7.20.5 - resolution: "@types/babel__core@npm:7.20.5" - dependencies: - "@babel/parser": "npm:^7.20.7" - "@babel/types": "npm:^7.20.7" - "@types/babel__generator": "npm:*" - "@types/babel__template": "npm:*" - "@types/babel__traverse": "npm:*" - checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff - languageName: node - linkType: hard - -"@types/babel__generator@npm:*": - version: 7.27.0 - resolution: "@types/babel__generator@npm:7.27.0" - dependencies: - "@babel/types": "npm:^7.0.0" - checksum: 10c0/9f9e959a8792df208a9d048092fda7e1858bddc95c6314857a8211a99e20e6830bdeb572e3587ae8be5429e37f2a96fcf222a9f53ad232f5537764c9e13a2bbd - languageName: node - linkType: hard - -"@types/babel__template@npm:*": - version: 7.4.4 - resolution: "@types/babel__template@npm:7.4.4" - dependencies: - "@babel/parser": "npm:^7.1.0" - "@babel/types": "npm:^7.0.0" - checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b - languageName: node - linkType: hard - -"@types/babel__traverse@npm:*": - version: 7.28.0 - resolution: "@types/babel__traverse@npm:7.28.0" - dependencies: - "@babel/types": "npm:^7.28.2" - checksum: 10c0/b52d7d4e8fc6a9018fe7361c4062c1c190f5778cf2466817cb9ed19d69fbbb54f9a85ffedeb748ed8062d2cf7d4cc088ee739848f47c57740de1c48cbf0d0994 - languageName: node - linkType: hard - -"@types/chai@npm:^5.2.2": - version: 5.2.3 - resolution: "@types/chai@npm:5.2.3" - dependencies: - "@types/deep-eql": "npm:*" - assertion-error: "npm:^2.0.1" - checksum: 10c0/e0ef1de3b6f8045a5e473e867c8565788c444271409d155588504840ad1a53611011f85072188c2833941189400228c1745d78323dac13fcede9c2b28bacfb2f - languageName: node - linkType: hard - -"@types/deep-eql@npm:*": - version: 4.0.2 - resolution: "@types/deep-eql@npm:4.0.2" - checksum: 10c0/bf3f811843117900d7084b9d0c852da9a044d12eb40e6de73b552598a6843c21291a8a381b0532644574beecd5e3491c5ff3a0365ab86b15d59862c025384844 - languageName: node - linkType: hard - -"@types/estree@npm:1.0.8": - version: 1.0.8 - resolution: "@types/estree@npm:1.0.8" - checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 - languageName: node - linkType: hard - -"@types/estree@npm:^1.0.0": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d - languageName: node - linkType: hard - -"@types/node@npm:^25.3.0": - version: 25.3.0 - resolution: "@types/node@npm:25.3.0" - dependencies: - undici-types: "npm:~7.18.0" - checksum: 10c0/7b2b18c9d68047157367fc2f786d4f166d22dc0ad9f82331ca02fb16f2f391854123dbe604dcb938cda119c87051e4bb71dcb9ece44a579f483a6f96d4bd41de - languageName: node - linkType: hard - -"@types/prompt-sync@npm:^4.2.3": - version: 4.2.3 - resolution: "@types/prompt-sync@npm:4.2.3" - checksum: 10c0/e787a2d99938eba1dbdf94534c9777e0b45aac8aa099364467f576e07b1667b9bf3b3fda7b47333903dee62924174d3d8c0df0c34f371e4c70321fd6966a9840 - languageName: node - linkType: hard - -"@types/react@npm:^19.2.14": - version: 19.2.14 - resolution: "@types/react@npm:19.2.14" - dependencies: - csstype: "npm:^3.2.2" - checksum: 10c0/7d25bf41b57719452d86d2ac0570b659210402707313a36ee612666bf11275a1c69824f8c3ee1fdca077ccfe15452f6da8f1224529b917050eb2d861e52b59b7 - languageName: node - linkType: hard - -"@types/yargs-parser@npm:*": - version: 21.0.3 - resolution: "@types/yargs-parser@npm:21.0.3" - checksum: 10c0/e71c3bd9d0b73ca82e10bee2064c384ab70f61034bbfb78e74f5206283fc16a6d85267b606b5c22cb2a3338373586786fed595b2009825d6a9115afba36560a0 - languageName: node - linkType: hard - -"@types/yargs@npm:^17.0.35": - version: 17.0.35 - resolution: "@types/yargs@npm:17.0.35" - dependencies: - "@types/yargs-parser": "npm:*" - checksum: 10c0/609557826a6b85e73ccf587923f6429850d6dc70e420b455bab4601b670bfadf684b09ae288bccedab042c48ba65f1666133cf375814204b544009f57d6eef63 - languageName: node - linkType: hard - -"@ucast/core@npm:^1.0.0, @ucast/core@npm:^1.4.1, @ucast/core@npm:^1.6.1": - version: 1.10.2 - resolution: "@ucast/core@npm:1.10.2" - checksum: 10c0/bc24a2b02d796b5c14353aaf1c8faf8103157695522e82e9d6d7813a300e631a406d4809030c582bda99a72232a8eb19f25b4d78857f1c9fab2e8fb2028706e8 - languageName: node - linkType: hard - -"@ucast/js@npm:^3.0.0": - version: 3.0.4 - resolution: "@ucast/js@npm:3.0.4" - dependencies: - "@ucast/core": "npm:^1.0.0" - checksum: 10c0/c1243a22a82afa6a553317ed8201dbc496b86d3a33220778033773789bd7f38efe8ddb65d6dd9dd7b8035239f87a467b17c560afd206c0ece8b71780333d4f17 - languageName: node - linkType: hard - -"@ucast/mongo2js@npm:^1.3.0": - version: 1.4.0 - resolution: "@ucast/mongo2js@npm:1.4.0" - dependencies: - "@ucast/core": "npm:^1.6.1" - "@ucast/js": "npm:^3.0.0" - "@ucast/mongo": "npm:^2.4.0" - checksum: 10c0/3feeb7b175fc8263764fbcb8a88d0bfa26640bc7fb2d76aa7c34cb21397ecb2008e8b66387f4204bf435d98cd9fad0afddef0948f82aa64e98fa7574b8dbb181 - languageName: node - linkType: hard - -"@ucast/mongo@npm:^2.4.0": - version: 2.4.3 - resolution: "@ucast/mongo@npm:2.4.3" - dependencies: - "@ucast/core": "npm:^1.4.1" - checksum: 10c0/3b806014f5754594faae5045f778e330c03216904895116ad524bd5e57e24875d7994add478e873628b5b2406d8c4cbce6e3eba5a7c6591924e4226e956d78b6 - languageName: node - linkType: hard - -"@vitejs/plugin-react@npm:^5.1.4": - version: 5.1.4 - resolution: "@vitejs/plugin-react@npm:5.1.4" - dependencies: - "@babel/core": "npm:^7.29.0" - "@babel/plugin-transform-react-jsx-self": "npm:^7.27.1" - "@babel/plugin-transform-react-jsx-source": "npm:^7.27.1" - "@rolldown/pluginutils": "npm:1.0.0-rc.3" - "@types/babel__core": "npm:^7.20.5" - react-refresh: "npm:^0.18.0" - peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/dd7b8f40717ecd4a5ab18f467134ea8135f9a443359333d71e4114aeacfc8b679be9fd36dc12290d076c78883a02e708bfe1f0d93411c06c9659da0879b952e3 - languageName: node - linkType: hard - -"@vitest/expect@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/expect@npm:4.0.18" - dependencies: - "@standard-schema/spec": "npm:^1.0.0" - "@types/chai": "npm:^5.2.2" - "@vitest/spy": "npm:4.0.18" - "@vitest/utils": "npm:4.0.18" - chai: "npm:^6.2.1" - tinyrainbow: "npm:^3.0.3" - checksum: 10c0/123b0aa111682e82ec5289186df18037b1a1768700e468ee0f9879709aaa320cf790463c15c0d8ee10df92b402f4394baf5d27797e604d78e674766d87bcaadc - languageName: node - linkType: hard - -"@vitest/mocker@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/mocker@npm:4.0.18" - dependencies: - "@vitest/spy": "npm:4.0.18" - estree-walker: "npm:^3.0.3" - magic-string: "npm:^0.30.21" - peerDependencies: - msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0-0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - checksum: 10c0/fb0a257e7e167759d4ad228d53fa7bad2267586459c4a62188f2043dd7163b4b02e1e496dc3c227837f776e7d73d6c4343613e89e7da379d9d30de8260f1ee4b - languageName: node - linkType: hard - -"@vitest/pretty-format@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/pretty-format@npm:4.0.18" - dependencies: - tinyrainbow: "npm:^3.0.3" - checksum: 10c0/0086b8c88eeca896d8e4b98fcdef452c8041a1b63eb9e85d3e0bcc96c8aa76d8e9e0b6990ebb0bb0a697c4ebab347e7735888b24f507dbff2742ddce7723fd94 - languageName: node - linkType: hard - -"@vitest/runner@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/runner@npm:4.0.18" - dependencies: - "@vitest/utils": "npm:4.0.18" - pathe: "npm:^2.0.3" - checksum: 10c0/fdb4afa411475133c05ba266c8092eaf1e56cbd5fb601f92ec6ccb9bab7ca52e06733ee8626599355cba4ee71cb3a8f28c84d3b69dc972e41047edc50229bc01 - languageName: node - linkType: hard - -"@vitest/snapshot@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/snapshot@npm:4.0.18" - dependencies: - "@vitest/pretty-format": "npm:4.0.18" - magic-string: "npm:^0.30.21" - pathe: "npm:^2.0.3" - checksum: 10c0/d3bfefa558db9a69a66886ace6575eb96903a5ba59f4d9a5d0fecb4acc2bb8dbb443ef409f5ac1475f2e1add30bd1d71280f98912da35e89c75829df9e84ea43 - languageName: node - linkType: hard - -"@vitest/spy@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/spy@npm:4.0.18" - checksum: 10c0/6de537890b3994fcadb8e8d8ac05942320ae184f071ec395d978a5fba7fa928cbb0c5de85af86a1c165706c466e840de8779eaff8c93450c511c7abaeb9b8a4e - languageName: node - linkType: hard - -"@vitest/utils@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/utils@npm:4.0.18" - dependencies: - "@vitest/pretty-format": "npm:4.0.18" - tinyrainbow: "npm:^3.0.3" - checksum: 10c0/4a3c43c1421eb90f38576926496f6c80056167ba111e63f77cf118983902673737a1a38880b890d7c06ec0a12475024587344ee502b3c43093781533022f2aeb - languageName: node - linkType: hard - -"@volar/language-core@npm:2.4.28, @volar/language-core@npm:~2.4.11": - version: 2.4.28 - resolution: "@volar/language-core@npm:2.4.28" - dependencies: - "@volar/source-map": "npm:2.4.28" - checksum: 10c0/d41f7327fed7fa5301fbf2d8f96753d645a976b21dbbeb869794a780aa6523d1e6bf258242bc3d8ccd37f8e8b98a04fea9574e6f63badc585a8a3c2e068c4a86 - languageName: node - linkType: hard - -"@volar/source-map@npm:2.4.28": - version: 2.4.28 - resolution: "@volar/source-map@npm:2.4.28" - checksum: 10c0/24b0b02c7f66febe47f0bfda4a5ed4beaf949041eddc6325c7478b900faeb071795b696d97a4f326dde47217d06e40b67129300bc544f054772c5cb84c2f254e - languageName: node - linkType: hard - -"@volar/typescript@npm:^2.4.11": - version: 2.4.28 - resolution: "@volar/typescript@npm:2.4.28" - dependencies: - "@volar/language-core": "npm:2.4.28" - path-browserify: "npm:^1.0.1" - vscode-uri: "npm:^3.0.8" - checksum: 10c0/075c890b9ec1cb17f17e38aaed035f8ee7d507439e87270d8e3c394356fc9387fd0bda9ec1069b36ea4c378d9375a08f5bc64c063a83427010ddd86d472124fc - languageName: node - linkType: hard - -"@vue/compiler-core@npm:3.5.27": - version: 3.5.27 - resolution: "@vue/compiler-core@npm:3.5.27" - dependencies: - "@babel/parser": "npm:^7.28.5" - "@vue/shared": "npm:3.5.27" - entities: "npm:^7.0.0" - estree-walker: "npm:^2.0.2" - source-map-js: "npm:^1.2.1" - checksum: 10c0/10ea10c0678d314f3f86c226b6f93f2b91e8e2dc6f6388b0e4b5792d5338d60c80e36430c86d007ee5fab629f3ef526af94e2fe2d550e1ae1ee1d389cfebf4e6 - languageName: node - linkType: hard - -"@vue/compiler-dom@npm:^3.5.0": - version: 3.5.27 - resolution: "@vue/compiler-dom@npm:3.5.27" - dependencies: - "@vue/compiler-core": "npm:3.5.27" - "@vue/shared": "npm:3.5.27" - checksum: 10c0/0a91a1b93a0f25936c83a2881da7222d22c6ad160f3405f9aed86668b66f4c7ff1611bcc769441fccd0fecb3c83607c0c1c78a43d8acf3aa106b87034de54e50 - languageName: node - linkType: hard - -"@vue/compiler-vue2@npm:^2.7.16": - version: 2.7.16 - resolution: "@vue/compiler-vue2@npm:2.7.16" - dependencies: - de-indent: "npm:^1.0.2" - he: "npm:^1.2.0" - checksum: 10c0/c76c3fad770b9a7da40b314116cc9da173da20e5fd68785c8ed8dd8a87d02f239545fa296e16552e040ec86b47bfb18283b39447b250c2e76e479bd6ae475bb3 - languageName: node - linkType: hard - -"@vue/language-core@npm:2.2.0": - version: 2.2.0 - resolution: "@vue/language-core@npm:2.2.0" - dependencies: - "@volar/language-core": "npm:~2.4.11" - "@vue/compiler-dom": "npm:^3.5.0" - "@vue/compiler-vue2": "npm:^2.7.16" - "@vue/shared": "npm:^3.5.0" - alien-signals: "npm:^0.4.9" - minimatch: "npm:^9.0.3" - muggle-string: "npm:^0.4.1" - path-browserify: "npm:^1.0.1" - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/1c44cc4067266bbc825af358a867aed455963a08c160cd9df9a47571fd917a87d9de9bdea6149877e0c8309a6cf39f263e7cf2fbadeceba47a5a158f392151b2 - languageName: node - linkType: hard - -"@vue/shared@npm:3.5.27, @vue/shared@npm:^3.5.0": - version: 3.5.27 - resolution: "@vue/shared@npm:3.5.27" - checksum: 10c0/c80a84464530d51cf3d5fa1aab6c3e9717e5901fbc1b8a8eb9962edfc02985c1e03e6dc6d0d205d10cdff067c1c5f689d7156446d2a4c7686a8409a40e3a5f20 - languageName: node - linkType: hard - -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 - languageName: node - linkType: hard - -"acorn@npm:^8.15.0": - version: 8.15.0 - resolution: "acorn@npm:8.15.0" - bin: - acorn: bin/acorn - checksum: 10c0/dec73ff59b7d6628a01eebaece7f2bdb8bb62b9b5926dcad0f8931f2b8b79c2be21f6c68ac095592adb5adb15831a3635d9343e6a91d028bbe85d564875ec3ec - languageName: node - linkType: hard - -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: "npm:^4.3.4" - checksum: 10c0/e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: "npm:^2.0.0" - indent-string: "npm:^4.0.0" - checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 - languageName: node - linkType: hard - -"ajv-draft-04@npm:^1.0.0, ajv-draft-04@npm:~1.0.0": - version: 1.0.0 - resolution: "ajv-draft-04@npm:1.0.0" - peerDependencies: - ajv: ^8.5.0 - peerDependenciesMeta: - ajv: - optional: true - checksum: 10c0/6044310bd38c17d77549fd326bd40ce1506fa10b0794540aa130180808bf94117fac8c9b448c621512bea60e4a947278f6a978e87f10d342950c15b33ddd9271 - languageName: node - linkType: hard - -"ajv-formats@npm:~3.0.1": - version: 3.0.1 - resolution: "ajv-formats@npm:3.0.1" - dependencies: - ajv: "npm:^8.0.0" - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - checksum: 10c0/168d6bca1ea9f163b41c8147bae537e67bd963357a5488a1eaf3abe8baa8eec806d4e45f15b10767e6020679315c7e1e5e6803088dfb84efa2b4e9353b83dd0a - languageName: node - linkType: hard - -"ajv@npm:^8.0.0, ajv@npm:^8.6.3": - version: 8.17.1 - resolution: "ajv@npm:8.17.1" - dependencies: - fast-deep-equal: "npm:^3.1.3" - fast-uri: "npm:^3.0.1" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 - languageName: node - linkType: hard - -"ajv@npm:~8.12.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" - dependencies: - fast-deep-equal: "npm:^3.1.1" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.2.2" - checksum: 10c0/ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e - languageName: node - linkType: hard - -"ajv@npm:~8.13.0": - version: 8.13.0 - resolution: "ajv@npm:8.13.0" - dependencies: - fast-deep-equal: "npm:^3.1.3" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.4.1" - checksum: 10c0/14c6497b6f72843986d7344175a1aa0e2c35b1e7f7475e55bc582cddb765fca7e6bf950f465dc7846f817776d9541b706f4b5b3fbedd8dfdeb5fce6f22864264 - languageName: node - linkType: hard - -"alien-signals@npm:^0.4.9": - version: 0.4.14 - resolution: "alien-signals@npm:0.4.14" - checksum: 10c0/5abb3377bcaf6b3819e950084b3ebd022ad90210105afb450c89dc347e80e28da441bf34858a57ea122abe7603e552ddbad80dc597c8f02a0a5206c5fb9c20cb - languageName: node - linkType: hard - -"ansi-regex@npm:^4.1.0": - version: 4.1.1 - resolution: "ansi-regex@npm:4.1.1" - checksum: 10c0/d36d34234d077e8770169d980fed7b2f3724bfa2a01da150ccd75ef9707c80e883d27cdf7a0eac2f145ac1d10a785a8a855cffd05b85f778629a0db62e7033da - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: "npm:^2.0.1" - checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c - languageName: node - linkType: hard - -"ansi-styles@npm:^6.2.1": - version: 6.2.3 - resolution: "ansi-styles@npm:6.2.3" - checksum: 10c0/23b8a4ce14e18fb854693b95351e286b771d23d8844057ed2e7d083cd3e708376c3323707ec6a24365f7d7eda3ca00327fe04092e29e551499ec4c8b7bfac868 - languageName: node - linkType: hard - -"argparse@npm:^1.0.7, argparse@npm:~1.0.9": - version: 1.0.10 - resolution: "argparse@npm:1.0.10" - dependencies: - sprintf-js: "npm:~1.0.2" - checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de - languageName: node - linkType: hard - -"assertion-error@npm:^2.0.1": - version: 2.0.1 - resolution: "assertion-error@npm:2.0.1" - checksum: 10c0/bbbcb117ac6480138f8c93cf7f535614282dea9dc828f540cdece85e3c665e8f78958b96afac52f29ff883c72638e6a87d469ecc9fe5bc902df03ed24a55dba8 - languageName: node - linkType: hard - -"async-function@npm:^1.0.0": - version: 1.0.0 - resolution: "async-function@npm:1.0.0" - checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73 - languageName: node - linkType: hard - -"async-generator-function@npm:^1.0.0": - version: 1.0.0 - resolution: "async-generator-function@npm:1.0.0" - checksum: 10c0/2c50ef856c543ad500d8d8777d347e3c1ba623b93e99c9263ecc5f965c1b12d2a140e2ab6e43c3d0b85366110696f28114649411cbcd10b452a92a2318394186 - languageName: node - linkType: hard - -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d - languageName: node - linkType: hard - -"axios@npm:^1.13.5": - version: 1.13.5 - resolution: "axios@npm:1.13.5" - dependencies: - follow-redirects: "npm:^1.15.11" - form-data: "npm:^4.0.5" - proxy-from-env: "npm:^1.1.0" - checksum: 10c0/abf468c34f2d145f3dc7dbc0f1be67e520630624307bda69a41bbe8d386bd672d87b4405c4ee77f9ff54b235ab02f96a9968fb00e75b13ce64706e352a3068fd - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee - languageName: node - linkType: hard - -"baseline-browser-mapping@npm:^2.9.0": - version: 2.9.19 - resolution: "baseline-browser-mapping@npm:2.9.19" - bin: - baseline-browser-mapping: dist/cli.js - checksum: 10c0/569928db78bcd081953d7db79e4243a59a579a34b4ae1806b9b42d3b7f84e5bc40e6e82ae4fa06e7bef8291bf747b33b3f9ef5d3c6e1e420cb129d9295536129 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: "npm:^1.0.0" - checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f - languageName: node - linkType: hard - -"browserslist@npm:^4.24.0": - version: 4.28.1 - resolution: "browserslist@npm:4.28.1" - dependencies: - baseline-browser-mapping: "npm:^2.9.0" - caniuse-lite: "npm:^1.0.30001759" - electron-to-chromium: "npm:^1.5.263" - node-releases: "npm:^2.0.27" - update-browserslist-db: "npm:^1.2.0" - bin: - browserslist: cli.js - checksum: 10c0/545a5fa9d7234e3777a7177ec1e9134bb2ba60a69e6b95683f6982b1473aad347c77c1264ccf2ac5dea609a9731fbfbda6b85782bdca70f80f86e28a402504bd - languageName: node - linkType: hard - -"cacache@npm:^18.0.0": - version: 18.0.3 - resolution: "cacache@npm:18.0.3" - dependencies: - "@npmcli/fs": "npm:^3.1.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^4.0.0" - ssri: "npm:^10.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^3.0.0" - checksum: 10c0/dfda92840bb371fb66b88c087c61a74544363b37a265023223a99965b16a16bbb87661fe4948718d79df6e0cc04e85e62784fbcf1832b2a5e54ff4c46fbb45b7 - languageName: node - linkType: hard - -"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind-apply-helpers@npm:1.0.2" - dependencies: - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - checksum: 10c0/47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938 - languageName: node - linkType: hard - -"call-me-maybe@npm:^1.0.1": - version: 1.0.2 - resolution: "call-me-maybe@npm:1.0.2" - checksum: 10c0/8eff5dbb61141ebb236ed71b4e9549e488bcb5451c48c11e5667d5c75b0532303788a1101e6978cafa2d0c8c1a727805599c2741e3e0982855c9f1d78cd06c9f - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001759": - version: 1.0.30001767 - resolution: "caniuse-lite@npm:1.0.30001767" - checksum: 10c0/37067c6d2b26623f81494a1f206adbff2b80baed3318ba430684e428bd7d81be889f39db8ef081501d1db5f7dd5d15972892f173eb59c9f3bb780e0b38e6610a - languageName: node - linkType: hard - -"chai@npm:^6.2.1": - version: 6.2.2 - resolution: "chai@npm:6.2.2" - checksum: 10c0/e6c69e5f0c11dffe6ea13d0290936ebb68fcc1ad688b8e952e131df6a6d5797d5e860bc55cef1aca2e950c3e1f96daf79e9d5a70fb7dbaab4e46355e2635ed53 - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 - languageName: node - linkType: hard - -"cliui@npm:^9.0.1": - version: 9.0.1 - resolution: "cliui@npm:9.0.1" - dependencies: - string-width: "npm:^7.2.0" - strip-ansi: "npm:^7.1.0" - wrap-ansi: "npm:^9.0.0" - checksum: 10c0/13441832e9efe7c7a76bd2b8e683555c478d461a9f249dc5db9b17fe8d4b47fa9277b503914b90bd00e4a151abb6b9b02b2288972ffe2e5e3ca40bcb1c2330d3 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: "npm:~1.1.4" - checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.8": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: "npm:~1.0.0" - checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 - languageName: node - linkType: hard - -"compare-versions@npm:^6.1.1": - version: 6.1.1 - resolution: "compare-versions@npm:6.1.1" - checksum: 10c0/415205c7627f9e4f358f571266422980c9fe2d99086be0c9a48008ef7c771f32b0fbe8e97a441ffedc3910872f917a0675fe0fe3c3b6d331cda6d8690be06338 - languageName: node - linkType: hard - -"confbox@npm:^0.1.8": - version: 0.1.8 - resolution: "confbox@npm:0.1.8" - checksum: 10c0/fc2c68d97cb54d885b10b63e45bd8da83a8a71459d3ecf1825143dd4c7f9f1b696b3283e07d9d12a144c1301c2ebc7842380bdf0014e55acc4ae1c9550102418 - languageName: node - linkType: hard - -"confbox@npm:^0.2.2": - version: 0.2.2 - resolution: "confbox@npm:0.2.2" - checksum: 10c0/7c246588d533d31e8cdf66cb4701dff6de60f9be77ab54c0d0338e7988750ac56863cc0aca1b3f2046f45ff223a765d3e5d4977a7674485afcd37b6edf3fd129 - languageName: node - linkType: hard - -"convert-source-map@npm:^2.0.0": - version: 2.0.0 - resolution: "convert-source-map@npm:2.0.0" - checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0": - version: 7.0.6 - resolution: "cross-spawn@npm:7.0.6" - dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 - languageName: node - linkType: hard - -"csstype@npm:^3.2.2": - version: 3.2.3 - resolution: "csstype@npm:3.2.3" - checksum: 10c0/cd29c51e70fa822f1cecd8641a1445bed7063697469d35633b516e60fe8c1bde04b08f6c5b6022136bb669b64c63d4173af54864510fbb4ee23281801841a3ce - languageName: node - linkType: hard - -"de-indent@npm:^1.0.2": - version: 1.0.2 - resolution: "de-indent@npm:1.0.2" - checksum: 10c0/7058ce58abd6dfc123dd204e36be3797abd419b59482a634605420f47ae97639d0c183ec5d1b904f308a01033f473673897afc2bd59bc620ebf1658763ef4291 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: "npm:2.1.2" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 - languageName: node - linkType: hard - -"debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.4.0": - version: 4.4.3 - resolution: "debug@npm:4.4.3" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 - languageName: node - linkType: hard - -"diff@npm:~8.0.2": - version: 8.0.3 - resolution: "diff@npm:8.0.3" - checksum: 10c0/d29321c70d3545fdcb56c5fdd76028c3f04c012462779e062303d4c3c531af80d2c360c26b871e6e2b9a971d2422d47e1779a859106c4cac4b5d2d143df70e20 - languageName: node - linkType: hard - -"dunder-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "dunder-proto@npm:1.0.1" - dependencies: - call-bind-apply-helpers: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.2.0" - checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.5.263": - version: 1.5.286 - resolution: "electron-to-chromium@npm:1.5.286" - checksum: 10c0/5384510f9682d7e46f98fa48b874c3901d9639de96e9e387afce1fe010fbac31376df0534524edc15f66e9902bfacee54037a5e598004e9c6a617884e379926d - languageName: node - linkType: hard - -"emoji-regex@npm:^10.3.0": - version: 10.6.0 - resolution: "emoji-regex@npm:10.6.0" - checksum: 10c0/1e4aa097bb007301c3b4b1913879ae27327fdc48e93eeefefe3b87e495eb33c5af155300be951b4349ff6ac084f4403dc9eff970acba7c1c572d89396a9a32d7 - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: "npm:^0.6.2" - checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 - languageName: node - linkType: hard - -"entities@npm:^7.0.0": - version: 7.0.1 - resolution: "entities@npm:7.0.1" - checksum: 10c0/b4fb9937bb47ecb00aaaceb9db9cdd1cc0b0fb649c0e843d05cf5dbbd2e9d2df8f98721d8b1b286445689c72af7b54a7242fc2d63ef7c9739037a8c73363e7ca - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.1": - version: 1.0.1 - resolution: "es-define-property@npm:1.0.1" - checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c - languageName: node - linkType: hard - -"es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 - languageName: node - linkType: hard - -"es-module-lexer@npm:^1.7.0": - version: 1.7.0 - resolution: "es-module-lexer@npm:1.7.0" - checksum: 10c0/4c935affcbfeba7fb4533e1da10fa8568043df1e3574b869385980de9e2d475ddc36769891936dbb07036edb3c3786a8b78ccf44964cd130dedc1f2c984b6c7b - languageName: node - linkType: hard - -"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": - version: 1.1.1 - resolution: "es-object-atoms@npm:1.1.1" - dependencies: - es-errors: "npm:^1.3.0" - checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c - languageName: node - linkType: hard - -"es-set-tostringtag@npm:^2.1.0": - version: 2.1.0 - resolution: "es-set-tostringtag@npm:2.1.0" - dependencies: - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.6" - has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.2" - checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af - languageName: node - linkType: hard - -"esbuild@npm:0.27.3, esbuild@npm:~0.27.0": - version: 0.27.3 - resolution: "esbuild@npm:0.27.3" - dependencies: - "@esbuild/aix-ppc64": "npm:0.27.3" - "@esbuild/android-arm": "npm:0.27.3" - "@esbuild/android-arm64": "npm:0.27.3" - "@esbuild/android-x64": "npm:0.27.3" - "@esbuild/darwin-arm64": "npm:0.27.3" - "@esbuild/darwin-x64": "npm:0.27.3" - "@esbuild/freebsd-arm64": "npm:0.27.3" - "@esbuild/freebsd-x64": "npm:0.27.3" - "@esbuild/linux-arm": "npm:0.27.3" - "@esbuild/linux-arm64": "npm:0.27.3" - "@esbuild/linux-ia32": "npm:0.27.3" - "@esbuild/linux-loong64": "npm:0.27.3" - "@esbuild/linux-mips64el": "npm:0.27.3" - "@esbuild/linux-ppc64": "npm:0.27.3" - "@esbuild/linux-riscv64": "npm:0.27.3" - "@esbuild/linux-s390x": "npm:0.27.3" - "@esbuild/linux-x64": "npm:0.27.3" - "@esbuild/netbsd-arm64": "npm:0.27.3" - "@esbuild/netbsd-x64": "npm:0.27.3" - "@esbuild/openbsd-arm64": "npm:0.27.3" - "@esbuild/openbsd-x64": "npm:0.27.3" - "@esbuild/openharmony-arm64": "npm:0.27.3" - "@esbuild/sunos-x64": "npm:0.27.3" - "@esbuild/win32-arm64": "npm:0.27.3" - "@esbuild/win32-ia32": "npm:0.27.3" - "@esbuild/win32-x64": "npm:0.27.3" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-arm64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-arm64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/openharmony-arm64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10c0/fdc3f87a3f08b3ef98362f37377136c389a0d180fda4b8d073b26ba930cf245521db0a368f119cc7624bc619248fff1439f5811f062d853576f8ffa3df8ee5f1 - languageName: node - linkType: hard - -"esbuild@npm:^0.27.0": - version: 0.27.2 - resolution: "esbuild@npm:0.27.2" - dependencies: - "@esbuild/aix-ppc64": "npm:0.27.2" - "@esbuild/android-arm": "npm:0.27.2" - "@esbuild/android-arm64": "npm:0.27.2" - "@esbuild/android-x64": "npm:0.27.2" - "@esbuild/darwin-arm64": "npm:0.27.2" - "@esbuild/darwin-x64": "npm:0.27.2" - "@esbuild/freebsd-arm64": "npm:0.27.2" - "@esbuild/freebsd-x64": "npm:0.27.2" - "@esbuild/linux-arm": "npm:0.27.2" - "@esbuild/linux-arm64": "npm:0.27.2" - "@esbuild/linux-ia32": "npm:0.27.2" - "@esbuild/linux-loong64": "npm:0.27.2" - "@esbuild/linux-mips64el": "npm:0.27.2" - "@esbuild/linux-ppc64": "npm:0.27.2" - "@esbuild/linux-riscv64": "npm:0.27.2" - "@esbuild/linux-s390x": "npm:0.27.2" - "@esbuild/linux-x64": "npm:0.27.2" - "@esbuild/netbsd-arm64": "npm:0.27.2" - "@esbuild/netbsd-x64": "npm:0.27.2" - "@esbuild/openbsd-arm64": "npm:0.27.2" - "@esbuild/openbsd-x64": "npm:0.27.2" - "@esbuild/openharmony-arm64": "npm:0.27.2" - "@esbuild/sunos-x64": "npm:0.27.2" - "@esbuild/win32-arm64": "npm:0.27.2" - "@esbuild/win32-ia32": "npm:0.27.2" - "@esbuild/win32-x64": "npm:0.27.2" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-arm64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-arm64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/openharmony-arm64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10c0/cf83f626f55500f521d5fe7f4bc5871bec240d3deb2a01fbd379edc43b3664d1167428738a5aad8794b35d1cca985c44c375b1cd38a2ca613c77ced2c83aafcd - languageName: node - linkType: hard - -"escalade@npm:^3.1.1": - version: 3.1.2 - resolution: "escalade@npm:3.1.2" - checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 - languageName: node - linkType: hard - -"escalade@npm:^3.2.0": - version: 3.2.0 - resolution: "escalade@npm:3.2.0" - checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 - languageName: node - linkType: hard - -"esprima@npm:^4.0.0": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 - languageName: node - linkType: hard - -"estree-walker@npm:^2.0.2": - version: 2.0.2 - resolution: "estree-walker@npm:2.0.2" - checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af - languageName: node - linkType: hard - -"estree-walker@npm:^3.0.3": - version: 3.0.3 - resolution: "estree-walker@npm:3.0.3" - dependencies: - "@types/estree": "npm:^1.0.0" - checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d - languageName: node - linkType: hard - -"expect-type@npm:^1.2.2": - version: 1.3.0 - resolution: "expect-type@npm:1.3.0" - checksum: 10c0/8412b3fe4f392c420ab41dae220b09700e4e47c639a29ba7ba2e83cc6cffd2b4926f7ac9e47d7e277e8f4f02acda76fd6931cb81fd2b382fa9477ef9ada953fd - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 - languageName: node - linkType: hard - -"exsolve@npm:^1.0.7": - version: 1.0.8 - resolution: "exsolve@npm:1.0.8" - checksum: 10c0/65e44ae05bd4a4a5d87cfdbbd6b8f24389282cf9f85fa5feb17ca87ad3f354877e6af4cd99e02fc29044174891f82d1d68c77f69234410eb8f163530e6278c67 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 - languageName: node - linkType: hard - -"fast-uri@npm:^3.0.1": - version: 3.0.1 - resolution: "fast-uri@npm:3.0.1" - checksum: 10c0/3cd46d6006083b14ca61ffe9a05b8eef75ef87e9574b6f68f2e17ecf4daa7aaadeff44e3f0f7a0ef4e0f7e7c20fc07beec49ff14dc72d0b500f00386592f2d10 - languageName: node - linkType: hard - -"fdir@npm:^6.5.0": - version: 6.5.0 - resolution: "fdir@npm:6.5.0" - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f - languageName: node - linkType: hard - -"follow-redirects@npm:^1.15.11": - version: 1.15.11 - resolution: "follow-redirects@npm:1.15.11" - peerDependenciesMeta: - debug: - optional: true - checksum: 10c0/d301f430542520a54058d4aeeb453233c564aaccac835d29d15e050beb33f339ad67d9bddbce01739c5dc46a6716dbe3d9d0d5134b1ca203effa11a7ef092343 - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" - dependencies: - cross-spawn: "npm:^7.0.0" - signal-exit: "npm:^4.0.1" - checksum: 10c0/9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 - languageName: node - linkType: hard - -"form-data@npm:^4.0.5": - version: 4.0.5 - resolution: "form-data@npm:4.0.5" - dependencies: - asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.8" - es-set-tostringtag: "npm:^2.1.0" - hasown: "npm:^2.0.2" - mime-types: "npm:^2.1.12" - checksum: 10c0/dd6b767ee0bbd6d84039db12a0fa5a2028160ffbfaba1800695713b46ae974a5f6e08b3356c3195137f8530dcd9dfcb5d5ae1eeff53d0db1e5aad863b619ce3b - languageName: node - linkType: hard - -"fs-extra@npm:~11.3.0": - version: 11.3.3 - resolution: "fs-extra@npm:11.3.3" - dependencies: - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10c0/984924ff4104e3e9f351b658a864bf3b354b2c90429f57aec0acd12d92c4e6b762cbacacdffb4e745b280adce882e1f980c485d9f02c453f769ab4e7fc646ce3 - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 - languageName: node - linkType: hard - -"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: "npm:latest" - checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" - dependencies: - node-gyp: "npm:latest" - conditions: os=darwin - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 - languageName: node - linkType: hard - -"generator-function@npm:^2.0.0": - version: 2.0.1 - resolution: "generator-function@npm:2.0.1" - checksum: 10c0/8a9f59df0f01cfefafdb3b451b80555e5cf6d76487095db91ac461a0e682e4ff7a9dbce15f4ecec191e53586d59eece01949e05a4b4492879600bbbe8e28d6b8 - languageName: node - linkType: hard - -"gensync@npm:^1.0.0-beta.2": - version: 1.0.0-beta.2 - resolution: "gensync@npm:1.0.0-beta.2" - checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde - languageName: node - linkType: hard - -"get-east-asian-width@npm:^1.0.0": - version: 1.5.0 - resolution: "get-east-asian-width@npm:1.5.0" - checksum: 10c0/bff8bbc8d81790b9477f7aa55b1806b9f082a8dc1359fff7bd8b96939622c86b729685afc2bfeb22def1fc6ef1e5228e4d87dd4e6da60bc43a5edfb03c4ee167 - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.2.6": - version: 1.3.1 - resolution: "get-intrinsic@npm:1.3.1" - dependencies: - async-function: "npm:^1.0.0" - async-generator-function: "npm:^1.0.0" - call-bind-apply-helpers: "npm:^1.0.2" - es-define-property: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.1.1" - function-bind: "npm:^1.1.2" - generator-function: "npm:^2.0.0" - get-proto: "npm:^1.0.1" - gopd: "npm:^1.2.0" - has-symbols: "npm:^1.1.0" - hasown: "npm:^2.0.2" - math-intrinsics: "npm:^1.1.0" - checksum: 10c0/9f4ab0cf7efe0fd2c8185f52e6f637e708f3a112610c88869f8f041bb9ecc2ce44bf285dfdbdc6f4f7c277a5b88d8e94a432374d97cca22f3de7fc63795deb5d - languageName: node - linkType: hard - -"get-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "get-proto@npm:1.0.1" - dependencies: - dunder-proto: "npm:^1.0.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c - languageName: node - linkType: hard - -"get-tsconfig@npm:^4.7.5": - version: 4.7.5 - resolution: "get-tsconfig@npm:4.7.5" - dependencies: - resolve-pkg-maps: "npm:^1.0.0" - checksum: 10c0/a917dff2ba9ee187c41945736bf9bbab65de31ce5bc1effd76267be483a7340915cff232199406379f26517d2d0a4edcdbcda8cca599c2480a0f2cf1e1de3efa - languageName: node - linkType: hard - -"glob@npm:^10.2.2, glob@npm:^10.3.10": - version: 10.3.15 - resolution: "glob@npm:10.3.15" - dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^2.3.6" - minimatch: "npm:^9.0.1" - minipass: "npm:^7.0.4" - path-scurry: "npm:^1.11.0" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/cda748ddc181b31b3df9548c0991800406d5cc3b3f8110e37a8751ec1e39f37cdae7d7782d5422d7df92775121cdf00599992dff22f7ff1260344843af227c2b - languageName: node - linkType: hard - -"gopd@npm:^1.2.0": - version: 1.2.0 - resolution: "gopd@npm:1.2.0" - checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 - languageName: node - linkType: hard - -"handlebars@npm:^4.7.8": - version: 4.7.8 - resolution: "handlebars@npm:4.7.8" - dependencies: - minimist: "npm:^1.2.5" - neo-async: "npm:^2.6.2" - source-map: "npm:^0.6.1" - uglify-js: "npm:^3.1.4" - wordwrap: "npm:^1.0.0" - dependenciesMeta: - uglify-js: - optional: true - bin: - handlebars: bin/handlebars - checksum: 10c0/7aff423ea38a14bb379316f3857fe0df3c5d66119270944247f155ba1f08e07a92b340c58edaa00cfe985c21508870ee5183e0634dcb53dd405f35c93ef7f10d - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": - version: 1.1.0 - resolution: "has-symbols@npm:1.1.0" - checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e - languageName: node - linkType: hard - -"has-tostringtag@npm:^1.0.2": - version: 1.0.2 - resolution: "has-tostringtag@npm:1.0.2" - dependencies: - has-symbols: "npm:^1.0.3" - checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c - languageName: node - linkType: hard - -"hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: "npm:^1.1.2" - checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 - languageName: node - linkType: hard - -"he@npm:^1.2.0": - version: 1.2.0 - resolution: "he@npm:1.2.0" - bin: - he: bin/he - checksum: 10c0/a27d478befe3c8192f006cdd0639a66798979dfa6e2125c6ac582a19a5ebfec62ad83e8382e6036170d873f46e4536a7e795bf8b95bf7c247f4cc0825ccc8c17 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1": - version: 7.0.4 - resolution: "https-proxy-agent@npm:7.0.4" - dependencies: - agent-base: "npm:^7.0.2" - debug: "npm:4" - checksum: 10c0/bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b - languageName: node - linkType: hard - -"i18next@npm:^25.8.11": - version: 25.8.11 - resolution: "i18next@npm:25.8.11" - dependencies: - "@babel/runtime": "npm:^7.28.4" - peerDependencies: - typescript: ^5 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/6e7a4068a5276825e10fa6e883c06acf34a3be273a69cb4117ea3154b04a85be94a685a2c78bfb1a42d89d8db10577cb2a248e4a65481ba5a435d28e741fed0c - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 - languageName: node - linkType: hard - -"import-fresh@npm:^3.3.1": - version: 3.3.1 - resolution: "import-fresh@npm:3.3.1" - dependencies: - parent-module: "npm:^1.0.0" - resolve-from: "npm:^4.0.0" - checksum: 10c0/bf8cc494872fef783249709385ae883b447e3eb09db0ebd15dcead7d9afe7224dad7bd7591c6b73b0b19b3c0f9640eb8ee884f01cfaf2887ab995b0b36a0cbec - languageName: node - linkType: hard - -"import-lazy@npm:~4.0.0": - version: 4.0.0 - resolution: "import-lazy@npm:4.0.0" - checksum: 10c0/a3520313e2c31f25c0b06aa66d167f329832b68a4f957d7c9daf6e0fa41822b6e84948191648b9b9d8ca82f94740cdf15eecf2401a5b42cd1c33fd84f2225cca - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f - languageName: node - linkType: hard - -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc - languageName: node - linkType: hard - -"is-core-module@npm:^2.16.1": - version: 2.16.1 - resolution: "is-core-module@npm:2.16.1" - dependencies: - hasown: "npm:^2.0.2" - checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc - languageName: node - linkType: hard - -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d - languageName: node - linkType: hard - -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 - languageName: node - linkType: hard - -"jackspeak@npm:^2.3.6": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 10c0/f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 - languageName: node - linkType: hard - -"jju@npm:~1.4.0": - version: 1.4.0 - resolution: "jju@npm:1.4.0" - checksum: 10c0/f3f444557e4364cfc06b1abf8331bf3778b26c0c8552ca54429bc0092652172fdea26cbffe33e1017b303d5aa506f7ede8571857400efe459cb7439180e2acad - languageName: node - linkType: hard - -"js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed - languageName: node - linkType: hard - -"js-yaml@npm:^3.13.1": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" - dependencies: - argparse: "npm:^1.0.7" - esprima: "npm:^4.0.0" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b - languageName: node - linkType: hard - -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 - languageName: node - linkType: hard - -"jsesc@npm:^3.0.2": - version: 3.1.0 - resolution: "jsesc@npm:3.1.0" - bin: - jsesc: bin/jsesc - checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 - languageName: node - linkType: hard - -"json-schema-traverse@npm:^1.0.0": - version: 1.0.0 - resolution: "json-schema-traverse@npm:1.0.0" - checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 - languageName: node - linkType: hard - -"json5@npm:^2.2.3": - version: 2.2.3 - resolution: "json5@npm:2.2.3" - bin: - json5: lib/cli.js - checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c - languageName: node - linkType: hard - -"jsonfile@npm:^6.0.1": - version: 6.2.0 - resolution: "jsonfile@npm:6.2.0" - dependencies: - graceful-fs: "npm:^4.1.6" - universalify: "npm:^2.0.0" - dependenciesMeta: - graceful-fs: - optional: true - checksum: 10c0/7f4f43b08d1869ded8a6822213d13ae3b99d651151d77efd1557ced0889c466296a7d9684e397bd126acf5eb2cfcb605808c3e681d0fdccd2fe5a04b47e76c0d - languageName: node - linkType: hard - -"kolorist@npm:^1.8.0": - version: 1.8.0 - resolution: "kolorist@npm:1.8.0" - checksum: 10c0/73075db44a692bf6c34a649f3b4b3aea4993b84f6b754cbf7a8577e7c7db44c0bad87752bd23b0ce533f49de2244ce2ce03b7b1b667a85ae170a94782cc50f9b - languageName: node - linkType: hard - -"local-pkg@npm:^1.0.0": - version: 1.1.2 - resolution: "local-pkg@npm:1.1.2" - dependencies: - mlly: "npm:^1.7.4" - pkg-types: "npm:^2.3.0" - quansync: "npm:^0.2.11" - checksum: 10c0/1bcfcc5528dea95cba3caa478126a348d3985aad9f69ecf7802c13efef90897e1c5ff7851974332c5e6d4a4698efe610fef758a068c8bc3feb5322aeb35d5993 - languageName: node - linkType: hard - -"lodash@npm:~4.17.15": - version: 4.17.23 - resolution: "lodash@npm:4.17.23" - checksum: 10c0/1264a90469f5bb95d4739c43eb6277d15b6d9e186df4ac68c3620443160fc669e2f14c11e7d8b2ccf078b81d06147c01a8ccced9aab9f9f63d50dcf8cace6bf6 - languageName: node - linkType: hard - -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.2.2 - resolution: "lru-cache@npm:10.2.2" - checksum: 10c0/402d31094335851220d0b00985084288136136992979d0e015f0f1697e15d1c86052d7d53ae86b614e5b058425606efffc6969a31a091085d7a2b80a8a1e26d6 - languageName: node - linkType: hard - -"lru-cache@npm:^5.1.1": - version: 5.1.1 - resolution: "lru-cache@npm:5.1.1" - dependencies: - yallist: "npm:^3.0.2" - checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 - languageName: node - linkType: hard - -"magic-string@npm:^0.30.17, magic-string@npm:^0.30.21": - version: 0.30.21 - resolution: "magic-string@npm:0.30.21" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.5" - checksum: 10c0/299378e38f9a270069fc62358522ddfb44e94244baa0d6a8980ab2a9b2490a1d03b236b447eee309e17eb3bddfa482c61259d47960eb018a904f0ded52780c4a - languageName: node - linkType: hard - -"make-fetch-happen@npm:^13.0.0": - version: 13.0.1 - resolution: "make-fetch-happen@npm:13.0.1" - dependencies: - "@npmcli/agent": "npm:^2.0.0" - cacache: "npm:^18.0.0" - http-cache-semantics: "npm:^4.1.1" - is-lambda: "npm:^1.0.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^3.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" - proc-log: "npm:^4.2.0" - promise-retry: "npm:^2.0.1" - ssri: "npm:^10.0.0" - checksum: 10c0/df5f4dbb6d98153b751bccf4dc4cc500de85a96a9331db9805596c46aa9f99d9555983954e6c1266d9f981ae37a9e4647f42b9a4bb5466f867f4012e582c9e7e - languageName: node - linkType: hard - -"math-intrinsics@npm:^1.1.0": - version: 1.1.0 - resolution: "math-intrinsics@npm:1.1.0" - checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa - languageName: node - linkType: hard - -"mime-types@npm:^2.1.12": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: "npm:1.52.0" - checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 - languageName: node - linkType: hard - -"minimatch@npm:10.0.3": - version: 10.0.3 - resolution: "minimatch@npm:10.0.3" - dependencies: - "@isaacs/brace-expansion": "npm:^5.0.0" - checksum: 10c0/e43e4a905c5d70ac4cec8530ceaeccb9c544b1ba8ac45238e2a78121a01c17ff0c373346472d221872563204eabe929ad02669bb575cb1f0cc30facab369f70f - languageName: node - linkType: hard - -"minimatch@npm:^9.0.1": - version: 9.0.4 - resolution: "minimatch@npm:9.0.4" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/2c16f21f50e64922864e560ff97c587d15fd491f65d92a677a344e970fe62aafdbeafe648965fa96d33c061b4d0eabfe0213466203dd793367e7f28658cf6414 - languageName: node - linkType: hard - -"minimatch@npm:^9.0.3": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed - languageName: node - linkType: hard - -"minimist@npm:^1.2.5": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 - languageName: node - linkType: hard - -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e - languageName: node - linkType: hard - -"minipass-fetch@npm:^3.0.0": - version: 3.0.5 - resolution: "minipass-fetch@npm:3.0.5" - dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^2.1.2" - dependenciesMeta: - encoding: - optional: true - checksum: 10c0/9d702d57f556274286fdd97e406fc38a2f5c8d15e158b498d7393b1105974b21249289ec571fa2b51e038a4872bfc82710111cf75fae98c662f3d6f95e72152b - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c - languageName: node - linkType: hard - -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4": - version: 7.1.1 - resolution: "minipass@npm:7.1.1" - checksum: 10c0/fdccc2f99c31083f45f881fd1e6971d798e333e078ab3c8988fb818c470fbd5e935388ad9adb286397eba50baebf46ef8ff487c8d3f455a69c6f3efc327bdff9 - languageName: node - linkType: hard - -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: "npm:^3.0.0" - yallist: "npm:^4.0.0" - checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 - languageName: node - linkType: hard - -"mkdirp@npm:^1.0.3": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf - languageName: node - linkType: hard - -"mlly@npm:^1.7.4": - version: 1.8.0 - resolution: "mlly@npm:1.8.0" - dependencies: - acorn: "npm:^8.15.0" - pathe: "npm:^2.0.3" - pkg-types: "npm:^1.3.1" - ufo: "npm:^1.6.1" - checksum: 10c0/f174b844ae066c71e9b128046677868e2e28694f0bbeeffbe760b2a9d8ff24de0748d0fde6fabe706700c1d2e11d3c0d7a53071b5ea99671592fac03364604ab - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc - languageName: node - linkType: hard - -"ms@npm:^2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 - languageName: node - linkType: hard - -"muggle-string@npm:^0.4.1": - version: 0.4.1 - resolution: "muggle-string@npm:0.4.1" - checksum: 10c0/e914b63e24cd23f97e18376ec47e4ba3aa24365e4776212b666add2e47bb158003212980d732c49abf3719568900af7861873844a6e2d3a7ca7e86952c0e99e9 - languageName: node - linkType: hard - -"nanoid@npm:^3.3.11": - version: 3.3.11 - resolution: "nanoid@npm:3.3.11" - bin: - nanoid: bin/nanoid.cjs - checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b - languageName: node - linkType: hard - -"negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 - languageName: node - linkType: hard - -"neo-async@npm:^2.6.2": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: 10c0/c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 10.1.0 - resolution: "node-gyp@npm:10.1.0" - dependencies: - env-paths: "npm:^2.2.0" - exponential-backoff: "npm:^3.1.1" - glob: "npm:^10.3.10" - graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^13.0.0" - nopt: "npm:^7.0.0" - proc-log: "npm:^3.0.0" - semver: "npm:^7.3.5" - tar: "npm:^6.1.2" - which: "npm:^4.0.0" - bin: - node-gyp: bin/node-gyp.js - checksum: 10c0/9cc821111ca244a01fb7f054db7523ab0a0cd837f665267eb962eb87695d71fb1e681f9e21464cc2fd7c05530dc4c81b810bca1a88f7d7186909b74477491a3c - languageName: node - linkType: hard - -"node-releases@npm:^2.0.27": - version: 2.0.27 - resolution: "node-releases@npm:2.0.27" - checksum: 10c0/f1e6583b7833ea81880627748d28a3a7ff5703d5409328c216ae57befbced10ce2c991bea86434e8ec39003bd017f70481e2e5f8c1f7e0a7663241f81d6e00e2 - languageName: node - linkType: hard - -"nopt@npm:^7.0.0": - version: 7.2.1 - resolution: "nopt@npm:7.2.1" - dependencies: - abbrev: "npm:^2.0.0" - bin: - nopt: bin/nopt.js - checksum: 10c0/a069c7c736767121242037a22a788863accfa932ab285a1eb569eb8cd534b09d17206f68c37f096ae785647435e0c5a5a0a67b42ec743e481a455e5ae6a6df81 - languageName: node - linkType: hard - -"obug@npm:^2.1.1": - version: 2.1.1 - resolution: "obug@npm:2.1.1" - checksum: 10c0/59dccd7de72a047e08f8649e94c1015ec72f94eefb6ddb57fb4812c4b425a813bc7e7cd30c9aca20db3c59abc3c85cc7a62bb656a968741d770f4e8e02bc2e78 - languageName: node - linkType: hard - -"openapi-types@npm:^12.1.3": - version: 12.1.3 - resolution: "openapi-types@npm:12.1.3" - checksum: 10c0/4ad4eb91ea834c237edfa6ab31394e87e00c888fc2918009763389c00d02342345195d6f302d61c3fd807f17723cd48df29b47b538b68375b3827b3758cd520f - languageName: node - linkType: hard - -"oxfmt@npm:^0.34.0": - version: 0.34.0 - resolution: "oxfmt@npm:0.34.0" - dependencies: - "@oxfmt/binding-android-arm-eabi": "npm:0.34.0" - "@oxfmt/binding-android-arm64": "npm:0.34.0" - "@oxfmt/binding-darwin-arm64": "npm:0.34.0" - "@oxfmt/binding-darwin-x64": "npm:0.34.0" - "@oxfmt/binding-freebsd-x64": "npm:0.34.0" - "@oxfmt/binding-linux-arm-gnueabihf": "npm:0.34.0" - "@oxfmt/binding-linux-arm-musleabihf": "npm:0.34.0" - "@oxfmt/binding-linux-arm64-gnu": "npm:0.34.0" - "@oxfmt/binding-linux-arm64-musl": "npm:0.34.0" - "@oxfmt/binding-linux-ppc64-gnu": "npm:0.34.0" - "@oxfmt/binding-linux-riscv64-gnu": "npm:0.34.0" - "@oxfmt/binding-linux-riscv64-musl": "npm:0.34.0" - "@oxfmt/binding-linux-s390x-gnu": "npm:0.34.0" - "@oxfmt/binding-linux-x64-gnu": "npm:0.34.0" - "@oxfmt/binding-linux-x64-musl": "npm:0.34.0" - "@oxfmt/binding-openharmony-arm64": "npm:0.34.0" - "@oxfmt/binding-win32-arm64-msvc": "npm:0.34.0" - "@oxfmt/binding-win32-ia32-msvc": "npm:0.34.0" - "@oxfmt/binding-win32-x64-msvc": "npm:0.34.0" - tinypool: "npm:2.1.0" - dependenciesMeta: - "@oxfmt/binding-android-arm-eabi": - optional: true - "@oxfmt/binding-android-arm64": - optional: true - "@oxfmt/binding-darwin-arm64": - optional: true - "@oxfmt/binding-darwin-x64": - optional: true - "@oxfmt/binding-freebsd-x64": - optional: true - "@oxfmt/binding-linux-arm-gnueabihf": - optional: true - "@oxfmt/binding-linux-arm-musleabihf": - optional: true - "@oxfmt/binding-linux-arm64-gnu": - optional: true - "@oxfmt/binding-linux-arm64-musl": - optional: true - "@oxfmt/binding-linux-ppc64-gnu": - optional: true - "@oxfmt/binding-linux-riscv64-gnu": - optional: true - "@oxfmt/binding-linux-riscv64-musl": - optional: true - "@oxfmt/binding-linux-s390x-gnu": - optional: true - "@oxfmt/binding-linux-x64-gnu": - optional: true - "@oxfmt/binding-linux-x64-musl": - optional: true - "@oxfmt/binding-openharmony-arm64": - optional: true - "@oxfmt/binding-win32-arm64-msvc": - optional: true - "@oxfmt/binding-win32-ia32-msvc": - optional: true - "@oxfmt/binding-win32-x64-msvc": - optional: true - bin: - oxfmt: bin/oxfmt - checksum: 10c0/af774ad06cadd4ea3340e7c86e30f82d316b190f53ed25bad66a622be83487eaed6b37cf380fbb2557d0a58b258190d40df7c062582e1777bbdf375b72a02adc - languageName: node - linkType: hard - -"oxlint-tsgolint@npm:^0.14.1": - version: 0.14.1 - resolution: "oxlint-tsgolint@npm:0.14.1" - dependencies: - "@oxlint-tsgolint/darwin-arm64": "npm:0.14.1" - "@oxlint-tsgolint/darwin-x64": "npm:0.14.1" - "@oxlint-tsgolint/linux-arm64": "npm:0.14.1" - "@oxlint-tsgolint/linux-x64": "npm:0.14.1" - "@oxlint-tsgolint/win32-arm64": "npm:0.14.1" - "@oxlint-tsgolint/win32-x64": "npm:0.14.1" - dependenciesMeta: - "@oxlint-tsgolint/darwin-arm64": - optional: true - "@oxlint-tsgolint/darwin-x64": - optional: true - "@oxlint-tsgolint/linux-arm64": - optional: true - "@oxlint-tsgolint/linux-x64": - optional: true - "@oxlint-tsgolint/win32-arm64": - optional: true - "@oxlint-tsgolint/win32-x64": - optional: true - bin: - tsgolint: bin/tsgolint.js - checksum: 10c0/c490d883349b3ecd11d573ca9129984016e580caa0fce5003463089c48cf10f61077f1a686f193fb7fdf2487e1058e4ea22159868d8d655575cc00d54596f2c6 - languageName: node - linkType: hard - -"oxlint@npm:^1.49.0": - version: 1.49.0 - resolution: "oxlint@npm:1.49.0" - dependencies: - "@oxlint/binding-android-arm-eabi": "npm:1.49.0" - "@oxlint/binding-android-arm64": "npm:1.49.0" - "@oxlint/binding-darwin-arm64": "npm:1.49.0" - "@oxlint/binding-darwin-x64": "npm:1.49.0" - "@oxlint/binding-freebsd-x64": "npm:1.49.0" - "@oxlint/binding-linux-arm-gnueabihf": "npm:1.49.0" - "@oxlint/binding-linux-arm-musleabihf": "npm:1.49.0" - "@oxlint/binding-linux-arm64-gnu": "npm:1.49.0" - "@oxlint/binding-linux-arm64-musl": "npm:1.49.0" - "@oxlint/binding-linux-ppc64-gnu": "npm:1.49.0" - "@oxlint/binding-linux-riscv64-gnu": "npm:1.49.0" - "@oxlint/binding-linux-riscv64-musl": "npm:1.49.0" - "@oxlint/binding-linux-s390x-gnu": "npm:1.49.0" - "@oxlint/binding-linux-x64-gnu": "npm:1.49.0" - "@oxlint/binding-linux-x64-musl": "npm:1.49.0" - "@oxlint/binding-openharmony-arm64": "npm:1.49.0" - "@oxlint/binding-win32-arm64-msvc": "npm:1.49.0" - "@oxlint/binding-win32-ia32-msvc": "npm:1.49.0" - "@oxlint/binding-win32-x64-msvc": "npm:1.49.0" - peerDependencies: - oxlint-tsgolint: ">=0.14.1" - dependenciesMeta: - "@oxlint/binding-android-arm-eabi": - optional: true - "@oxlint/binding-android-arm64": - optional: true - "@oxlint/binding-darwin-arm64": - optional: true - "@oxlint/binding-darwin-x64": - optional: true - "@oxlint/binding-freebsd-x64": - optional: true - "@oxlint/binding-linux-arm-gnueabihf": - optional: true - "@oxlint/binding-linux-arm-musleabihf": - optional: true - "@oxlint/binding-linux-arm64-gnu": - optional: true - "@oxlint/binding-linux-arm64-musl": - optional: true - "@oxlint/binding-linux-ppc64-gnu": - optional: true - "@oxlint/binding-linux-riscv64-gnu": - optional: true - "@oxlint/binding-linux-riscv64-musl": - optional: true - "@oxlint/binding-linux-s390x-gnu": - optional: true - "@oxlint/binding-linux-x64-gnu": - optional: true - "@oxlint/binding-linux-x64-musl": - optional: true - "@oxlint/binding-openharmony-arm64": - optional: true - "@oxlint/binding-win32-arm64-msvc": - optional: true - "@oxlint/binding-win32-ia32-msvc": - optional: true - "@oxlint/binding-win32-x64-msvc": - optional: true - peerDependenciesMeta: - oxlint-tsgolint: - optional: true - bin: - oxlint: bin/oxlint - checksum: 10c0/86ab075209d21182036383c70aa126618b16d1321019c0cd4a0a22f9285160444dd641589c10e27fc9bd1fb312d05f082a22b3a169cc9846396ec9f42f4c895b - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: "npm:^3.0.0" - checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: "npm:^3.0.0" - checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 - languageName: node - linkType: hard - -"path-browserify@npm:^1.0.1": - version: 1.0.1 - resolution: "path-browserify@npm:1.0.1" - checksum: 10c0/8b8c3fd5c66bd340272180590ae4ff139769e9ab79522e2eb82e3d571a89b8117c04147f65ad066dccfb42fcad902e5b7d794b3d35e0fd840491a8ddbedf8c66 - languageName: node - linkType: hard - -"path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 - languageName: node - linkType: hard - -"path-scurry@npm:^1.11.0": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" - dependencies: - lru-cache: "npm:^10.2.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d - languageName: node - linkType: hard - -"pathe@npm:^2.0.1, pathe@npm:^2.0.3": - version: 2.0.3 - resolution: "pathe@npm:2.0.3" - checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 - languageName: node - linkType: hard - -"picocolors@npm:^1.1.1": - version: 1.1.1 - resolution: "picocolors@npm:1.1.1" - checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 - languageName: node - linkType: hard - -"picomatch@npm:^4.0.2, picomatch@npm:^4.0.3": - version: 4.0.3 - resolution: "picomatch@npm:4.0.3" - checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 - languageName: node - linkType: hard - -"pkg-types@npm:^1.3.1": - version: 1.3.1 - resolution: "pkg-types@npm:1.3.1" - dependencies: - confbox: "npm:^0.1.8" - mlly: "npm:^1.7.4" - pathe: "npm:^2.0.1" - checksum: 10c0/19e6cb8b66dcc66c89f2344aecfa47f2431c988cfa3366bdfdcfb1dd6695f87dcce37fbd90fe9d1605e2f4440b77f391e83c23255347c35cf84e7fd774d7fcea - languageName: node - linkType: hard - -"pkg-types@npm:^2.3.0": - version: 2.3.0 - resolution: "pkg-types@npm:2.3.0" - dependencies: - confbox: "npm:^0.2.2" - exsolve: "npm:^1.0.7" - pathe: "npm:^2.0.3" - checksum: 10c0/d2bbddc5b81bd4741e1529c08ef4c5f1542bbdcf63498b73b8e1d84cff71806d1b8b1577800549bb569cb7aa20056257677b979bff48c97967cba7e64f72ae12 - languageName: node - linkType: hard - -"postcss@npm:^8.5.6": - version: 8.5.6 - resolution: "postcss@npm:8.5.6" - dependencies: - nanoid: "npm:^3.3.11" - picocolors: "npm:^1.1.1" - source-map-js: "npm:^1.2.1" - checksum: 10c0/5127cc7c91ed7a133a1b7318012d8bfa112da9ef092dddf369ae699a1f10ebbd89b1b9f25f3228795b84585c72aabd5ced5fc11f2ba467eedf7b081a66fad024 - languageName: node - linkType: hard - -"proc-log@npm:^3.0.0": - version: 3.0.0 - resolution: "proc-log@npm:3.0.0" - checksum: 10c0/f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc - languageName: node - linkType: hard - -"proc-log@npm:^4.2.0": - version: 4.2.0 - resolution: "proc-log@npm:4.2.0" - checksum: 10c0/17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9 - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: "npm:^2.0.2" - retry: "npm:^0.12.0" - checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 - languageName: node - linkType: hard - -"prompt-sync@npm:^4.2.0": - version: 4.2.0 - resolution: "prompt-sync@npm:4.2.0" - dependencies: - strip-ansi: "npm:^5.0.0" - checksum: 10c0/1312154b8d84c7487b734afdc5d9f7e092ac7a3a303aec8dfd3ba680502374f5942ca501943c6314ae77979aa4dcd3c6cd03db5da6ac7e4531d384c9740261ad - languageName: node - linkType: hard - -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.3.1 - resolution: "punycode@npm:2.3.1" - checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 - languageName: node - linkType: hard - -"quansync@npm:^0.2.11": - version: 0.2.11 - resolution: "quansync@npm:0.2.11" - checksum: 10c0/cb9a1f8ebce074069f2f6a78578873ffedd9de9f6aa212039b44c0870955c04a71c3b1311b5d97f8ac2f2ec476de202d0a5c01160cb12bc0a11b7ef36d22ef56 - languageName: node - linkType: hard - -"react-refresh@npm:^0.18.0": - version: 0.18.0 - resolution: "react-refresh@npm:0.18.0" - checksum: 10c0/34a262f7fd803433a534f50deb27a148112a81adcae440c7d1cbae7ef14d21ea8f2b3d783e858cb7698968183b77755a38b4d4b5b1d79b4f4689c2f6d358fff2 - languageName: node - linkType: hard - -"react@npm:^19.2.4": - version: 19.2.4 - resolution: "react@npm:19.2.4" - checksum: 10c0/cd2c9ff67a720799cc3b38a516009986f7fc4cb8d3e15716c6211cf098d1357ee3e348ab05ad0600042bbb0fd888530ba92e329198c92eafa0994f5213396596 - languageName: node - linkType: hard - -"reflect-metadata@npm:^0.2.2": - version: 0.2.2 - resolution: "reflect-metadata@npm:0.2.2" - checksum: 10c0/1cd93a15ea291e420204955544637c264c216e7aac527470e393d54b4bb075f10a17e60d8168ec96600c7e0b9fcc0cb0bb6e91c3fbf5b0d8c9056f04e6ac1ec2 - languageName: node - linkType: hard - -"require-from-string@npm:^2.0.2": - version: 2.0.2 - resolution: "require-from-string@npm:2.0.2" - checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 - languageName: node - linkType: hard - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 - languageName: node - linkType: hard - -"resolve-pkg-maps@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-pkg-maps@npm:1.0.0" - checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab - languageName: node - linkType: hard - -"resolve@npm:~1.22.1, resolve@npm:~1.22.2": - version: 1.22.11 - resolution: "resolve@npm:1.22.11" - dependencies: - is-core-module: "npm:^2.16.1" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/f657191507530f2cbecb5815b1ee99b20741ea6ee02a59c57028e9ec4c2c8d7681afcc35febbd554ac0ded459db6f2d8153382c53a2f266cee2575e512674409 - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A~1.22.1#optional!builtin, resolve@patch:resolve@npm%3A~1.22.2#optional!builtin": - version: 1.22.11 - resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.16.1" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/ee5b182f2e37cb1165465e58c6abc797fec0a80b5ba3231607beb4677db0c9291ac010c47cf092b6daa2b7f518d69a0e21888e7e2b633f68d501a874212a8c63 - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe - languageName: node - linkType: hard - -"rollup@npm:^4.43.0": - version: 4.57.1 - resolution: "rollup@npm:4.57.1" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.57.1" - "@rollup/rollup-android-arm64": "npm:4.57.1" - "@rollup/rollup-darwin-arm64": "npm:4.57.1" - "@rollup/rollup-darwin-x64": "npm:4.57.1" - "@rollup/rollup-freebsd-arm64": "npm:4.57.1" - "@rollup/rollup-freebsd-x64": "npm:4.57.1" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.57.1" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.57.1" - "@rollup/rollup-linux-arm64-gnu": "npm:4.57.1" - "@rollup/rollup-linux-arm64-musl": "npm:4.57.1" - "@rollup/rollup-linux-loong64-gnu": "npm:4.57.1" - "@rollup/rollup-linux-loong64-musl": "npm:4.57.1" - "@rollup/rollup-linux-ppc64-gnu": "npm:4.57.1" - "@rollup/rollup-linux-ppc64-musl": "npm:4.57.1" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.57.1" - "@rollup/rollup-linux-riscv64-musl": "npm:4.57.1" - "@rollup/rollup-linux-s390x-gnu": "npm:4.57.1" - "@rollup/rollup-linux-x64-gnu": "npm:4.57.1" - "@rollup/rollup-linux-x64-musl": "npm:4.57.1" - "@rollup/rollup-openbsd-x64": "npm:4.57.1" - "@rollup/rollup-openharmony-arm64": "npm:4.57.1" - "@rollup/rollup-win32-arm64-msvc": "npm:4.57.1" - "@rollup/rollup-win32-ia32-msvc": "npm:4.57.1" - "@rollup/rollup-win32-x64-gnu": "npm:4.57.1" - "@rollup/rollup-win32-x64-msvc": "npm:4.57.1" - "@types/estree": "npm:1.0.8" - fsevents: "npm:~2.3.2" - dependenciesMeta: - "@rollup/rollup-android-arm-eabi": - optional: true - "@rollup/rollup-android-arm64": - optional: true - "@rollup/rollup-darwin-arm64": - optional: true - "@rollup/rollup-darwin-x64": - optional: true - "@rollup/rollup-freebsd-arm64": - optional: true - "@rollup/rollup-freebsd-x64": - optional: true - "@rollup/rollup-linux-arm-gnueabihf": - optional: true - "@rollup/rollup-linux-arm-musleabihf": - optional: true - "@rollup/rollup-linux-arm64-gnu": - optional: true - "@rollup/rollup-linux-arm64-musl": - optional: true - "@rollup/rollup-linux-loong64-gnu": - optional: true - "@rollup/rollup-linux-loong64-musl": - optional: true - "@rollup/rollup-linux-ppc64-gnu": - optional: true - "@rollup/rollup-linux-ppc64-musl": - optional: true - "@rollup/rollup-linux-riscv64-gnu": - optional: true - "@rollup/rollup-linux-riscv64-musl": - optional: true - "@rollup/rollup-linux-s390x-gnu": - optional: true - "@rollup/rollup-linux-x64-gnu": - optional: true - "@rollup/rollup-linux-x64-musl": - optional: true - "@rollup/rollup-openbsd-x64": - optional: true - "@rollup/rollup-openharmony-arm64": - optional: true - "@rollup/rollup-win32-arm64-msvc": - optional: true - "@rollup/rollup-win32-ia32-msvc": - optional: true - "@rollup/rollup-win32-x64-gnu": - optional: true - "@rollup/rollup-win32-x64-msvc": - optional: true - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 10c0/a90aaf1166fc495920e44e52dced0b12283aaceb0924abd6f863102128dd428bbcbf85970f792c06bc63d2a2168e7f073b73e05f6f8d76fdae17b7ac6cacba06 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 - languageName: node - linkType: hard - -"semver@npm:^6.3.1": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d - languageName: node - linkType: hard - -"semver@npm:^7.3.5": - version: 7.6.2 - resolution: "semver@npm:7.6.2" - bin: - semver: bin/semver.js - checksum: 10c0/97d3441e97ace8be4b1976433d1c32658f6afaff09f143e52c593bae7eef33de19e3e369c88bd985ce1042c6f441c80c6803078d1de2a9988080b66684cbb30c - languageName: node - linkType: hard - -"semver@npm:~7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: "npm:^6.0.0" - bin: - semver: bin/semver.js - checksum: 10c0/5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: "npm:^3.0.0" - checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 - languageName: node - linkType: hard - -"siginfo@npm:^2.0.0": - version: 2.0.0 - resolution: "siginfo@npm:2.0.0" - checksum: 10c0/3def8f8e516fbb34cb6ae415b07ccc5d9c018d85b4b8611e3dc6f8be6d1899f693a4382913c9ed51a06babb5201639d76453ab297d1c54a456544acf5c892e34 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.3 - resolution: "socks-proxy-agent@npm:8.0.3" - dependencies: - agent-base: "npm:^7.1.1" - debug: "npm:^4.3.4" - socks: "npm:^2.7.1" - checksum: 10c0/4950529affd8ccd6951575e21c1b7be8531b24d924aa4df3ee32df506af34b618c4e50d261f4cc603f1bfd8d426915b7d629966c8ce45b05fb5ad8c8b9a6459d - languageName: node - linkType: hard - -"socks@npm:^2.7.1": - version: 2.8.3 - resolution: "socks@npm:2.8.3" - dependencies: - ip-address: "npm:^9.0.5" - smart-buffer: "npm:^4.2.0" - checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 - languageName: node - linkType: hard - -"source-map-js@npm:^1.2.1": - version: 1.2.1 - resolution: "source-map-js@npm:1.2.1" - checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf - languageName: node - linkType: hard - -"source-map@npm:^0.6.1, source-map@npm:~0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 - languageName: node - linkType: hard - -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec - languageName: node - linkType: hard - -"sprintf-js@npm:~1.0.2": - version: 1.0.3 - resolution: "sprintf-js@npm:1.0.3" - checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb - languageName: node - linkType: hard - -"ssri@npm:^10.0.0": - version: 10.0.6 - resolution: "ssri@npm:10.0.6" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/e5a1e23a4057a86a97971465418f22ea89bd439ac36ade88812dd920e4e61873e8abd6a9b72a03a67ef50faa00a2daf1ab745c5a15b46d03e0544a0296354227 - languageName: node - linkType: hard - -"stackback@npm:0.0.2": - version: 0.0.2 - resolution: "stackback@npm:0.0.2" - checksum: 10c0/89a1416668f950236dd5ac9f9a6b2588e1b9b62b1b6ad8dff1bfc5d1a15dbf0aafc9b52d2226d00c28dffff212da464eaeebfc6b7578b9d180cef3e3782c5983 - languageName: node - linkType: hard - -"std-env@npm:^3.10.0": - version: 3.10.0 - resolution: "std-env@npm:3.10.0" - checksum: 10c0/1814927a45004d36dde6707eaf17552a546769bc79a6421be2c16ce77d238158dfe5de30910b78ec30d95135cc1c59ea73ee22d2ca170f8b9753f84da34c427f - languageName: node - linkType: hard - -"string-argv@npm:~0.3.1": - version: 0.3.2 - resolution: "string-argv@npm:0.3.2" - checksum: 10c0/75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82 - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: "npm:^8.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - strip-ansi: "npm:^6.0.1" - checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b - languageName: node - linkType: hard - -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: "npm:^0.2.0" - emoji-regex: "npm:^9.2.2" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca - languageName: node - linkType: hard - -"string-width@npm:^7.0.0, string-width@npm:^7.2.0": - version: 7.2.0 - resolution: "string-width@npm:7.2.0" - dependencies: - emoji-regex: "npm:^10.3.0" - get-east-asian-width: "npm:^1.0.0" - strip-ansi: "npm:^7.1.0" - checksum: 10c0/eb0430dd43f3199c7a46dcbf7a0b34539c76fe3aa62763d0b0655acdcbdf360b3f66f3d58ca25ba0205f42ea3491fa00f09426d3b7d3040e506878fc7664c9b9 - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: "npm:^5.0.1" - checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 - languageName: node - linkType: hard - -"strip-ansi@npm:^5.0.0": - version: 5.2.0 - resolution: "strip-ansi@npm:5.2.0" - dependencies: - ansi-regex: "npm:^4.1.0" - checksum: 10c0/de4658c8a097ce3b15955bc6008f67c0790f85748bdc025b7bc8c52c7aee94bc4f9e50624516150ed173c3db72d851826cd57e7a85fe4e4bb6dbbebd5d297fdf - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 - languageName: node - linkType: hard - -"strip-ansi@npm:^7.1.0": - version: 7.1.2 - resolution: "strip-ansi@npm:7.1.2" - dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 10c0/0d6d7a023de33368fd042aab0bf48f4f4077abdfd60e5393e73c7c411e85e1b3a83507c11af2e656188511475776215df9ca589b4da2295c9455cc399ce1858b - languageName: node - linkType: hard - -"strip-json-comments@npm:~3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd - languageName: node - linkType: hard - -"supports-color@npm:~8.1.1": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 - languageName: node - linkType: hard - -"tagged-tag@npm:^1.0.0": - version: 1.0.0 - resolution: "tagged-tag@npm:1.0.0" - checksum: 10c0/91d25c9ffb86a91f20522cefb2cbec9b64caa1febe27ad0df52f08993ff60888022d771e868e6416cf2e72dab68449d2139e8709ba009b74c6c7ecd4000048d1 - languageName: node - linkType: hard - -"tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.2.1 - resolution: "tar@npm:6.2.1" - dependencies: - chownr: "npm:^2.0.0" - fs-minipass: "npm:^2.0.0" - minipass: "npm:^5.0.0" - minizlib: "npm:^2.1.1" - mkdirp: "npm:^1.0.3" - yallist: "npm:^4.0.0" - checksum: 10c0/a5eca3eb50bc11552d453488344e6507156b9193efd7635e98e867fab275d527af53d8866e2370cd09dfe74378a18111622ace35af6a608e5223a7d27fe99537 - languageName: node - linkType: hard - -"tinybench@npm:^2.9.0": - version: 2.9.0 - resolution: "tinybench@npm:2.9.0" - checksum: 10c0/c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c - languageName: node - linkType: hard - -"tinyexec@npm:^1.0.2": - version: 1.0.2 - resolution: "tinyexec@npm:1.0.2" - checksum: 10c0/1261a8e34c9b539a9aae3b7f0bb5372045ff28ee1eba035a2a059e532198fe1a182ec61ac60fa0b4a4129f0c4c4b1d2d57355b5cb9aa2d17ac9454ecace502ee - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.15": - version: 0.2.15 - resolution: "tinyglobby@npm:0.2.15" - dependencies: - fdir: "npm:^6.5.0" - picomatch: "npm:^4.0.3" - checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 - languageName: node - linkType: hard - -"tinypool@npm:2.1.0": - version: 2.1.0 - resolution: "tinypool@npm:2.1.0" - checksum: 10c0/9fb1c760558c6264e0f4cfde96a63b12450b43f1730fbe6274aa24ddbdf488745c08924d0dea7a1303b47d555416a6415f2113898c69b6ecf731e75ac95238a5 - languageName: node - linkType: hard - -"tinyrainbow@npm:^3.0.3": - version: 3.0.3 - resolution: "tinyrainbow@npm:3.0.3" - checksum: 10c0/1e799d35cd23cabe02e22550985a3051dc88814a979be02dc632a159c393a998628eacfc558e4c746b3006606d54b00bcdea0c39301133956d10a27aa27e988c - languageName: node - linkType: hard - -"ts-pattern@npm:^5.9.0": - version: 5.9.0 - resolution: "ts-pattern@npm:5.9.0" - checksum: 10c0/7640db25c39d29b287471b2b82d4f7b4674a02098c6ba4d10fed180adfb07d0e0c71930d9e59dc0d90654145e02fd320af63cf0df3c41e100d4154658a612a0a - languageName: node - linkType: hard - -"tsx@npm:^4.21.0": - version: 4.21.0 - resolution: "tsx@npm:4.21.0" - dependencies: - esbuild: "npm:~0.27.0" - fsevents: "npm:~2.3.3" - get-tsconfig: "npm:^4.7.5" - dependenciesMeta: - fsevents: - optional: true - bin: - tsx: dist/cli.mjs - checksum: 10c0/f5072923cd8459a1f9a26df87823a2ab5754641739d69df2a20b415f61814322b751fa6be85db7c6ec73cf68ba8fac2fd1cfc76bdb0aa86ded984d84d5d2126b - languageName: node - linkType: hard - -"type-fest@npm:^5.4.4": - version: 5.4.4 - resolution: "type-fest@npm:5.4.4" - dependencies: - tagged-tag: "npm:^1.0.0" - checksum: 10c0/bf9c6d7df5383fd720aac71da8ce8690ff1c554459d19cf3c72d61eac98255dba57abe20c628f91f4116f66211791462fdafa90b2be2d7405a5a4c295e4d849d - languageName: node - linkType: hard - -"typescript@npm:5.8.2": - version: 5.8.2 - resolution: "typescript@npm:5.8.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/5c4f6fbf1c6389b6928fe7b8fcd5dc73bb2d58cd4e3883f1d774ed5bd83b151cbac6b7ecf11723de56d4676daeba8713894b1e9af56174f2f9780ae7848ec3c6 - languageName: node - linkType: hard - -"typescript@npm:^5.9.3": - version: 5.9.3 - resolution: "typescript@npm:5.9.3" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5 - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A5.8.2#optional!builtin": - version: 5.8.2 - resolution: "typescript@patch:typescript@npm%3A5.8.2#optional!builtin::version=5.8.2&hash=b45daf" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/8a6cd29dfb59bd5a978407b93ae0edb530ee9376a5b95a42ad057a6f80ffb0c410489ccd6fe48d1d0dfad6e8adf5d62d3874bbd251f488ae30e11a1ce6dabd28 - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A^5.9.3#optional!builtin": - version: 5.9.3 - resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=b45daf" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/6f7e53bf0d9702350deeb6f35e08b69cbc8b958c33e0ec77bdc0ad6a6c8e280f3959dcbfde6f5b0848bece57810696489deaaa53d75de3578ff255d168c1efbd - languageName: node - linkType: hard - -"ufo@npm:^1.6.1": - version: 1.6.3 - resolution: "ufo@npm:1.6.3" - checksum: 10c0/bf0e4ebff99e54da1b9c7182ac2f40475988b41faa881d579bc97bc2a0509672107b0a0e94c4b8d31a0ab8c4bf07f4aa0b469ac6da8536d56bda5b085ea2e953 - languageName: node - linkType: hard - -"uglify-js@npm:^3.1.4": - version: 3.19.3 - resolution: "uglify-js@npm:3.19.3" - bin: - uglifyjs: bin/uglifyjs - checksum: 10c0/83b0a90eca35f778e07cad9622b80c448b6aad457c9ff8e568afed978212b42930a95f9e1be943a1ffa4258a3340fbb899f41461131c05bb1d0a9c303aed8479 - languageName: node - linkType: hard - -"undici-types@npm:~7.18.0": - version: 7.18.2 - resolution: "undici-types@npm:7.18.2" - checksum: 10c0/85a79189113a238959d7a647368e4f7c5559c3a404ebdb8fc4488145ce9426fcd82252a844a302798dfc0e37e6fb178ff481ed03bc4caf634c5757d9ef43521d - languageName: node - linkType: hard - -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: "npm:^4.0.0" - checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f - languageName: node - linkType: hard - -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 - languageName: node - linkType: hard - -"universalify@npm:^2.0.0": - version: 2.0.1 - resolution: "universalify@npm:2.0.1" - checksum: 10c0/73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a - languageName: node - linkType: hard - -"update-browserslist-db@npm:^1.2.0": - version: 1.2.3 - resolution: "update-browserslist-db@npm:1.2.3" - dependencies: - escalade: "npm:^3.2.0" - picocolors: "npm:^1.1.1" - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 10c0/13a00355ea822388f68af57410ce3255941d5fb9b7c49342c4709a07c9f230bbef7f7499ae0ca7e0de532e79a82cc0c4edbd125f1a323a1845bf914efddf8bec - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: "npm:^2.1.0" - checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c - languageName: node - linkType: hard - -"vite-plugin-dts@npm:^4.5.4": - version: 4.5.4 - resolution: "vite-plugin-dts@npm:4.5.4" - dependencies: - "@microsoft/api-extractor": "npm:^7.50.1" - "@rollup/pluginutils": "npm:^5.1.4" - "@volar/typescript": "npm:^2.4.11" - "@vue/language-core": "npm:2.2.0" - compare-versions: "npm:^6.1.1" - debug: "npm:^4.4.0" - kolorist: "npm:^1.8.0" - local-pkg: "npm:^1.0.0" - magic-string: "npm:^0.30.17" - peerDependencies: - typescript: "*" - vite: "*" - peerDependenciesMeta: - vite: - optional: true - checksum: 10c0/5fcb7f3739d115f36195a692c0e9f9fca4e504bbbbabe29e71ee06630dd05ea2920169371e80e548eb4779d2eca14107277497838d7df588d53e1fadf84be861 - languageName: node - linkType: hard - -"vite@npm:^6.0.0 || ^7.0.0, vite@npm:^7.3.1": - version: 7.3.1 - resolution: "vite@npm:7.3.1" - dependencies: - esbuild: "npm:^0.27.0" - fdir: "npm:^6.5.0" - fsevents: "npm:~2.3.3" - picomatch: "npm:^4.0.3" - postcss: "npm:^8.5.6" - rollup: "npm:^4.43.0" - tinyglobby: "npm:^0.2.15" - peerDependencies: - "@types/node": ^20.19.0 || >=22.12.0 - jiti: ">=1.21.0" - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: ">=0.54.8" - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - bin: - vite: bin/vite.js - checksum: 10c0/5c7548f5f43a23533e53324304db4ad85f1896b1bfd3ee32ae9b866bac2933782c77b350eb2b52a02c625c8ad1ddd4c000df077419410650c982cd97fde8d014 - languageName: node - linkType: hard - -"vitest@npm:4.0.18": - version: 4.0.18 - resolution: "vitest@npm:4.0.18" - dependencies: - "@vitest/expect": "npm:4.0.18" - "@vitest/mocker": "npm:4.0.18" - "@vitest/pretty-format": "npm:4.0.18" - "@vitest/runner": "npm:4.0.18" - "@vitest/snapshot": "npm:4.0.18" - "@vitest/spy": "npm:4.0.18" - "@vitest/utils": "npm:4.0.18" - es-module-lexer: "npm:^1.7.0" - expect-type: "npm:^1.2.2" - magic-string: "npm:^0.30.21" - obug: "npm:^2.1.1" - pathe: "npm:^2.0.3" - picomatch: "npm:^4.0.3" - std-env: "npm:^3.10.0" - tinybench: "npm:^2.9.0" - tinyexec: "npm:^1.0.2" - tinyglobby: "npm:^0.2.15" - tinyrainbow: "npm:^3.0.3" - vite: "npm:^6.0.0 || ^7.0.0" - why-is-node-running: "npm:^2.3.0" - peerDependencies: - "@edge-runtime/vm": "*" - "@opentelemetry/api": ^1.9.0 - "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 - "@vitest/browser-playwright": 4.0.18 - "@vitest/browser-preview": 4.0.18 - "@vitest/browser-webdriverio": 4.0.18 - "@vitest/ui": 4.0.18 - happy-dom: "*" - jsdom: "*" - peerDependenciesMeta: - "@edge-runtime/vm": - optional: true - "@opentelemetry/api": - optional: true - "@types/node": - optional: true - "@vitest/browser-playwright": - optional: true - "@vitest/browser-preview": - optional: true - "@vitest/browser-webdriverio": - optional: true - "@vitest/ui": - optional: true - happy-dom: - optional: true - jsdom: - optional: true - bin: - vitest: vitest.mjs - checksum: 10c0/b913cd32032c95f29ff08c931f4b4c6fd6d2da498908d6770952c561a1b8d75c62499a1f04cadf82fb89cc0f9a33f29fb5dfdb899f6dbb27686a9d91571be5fa - languageName: node - linkType: hard - -"vscode-uri@npm:^3.0.8": - version: 3.1.0 - resolution: "vscode-uri@npm:3.1.0" - checksum: 10c0/5f6c9c10fd9b1664d71fab4e9fbbae6be93c7f75bb3a1d9d74399a88ab8649e99691223fd7cef4644376cac6e94fa2c086d802521b9a8e31c5af3e60f0f35624 - languageName: node - linkType: hard - -"which@npm:^2.0.1": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: "npm:^2.0.0" - bin: - node-which: ./bin/node-which - checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f - languageName: node - linkType: hard - -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" - dependencies: - isexe: "npm:^3.1.1" - bin: - node-which: bin/which.js - checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a - languageName: node - linkType: hard - -"why-is-node-running@npm:^2.3.0": - version: 2.3.0 - resolution: "why-is-node-running@npm:2.3.0" - dependencies: - siginfo: "npm:^2.0.0" - stackback: "npm:0.0.2" - bin: - why-is-node-running: cli.js - checksum: 10c0/1cde0b01b827d2cf4cb11db962f3958b9175d5d9e7ac7361d1a7b0e2dc6069a263e69118bd974c4f6d0a890ef4eedfe34cf3d5167ec14203dbc9a18620537054 - languageName: node - linkType: hard - -"wordwrap@npm:^1.0.0": - version: 1.0.0 - resolution: "wordwrap@npm:1.0.0" - checksum: 10c0/7ed2e44f3c33c5c3e3771134d2b0aee4314c9e49c749e37f464bf69f2bcdf0cbf9419ca638098e2717cff4875c47f56a007532f6111c3319f557a2ca91278e92 - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: "npm:^6.1.0" - string-width: "npm:^5.0.1" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 - languageName: node - linkType: hard - -"wrap-ansi@npm:^9.0.0": - version: 9.0.2 - resolution: "wrap-ansi@npm:9.0.2" - dependencies: - ansi-styles: "npm:^6.2.1" - string-width: "npm:^7.0.0" - strip-ansi: "npm:^7.1.0" - checksum: 10c0/3305839b9a0d6fb930cb63a52f34d3936013d8b0682ff3ec133c9826512620f213800ffa19ea22904876d5b7e9a3c1f40682f03597d986a4ca881fa7b033688c - languageName: node - linkType: hard - -"y18n@npm:^5.0.5": - version: 5.0.8 - resolution: "y18n@npm:5.0.8" - checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 - languageName: node - linkType: hard - -"yallist@npm:^3.0.2": - version: 3.1.1 - resolution: "yallist@npm:3.1.1" - checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a - languageName: node - linkType: hard - -"yargs-parser@npm:^22.0.0": - version: 22.0.0 - resolution: "yargs-parser@npm:22.0.0" - checksum: 10c0/cb7ef81759c4271cb1d96b9351dbbc9a9ce35d3e1122d2b739bf6c432603824fa02c67cc12dcef6ea80283379d63495686e8f41cc7b06c6576e792aba4d33e1c - languageName: node - linkType: hard - -"yargs@npm:^18.0.0": - version: 18.0.0 - resolution: "yargs@npm:18.0.0" - dependencies: - cliui: "npm:^9.0.1" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - string-width: "npm:^7.2.0" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^22.0.0" - checksum: 10c0/bf290e4723876ea9c638c786a5c42ac28e03c9ca2325e1424bf43b94e5876456292d3ed905b853ebbba6daf43ed29e772ac2a6b3c5fb1b16533245d6211778f3 - languageName: node - linkType: hard - -"zod@npm:^4.3.6": - version: 4.3.6 - resolution: "zod@npm:4.3.6" - checksum: 10c0/860d25a81ab41d33aa25f8d0d07b091a04acb426e605f396227a796e9e800c44723ed96d0f53a512b57be3d1520f45bf69c0cb3b378a232a00787a2609625307 - languageName: node - linkType: hard