diff --git a/README.md b/README.md index b5b270a6..93fa14ba 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ yarn openapi-codegen generate --config my-config.ts --splitByTags Organize output into separate folders based on OpenAPI operation tags (default: true) --defaultTag (Requires `--splitByTags`) Default tag for shared code across multiple tags (default: 'Common') + --includeTags Comma-separated list of tags to include in generation --excludeTags Comma-separated list of tags to exclude from generation --excludePathRegex Exclude operations whose paths match the given regular expression --excludeRedundantZodSchemas Exclude any redundant Zod schemas (default: true) @@ -91,7 +92,9 @@ yarn openapi-codegen generate --config my-config.ts --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) + --mutationScope Serialize mutations for the same path-param resource via TanStack scope.id (default: false) + --mutationDefaultOnError Use OpenApiQueryConfig.onError as the default onError for mutation hooks (default: false) + --workspaceContext Comma-separated list of path/ACL params that generated hooks may resolve from OpenApiWorkspaceContext --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) @@ -115,6 +118,7 @@ yarn openapi-codegen generate --config my-config.ts --splitByTags Organize output into separate folders based on OpenAPI operation tags (default: true) --defaultTag (Requires `--splitByTags`) Default tag for shared code across multiple tags (default: 'Common') + --includeTags Comma-separated list of tags to include in generation --excludeTags Comma-separated list of tags to exclude from generation --excludePathRegex Exclude operations whose paths match the given regular expression --excludeRedundantZodSchemas Exclude any redundant Zod schemas (default: true) @@ -192,20 +196,36 @@ const config: OpenAPICodegenConfig = { export default config; ``` +### Default mutation errors + +Set `mutationDefaultOnError: true` in codegen config (or pass `--mutationDefaultOnError`) to let generated mutation hooks fall back to `OpenApiQueryConfig.Provider` when a mutation call does not define its own `onError`. + +```tsx +import { ErrorHandler, OpenApiQueryConfig } from "@povio/openapi-codegen-cli"; + + { + errorToast({ text: ErrorHandler.getErrorMessage(error) }); + }} +> + +; +``` + ### 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`). +Set `workspaceContext` to a list of param names in codegen config (or pass `--workspaceContext officeId,projectId`) and wrap your app subtree with `OpenApiWorkspaceContext.Provider` if generated hooks frequently repeat workspace-scoped params. ```tsx import { OpenApiWorkspaceContext } from "@povio/openapi-codegen-cli"; -// openapi-codegen.config.ts -> { workspaceContext: true } +// openapi-codegen.config.ts -> { workspaceContext: ["officeId", "projectId"] } ; ``` -Generated query/mutation hooks can then omit matching path/ACL params and resolve them from `OpenApiWorkspaceContext`. +Generated query/mutation hooks can then omit only those matching path/ACL params and resolve them from `OpenApiWorkspaceContext`. Params not listed in `workspaceContext` remain explicit and required. ### Generation Modes diff --git a/openapi-codegen.config.mjs b/openapi-codegen.config.mjs index b108e6ed..71b80682 100644 --- a/openapi-codegen.config.mjs +++ b/openapi-codegen.config.mjs @@ -2,7 +2,7 @@ const config = { input: "http://127.0.0.1:4000/docs-json", output: "./test/generated/next", - excludeTags: ["auth"], + includeTags: ["auth"], replaceOptionalWithNullish: true, builderConfigs: true, infiniteQueries: true, diff --git a/package.json b/package.json index 2843d676..33d61d04 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@povio/openapi-codegen-cli", - "version": "2.0.8-rc.26", + "version": "2.0.8-rc.38", "keywords": [ "codegen", "openapi", @@ -99,7 +99,9 @@ "type-fest": "^5.4.4", "vite": "npm:rolldown-vite@^7.3.1", "vite-plugin-dts": "^4.5.4", - "vitest": "4.0.18" + "vitest": "4.0.18", + "yargs": "^17.7.2", + "zod": "^4.3.6" }, "peerDependencies": { "@casl/ability": "^6.7.3", @@ -107,7 +109,7 @@ "@tanstack/react-query": "^5.90.21", "axios": "^1.13.1", "react": "^19.1.0", - "vite": "^6.0.0 || ^7.0.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "zod": "^4.1.12" }, "peerDependenciesMeta": { diff --git a/src/commands/check.command.ts b/src/commands/check.command.ts index 086bfda0..22a25880 100644 --- a/src/commands/check.command.ts +++ b/src/commands/check.command.ts @@ -19,6 +19,9 @@ class CheckOptions implements CheckParams { @YargOption({ envAlias: "defaultTag" }) defaultTag?: string; + @YargOption({ envAlias: "includeTags" }) + includeTags?: string; + @YargOption({ envAlias: "excludeTags" }) excludeTags?: string; diff --git a/src/commands/check.ts b/src/commands/check.ts index 7d33b5ff..74ac6f90 100644 --- a/src/commands/check.ts +++ b/src/commands/check.ts @@ -9,11 +9,18 @@ import SwaggerParser from "@apidevtools/swagger-parser"; export type CheckParams = { config?: string; + includeTags?: string; excludeTags?: string; verbose?: boolean; } & Partial>; -export async function check({ verbose, config: configParam, excludeTags: _excludeTagsParam, ...params }: CheckParams) { +export async function check({ + verbose, + config: configParam, + includeTags: _includeTagsParam, + excludeTags: _excludeTagsParam, + ...params +}: CheckParams) { const start = Date.now(); if (verbose) { diff --git a/src/commands/generate.command.ts b/src/commands/generate.command.ts index f3181adf..70d09936 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: "clearOutput", type: "boolean" }) + clearOutput?: boolean; + @YargOption({ envAlias: "incremental", type: "boolean" }) incremental?: boolean; @@ -31,6 +34,9 @@ class GenerateOptions implements GenerateParams { @YargOption({ envAlias: "defaultTag" }) defaultTag?: string; + @YargOption({ envAlias: "includeTags" }) + includeTags?: string; + @YargOption({ envAlias: "excludeTags" }) excludeTags?: string; @@ -70,8 +76,14 @@ class GenerateOptions implements GenerateParams { @YargOption({ envAlias: "mutationEffects", type: "boolean" }) mutationEffects?: boolean; - @YargOption({ envAlias: "workspaceContext", type: "boolean" }) - workspaceContext?: boolean; + @YargOption({ envAlias: "mutationDefaultOnError", type: "boolean" }) + mutationDefaultOnError?: boolean; + + @YargOption({ envAlias: "workspaceContext" }) + workspaceContext?: string; + + @YargOption({ envAlias: "mutationScope", type: "boolean" }) + mutationScope?: boolean; @YargOption({ envAlias: "parseRequestParams", type: "boolean" }) parseRequestParams?: boolean; diff --git a/src/commands/generate.ts b/src/commands/generate.ts index 421b0790..14d61eb8 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -7,8 +7,10 @@ import { Profiler } from "@/helpers/profile.helper"; export type GenerateParams = { config?: string; + includeTags?: string; excludeTags?: string; inlineEndpointsExcludeModules?: string; + workspaceContext?: string; prettier?: boolean; verbose?: boolean; } & Partial< @@ -16,6 +18,7 @@ export type GenerateParams = { GenerateOptions, | "input" | "output" + | "clearOutput" | "incremental" | "tsNamespaces" | "tsPath" @@ -33,7 +36,7 @@ export type GenerateParams = { | "infiniteQueries" | "axiosRequestConfig" | "mutationEffects" - | "workspaceContext" + | "mutationScope" | "parseRequestParams" | "inlineEndpoints" | "builderConfigs" diff --git a/src/generators/const/options.const.ts b/src/generators/const/options.const.ts index fcf5d473..a822ad41 100644 --- a/src/generators/const/options.const.ts +++ b/src/generators/const/options.const.ts @@ -8,9 +8,11 @@ export const DEFAULT_GENERATE_OPTIONS: GenerateOptions = { // Base options input: "http://localhost:4000/docs-json/", output: "output", + clearOutput: false, incremental: true, splitByTags: true, defaultTag: "Common", + includeTags: [], excludeTags: [], excludePathRegex: "", excludeRedundantZodSchemas: true, @@ -60,8 +62,10 @@ export const DEFAULT_GENERATE_OPTIONS: GenerateOptions = { queryTypesImportPath: PACKAGE_IMPORT_PATH, axiosRequestConfig: false, mutationEffects: true, - workspaceContext: false, + mutationDefaultOnError: false, + workspaceContext: [], prefetchQueries: true, + mutationScope: false, // Infinite queries options infiniteQueries: false, infiniteQueryParamNames: { diff --git a/src/generators/core/SchemaResolver.class.ts b/src/generators/core/SchemaResolver.class.ts index 0612642f..5c66829e 100644 --- a/src/generators/core/SchemaResolver.class.ts +++ b/src/generators/core/SchemaResolver.class.ts @@ -179,6 +179,10 @@ export class SchemaResolver { return this.options.defaultTag; } + if (this.options.modelsInCommon) { + return formatTag(this.options.defaultTag); + } + const extractedEnumZodSchema = this.extractedEnumZodSchemaData.find((data) => data.zodSchemaName === zodSchemaName); if (extractedEnumZodSchema) { return formatTag(extractedEnumZodSchema.tag ?? this.options.defaultTag); diff --git a/src/generators/core/endpoints/getEndpointParameter.ts b/src/generators/core/endpoints/getEndpointParameter.ts index be0a4f0e..5c64409a 100644 --- a/src/generators/core/endpoints/getEndpointParameter.ts +++ b/src/generators/core/endpoints/getEndpointParameter.ts @@ -3,9 +3,12 @@ import { match } from "ts-pattern"; import { ALLOWED_PATH_IN } from "@/generators/const/openapi.const"; import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; -import { getEnumZodSchemaCodeFromEnumNames } from "@/generators/core/zod/getZodSchema"; +import { getZodChain } from "@/generators/core/zod/getZodChain"; +import { getEnumZodSchemaCodeFromEnumNames, getZodSchema } from "@/generators/core/zod/getZodSchema"; +import { resolveZodSchemaName } from "@/generators/core/zod/resolveZodSchemaName"; import { EndpointParameter } from "@/generators/types/endpoint"; import { ParameterObject } from "@/generators/types/openapi"; +import { isSchemaObject } from "@/generators/utils/openapi-schema.utils"; import { isParamMediaTypeAllowed, isSortingParameterObject, @@ -16,7 +19,6 @@ import { getParamZodSchemaName, getZodSchemaOperationName, } from "@/generators/utils/zod-schema.utils"; -import { resolveEndpointZodSchema } from "./resolveEndpointZodSchema"; export function getEndpointParameter({ resolver, @@ -79,13 +81,41 @@ export function getEndpointParameter({ parameterSortingEnumSchemaName = enumZodSchemaName; } - const zodSchemaName = resolveEndpointZodSchema({ - resolver, + const zodSchema = getZodSchema({ schema, + resolver, meta: { isRequired: paramObj.in === "path" ? true : (paramObj.required ?? false) }, tag, + }); + + const schemaObject = resolver.resolveObject(schema); + + /** + * Optional query/header object params (e.g. deepObject `filter`): OpenAPI marks the param + * `required: false`, so getZodChain would append `.optional()` to the named schema. The + * endpoints template already wraps named optional params with `.optional()` in + * `ZodExtended.parse`, which duplicates optionality and breaks consumers that expect a bare + * object schema (e.g. builder configs). Keep `.nullable()` / defaults / validations; only + * skip the root presence modifier for object-shaped schemas. + */ + const rootIsOptionalQueryOrHeaderObject = + (paramObj.in === "query" || paramObj.in === "header") && + !paramObj.required && + isSchemaObject(schemaObject) && + (schemaObject.type === "object" || (!!schemaObject.properties && Object.keys(schemaObject.properties).length > 0)); + + const zodChain = getZodChain({ + schema: schemaObject, + meta: rootIsOptionalQueryOrHeaderObject ? { ...zodSchema.meta, isRequired: true } : zodSchema.meta, + options: resolver.options, + }); + + const zodSchemaName = resolveZodSchemaName({ + schema: schemaObject, + zodSchema: zodSchema.assign(zodSchema.getCodeString(tag) + zodChain), fallbackName, - composeBeforeResolve: true, + resolver, + tag, }); return { @@ -99,6 +129,6 @@ export function getEndpointParameter({ .run() as "Header" | "Query" | "Path", zodSchema: zodSchemaName, parameterObject: paramObj, - parameterSortingEnumSchemaName, + ...(parameterSortingEnumSchemaName !== undefined ? { parameterSortingEnumSchemaName } : {}), }; } diff --git a/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.test.ts b/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.test.ts index a8059f7d..c4e0330b 100644 --- a/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.test.ts +++ b/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.test.ts @@ -766,6 +766,77 @@ describe("getEndpointsFromOpenAPIDoc", () => { ); }); + test("uses default response when 200 has no content but default has JSON body", () => { + const Widget = { + type: "object", + properties: { id: { type: "string" } }, + } as OpenAPIV3.SchemaObject; + + const openApiDoc: OpenAPIV3.Document = { + ...baseDoc, + components: { schemas: { Widget } }, + paths: { + "/widgets": { + get: { + tags: ["widget"], + operationId: "listWidgets", + responses: { + "200": { + description: "", + }, + default: { + description: "", + content: { + [JSON_APPLICATION_FORMAT]: { + schema: { + type: "array", + items: { $ref: "#/components/schemas/Widget" }, + }, + }, + }, + }, + }, + }, + }, + }, + }; + + const resolver = new SchemaResolver(openApiDoc, generateOptions); + const endpoints = getEndpointsFromOpenAPIDoc(resolver); + + expect(endpoints).toEqual([ + { + description: undefined, + summary: undefined, + errors: [], + method: "get", + operationName: "listWidgets", + parameters: [], + path: "/widgets", + requestFormat: JSON_APPLICATION_FORMAT, + response: "ListWidgetsResponse", + responseDescription: "", + responseFormat: JSON_APPLICATION_FORMAT, + responseObject: { + content: { + [JSON_APPLICATION_FORMAT]: { + schema: { type: "array", items: { $ref: "#/components/schemas/Widget" } }, + }, + }, + description: "", + }, + tags: ["widget"], + responseStatusCodes: ["200", "default"], + mediaUpload: false, + mediaDownload: false, + }, + ]); + expect(resolver.getZodSchemas()).toMatchObject({ + Widget: expect.any(String), + ListWidgetsResponse: "z.array(Widget)", + }); + }); + test("petstore.yaml", async () => { const openApiDoc = (await SwaggerParser.parse("./test/petstore.yaml")) as OpenAPIV3.Document; const resolver = new SchemaResolver(openApiDoc, generateOptions); @@ -1404,8 +1475,16 @@ describe("getEndpointsFromOpenAPIDoc", () => { ], path: "/user", requestFormat: JSON_APPLICATION_FORMAT, - response: "z.void()", + response: "User", + responseDescription: "Successful operation", responseFormat: JSON_APPLICATION_FORMAT, + responseObject: { + content: { + [JSON_APPLICATION_FORMAT]: { schema: { $ref: "#/components/schemas/User" } }, + "application/xml": { schema: { $ref: "#/components/schemas/User" } }, + }, + description: "Successful operation", + }, tags: ["user"], responseStatusCodes: ["default"], mediaUpload: false, diff --git a/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.ts b/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.ts index ffcf67a1..c662bc97 100644 --- a/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.ts +++ b/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.ts @@ -1,14 +1,27 @@ 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 { Profiler } from "@/helpers/profile.helper"; +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 { 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, replaceHyphenatedPath } from "@/generators/utils/openapi.utils"; -import { formatTag } from "@/generators/utils/tag.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 { getInvalidOperationIdError, getInvalidStatusCodeError, @@ -21,158 +34,203 @@ 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, profiler?: Profiler) { +export function getEndpointsFromOpenAPIDoc(resolver: SchemaResolver) { const endpoints = []; - const p = profiler ?? new Profiler(false); - - for (const context of resolver.getOperationContexts()) { - endpoints.push(buildEndpointFromOperationContext(resolver, context, p)); - } - return endpoints; -} + for (const path in resolver.openApiDoc.paths) { + if (isPathExcluded(path, resolver.options)) { + continue; + } -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)); - } + const pathItemObj = resolver.openApiDoc.paths[path] as OpenAPIV3.PathItemObject; + const pathItem = pick(pathItemObj, ALLOWED_METHODS); + const pathParameters = getParameters(pathItemObj.parameters ?? []); - 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"], - }; + for (const method in pathItem) { + const operation = pathItem[method as keyof typeof pathItem] as OperationObject | undefined; + if (!operation || isOperationExcluded(operation, resolver.options)) { + continue; + } - 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 invalidOperationId = + operation.operationId && operation.operationId !== invalidVariableNameCharactersToCamel(operation.operationId); + if (operation.operationId && invalidOperationId) { + resolver.validationErrors.push(getInvalidOperationIdError(operation.operationId)); } - } - }); - p.runSync("endpoints.params", () => { - for (const param of parameters) { - const endpointParameter = getEndpointParameter({ - resolver, - param, - operationName, - isUniqueOperationName, - tag, + const parameters = Object.entries({ + ...pathParameters, + ...getParameters(operation.parameters ?? []), + }).map(([, param]) => param); + const operationName = getUniqueOperationName({ + path, + method, + operation, + operationsByTag: resolver.operationsByTag, + options: resolver.options, }); - 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), - ); + 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), + 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; } } - if (schema) { - responseZodSchema = resolveEndpointZodSchema({ + for (const param of parameters) { + const endpointParameter = getEndpointParameter({ resolver, - schema, - meta: { isRequired: true }, + param, + operationName, + isUniqueOperationName, tag, - fallbackName: isReferenceObject(schema) - ? undefined - : getResponseZodSchemaName({ statusCode, operationName, isUniqueOperationName, tag }), - composeBeforeResolve: false, }); + if (endpointParameter) { + endpoint.parameters.push(endpointParameter); + } } - 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 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 ?? {}); + // Prefer any content entry that declares a body schema. Some specs use + // non-application media types (e.g. text/json) which would otherwise skip + // schema resolution and fall back to z.void() for the whole operation. + const matchingMediaType = + mediaTypes.find((mt) => { + const entry = responseObj.content?.[mt]; + return !!entry?.schema; + }) ?? mediaTypes.find(isMediaTypeAllowed); + + let schema: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject | undefined; + if (matchingMediaType) { + endpoint.responseFormat = matchingMediaType; + schema = responseObj.content?.[matchingMediaType]?.schema; + } else if (statusCode === "200") { + resolver.validationErrors.push( + getInvalidStatusCodeError({ received: "200", expected: "204" }, operation, endpoint), + ); + } + + if (schema) { + const zodSchema = getZodSchema({ + schema, + resolver, + meta: { isRequired: true }, + tag, }); + + const schemaObject = resolver.resolveObject(schema); + + const zodSchemaName = resolveZodSchemaName({ + schema: schemaObject, + zodSchema, + fallbackName: zodSchema.ref + ? undefined + : getResponseZodSchemaName({ statusCode, operationName, isUniqueOperationName, tag }), + resolver, + tag, + }); + + const responseZodSchema = + zodSchemaName + getZodChain({ schema: schemaObject, meta: zodSchema.meta, options: resolver.options }); + + const status = Number(statusCode); + + if (isMainResponseStatus(status) && !endpoint.response) { + endpoint.response = responseZodSchema; + endpoint.responseObject = responseObj; + endpoint.responseDescription = responseObj?.description; + } else if (statusCode === "default" && !endpoint.response) { + // Nest/Swagger often puts the JSON body only under `default` while `200` has no content. + endpoint.response = responseZodSchema; + endpoint.responseObject = responseObj; + endpoint.responseDescription = responseObj?.description; + } else if (statusCode !== "default" && !Number.isNaN(status) && isErrorStatus(status)) { + endpoint.errors.push({ + zodSchema: responseZodSchema, + status, + description: responseObj?.description, + }); + } + } else { + const status = Number(statusCode); + const responseZodSchema = VOID_SCHEMA; + + if (statusCode !== "default" && !Number.isNaN(status) && isErrorStatus(status)) { + endpoint.errors.push({ + zodSchema: responseZodSchema, + status, + description: responseObj?.description, + }); + } } } - } - }); - if (!endpoint.response) { - endpoint.response = VOID_SCHEMA; - } + if (!endpoint.response) { + endpoint.response = VOID_SCHEMA; + } - 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), - ); - } - }); + 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), + ); + } - p.runSync("endpoints.acl", () => { - endpoint.acl = getEndpointAcl({ resolver, endpoint, operation }); - }); + const resolvedAcl = getEndpointAcl({ resolver, endpoint, operation }); + if (resolvedAcl?.length) { + endpoint.acl = resolvedAcl; + } - if (operation.security?.[0].Authorization && !endpoint.responseStatusCodes.includes("401")) { - resolver.validationErrors.push(getMissingStatusCodeError("401", operation, endpoint)); - } + if (operation.security?.[0].Authorization && !endpoint.responseStatusCodes.includes("401")) { + resolver.validationErrors.push(getMissingStatusCodeError("401", operation, endpoint)); + } - if (endpoint.acl?.[0] && !endpoint.responseStatusCodes.includes("403")) { - resolver.validationErrors.push(getMissingStatusCodeError("403", operation, endpoint)); + if (endpoint.acl?.[0] && !endpoint.responseStatusCodes.includes("403")) { + resolver.validationErrors.push(getMissingStatusCodeError("403", operation, endpoint)); + } + + endpoints.push(endpoint); + } } - return endpoint; + return endpoints; +} + +function getParameters(parameters: NonNullable) { + return Object.fromEntries( + (parameters ?? []).map((param) => [isReferenceObject(param) ? param.$ref : param.name, param] as const), + ); } function getMissingPathParameters(endpoint: Endpoint): EndpointParameter[] { diff --git a/src/generators/core/getMetadataFromOpenAPIDoc.test.ts b/src/generators/core/getMetadataFromOpenAPIDoc.test.ts index bd2a4db7..1640f291 100644 --- a/src/generators/core/getMetadataFromOpenAPIDoc.test.ts +++ b/src/generators/core/getMetadataFromOpenAPIDoc.test.ts @@ -339,7 +339,7 @@ describe("getMetadataFromOpenAPIDoc", () => { isQuery: false, isMutation: true, params: [{ name: "data", isRequired: true, ...User }], - response: { type: "void", metaType: "primitive" }, + response: { ...User }, }, { name: "useCreateWithListInput", @@ -428,4 +428,23 @@ describe("getMetadataFromOpenAPIDoc", () => { expect(metadata.models).toEqual(models(extractEnums)); expect(metadata.queries).toEqual(queries); }); + + test("uses common model namespace and import path when modelsInCommon is enabled with includeTags", async () => { + const openApiDoc = (await SwaggerParser.bundle("./test/petstore.yaml")) as OpenAPIV3.Document; + + const metadata = await getMetadataFromOpenAPIDoc(openApiDoc, { + ...DEFAULT_GENERATE_OPTIONS, + includeTags: ["pet"], + modelsInCommon: true, + excludeRedundantZodSchemas: false, + }); + + expect(metadata.models.length).toBeGreaterThan(0); + expect(metadata.models.every((model) => model.namespace === "CommonModels")).toBe(true); + expect(metadata.models.every((model) => model.importPath === "common/common.models")).toBe(true); + + const petQuery = metadata.queries.find((query) => query.name === "useGetById"); + expect(petQuery?.response.namespace).toBe("CommonModels"); + expect(petQuery?.response.importPath).toBe("common/common.models"); + }); }); diff --git a/src/generators/core/resolveConfig.test.ts b/src/generators/core/resolveConfig.test.ts new file mode 100644 index 00000000..5c7d008e --- /dev/null +++ b/src/generators/core/resolveConfig.test.ts @@ -0,0 +1,15 @@ +import { describe, expect, it } from "vitest"; + +import { resolveConfig } from "@/generators/core/resolveConfig"; + +describe("resolveConfig", () => { + it("normalizes workspaceContext from comma-separated CLI input", () => { + const config = resolveConfig({ + params: { + workspaceContext: " officeId,positionId,officeId ,, ", + }, + }); + + expect(config.workspaceContext).toEqual(["officeId", "positionId"]); + }); +}); diff --git a/src/generators/core/resolveConfig.ts b/src/generators/core/resolveConfig.ts index 13927846..7b8cfe87 100644 --- a/src/generators/core/resolveConfig.ts +++ b/src/generators/core/resolveConfig.ts @@ -4,21 +4,28 @@ import { deepMerge } from "@/generators/utils/object.utils"; export function resolveConfig({ fileConfig = {}, - params: { excludeTags, inlineEndpointsExcludeModules, ...options }, + params: { includeTags, excludeTags, inlineEndpointsExcludeModules, workspaceContext, ...options }, }: { fileConfig?: Partial | null; params: Partial< - Omit & { + Omit & { + includeTags: string; excludeTags: string; inlineEndpointsExcludeModules: string; + workspaceContext: string; } >; }) { const resolvedConfig = deepMerge(DEFAULT_GENERATE_OPTIONS, fileConfig ?? {}, { ...options, + includeTags: includeTags?.split(","), excludeTags: excludeTags?.split(","), inlineEndpointsExcludeModules: inlineEndpointsExcludeModules?.split(","), + workspaceContext: workspaceContext?.split(","), }); resolvedConfig.checkAcl = resolvedConfig.acl && resolvedConfig.checkAcl; + resolvedConfig.workspaceContext = Array.from( + new Set((resolvedConfig.workspaceContext ?? []).map((value) => value.trim()).filter(Boolean)), + ); return resolvedConfig; } diff --git a/src/generators/generate/generateAcl.ts b/src/generators/generate/generateAcl.ts index fe453b1c..5f6f3e73 100644 --- a/src/generators/generate/generateAcl.ts +++ b/src/generators/generate/generateAcl.ts @@ -1,4 +1,5 @@ import { ACL_APP_ABILITIES, CASL_ABILITY_BINDING, CASL_ABILITY_IMPORT } from "@/generators/const/acl.const"; +import { PACKAGE_IMPORT_PATH } from "@/generators/const/package.const"; import { Endpoint } from "@/generators/types/endpoint"; import { GenerateType, GenerateTypeParams, Import } from "@/generators/types/generate"; import { @@ -14,6 +15,7 @@ import { } from "@/generators/utils/generate/generate.acl.utils"; import { getInfiniteQueryName, getQueryName } from "@/generators/utils/generate/generate.query.utils"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; +import { capitalize } from "@/generators/utils/string.utils"; export function generateAcl({ resolver, data, tag }: GenerateTypeParams) { const aclData = getAclData({ resolver, data, tag }); @@ -22,6 +24,7 @@ export function generateAcl({ resolver, data, tag }: GenerateTypeParams) { } const { hasAdditionalAbilityImports, modelsImports, endpoints } = aclData; + const hasWorkspaceContext = endpoints.some((endpoint) => getWorkspaceConditionNames(resolver, endpoint).length > 0); const caslAbilityTupleImport: Import = { bindings: [ @@ -30,9 +33,16 @@ export function generateAcl({ resolver, data, tag }: GenerateTypeParams) { typeBindings: [CASL_ABILITY_BINDING.abilityTuple], from: CASL_ABILITY_IMPORT.from, }; + const workspaceContextImport: Import = { + bindings: ["useWorkspaceContext"], + from: PACKAGE_IMPORT_PATH, + }; const lines: string[] = []; lines.push(renderImport(caslAbilityTupleImport)); + if (hasWorkspaceContext) { + lines.push(renderImport(workspaceContextImport)); + } for (const modelsImport of modelsImports) { lines.push(renderImport(modelsImport)); } @@ -43,7 +53,7 @@ export function generateAcl({ resolver, data, tag }: GenerateTypeParams) { } for (const endpoint of endpoints) { - lines.push(renderAbilityFunction(endpoint)); + lines.push(renderAbilityFunction({ resolver, endpoint })); lines.push(""); } @@ -103,7 +113,74 @@ function renderImport(importData: Import) { return `import${importData.typeOnly ? " type" : ""} ${names} from "${importData.from}";`; } -function renderAbilityFunction(endpoint: Endpoint) { +function getWorkspaceContextAllowList(workspaceContext: GenerateTypeParams["resolver"]["options"]["workspaceContext"]) { + return new Set(workspaceContext); +} + +function getWorkspaceConditionNames(resolver: GenerateTypeParams["resolver"], endpoint: Endpoint) { + const allowList = getWorkspaceContextAllowList(resolver.options.workspaceContext); + return (getAbilityConditionsTypes(endpoint) ?? []) + .map((condition) => condition.name) + .filter((name) => allowList.has(name)); +} + +function renderWorkspaceAclHook({ + resolver, + endpoint, +}: { + resolver: GenerateTypeParams["resolver"]; + endpoint: Endpoint; +}) { + const abilityConditionsTypes = getAbilityConditionsTypes(endpoint) ?? []; + const workspaceConditionNames = getWorkspaceConditionNames(resolver, endpoint); + if (workspaceConditionNames.length === 0) { + return; + } + + const workspaceConditionNameSet = new Set(workspaceConditionNames); + const objectRequired = abilityConditionsTypes.some( + (propertyType) => propertyType.required && !workspaceConditionNameSet.has(propertyType.name), + ); + const objectParams = abilityConditionsTypes + .map((propertyType) => { + const isWorkspaceCondition = workspaceConditionNameSet.has(propertyType.name); + return `${propertyType.name}${propertyType.required && !isWorkspaceCondition ? "" : "?"}: ${(propertyType.type ?? "") + (propertyType.zodSchemaName ?? "")}, `; + }) + .join(""); + const contextType = abilityConditionsTypes + .filter((propertyType) => workspaceConditionNameSet.has(propertyType.name)) + .map((propertyType) => `${propertyType.name}?: ${(propertyType.type ?? "") + (propertyType.zodSchemaName ?? "")}`) + .join("; "); + const contextBindings = workspaceConditionNames.map((name) => `${name}: ${name}Workspace`).join(", "); + + const lines: string[] = []; + lines.push(`export const use${capitalize(getAbilityFunctionName(endpoint))} = (`); + lines.push(` object${objectRequired ? "" : "?"}: { ${objectParams} } `); + lines.push(") => {"); + lines.push(` const { ${contextBindings} } = useWorkspaceContext<{ ${contextType} }>();`); + for (const conditionName of workspaceConditionNames) { + const resolvedName = `normalize${capitalize(conditionName)}`; + lines.push(` const ${resolvedName} = object?.${conditionName} ?? ${conditionName}Workspace;`); + lines.push(` if (!${resolvedName}) {`); + lines.push(` throw Error(\`${capitalize(conditionName)} not provided\`);`); + lines.push(" }"); + } + lines.push( + ` return ${getAbilityFunctionName(endpoint)}({ ...object, ${workspaceConditionNames + .map((conditionName) => `${conditionName}: normalize${capitalize(conditionName)}`) + .join(", ")} });`, + ); + lines.push("};"); + return lines.join("\n"); +} + +function renderAbilityFunction({ + resolver, + endpoint, +}: { + resolver: GenerateTypeParams["resolver"]; + endpoint: Endpoint; +}) { const abilityConditionsTypes = getAbilityConditionsTypes(endpoint) ?? []; const hasConditions = hasAbilityConditions(endpoint); const lines: string[] = []; @@ -152,5 +229,10 @@ function renderAbilityFunction(endpoint: Endpoint) { lines.push( `] as ${CASL_ABILITY_BINDING.abilityTuple}<"${getAbilityAction(endpoint)}", ${getAbilitySubjectTypes(endpoint).join(" | ")}>;`, ); + const workspaceAclHook = renderWorkspaceAclHook({ resolver, endpoint }); + if (workspaceAclHook) { + lines.push(""); + lines.push(workspaceAclHook); + } return lines.join("\n"); } diff --git a/src/generators/generate/generateConfigs.ts b/src/generators/generate/generateConfigs.ts index 9883fbe5..96704b0c 100644 --- a/src/generators/generate/generateConfigs.ts +++ b/src/generators/generate/generateConfigs.ts @@ -42,6 +42,7 @@ export function generateConfigs(generateTypeParams: GenerateTypeParams) { const hasMutation = endpoints.length > 0; const hasAclCheck = resolver.options.checkAcl && endpoints.some((e) => e.acl); const hasMutationEffects = resolver.options.mutationEffects && hasMutation; + const hasMutationDefaultOnError = resolver.options.mutationDefaultOnError && hasMutation; const hasWorkspaceContext = resolver.options.workspaceContext && endpoints.some((e) => resolver.options.workspaceContext); // Simplified check @@ -57,7 +58,7 @@ export function generateConfigs(generateTypeParams: GenerateTypeParams) { }; const queryTypesImport: Import = { - bindings: ["OpenApiQueryConfig"], + bindings: [...(hasMutationDefaultOnError ? ["OpenApiQueryConfig"] : [])], typeBindings: [QUERY_OPTIONS_TYPES.mutation], from: getQueryTypesImportPath(resolver.options), }; @@ -199,6 +200,7 @@ function renderColumnsConfig(columnsConfig: DynamicColumnsConfig) { function renderMutationContent(resolver: any, endpoint: Endpoint, tag: string) { const hasAclCheck = resolver.options.checkAcl && endpoint.acl; const hasMutationEffects = resolver.options.mutationEffects; + const hasMutationDefaultOnError = resolver.options.mutationDefaultOnError; const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; const endpointTag = getEndpointTag(endpoint, resolver.options); @@ -220,7 +222,9 @@ function renderMutationContent(resolver: any, endpoint: Endpoint, tag: string) { lines.push( `(options?: AppMutationOptions${hasAxiosRequestConfig ? `, config?: AxiosRequestConfig` : ""}) => {`, ); - lines.push(" const queryConfig = OpenApiQueryConfig.useConfig();"); + if (hasMutationDefaultOnError) { + lines.push(" const queryConfig = OpenApiQueryConfig.useConfig();"); + } if (hasMutationEffects) { lines.push( @@ -252,6 +256,9 @@ function renderMutationContent(resolver: any, endpoint: Endpoint, tag: string) { lines.push(" },"); } lines.push(" ...options,"); + if (hasMutationDefaultOnError) { + lines.push(" onError: options?.onError ?? queryConfig.onError,"); + } lines.push(" });"); lines.push("}"); return lines diff --git a/src/generators/generate/generateQueries.test.ts b/src/generators/generate/generateQueries.test.ts new file mode 100644 index 00000000..ae62d800 --- /dev/null +++ b/src/generators/generate/generateQueries.test.ts @@ -0,0 +1,312 @@ +import { describe, expect, it } from "vitest"; +import { OpenAPIV3 } from "openapi-types"; + +import { DEFAULT_GENERATE_OPTIONS } from "@/generators/const/options.const"; +import { generateCodeFromOpenAPIDoc } from "@/generators/generateCodeFromOpenAPIDoc"; + +const openApiDoc = { + openapi: "3.0.0", + info: { + title: "Workspace Context Test", + version: "1.0.0", + }, + paths: { + "/offices/{officeId}/positions/{positionId}": { + get: { + tags: ["Workspace"], + operationId: "getPosition", + "x-acl": [ + { + action: "read", + subject: "Position", + conditions: { + officeId: "$params.officeId", + positionId: "$params.positionId", + }, + }, + ], + parameters: [ + { + name: "officeId", + in: "path", + required: true, + schema: { type: "string" }, + }, + { + name: "positionId", + in: "path", + required: true, + schema: { type: "string" }, + }, + ], + responses: { + 200: { + description: "OK", + content: { + "application/json": { + schema: { $ref: "#/components/schemas/Position" }, + }, + }, + }, + 403: { + description: "Forbidden", + }, + }, + } as OpenAPIV3.OperationObject, + }, + "/items/{id}": { + get: { + tags: ["Workspace"], + operationId: "findById", + parameters: [ + { + name: "id", + in: "path", + required: true, + schema: { type: "string" }, + }, + ], + responses: { + 200: { + description: "OK", + content: { + "application/json": { + schema: { $ref: "#/components/schemas/Item" }, + }, + }, + }, + }, + } as OpenAPIV3.OperationObject, + }, + "/items": { + post: { + tags: ["Workspace"], + operationId: "createItem", + requestBody: { + required: true, + content: { + "application/json": { + schema: { $ref: "#/components/schemas/Item" }, + }, + }, + }, + responses: { + 200: { + description: "OK", + content: { + "application/json": { + schema: { $ref: "#/components/schemas/Item" }, + }, + }, + }, + }, + } as OpenAPIV3.OperationObject, + }, + "/offices/{officeId}/positions": { + post: { + tags: ["Workspace"], + operationId: "createPosition", + "x-acl": [ + { + action: "create", + subject: "Position", + conditions: { + officeId: "$params.officeId", + }, + }, + ], + parameters: [ + { + name: "officeId", + in: "path", + required: true, + schema: { type: "string" }, + }, + ], + requestBody: { + required: true, + content: { + "application/json": { + schema: { $ref: "#/components/schemas/Position" }, + }, + }, + }, + responses: { + 200: { + description: "OK", + content: { + "application/json": { + schema: { $ref: "#/components/schemas/Position" }, + }, + }, + }, + }, + } as OpenAPIV3.OperationObject, + }, + }, + components: { + schemas: { + Position: { + type: "object", + properties: { + id: { type: "string" }, + }, + required: ["id"], + }, + Item: { + type: "object", + properties: { + id: { type: "string" }, + }, + required: ["id"], + }, + }, + }, +} as OpenAPIV3.Document; + +describe("generateQueries workspaceContext", () => { + it("maps workspace-resolved values back to the original helper property names", () => { + const files = generateCodeFromOpenAPIDoc(openApiDoc, { + ...DEFAULT_GENERATE_OPTIONS, + output: "test-output", + workspaceContext: ["officeId", "positionId", "id"], + builderConfigs: false, + prefetchQueries: false, + }); + + const queriesFile = files.find((file) => file.fileName.endsWith("/workspace/workspace.queries.ts")); + + expect(queriesFile?.content).toContain( + "getPositionQueryOptions({ officeId: normalizeOfficeId, positionId: normalizePositionId })", + ); + expect(queriesFile?.content).toContain( + "return getPositionQueryOptions({ officeId: normalizeOfficeId, positionId: normalizePositionId }).queryFn();", + ); + expect(queriesFile?.content).toContain("findByIdQueryOptions({ id: normalizeId })"); + expect(queriesFile?.content).toContain( + "const { officeId: officeIdWorkspace, positionId: positionIdWorkspace } = useWorkspaceContext<{ officeId?: string; positionId?: string }>();", + ); + expect(queriesFile?.content).toContain("const normalizeOfficeId = officeId ?? officeIdWorkspace;"); + expect(queriesFile?.content).toContain("throw Error(`OfficeId not provided`);"); + + expect(queriesFile?.content).not.toContain("getPositionQueryOptions({ normalizeOfficeId, normalizePositionId })"); + expect(queriesFile?.content).not.toContain("findByIdQueryOptions({ normalizeId })"); + }); + + it("only replaces allowlisted workspace context params", () => { + const files = generateCodeFromOpenAPIDoc(openApiDoc, { + ...DEFAULT_GENERATE_OPTIONS, + output: "test-output", + workspaceContext: ["officeId"], + acl: false, + checkAcl: false, + builderConfigs: false, + prefetchQueries: false, + }); + + const queriesFile = files.find((file) => file.fileName.endsWith("/workspace/workspace.queries.ts")); + + expect(queriesFile?.content).toContain( + "export const useGetPosition = ({ officeId, positionId }: { officeId?: string, positionId: string }, options?: AppQueryOptions) => {", + ); + expect(queriesFile?.content).toContain("...getPositionQueryOptions({ officeId: normalizeOfficeId, positionId }),"); + expect(queriesFile?.content).toContain( + "const { officeId: officeIdWorkspace } = useWorkspaceContext<{ officeId?: string }>();", + ); + expect(queriesFile?.content).toContain("const normalizeOfficeId = officeId ?? officeIdWorkspace;"); + expect(queriesFile?.content).not.toContain("const normalizePositionId ="); + expect(queriesFile?.content).not.toContain("positionId: normalizePositionId"); + expect(queriesFile?.content).toContain( + "export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => {", + ); + expect(queriesFile?.content).not.toContain("const normalizeId ="); + }); + + it("emits context-aware ACL hooks for allowlisted workspace conditions", () => { + const files = generateCodeFromOpenAPIDoc(openApiDoc, { + ...DEFAULT_GENERATE_OPTIONS, + output: "test-output", + workspaceContext: ["officeId"], + builderConfigs: false, + prefetchQueries: false, + }); + + const aclFile = files.find((file) => file.fileName.endsWith("/workspace/workspace.acl.ts")); + + expect(aclFile?.content).toContain('import { useWorkspaceContext } from "@povio/openapi-codegen-cli";'); + expect(aclFile?.content).toContain("object?: { officeId: string, positionId: string, }"); + expect(aclFile?.content).toContain("export const useCanUseGetPosition = ("); + expect(aclFile?.content).toContain("object: { officeId?: string, positionId: string, }"); + expect(aclFile?.content).toContain( + "const { officeId: officeIdWorkspace } = useWorkspaceContext<{ officeId?: string }>();", + ); + expect(aclFile?.content).toContain("const normalizeOfficeId = object?.officeId ?? officeIdWorkspace;"); + expect(aclFile?.content).toContain("throw Error(`OfficeId not provided`);"); + expect(aclFile?.content).toContain("return canUseGetPosition({ ...object, officeId: normalizeOfficeId });"); + expect(aclFile?.content).not.toContain("positionId: normalizePositionId"); + }); + + it("resolves allowlisted workspace params inside mutation callbacks", () => { + const files = generateCodeFromOpenAPIDoc(openApiDoc, { + ...DEFAULT_GENERATE_OPTIONS, + output: "test-output", + workspaceContext: ["officeId"], + acl: false, + checkAcl: false, + mutationEffects: false, + builderConfigs: false, + prefetchQueries: false, + }); + + const queriesFile = files.find((file) => file.fileName.endsWith("/workspace/workspace.queries.ts")); + + expect(queriesFile?.content).toContain( + "export const useCreatePosition = (options?: AppMutationOptions) => {", + ); + expect(queriesFile?.content).toContain( + "const { officeId: officeIdWorkspace } = useWorkspaceContext<{ officeId?: string }>();", + ); + expect(queriesFile?.content).toContain("mutationFn: ({ officeId, data }) => { "); + expect(queriesFile?.content).toContain("const normalizeOfficeId = officeId ?? officeIdWorkspace;"); + expect(queriesFile?.content).toContain("return WorkspaceApi.createPosition(normalizeOfficeId, data)"); + }); + + it("does not emit provider onError fallback for mutations by default", () => { + const files = generateCodeFromOpenAPIDoc(openApiDoc, { + ...DEFAULT_GENERATE_OPTIONS, + output: "test-output", + acl: false, + checkAcl: false, + mutationEffects: false, + builderConfigs: false, + prefetchQueries: false, + }); + + const queriesFile = files.find((file) => file.fileName.endsWith("/workspace/workspace.queries.ts")); + + expect(queriesFile?.content).not.toContain("OpenApiQueryConfig"); + expect(queriesFile?.content).not.toContain("const queryConfig = OpenApiQueryConfig.useConfig();"); + expect(queriesFile?.content).not.toContain("onError: options?.onError ?? queryConfig.onError"); + }); + + it("can use OpenApiQueryConfig.onError as the default onError for mutations", () => { + const files = generateCodeFromOpenAPIDoc(openApiDoc, { + ...DEFAULT_GENERATE_OPTIONS, + output: "test-output", + acl: false, + checkAcl: false, + mutationEffects: false, + mutationDefaultOnError: true, + builderConfigs: false, + prefetchQueries: false, + }); + + const queriesFile = files.find((file) => file.fileName.endsWith("/workspace/workspace.queries.ts")); + + expect(queriesFile?.content).toContain( + "import { OpenApiQueryConfig, type AppQueryOptions, type AppMutationOptions }", + ); + expect(queriesFile?.content).toContain("const queryConfig = OpenApiQueryConfig.useConfig();"); + expect(queriesFile?.content).toContain("onError: options?.onError ?? queryConfig.onError"); + }); +}); diff --git a/src/generators/generate/generateQueries.ts b/src/generators/generate/generateQueries.ts index 622bc720..a7037261 100644 --- a/src/generators/generate/generateQueries.ts +++ b/src/generators/generate/generateQueries.ts @@ -66,6 +66,7 @@ import { getNamespaceName } from "@/generators/utils/namespace.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 { capitalize } from "@/generators/utils/string.utils"; import { getEndpointTag, shouldInlineEndpointsForTag } from "@/generators/utils/tag.utils"; import { isNamedZodSchema } from "@/generators/utils/zod-schema.utils"; import { invalidVariableNameCharactersToCamel } from "@/generators/utils/js.utils"; @@ -95,6 +96,7 @@ export function generateQueries(params: GenerateTypeParams) { }; const { queryEndpoints, infiniteQueryEndpoints, mutationEndpoints, aclEndpoints } = endpointGroups; + const hasMutationDefaultOnError = resolver.options.mutationDefaultOnError && mutationEndpoints.length > 0; const queryImport: Import = { bindings: [ @@ -126,7 +128,7 @@ export function generateQueries(params: GenerateTypeParams) { }; const queryTypesImport: Import = { - bindings: [...(mutationEndpoints.length > 0 ? ["OpenApiQueryConfig"] : [])], + bindings: [...(hasMutationDefaultOnError ? ["OpenApiQueryConfig"] : [])], typeBindings: [ ...(queryEndpoints.length > 0 ? [QUERY_OPTIONS_TYPES.query] : []), ...(resolver.options.infiniteQueries && infiniteQueryEndpoints.length > 0 @@ -141,7 +143,7 @@ export function generateQueries(params: GenerateTypeParams) { resolver.options.workspaceContext && endpoints.some((endpoint) => getWorkspaceParamNames(resolver, endpoint).length > 0); const workspaceContextImport: Import = { - bindings: ["OpenApiWorkspaceContext"], + bindings: ["useWorkspaceContext"], from: PACKAGE_IMPORT_PATH, }; @@ -306,7 +308,7 @@ function getEndpointParamMapping( const key = JSON.stringify( Object.entries(options ?? {}) .sort(([left], [right]) => left.localeCompare(right)) - .map(([optionName, optionValue]) => [optionName, Boolean(optionValue)]), + .map(([optionName, optionValue]) => [optionName, optionValue]), ); const cached = endpointCache.get(key); if (cached) { @@ -318,6 +320,10 @@ function getEndpointParamMapping( return computed; } +function getWorkspaceContextAllowList(workspaceContext: SchemaResolver["options"]["workspaceContext"]) { + return new Set(workspaceContext); +} + function renderImport(importData: Import) { const namedImports = [ ...importData.bindings, @@ -351,6 +357,20 @@ function renderEndpointArgs( .join(", "); } +function renderEndpointObjectArgs( + resolver: SchemaResolver, + endpoint: Endpoint, + options: Parameters[2], + replacements?: Record, +) { + return getEndpointParamMapping(resolver, endpoint, options) + .map((param) => { + const replacement = replacements?.[param.name]; + return replacement && replacement !== param.name ? `${param.name}: ${replacement}` : param.name; + }) + .join(", "); +} + function renderEndpointParamDescription(endpointParam: ReturnType[0]) { const strs = [`${endpointParam.paramType} parameter`]; const description = endpointParam.parameterObject?.description || endpointParam.bodyObject?.description; @@ -384,6 +404,7 @@ function renderEndpointParamDescription(endpointParam: ReturnType param.name)); const workspaceParamNames = endpointParams.filter((param) => param.paramType === "Path").map((param) => param.name); @@ -392,20 +413,31 @@ function getWorkspaceParamNames(resolver: SchemaResolver, endpoint: Endpoint) { .map((condition) => invalidVariableNameCharactersToCamel(condition.name)) .filter((name) => endpointParamNames.has(name)); - return getUniqueArray([...workspaceParamNames, ...aclParamNames]); + return getUniqueArray([...workspaceParamNames, ...aclParamNames]).filter((name) => allowList.has(name)); } function getWorkspaceParamReplacements(resolver: SchemaResolver, endpoint: Endpoint) { return Object.fromEntries( - getWorkspaceParamNames(resolver, endpoint).map((name) => [name, `${name}FromWorkspace`]), + getWorkspaceParamNames(resolver, endpoint).map((name) => [name, `normalize${capitalize(name)}`]), ) as Record; } -function renderWorkspaceParamResolutions({ +function getWorkspaceParamTypes(resolver: SchemaResolver, endpoint: Endpoint, modelNamespaceTag?: string) { + const workspaceParamNames = new Set(getWorkspaceParamNames(resolver, endpoint)); + return Object.fromEntries( + getEndpointParamMapping(resolver, endpoint, { modelNamespaceTag }) + .filter((param) => workspaceParamNames.has(param.name)) + .map((param) => [param.name, param.type]), + ) as Record; +} + +function renderWorkspaceContextDestructure({ replacements, + paramTypes, indent, }: { replacements: Record; + paramTypes: Record; indent: string; }) { const workspaceParamNames = Object.keys(replacements); @@ -413,15 +445,48 @@ function renderWorkspaceParamResolutions({ return []; } - const lines = [`${indent}const workspaceContext = OpenApiWorkspaceContext.useContext();`]; + const workspaceParamBindings = workspaceParamNames.map((paramName) => `${paramName}: ${paramName}Workspace`); + const workspaceContextType = workspaceParamNames + .map((paramName) => `${paramName}?: ${paramTypes[paramName] ?? "unknown"}`) + .join("; "); + return [ + `${indent}const { ${workspaceParamBindings.join(", ")} } = useWorkspaceContext<{ ${workspaceContextType} }>();`, + ]; +} + +function renderWorkspaceParamCoalescing({ + replacements, + indent, +}: { + replacements: Record; + indent: string; +}) { + const workspaceParamNames = Object.keys(replacements); + const lines: string[] = []; for (const paramName of workspaceParamNames) { - lines.push( - `${indent}const ${replacements[paramName]} = OpenApiWorkspaceContext.resolveParam(workspaceContext, "${paramName}", ${paramName});`, - ); + lines.push(`${indent}const ${replacements[paramName]} = ${paramName} ?? ${paramName}Workspace;`); + lines.push(`${indent}if (!${replacements[paramName]}) {`); + lines.push(`${indent} throw Error(\`${capitalize(paramName)} not provided\`);`); + lines.push(`${indent}}`); } return lines; } +function renderWorkspaceParamResolutions({ + replacements, + paramTypes, + indent, +}: { + replacements: Record; + paramTypes: Record; + indent: string; +}) { + return [ + ...renderWorkspaceContextDestructure({ replacements, paramTypes, indent }), + ...renderWorkspaceParamCoalescing({ replacements, indent }), + ]; +} + function renderAclCheckCall( resolver: SchemaResolver, endpoint: Endpoint, @@ -789,8 +854,9 @@ function renderQuery({ const workspaceParamReplacements = resolver.options.workspaceContext ? getWorkspaceParamReplacements(resolver, endpoint) : {}; + const workspaceParamTypes = getWorkspaceParamTypes(resolver, endpoint, tag); const endpointArgs = renderEndpointArgs(resolver, endpoint, {}); - const resolvedEndpointArgs = renderEndpointArgs(resolver, endpoint, {}, workspaceParamReplacements); + const resolvedEndpointArgs = renderEndpointObjectArgs(resolver, endpoint, {}, workspaceParamReplacements); const endpointParams = renderEndpointParams(resolver, endpoint, { optionalPathParams: resolver.options.workspaceContext, modelNamespaceTag: tag, @@ -807,7 +873,13 @@ function renderQuery({ if (hasAclCheck) { lines.push(` const { checkAcl } = ${ACL_CHECK_HOOK}();`); } - lines.push(...renderWorkspaceParamResolutions({ replacements: workspaceParamReplacements, indent: " " })); + lines.push( + ...renderWorkspaceParamResolutions({ + replacements: workspaceParamReplacements, + paramTypes: workspaceParamTypes, + indent: " ", + }), + ); lines.push(" "); lines.push(` return ${QUERY_HOOKS.query}({`); lines.push(` ...${queryOptionsName}(${queryOptionsArgs}),`); @@ -838,11 +910,13 @@ function renderMutation({ }) { const hasAclCheck = resolver.options.checkAcl && endpoint.acl; const hasMutationEffects = resolver.options.mutationEffects; + const hasMutationDefaultOnError = resolver.options.mutationDefaultOnError; const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; const tag = getEndpointTag(endpoint, resolver.options); const workspaceParamReplacements = resolver.options.workspaceContext ? getWorkspaceParamReplacements(resolver, endpoint) : {}; + const workspaceParamTypes = getWorkspaceParamTypes(resolver, endpoint, tag); const endpointParams = renderEndpointParams(resolver, endpoint, { includeFileParam: true, optionalPathParams: resolver.options.workspaceContext, @@ -868,13 +942,19 @@ function renderMutation({ 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 (hasMutationDefaultOnError) { + 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();"); - } + lines.push( + ...renderWorkspaceContextDestructure({ + replacements: workspaceParamReplacements, + paramTypes: workspaceParamTypes, + indent: " ", + }), + ); if (hasMutationEffects) { lines.push( ` const { runMutationEffects } = useMutationEffects({ currentModule: ${QUERIES_MODULE_NAME} });`, @@ -889,11 +969,7 @@ function renderMutation({ 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});`, - ); - } + lines.push(...renderWorkspaceParamCoalescing({ replacements: workspaceParamReplacements, indent: " " })); if (hasAclCheck) { lines.push(renderAclCheckCall(resolver, endpoint, workspaceParamReplacements, " ")); } @@ -940,18 +1016,16 @@ function renderMutation({ } lines.push(" ...options,"); - lines.push(" onError: options?.onError ?? queryConfig.onError,"); + if (hasMutationDefaultOnError) { + lines.push(" onError: options?.onError ?? queryConfig.onError,"); + } 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(...renderWorkspaceParamCoalescing({ replacements: workspaceParamReplacements, indent: " " })); lines.push( ` const updateKeys = [${updateQueryEndpoints .map( @@ -1054,13 +1128,14 @@ function renderInfiniteQuery({ const workspaceParamReplacements = resolver.options.workspaceContext ? getWorkspaceParamReplacements(resolver, endpoint) : {}; + const workspaceParamTypes = getWorkspaceParamTypes(resolver, endpoint, tag); const endpointParams = renderEndpointParams(resolver, endpoint, { excludePageParam: true, optionalPathParams: resolver.options.workspaceContext, modelNamespaceTag: tag, }); const endpointArgsWithoutPage = renderEndpointArgs(resolver, endpoint, { excludePageParam: true }); - const resolvedEndpointArgsWithoutPage = renderEndpointArgs( + const resolvedEndpointArgsWithoutPage = renderEndpointObjectArgs( resolver, endpoint, { excludePageParam: true }, @@ -1078,7 +1153,13 @@ function renderInfiniteQuery({ if (hasAclCheck) { lines.push(` const { checkAcl } = ${ACL_CHECK_HOOK}();`); } - lines.push(...renderWorkspaceParamResolutions({ replacements: workspaceParamReplacements, indent: " " })); + lines.push( + ...renderWorkspaceParamResolutions({ + replacements: workspaceParamReplacements, + paramTypes: workspaceParamTypes, + indent: " ", + }), + ); lines.push(""); lines.push(` return ${QUERY_HOOKS.infiniteQuery}({`); lines.push(` ...${queryOptionsName}(${queryOptionsArgs}),`); diff --git a/src/generators/generateCodeFromOpenAPIDoc.test.ts b/src/generators/generateCodeFromOpenAPIDoc.test.ts new file mode 100644 index 00000000..5477eeeb --- /dev/null +++ b/src/generators/generateCodeFromOpenAPIDoc.test.ts @@ -0,0 +1,196 @@ +import { OpenAPIV3 } from "openapi-types"; +import { describe, expect, test } from "vitest"; + +import { DEFAULT_GENERATE_OPTIONS } from "./const/options.const"; +import { generateCodeFromOpenAPIDoc } from "./generateCodeFromOpenAPIDoc"; +import { GenerateOptions } from "./types/options"; + +const openApiDoc = { + openapi: "3.0.3", + info: { title: "Mutation Scope Test", version: "1.0.0" }, + paths: { + "/users/{userId}/documents/{documentId}": { + put: { + tags: ["documents"], + operationId: "updateDocument", + parameters: [ + { + name: "userId", + in: "path", + required: true, + schema: { type: "string" }, + }, + { + name: "documentId", + in: "path", + required: true, + schema: { type: "string" }, + }, + ], + requestBody: { + required: true, + content: { + "application/json": { + schema: { $ref: "#/components/schemas/UpdateDocumentBody" }, + }, + }, + }, + responses: { + "200": { + description: "OK", + content: { + "application/json": { + schema: { $ref: "#/components/schemas/Document" }, + }, + }, + }, + }, + }, + delete: { + tags: ["documents"], + operationId: "deleteDocument", + parameters: [ + { + name: "userId", + in: "path", + required: true, + schema: { type: "string" }, + }, + { + name: "documentId", + in: "path", + required: true, + schema: { type: "string" }, + }, + ], + responses: { + "204": { + description: "Deleted", + }, + }, + }, + }, + "/documents": { + post: { + tags: ["documents"], + operationId: "createDocument", + requestBody: { + required: true, + content: { + "application/json": { + schema: { $ref: "#/components/schemas/UpdateDocumentBody" }, + }, + }, + }, + responses: { + "200": { + description: "OK", + content: { + "application/json": { + schema: { $ref: "#/components/schemas/Document" }, + }, + }, + }, + }, + }, + }, + "/users/{userId}/avatar": { + post: { + tags: ["documents"], + operationId: "uploadAvatar", + "x-media-upload": true, + parameters: [ + { + name: "userId", + in: "path", + required: true, + schema: { type: "string" }, + }, + ], + requestBody: { + required: true, + content: { + "application/octet-stream": { + schema: { type: "string", format: "binary" }, + }, + }, + }, + responses: { + "200": { + description: "OK", + content: { + "application/json": { + schema: { $ref: "#/components/schemas/UploadInstructions" }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + Document: { + type: "object", + properties: { + id: { type: "string" }, + title: { type: "string" }, + }, + }, + UpdateDocumentBody: { + type: "object", + required: ["title"], + properties: { + title: { type: "string" }, + }, + }, + UploadInstructions: { + type: "object", + properties: { + url: { type: "string" }, + method: { type: "string" }, + }, + }, + }, + }, +} as unknown as OpenAPIV3.Document; + +const options = { + ...DEFAULT_GENERATE_OPTIONS, + mutationEffects: false, + mutationScope: true, +} as GenerateOptions; + +describe("generateCodeFromOpenAPIDoc", () => { + test("generates resource-scoped mutations from path params", () => { + const files = generateCodeFromOpenAPIDoc(openApiDoc, options); + const queries = files.find(({ fileName }) => fileName === "output/documents/documents.queries.ts")?.content; + + expect(queries).toBeDefined(); + expect(queries).toContain( + "export const useUpdate = ({ userId, documentId }: { userId: string; documentId: string; }, options?: AppMutationOptions) => {", + ); + expect(queries).toContain("mutationFn: ( { data } ) =>"); + expect(queries).toContain("DocumentsApi.update(userId, documentId, data)"); + expect(queries).toContain("scope: { id: `update:${userId}:${documentId}` }"); + + expect(queries).toContain( + "export const useDeleteDocument = ({ userId, documentId }: { userId: string; documentId: string; }, options?: AppMutationOptions) => {", + ); + expect(queries).toContain("mutationFn: () =>"); + expect(queries).toContain("DocumentsApi.deleteDocument(userId, documentId)"); + expect(queries).toContain("scope: { id: `deleteDocument:${userId}:${documentId}` }"); + + expect(queries).toContain( + "export const useCreate = (options?: AppMutationOptions) => {", + ); + expect(queries).not.toContain("scope: { id: `create"); + + expect(queries).toContain( + "export const useUploadAvatar = (options?: AppMutationOptions void }>) => {", + ); + expect(queries).toContain("mutationFn: async ( { userId, data, file, abortController, onUploadProgress } ) =>"); + expect(queries).toContain("DocumentsApi.uploadAvatar(userId, data)"); + expect(queries).not.toContain("scope: { id: `uploadAvatar:${userId}` }"); + }); +}); diff --git a/src/generators/run/generate.runner.ts b/src/generators/run/generate.runner.ts index e51f55e1..6d038221 100644 --- a/src/generators/run/generate.runner.ts +++ b/src/generators/run/generate.runner.ts @@ -1,6 +1,4 @@ -import fs from "fs"; import path from "path"; - import SwaggerParser from "@apidevtools/swagger-parser"; import { OpenAPIV3 } from "openapi-types"; @@ -8,16 +6,9 @@ import { resolveConfig } from "@/generators/core/resolveConfig"; import { generateCodeFromOpenAPIDoc } from "@/generators/generateCodeFromOpenAPIDoc"; import { GenerateFileFormatter } from "@/generators/types/generate"; import { GenerateOptions } from "@/generators/types/options"; -import { writeGenerateFileData } from "@/generators/utils/file.utils"; +import { removeStaleGeneratedFiles, 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; -}; - type GenerateStats = { generatedFilesCount: number; generatedModulesCount: number; @@ -31,9 +22,11 @@ export async function runGenerate({ }: { fileConfig?: Partial | null; params?: Partial< - Omit & { + Omit & { + includeTags: string; excludeTags: string; inlineEndpointsExcludeModules: string; + workspaceContext: string; } >; formatGeneratedFile?: GenerateFileFormatter; @@ -42,27 +35,17 @@ export async function runGenerate({ 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, stats: { generatedFilesCount: 0, generatedModulesCount: 0 } }; - } - } - const filesData = profiler.runSync("generate.total", () => generateCodeFromOpenAPIDoc(openApiDoc, config, profiler)); + if (config.clearOutput) { + profiler.runSync("files.removeStaleGenerated", () => { + removeStaleGeneratedFiles({ output: config.output, filesData, options: config }); + }); + } await profiler.runAsync("files.write", async () => { await writeGenerateFileData(filesData, { formatGeneratedFile }); }); const stats = getGenerateStats(filesData, config); - if (config.incremental) { - await writeCache(cacheFilePath, { openApiHash, optionsHash }, formatGeneratedFile); - } - return { skipped: false, config, stats }; } @@ -115,53 +98,6 @@ function hasExternalRef(value: unknown): boolean { 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; - } -} - -async function writeCache(filePath: string, data: CacheData, formatGeneratedFile?: GenerateFileFormatter) { - await writeGenerateFileData([{ fileName: filePath, content: JSON.stringify(data) }], { - formatGeneratedFile, - }); -} - -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(",")}}`; -} - function getGenerateStats(filesData: { fileName: string }[], config: GenerateOptions): GenerateStats { const generatedFilesCount = filesData.length; if (generatedFilesCount === 0) { diff --git a/src/generators/templates/partials/query-use-infinite-query.hbs b/src/generators/templates/partials/query-use-infinite-query.hbs new file mode 100644 index 00000000..e9fad559 --- /dev/null +++ b/src/generators/templates/partials/query-use-infinite-query.hbs @@ -0,0 +1,23 @@ +{{! Js docs }} +{{{genQueryJsDocs endpoint infiniteQuery=true}}} +{{! Infinite query definition}} +export const {{infiniteQueryName endpoint}} = ({{#if (endpointParams endpoint)}}{{#if (endpointParamsAllOptional endpoint excludePageParam=true)}}params: { {{{genEndpointParams endpoint excludePageParam=true}}} } = {}{{else}}{ {{{endpointArgs endpoint excludePageParam=true}}} }: { {{{genEndpointParams endpoint excludePageParam=true}}} }{{/if}}, {{/if}}options?: AppInfiniteQueryOptions{{#if hasAxiosRequestConfig}}, {{axiosRequestConfigName}}?: {{axiosRequestConfigType}}{{/if}}) => { + {{! Use acl check }} + {{#if hasAclCheck}}const { checkAcl } = {{aclCheckHook}}();{{/if}} + {{#if (endpointParams endpoint)}}{{#if (endpointParamsAllOptional endpoint excludePageParam=true)}}const { {{{endpointArgs endpoint excludePageParam=true}}} } = params;{{/if}}{{/if}} + + return {{infiniteQueryHook}}({ + queryKey: keys.{{endpointName endpoint}}Infinite({{#if (endpointParams endpoint)}}{{{endpointArgs endpoint excludePageParam=true}}}{{/if}}), + queryFn: ({ pageParam }) => {{#if hasQueryFnBody}}{ {{/if}} + {{#if hasAclCheck}}{{{genAclCheckCall endpoint}}}{{/if}} + {{#if hasQueryFnBody}}return {{/if}}{{importedEndpointName endpoint}}({{{endpointArgs endpoint replacePageParam=true}}}{{#if hasAxiosRequestConfig}}, {{axiosRequestConfigName}}{{/if}}) + {{#if hasQueryFnBody}} }{{/if}}, + initialPageParam: 1, + getNextPageParam: (response) => { + const pageParam = (response.{{pageParamName}} ?? 1); + const limitParam = response.{{limitParamName}}; + return pageParam * limitParam < response.{{totalItemsName}} ? pageParam + 1 : null; + }, + ...options, + }); +}; diff --git a/src/generators/templates/partials/query-use-mutation.hbs b/src/generators/templates/partials/query-use-mutation.hbs new file mode 100644 index 00000000..3d22b851 --- /dev/null +++ b/src/generators/templates/partials/query-use-mutation.hbs @@ -0,0 +1,55 @@ +{{! Js docs }} +{{{genQueryJsDocs endpoint mutation=true}}} +{{! Mutation definition}} +export const {{queryName endpoint mutation=true}} = ({{#if hasMutationScope}}{ {{#each mutationScopePathParams}}{{this.name}}{{#unless @last}}, {{/unless}}{{/each}} }: { {{#each mutationScopePathParams}}{{this.name}}: {{this.type}}; {{/each}} }, {{/if}}options?: AppMutationOptions void{{/if}} }{{/if}}>{{#if hasMutationEffects}} & {{mutationEffectsType}}{{/if}}{{#if hasAxiosRequestConfig}}, {{axiosRequestConfigName}}?: {{axiosRequestConfigType}}{{/if}}) => { + {{! Use acl check }} + {{#if hasAclCheck}}const { checkAcl } = {{aclCheckHook}}();{{/if}} + {{! Use mutation effects }} + {{#if hasMutationEffects}}const { runMutationEffects } = useMutationEffects({ currentModule: {{queriesModuleName}} });{{/if}} + + return {{queryHook}}({ + mutationFn: {{#if endpoint.mediaUpload}}async {{/if}}({{#if hasMutationVariables}} { {{#if hasMutationScope}}{{{endpointArgs endpoint excludePathParams=true includeFileParam=true}}}{{else}}{{{endpointArgs endpoint includeFileParam=true}}}{{/if}}{{#if endpoint.mediaUpload}}, abortController, onUploadProgress{{/if}} } {{/if}}) => {{#if hasMutationFnBody}} { {{/if}} + {{#if hasAclCheck}}{{{genAclCheckCall endpoint}}}{{/if}} + {{#if endpoint.mediaUpload}}const uploadInstructions = await {{importedEndpointName endpoint}}({{{endpointArgs endpoint}}}{{#if hasAxiosRequestConfig}}{{#if (endpointArgs endpoint)}}, {{/if}}{{axiosRequestConfigName}}{{/if}}); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as 'put' | 'post'; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append('file', file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + {{else}} + {{#if hasMutationFnBody}}return {{/if}}{{importedEndpointName endpoint}}({{{endpointArgs endpoint}}}{{#if hasAxiosRequestConfig}}{{#if (endpointArgs endpoint)}}, {{/if}}{{axiosRequestConfigName}}{{/if}}) + {{/if}} + {{#if hasMutationFnBody}} }{{/if}}, + {{#if hasMutationScope}}scope: { id: {{{mutationScopeExpression}}} }, + {{/if}}...options, {{#if hasMutationEffects}} + onSuccess: async (resData, variables, onMutateResult, context) => { + {{! Mutation effects }} + {{#if updateQueryEndpoints}} + {{#if destructuredVariables}}const { {{commaSeparated destructuredVariables }} } = variables;{{/if}} + const updateKeys = [{{#each updateQueryEndpoints as | endpoint |}}keys.{{endpointName endpoint}}({{{endpointArgs endpoint includeOnlyRequiredParams=true}}}), {{/each}}]; + {{/if}} + await runMutationEffects(resData, variables, options{{#if updateQueryEndpoints}}, updateKeys{{/if}}); + options?.onSuccess?.(resData, variables, onMutateResult, context); + },{{/if}} + }); +}; diff --git a/src/generators/templates/partials/query-use-query.hbs b/src/generators/templates/partials/query-use-query.hbs new file mode 100644 index 00000000..96394f4b --- /dev/null +++ b/src/generators/templates/partials/query-use-query.hbs @@ -0,0 +1,17 @@ +{{! Js docs }} +{{{genQueryJsDocs endpoint query=true}}} +{{! Query definition}} +export const {{queryName endpoint}} = ({{#if (endpointParams endpoint)}}{{#if (endpointParamsAllOptional endpoint)}}params: { {{{genEndpointParams endpoint}}} } = {}{{else}}{ {{{endpointArgs endpoint}}} }: { {{{genEndpointParams endpoint}}} }{{/if}}, {{/if}}options?: AppQueryOptions{{#if hasAxiosRequestConfig}}, {{axiosRequestConfigName}}?: {{axiosRequestConfigType}}{{/if}}) => { + {{! Use acl check }} + {{#if hasAclCheck}}const { checkAcl } = {{aclCheckHook}}();{{/if}} + {{#if (endpointParams endpoint)}}{{#if (endpointParamsAllOptional endpoint)}}const { {{{endpointArgs endpoint}}} } = params;{{/if}}{{/if}} + + return {{queryHook}}({ + queryKey: keys.{{endpointName endpoint}}({{#if (endpointParams endpoint)}}{{{endpointArgs endpoint}}}{{/if}}), + queryFn: {{#if hasQueryFn}}() => {{#if hasQueryFnBody}}{ {{/if}} + {{#if hasAclCheck}}{{{genAclCheckCall endpoint}}}{{/if}} + {{#if hasQueryFnBody}}return {{/if}}{{importedEndpointName endpoint}}({{{endpointArgs endpoint}}}{{#if hasAxiosRequestConfig}}{{#if (endpointArgs endpoint)}}, {{/if}}{{axiosRequestConfigName}}{{/if}}){{else}}{{importedEndpointName endpoint}}{{/if}} + {{#if hasQueryFnBody}} }{{/if}}, + ...options, + }); +}; diff --git a/src/generators/types/options.ts b/src/generators/types/options.ts index 5b2e38a7..e759d0a2 100644 --- a/src/generators/types/options.ts +++ b/src/generators/types/options.ts @@ -26,8 +26,10 @@ interface QueriesGenerateOptions { queryTypesImportPath: string; axiosRequestConfig?: boolean; mutationEffects?: boolean; - workspaceContext?: boolean; + mutationDefaultOnError?: boolean; + workspaceContext?: string[]; prefetchQueries?: boolean; + mutationScope?: boolean; } interface InfiniteQueriesGenerateOptions { @@ -65,9 +67,11 @@ interface GenerateConfig { interface BaseGenerateOptions { input: string; output: string; + clearOutput?: boolean; incremental?: boolean; splitByTags: boolean; defaultTag: string; + includeTags: string[]; excludeTags: string[]; excludePathRegex: string; excludeRedundantZodSchemas: boolean; diff --git a/src/generators/utils/file.utils.ts b/src/generators/utils/file.utils.ts index 0a037d7f..cbb16b51 100644 --- a/src/generators/utils/file.utils.ts +++ b/src/generators/utils/file.utils.ts @@ -3,6 +3,7 @@ import path from "path"; import { fileURLToPath } from "url"; import { GenerateFileData, GenerateFileFormatter } from "@/generators/types/generate"; +import { GenerateOptions } from "@/generators/types/options"; function readFileSync(filePath: string) { const moduleDir = path.dirname(fileURLToPath(import.meta.url)); @@ -75,3 +76,91 @@ export async function writeGenerateFileData(filesData: GenerateFileData[], optio await writeFile(file, options); } } + +export function removeStaleGeneratedFiles({ + output, + filesData, + options, +}: { + output: string; + filesData: GenerateFileData[]; + options: Pick; +}) { + if (!fs.existsSync(output)) { + return; + } + + const expectedFiles = new Set(filesData.map((file) => path.resolve(file.fileName))); + const generatedSuffixes = new Set(Object.values(options.configs).map((config) => config.outputFileNameSuffix)); + const staleFiles: string[] = []; + + const visit = (dirPath: string) => { + for (const dirent of fs.readdirSync(dirPath, { withFileTypes: true })) { + const entryPath = path.join(dirPath, dirent.name); + if (dirent.isDirectory()) { + visit(entryPath); + continue; + } + + if (isGeneratedFile(entryPath, output, generatedSuffixes) && !expectedFiles.has(path.resolve(entryPath))) { + staleFiles.push(entryPath); + } + } + }; + + visit(output); + + staleFiles.forEach((filePath) => fs.rmSync(filePath, { force: true })); + removeEmptyDirectories(output); +} + +function isGeneratedFile(filePath: string, output: string, generatedSuffixes: Set) { + const relativePath = path.relative(output, filePath); + if (relativePath === ".openapi-codegen-cache.json") { + return true; + } + + const normalizedRelativePath = relativePath.split(path.sep).join("/"); + if (["app-rest-client.ts", "queryModules.ts", "acl/app.ability.ts"].includes(normalizedRelativePath)) { + return true; + } + + const parsedPath = path.parse(filePath); + if (parsedPath.ext !== ".ts") { + return false; + } + + const segments = relativePath.split(path.sep).filter(Boolean); + if (segments.length < 2) { + return false; + } + + const moduleName = segments[0]; + const fileName = segments[segments.length - 1]; + if (!fileName.startsWith(`${moduleName}.`)) { + return false; + } + + const suffix = fileName.slice(moduleName.length + 1).replace(/\.tsx?$/, ""); + return generatedSuffixes.has(suffix); +} + +function removeEmptyDirectories(root: string) { + if (!fs.existsSync(root)) { + return; + } + + const removeIfEmpty = (dirPath: string) => { + for (const dirent of fs.readdirSync(dirPath, { withFileTypes: true })) { + if (dirent.isDirectory()) { + removeIfEmpty(path.join(dirPath, dirent.name)); + } + } + + if (dirPath !== root && fs.readdirSync(dirPath).length === 0) { + fs.rmdirSync(dirPath); + } + }; + + removeIfEmpty(root); +} diff --git a/src/generators/utils/generate/generate.configs.utils.ts b/src/generators/utils/generate/generate.configs.utils.ts index caec6fa8..a70384a1 100644 --- a/src/generators/utils/generate/generate.configs.utils.ts +++ b/src/generators/utils/generate/generate.configs.utils.ts @@ -269,6 +269,23 @@ function getInputsConfig(resolver: SchemaResolver, endpointParameter?: EndpointP return { schema: getImportedZodSchemaName(resolver, endpointParameter.zodSchema), options: { inputs } }; } +function resolveReadAllItemZodSchema( + resolver: SchemaResolver, + endpoint: Endpoint, + itemSchema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject, + itemsPropertyKey: string, +): string { + if (isReferenceObject(itemSchema)) { + return resolver.getZodSchemaNameByRef(itemSchema.$ref); + } + + if (isNamedZodSchema(endpoint.response)) { + return `${getImportedZodSchemaName(resolver, endpoint.response)}.shape.${itemsPropertyKey}.element`; + } + + return ANY_SCHEMA; +} + function getColumnsConfig(resolver: SchemaResolver, endpoint: Endpoint) { const endpointResponse = endpoint.responseObject; if (!endpointResponse) { @@ -308,7 +325,7 @@ function getColumnsConfig(resolver: SchemaResolver, endpoint: Endpoint) { return; } - const zodSchema = isReferenceObject(itemSchema) ? resolver.getZodSchemaNameByRef(itemSchema.$ref) : ANY_SCHEMA; + const zodSchema = resolveReadAllItemZodSchema(resolver, endpoint, itemSchema, propertyKey); const columns = Object.keys(itemSchemaObj?.properties ?? {}).reduce((acc, key) => ({ ...acc, [key]: true }), {}); const sortableEnumSchemaName = endpoint.parameters.find( diff --git a/src/generators/utils/generate/generate.endpoints.utils.ts b/src/generators/utils/generate/generate.endpoints.utils.ts index c2e54d76..b17b939f 100644 --- a/src/generators/utils/generate/generate.endpoints.utils.ts +++ b/src/generators/utils/generate/generate.endpoints.utils.ts @@ -48,10 +48,13 @@ export function mapEndpointParamsToFunctionParams( includeFileParam?: boolean; includeOnlyRequiredParams?: boolean; pathParamsRequiredOnly?: boolean; - optionalPathParams?: boolean; + optionalPathParams?: string[]; modelNamespaceTag?: string; + excludePathParams?: boolean; }, ) { + const optionalPathParams = options?.optionalPathParams ? new Set(options.optionalPathParams) : undefined; + const params = endpoint.parameters.map((param) => { let type = "string"; if (isNamedZodSchema(param.zodSchema)) { @@ -96,7 +99,8 @@ export function mapEndpointParamsToFunctionParams( (param) => (!options?.excludeBodyParam || param.name !== BODY_PARAMETER_NAME) && (!options?.excludePageParam || param.name !== resolver.options.infiniteQueryParamNames.page) && - (!options?.includeOnlyRequiredParams || param.required), + (!options?.includeOnlyRequiredParams || param.required) && + (!options?.excludePathParams || param.paramType !== "Path"), ) .map((param) => ({ ...param, @@ -105,12 +109,25 @@ export function mapEndpointParamsToFunctionParams( ? "pageParam" : param.name, required: - options?.optionalPathParams && param.paramType === "Path" + param.paramType === "Path" && optionalPathParams?.has(param.name) ? false : param.required && (param.paramType === "Path" || !options?.pathParamsRequiredOnly), })); } +/** True when the endpoint has at least one mapped param and every mapped param is optional (safe `= {}` default on the params object). */ +export function endpointParamsAllOptional( + resolver: SchemaResolver, + endpoint: Endpoint, + mapOptions?: Parameters[2], +): boolean { + const params = mapEndpointParamsToFunctionParams(resolver, endpoint, mapOptions); + if (params.length === 0) { + return false; + } + return params.every((p) => !p.required); +} + export function getEndpointConfig(endpoint: Endpoint) { const params = endpoint.parameters .filter((param) => param.type === "Query") diff --git a/src/generators/utils/hbs/hbs.endpoints.utils.ts b/src/generators/utils/hbs/hbs.endpoints.utils.ts new file mode 100644 index 00000000..aa14fac0 --- /dev/null +++ b/src/generators/utils/hbs/hbs.endpoints.utils.ts @@ -0,0 +1,124 @@ +import Handlebars from "handlebars"; +import { OpenAPIV3 } from "openapi-types"; + +import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; +import { Endpoint } from "@/generators/types/endpoint"; +import { GenerateOptions } from "@/generators/types/options"; +import { + endpointParamsAllOptional, + getEndpointBody, + getEndpointName, + getEndpointPath, + getImportedEndpointName, + mapEndpointParamsToFunctionParams, +} from "@/generators/utils/generate/generate.endpoints.utils"; +import { getSchemaDescriptions } from "@/generators/utils/generate/generate.openapi.utils"; +import { isSchemaObject } from "@/generators/utils/openapi-schema.utils"; +import { isParamMediaTypeAllowed } from "@/generators/utils/openapi.utils"; + +enum EndpointsHelpers { + EndpointName = "endpointName", + ImportedEndpointName = "importedEndpointName", + EndpointParams = "endpointParams", + EndpointPath = "endpointPath", + EndpointBody = "endpointBody", + EndpointArgs = "endpointArgs", + EndpointParamDescription = "endpointParamDescription", + EndpointParamsAllOptional = "endpointParamsAllOptional", +} + +export function registerEndpointsHbsHelpers(resolver: SchemaResolver) { + registerEndpointNameHelper(); + registerImportedEndpointNameHelper(resolver.options); + registerEndpointParamsHelper(resolver); + registerEndpointPathHelper(); + registerEndpointBodyHelper(); + registerEndpointArgsHelper(resolver); + registerEndpointParamDescriptionHelper(); + registerEndpointParamsAllOptionalHelper(resolver); +} + +function registerEndpointNameHelper() { + Handlebars.registerHelper(EndpointsHelpers.EndpointName, getEndpointName); +} + +function registerImportedEndpointNameHelper(options: GenerateOptions) { + Handlebars.registerHelper(EndpointsHelpers.ImportedEndpointName, (endpoint: Endpoint) => + getImportedEndpointName(endpoint, options), + ); +} + +function registerEndpointPathHelper() { + Handlebars.registerHelper(EndpointsHelpers.EndpointPath, getEndpointPath); +} + +function registerEndpointBodyHelper() { + Handlebars.registerHelper(EndpointsHelpers.EndpointBody, getEndpointBody); +} + +function registerEndpointParamsHelper(resolver: SchemaResolver) { + Handlebars.registerHelper( + EndpointsHelpers.EndpointParams, + (endpoint: Endpoint, options: { hash: Parameters[2] }) => + mapEndpointParamsToFunctionParams(resolver, endpoint, options.hash), + ); +} + +function registerEndpointArgsHelper(resolver: SchemaResolver) { + Handlebars.registerHelper( + EndpointsHelpers.EndpointArgs, + (endpoint: Endpoint, options: { hash: Parameters[2] }) => + mapEndpointParamsToFunctionParams(resolver, endpoint, options.hash) + .map((param) => param.name) + .join(", "), + ); +} + +function registerEndpointParamsAllOptionalHelper(resolver: SchemaResolver) { + Handlebars.registerHelper( + EndpointsHelpers.EndpointParamsAllOptional, + (endpoint: Endpoint, options: { hash: Parameters[2] }) => + endpointParamsAllOptional(resolver, endpoint, options.hash), + ); +} + +function registerEndpointParamDescriptionHelper() { + Handlebars.registerHelper( + EndpointsHelpers.EndpointParamDescription, + (endpointParam: ReturnType[0]) => { + const strs = [`${endpointParam.paramType} parameter`]; + + const description = endpointParam.parameterObject?.description || endpointParam.bodyObject?.description; + if (description) { + strs.push(description); + } + + let schema: OpenAPIV3.SchemaObject | undefined = undefined; + let mediaTypeObject: OpenAPIV3.MediaTypeObject | undefined = 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) { + const schemaDescriptions = getSchemaDescriptions(schema); + strs.push(...schemaDescriptions); + } + + if (mediaTypeObject?.example) { + strs.push(`Example: \`${mediaTypeObject.example}\``); + } + + return strs.join(". "); + }, + ); +} diff --git a/src/generators/utils/hbs/hbs.partials.utils.ts b/src/generators/utils/hbs/hbs.partials.utils.ts new file mode 100644 index 00000000..e00deb4d --- /dev/null +++ b/src/generators/utils/hbs/hbs.partials.utils.ts @@ -0,0 +1,310 @@ +import Handlebars from "handlebars"; +import { OpenAPIV3 } from "openapi-types"; + +import { ACL_CHECK_HOOK, CASL_ABILITY_BINDING } from "@/generators/const/acl.const"; +import { MUTATION_EFFECTS, ZOD_EXTENDED } from "@/generators/const/deps.const"; +import { AXIOS_REQUEST_CONFIG_NAME, AXIOS_REQUEST_CONFIG_TYPE } from "@/generators/const/endpoints.const"; +import { QUERIES_MODULE_NAME, QUERY_HOOKS } from "@/generators/const/queries.const"; +import { BLOB_SCHEMA } from "@/generators/const/zod.const"; +import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; +import { DynamicColumnsConfig, DynamicInputsConfig } from "@/generators/types/builder-config"; +import { Endpoint, EndpointParameter } from "@/generators/types/endpoint"; +import { GenerateZodSchemaData, Import } from "@/generators/types/generate"; +import { getAbilityConditionsTypes, hasAbilityConditions } from "@/generators/utils/generate/generate.acl.utils"; +import { + getEndpointBody, + getEndpointConfig, + getEndpointName, + getUpdateQueryEndpoints, + hasEndpointConfig, + mapEndpointParamsToFunctionParams, + requiresBody, +} from "@/generators/utils/generate/generate.endpoints.utils"; +import { getHbsPartialTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; +import { getDestructuredVariables, isInfiniteQuery, isMutation, isQuery } from "@/generators/utils/query.utils"; +import { isNamedZodSchema } from "@/generators/utils/zod-schema.utils"; + +enum PartialsHelpers { + ModelJsDocs = "genModelJsDocs", + Import = "genImport", + EndpointParams = "genEndpointParams", + HasUndefinedEndpointBody = "hasUndefinedEndpointBody", + EndpointConfig = "genEndpointConfig", + EndpointParamParse = "genEndpointParamParse", + QueryKeys = "genQueryKeys", + Query = "genQuery", + Mutation = "genMutation", + InfiniteQuery = "genInfiniteQuery", + QueryJsDocs = "genQueryJsDocs", + CaslAbilityType = "genCaslAbilityType", + CaslAbilityFunction = "genCaslAbilityFunction", + CaslAbilityQuery = "genCaslAbilityQuery", + AclCheckCall = "genAclCheckCall", + InputsConfig = "genInputsConfig", + ColumnsConfig = "genColumnsConfig", +} + +export function registerPartialsHbsHelpers(resolver: SchemaResolver) { + registerGenerateModelJsDocsHelper(); + registerImportHelper(); + registerGenerateEndpointParamsHelper(); + registerHasUndefinedEndpointBodyHelper(resolver); + registerGenerateEndpointConfigHelper(resolver); + registerGenerateEndpointParamParseHelper(); + registerGenerateQueryKeysHelper(resolver); + registerGenerateQueryHelper(resolver); + registerGenerateMutationHelper(resolver); + registerGenerateInfiniteQueryHelper(resolver); + registerGenerateQueryJsDocsHelper(resolver); + registerGenerateCaslAbilityTypeHelper(); + registerGenerateCaslAbilityFunctionHelper(); + registerGenerateCaslAbilityQueryHelper(); + registerGenerateAclCheckCallHelper(); + registerGenerateInputsConfigHelper(); + registerGenerateColumnsConfigHelper(); +} + +function registerGenerateModelJsDocsHelper() { + Handlebars.registerHelper( + PartialsHelpers.ModelJsDocs, + (name: string, zodSchema: GenerateZodSchemaData, tag: string) => + getHbsPartialTemplateDelegate("model-js-docs")({ name, zodSchema, tag }), + ); +} + +function registerImportHelper() { + Handlebars.registerHelper(PartialsHelpers.Import, (genImport: Import) => + getHbsPartialTemplateDelegate("import")({ import: genImport }), + ); +} + +function registerGenerateEndpointParamsHelper() { + Handlebars.registerHelper( + PartialsHelpers.EndpointParams, + (endpoint: Endpoint, options: { hash: Parameters[2] }) => + getHbsPartialTemplateDelegate("endpoint-params")({ endpoint, options }), + ); +} + +function registerHasUndefinedEndpointBodyHelper(resolver: SchemaResolver) { + Handlebars.registerHelper( + PartialsHelpers.HasUndefinedEndpointBody, + (endpoint: Endpoint) => + requiresBody(endpoint) && !getEndpointBody(endpoint) && hasEndpointConfig(endpoint, resolver), + ); +} + +function registerGenerateEndpointConfigHelper(resolver: SchemaResolver) { + Handlebars.registerHelper(PartialsHelpers.EndpointConfig, (endpoint: Endpoint) => { + const endpointConfig = getEndpointConfig(endpoint); + const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; + if (Object.keys(endpointConfig).length === 0) { + return hasAxiosRequestConfig ? AXIOS_REQUEST_CONFIG_NAME : ""; + } + + return getHbsPartialTemplateDelegate("endpoint-config")({ + endpointConfig, + hasAxiosRequestConfig, + hasBlobResponse: endpoint.response === BLOB_SCHEMA, + hasFileDownload: endpoint.mediaDownload, + axiosRequestConfigName: AXIOS_REQUEST_CONFIG_NAME, + generateParse: resolver.options.parseRequestParams, + }); + }); +} + +function registerGenerateEndpointParamParseHelper() { + Handlebars.registerHelper(PartialsHelpers.EndpointParamParse, (param: EndpointParameter, paramName: string) => + getHbsPartialTemplateDelegate("endpoint-param-parse")({ + param, + paramName, + isQuery: param.type === "Query", + zodExtendedNamespace: ZOD_EXTENDED.namespace, + parse: ZOD_EXTENDED.exports.parse, + sortExp: ZOD_EXTENDED.exports.sortExp, + addOptional: + !(param.parameterObject ?? param.bodyObject)?.required && + (param.parameterSortingEnumSchemaName || isNamedZodSchema(param.zodSchema)), + }), + ); +} + +function registerGenerateQueryKeysHelper(resolver: SchemaResolver) { + Handlebars.registerHelper(PartialsHelpers.QueryKeys, (queryEndpoints: Endpoint[]) => { + if (queryEndpoints.length === 0) { + return ""; + } + + return getHbsPartialTemplateDelegate("query-keys")({ + queryEndpoints, + queriesModuleName: QUERIES_MODULE_NAME, + generateInfiniteQueries: resolver.options.infiniteQueries, + }); + }); +} + +function registerGenerateQueryHelper(resolver: SchemaResolver) { + Handlebars.registerHelper(PartialsHelpers.Query, (endpoint: Endpoint) => { + if (!isQuery(endpoint)) { + return; + } + + const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; + const hasAclCheck = resolver.options.checkAcl && endpoint.acl; + + return getHbsPartialTemplateDelegate("query-use-query")({ + endpoint, + queryHook: QUERY_HOOKS.query, + hasQueryFn: + mapEndpointParamsToFunctionParams(resolver, endpoint).length > 0 || hasAxiosRequestConfig || hasAclCheck, + hasQueryFnBody: hasAclCheck, + hasAxiosRequestConfig, + axiosRequestConfigName: AXIOS_REQUEST_CONFIG_NAME, + axiosRequestConfigType: AXIOS_REQUEST_CONFIG_TYPE, + hasAclCheck, + aclCheckHook: ACL_CHECK_HOOK, + }); + }); +} + +function registerGenerateMutationHelper(resolver: SchemaResolver) { + Handlebars.registerHelper(PartialsHelpers.Mutation, (endpoint: Endpoint, queryEndpoints: Endpoint[]) => { + if (!isMutation(endpoint)) { + return; + } + + const updateQueryEndpoints = getUpdateQueryEndpoints(endpoint, queryEndpoints); + const hasAclCheck = resolver.options.checkAcl && endpoint.acl; + + const pathFuncParams = mapEndpointParamsToFunctionParams(resolver, endpoint).filter( + (param) => param.paramType === "Path", + ); + const hasMutationScope = + resolver.options.mutationScope === true && + pathFuncParams.length > 0 && + endpoint.method !== OpenAPIV3.HttpMethods.POST; + const mutationScopePathParams = hasMutationScope ? pathFuncParams.map(({ name, type }) => ({ name, type })) : []; + const mutationScopeExpression = hasMutationScope + ? getMutationScopeExpression(getEndpointName(endpoint), mutationScopePathParams.map(({ name }) => name)) + : undefined; + const mutationVariablesParams = mapEndpointParamsToFunctionParams(resolver, endpoint, { + excludePathParams: hasMutationScope, + includeFileParam: true, + }); + + const allDestructuredVariables = getDestructuredVariables(resolver, endpoint, updateQueryEndpoints); + const pathParamNames = new Set(pathFuncParams.map(({ name }) => name)); + const destructuredVariables = hasMutationScope + ? allDestructuredVariables.filter((name) => !pathParamNames.has(name)) + : allDestructuredVariables; + + return getHbsPartialTemplateDelegate("query-use-mutation")({ + endpoint, + queryHook: QUERY_HOOKS.mutation, + queriesModuleName: QUERIES_MODULE_NAME, + hasAxiosRequestConfig: resolver.options.axiosRequestConfig, + hasMutationFnBody: endpoint.mediaUpload || hasAclCheck, + axiosRequestConfigName: AXIOS_REQUEST_CONFIG_NAME, + axiosRequestConfigType: AXIOS_REQUEST_CONFIG_TYPE, + hasMutationEffects: resolver.options.mutationEffects, + mutationEffectsType: MUTATION_EFFECTS.optionsType, + updateQueryEndpoints, + destructuredVariables, + hasAclCheck, + aclCheckHook: ACL_CHECK_HOOK, + hasMutationScope, + mutationScopeExpression, + mutationScopePathParams, + hasMutationVariables: mutationVariablesParams.length > 0, + }); + }); +} + +function getMutationScopeExpression(endpointName: string, pathParamNames: string[]) { + return `\`${[endpointName, ...pathParamNames.map((name) => `\${${name}}`)].join(":")}\``; +} + +function registerGenerateInfiniteQueryHelper(resolver: SchemaResolver) { + Handlebars.registerHelper(PartialsHelpers.InfiniteQuery, (endpoint: Endpoint) => { + if (!resolver.options.infiniteQueries || !isInfiniteQuery(endpoint, resolver.options)) { + return; + } + + const hasAclCheck = resolver.options.checkAcl && endpoint.acl; + + return getHbsPartialTemplateDelegate("query-use-infinite-query")({ + endpoint, + infiniteQueryHook: QUERY_HOOKS.infiniteQuery, + hasQueryFnBody: hasAclCheck, + pageParamName: resolver.options.infiniteQueryResponseParamNames.page, + totalItemsName: resolver.options.infiniteQueryResponseParamNames.totalItems, + limitParamName: resolver.options.infiniteQueryResponseParamNames.limit, + hasAxiosRequestConfig: resolver.options.axiosRequestConfig, + axiosRequestConfigName: AXIOS_REQUEST_CONFIG_NAME, + axiosRequestConfigType: AXIOS_REQUEST_CONFIG_TYPE, + hasAclCheck, + aclCheckHook: ACL_CHECK_HOOK, + }); + }); +} + +function registerGenerateQueryJsDocsHelper(resolver: SchemaResolver) { + Handlebars.registerHelper( + PartialsHelpers.QueryJsDocs, + (endpoint: Endpoint, options: { hash: { query?: boolean; mutation?: boolean; infiniteQuery?: boolean } }) => + getHbsPartialTemplateDelegate("query-js-docs")({ + endpoint, + query: options.hash.query, + mutation: options.hash.mutation, + infiniteQuery: options.hash.infiniteQuery, + hasMutationEffects: resolver.options.mutationEffects, + mutationEffectsType: MUTATION_EFFECTS.optionsType, + }), + ); +} + +function registerGenerateCaslAbilityTypeHelper() { + Handlebars.registerHelper(PartialsHelpers.CaslAbilityType, (endpoint: Endpoint) => + getHbsPartialTemplateDelegate("casl-ability-type")({ + endpoint, + abilityTuple: CASL_ABILITY_BINDING.abilityTuple, + }), + ); +} + +function registerGenerateCaslAbilityFunctionHelper() { + Handlebars.registerHelper(PartialsHelpers.CaslAbilityFunction, (endpoint: Endpoint) => + getHbsPartialTemplateDelegate("casl-ability-function")({ endpoint }), + ); +} + +function registerGenerateCaslAbilityQueryHelper() { + Handlebars.registerHelper(PartialsHelpers.CaslAbilityQuery, (endpoint: Endpoint) => + getHbsPartialTemplateDelegate("casl-ability-query")({ endpoint }), + ); +} + +function registerGenerateAclCheckCallHelper() { + Handlebars.registerHelper(PartialsHelpers.AclCheckCall, (endpoint: Endpoint) => { + const checkParams = getAbilityConditionsTypes(endpoint)?.map((condition) => condition.name); + const params = new Set(endpoint.parameters.map((param) => param.name)); + const hasAllCheckParams = checkParams?.every((param) => params.has(param)); + + return getHbsPartialTemplateDelegate("acl-check-call")({ + endpoint, + generateAclCheckParams: hasAbilityConditions(endpoint) && hasAllCheckParams, + }); + }); +} + +function registerGenerateInputsConfigHelper() { + Handlebars.registerHelper(PartialsHelpers.InputsConfig, (inputsConfig: DynamicInputsConfig) => + getHbsPartialTemplateDelegate("inputs-config")({ inputsConfig }), + ); +} + +function registerGenerateColumnsConfigHelper() { + Handlebars.registerHelper(PartialsHelpers.ColumnsConfig, (columnsConfig: DynamicColumnsConfig) => + getHbsPartialTemplateDelegate("columns-config")({ columnsConfig }), + ); +} diff --git a/src/generators/utils/object.utils.test.ts b/src/generators/utils/object.utils.test.ts index ad888243..5acc9c33 100644 --- a/src/generators/utils/object.utils.test.ts +++ b/src/generators/utils/object.utils.test.ts @@ -162,7 +162,7 @@ describe("Utils: object", () => { output: "output", splitByTags: true, defaultTag: "Common", - excludeTags: [], + includeTags: [], excludePathRegex: "", excludeRedundantZodSchemas: true, tsNamespaces: true, @@ -200,7 +200,7 @@ describe("Utils: object", () => { tsNamespaces: undefined, splitByTags: undefined, defaultTag: undefined, - excludeTags: undefined, + includeTags: undefined, excludePathRegex: undefined, excludeRedundantZodSchemas: undefined, importPath: undefined, diff --git a/src/generators/utils/operation.utils.ts b/src/generators/utils/operation.utils.ts index 857cf6a8..97479d5a 100644 --- a/src/generators/utils/operation.utils.ts +++ b/src/generators/utils/operation.utils.ts @@ -9,13 +9,13 @@ import { invalidVariableNameCharactersToCamel } from "./js.utils"; import { pick } from "./object.utils"; import { isPathExcluded, pathToVariableName } from "./openapi.utils"; import { capitalize, removeWord } from "./string.utils"; -import { getOperationTag, isTagExcluded } from "./tag.utils"; +import { getOperationTag, isTagIncluded } from "./tag.utils"; export function isOperationExcluded(operation: OperationObject, options: GenerateOptions) { const isDeprecated = operation.deprecated && !options.withDeprecatedEndpoints; const tag = getOperationTag(operation, options); - const isExcluded = isTagExcluded(tag, options); - return isDeprecated || isExcluded; + const isIncluded = isTagIncluded(tag, options); + return isDeprecated || !isIncluded; } export function getOperationName({ diff --git a/src/generators/utils/tag.utils.test.ts b/src/generators/utils/tag.utils.test.ts new file mode 100644 index 00000000..928253a7 --- /dev/null +++ b/src/generators/utils/tag.utils.test.ts @@ -0,0 +1,66 @@ +import { describe, expect, test } from "vitest"; +import { DEFAULT_GENERATE_OPTIONS } from "@/generators/const/options.const"; +import { isTagIncluded } from "./tag.utils"; + +describe("Utils: tag", () => { + describe("isTagIncluded", () => { + const options = DEFAULT_GENERATE_OPTIONS; + + test("includes all when both are empty", () => { + expect(isTagIncluded("auth", { ...options, includeTags: [], excludeTags: [] })).toBe(true); + }); + + test("includes only includeTags when specified", () => { + const config = { ...options, includeTags: ["auth", "user"], excludeTags: [] }; + expect(isTagIncluded("auth", config)).toBe(true); + expect(isTagIncluded("user", config)).toBe(true); + expect(isTagIncluded("other", config)).toBe(false); + }); + + test("excludes excludeTags when includeTags is empty", () => { + const config = { ...options, includeTags: [], excludeTags: ["auth", "user"] }; + expect(isTagIncluded("auth", config)).toBe(false); + expect(isTagIncluded("user", config)).toBe(false); + expect(isTagIncluded("other", config)).toBe(true); + }); + + test("includeTags has high priority over excludeTags", () => { + const config = { ...options, includeTags: ["auth"], excludeTags: ["auth"] }; + // If it's in includeTags, it should be included regardless of excludeTags + expect(isTagIncluded("auth", config)).toBe(true); + }); + + test("includeTags overrides excludeTags (only includeTags are considered)", () => { + const config = { ...options, includeTags: ["auth"], excludeTags: ["user"] }; + expect(isTagIncluded("auth", config)).toBe(true); + expect(isTagIncluded("user", config)).toBe(false); // Not in includeTags + expect(isTagIncluded("other", config)).toBe(false); // Not in includeTags + }); + + test("case insensitive matching", () => { + expect(isTagIncluded("AUTH", { ...options, includeTags: ["auth"], excludeTags: [] })).toBe(true); + expect(isTagIncluded("auth", { ...options, includeTags: ["AUTH"], excludeTags: [] })).toBe(true); + expect(isTagIncluded("AUTH", { ...options, includeTags: [], excludeTags: ["auth"] })).toBe(false); + }); + + test("matches human-readable includeTags against normalized operation tags", () => { + expect( + isTagIncluded("WorkingDocumentsTemplatedDocument", { + ...options, + includeTags: ["WorkingDocuments - templated-document"], + excludeTags: [], + }), + ).toBe(true); + }); + + test("matches human-readable excludeTags against normalized operation tags", () => { + expect( + isTagIncluded("WorkingDocumentsTemplatedDocument", { + ...options, + includeTags: [], + excludeTags: ["WorkingDocuments - templated-document"], + }), + ).toBe(false); + }); + }); +}); diff --git a/src/generators/utils/tag.utils.ts b/src/generators/utils/tag.utils.ts index d46cdcbe..1e670116 100644 --- a/src/generators/utils/tag.utils.ts +++ b/src/generators/utils/tag.utils.ts @@ -18,8 +18,15 @@ export function getEndpointTag(endpoint: Endpoint, options: GenerateOptions) { return formatTag(tag ?? options.defaultTag); } -export function isTagExcluded(tag: string, options: GenerateOptions) { - return options.excludeTags.some((excludeTag) => excludeTag.toLowerCase() === tag.toLowerCase()); +export function isTagIncluded(tag: string, options: GenerateOptions) { + const normalizedTag = formatTag(tag).toLowerCase(); + if (options.includeTags.some((includeTag) => formatTag(includeTag).toLowerCase() === normalizedTag)) { + return true; + } + if (options.excludeTags.some((excludeTag) => formatTag(excludeTag).toLowerCase() === normalizedTag)) { + return false; + } + return options.includeTags.length === 0; } export function shouldInlineEndpointsForTag(tag: string, options: GenerateOptions) { diff --git a/src/index.ts b/src/index.ts index 043baa64..8f8243a0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,7 +20,7 @@ export type { MutationEffectsOptions } from "./lib/react-query/useMutationEffect export { OpenApiRouter } from "./lib/config/router.context"; export { OpenApiQueryConfig } from "./lib/config/queryConfig.context"; export type { InvalidationMap, InvalidationMapFunc, QueryModule } from "./lib/config/queryConfig.context"; -export { OpenApiWorkspaceContext } from "./lib/config/workspace.context"; +export { OpenApiWorkspaceContext, useWorkspaceContext } 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/workspace.context.tsx b/src/lib/config/workspace.context.tsx index 7a616958..cf8776f1 100644 --- a/src/lib/config/workspace.context.tsx +++ b/src/lib/config/workspace.context.tsx @@ -14,8 +14,8 @@ export namespace OpenApiWorkspaceContext { return {children}; }; - export const useContext = () => { - return use(Context); + export const useContext = () => { + return use(Context) as TValues; }; export const resolveParam = (context: WorkspaceValues, name: string, value: T | null | undefined): T => { @@ -31,3 +31,6 @@ export namespace OpenApiWorkspaceContext { return workspaceValue as T; }; } + +export const useWorkspaceContext = () => + OpenApiWorkspaceContext.useContext(); diff --git a/src/lib/rest/error-handling.ts b/src/lib/rest/error-handling.ts index 7e22b240..9ef98f24 100644 --- a/src/lib/rest/error-handling.ts +++ b/src/lib/rest/error-handling.ts @@ -28,18 +28,18 @@ export class ApplicationException extends Error { export interface ErrorEntry { code: CodeT; condition?: (error: unknown) => boolean; - getMessage: (t: TFunction, error: unknown) => string; + getMessage: (t: TFunction, error: unknown) => string; } export interface ErrorHandlerOptions { entries: ErrorEntry[]; - t?: TFunction; + t?: TFunction; onRethrowError?: (error: unknown, exception: ApplicationException) => void; } export class ErrorHandler { entries: ErrorEntry[] = []; - private t: TFunction; + private t: TFunction; private onRethrowError?: (error: unknown, exception: ApplicationException) => void; constructor({ entries, t = defaultT, onRethrowError }: ErrorHandlerOptions) { @@ -125,7 +125,7 @@ export class ErrorHandler { return code === entry.code; } - public setTranslateFunction(t: TFunction) { + public setTranslateFunction(t: TFunction) { this.t = t; } diff --git a/src/vite/openapi-codegen.plugin.ts b/src/vite/openapi-codegen.plugin.ts index 108f1299..ae923564 100644 --- a/src/vite/openapi-codegen.plugin.ts +++ b/src/vite/openapi-codegen.plugin.ts @@ -28,6 +28,7 @@ export function openApiCodegen(config: OpenApiCodegenViteConfig): Plugin { const profiler = new Profiler(process.env.OPENAPI_CODEGEN_PROFILE === "1"); await runGenerate({ fileConfig, formatGeneratedFile, profiler }); }); + return queue; }; const setupWatcher = (server: ViteDevServer) => { @@ -49,10 +50,11 @@ export function openApiCodegen(config: OpenApiCodegenViteConfig): Plugin { configResolved(config) { resolvedViteConfig = config; }, - buildStart() { - enqueueGenerate(); + async buildStart() { + await enqueueGenerate(); }, - configureServer(server) { + async configureServer(server) { + await enqueueGenerate(); setupWatcher(server); }, }; diff --git a/test/config.ts b/test/config.ts index f4b09b72..531b4c21 100644 --- a/test/config.ts +++ b/test/config.ts @@ -3,7 +3,7 @@ import { OpenAPICodegenConfig } from "../src/generators/types/config"; export const config: OpenAPICodegenConfig = { input: "http://127.0.0.1:4000/docs-json", output: "./output", - excludeTags: ["auth"], + includeTags: ["auth"], replaceOptionalWithNullish: true, builderConfigs: true, infiniteQueries: true, diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..f01bc8f0 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4607 @@ +# 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:^17.7.2" + 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 + +"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:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + +"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:^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-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-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 + languageName: node + linkType: hard + +"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, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"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-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, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.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 + +"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:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + +"zod@npm:^4.3.6": + version: 4.3.6 + resolution: "zod@npm:4.3.6" + checksum: 10c0/860d25a81ab41d33aa25f8d0d07b091a04acb426e605f396227a796e9e800c44723ed96d0f53a512b57be3d1520f45bf69c0cb3b378a232a00787a2609625307 + languageName: node + linkType: hard