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