zenko 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts","../src/utils/topological-sort.ts","../src/utils/property-name.ts","../src/utils/http-status.ts","../src/zenko.ts"],"sourcesContent":["export { generate, type OpenAPISpec, type GenerateOptions } from \"./src/zenko\"\n","export function topologicalSort(schemas: Record<string, any>): string[] {\n const visited = new Set<string>()\n const visiting = new Set<string>()\n const result: string[] = []\n\n const visit = (name: string): void => {\n if (visited.has(name)) return\n if (visiting.has(name)) {\n // Circular dependency detected, just add it anyway\n return\n }\n\n visiting.add(name)\n\n // Find dependencies of this schema\n const schema = schemas[name]\n const dependencies = extractDependencies(schema)\n\n // Visit dependencies first\n for (const dep of dependencies) {\n if (schemas[dep]) {\n visit(dep)\n }\n }\n\n visiting.delete(name)\n visited.add(name)\n result.push(name)\n }\n\n // Visit all schemas\n for (const name of Object.keys(schemas)) {\n visit(name)\n }\n\n return result\n}\n\nexport function extractDependencies(schema: any): string[] {\n const dependencies: string[] = []\n\n const traverse = (obj: any): void => {\n if (typeof obj !== \"object\" || obj === null) return\n\n if (obj.$ref && typeof obj.$ref === \"string\") {\n const refName = extractRefName(obj.$ref)\n dependencies.push(refName)\n return\n }\n\n if (Array.isArray(obj)) {\n obj.forEach(traverse)\n } else {\n Object.values(obj).forEach(traverse)\n }\n }\n\n traverse(schema)\n return [...new Set(dependencies)] // Remove duplicates\n}\n\nexport function extractRefName(ref: string): string {\n return ref.split(\"/\").pop() || \"Unknown\"\n}\n","/**\n * Checks if a string is a valid JavaScript identifier\n */\nexport function isValidJSIdentifier(name: string): boolean {\n // Check if name is empty\n if (!name) return false\n\n // Check if first character is valid (letter, underscore, or $)\n const firstChar = name.at(0)\n if (firstChar === undefined) return false\n if (!/[a-zA-Z_$]/.test(firstChar)) return false\n\n if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name)) return false\n\n // Check if it's a reserved word\n const reservedWords = new Set([\n \"abstract\",\n \"arguments\",\n \"await\",\n \"boolean\",\n \"break\",\n \"byte\",\n \"case\",\n \"catch\",\n \"char\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"double\",\n \"else\",\n \"enum\",\n \"eval\",\n \"export\",\n \"extends\",\n \"false\",\n \"final\",\n \"finally\",\n \"float\",\n \"for\",\n \"function\",\n \"goto\",\n \"if\",\n \"implements\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"int\",\n \"interface\",\n \"let\",\n \"long\",\n \"native\",\n \"new\",\n \"null\",\n \"package\",\n \"private\",\n \"protected\",\n \"public\",\n \"return\",\n \"short\",\n \"static\",\n \"super\",\n \"switch\",\n \"synchronized\",\n \"this\",\n \"throw\",\n \"throws\",\n \"transient\",\n \"true\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"volatile\",\n \"while\",\n \"with\",\n \"yield\",\n \"async\",\n ])\n\n return !reservedWords.has(name)\n}\n\n/**\n * Formats a property name for use in JavaScript/TypeScript object literals\n * Quotes the name if it's not a valid JavaScript identifier\n */\nexport function formatPropertyName(name: string): string {\n return isValidJSIdentifier(name) ? name : `\"${name}\"`\n}\n","const statusNameMap: Record<string, string> = {\n \"400\": \"badRequest\",\n \"401\": \"unauthorized\",\n \"402\": \"paymentRequired\",\n \"403\": \"forbidden\",\n \"404\": \"notFound\",\n \"405\": \"methodNotAllowed\",\n \"406\": \"notAcceptable\",\n \"407\": \"proxyAuthenticationRequired\",\n \"408\": \"requestTimeout\",\n \"409\": \"conflict\",\n \"410\": \"gone\",\n \"411\": \"lengthRequired\",\n \"412\": \"preconditionFailed\",\n \"413\": \"payloadTooLarge\",\n \"414\": \"uriTooLong\",\n \"415\": \"unsupportedMediaType\",\n \"416\": \"rangeNotSatisfiable\",\n \"417\": \"expectationFailed\",\n \"418\": \"imATeapot\",\n \"421\": \"misdirectedRequest\",\n \"422\": \"unprocessableEntity\",\n \"423\": \"locked\",\n \"424\": \"failedDependency\",\n \"425\": \"tooEarly\",\n \"426\": \"upgradeRequired\",\n \"428\": \"preconditionRequired\",\n \"429\": \"tooManyRequests\",\n \"431\": \"requestHeaderFieldsTooLarge\",\n \"451\": \"unavailableForLegalReasons\",\n \"500\": \"internalServerError\",\n \"501\": \"notImplemented\",\n \"502\": \"badGateway\",\n \"503\": \"serviceUnavailable\",\n \"504\": \"gatewayTimeout\",\n \"505\": \"httpVersionNotSupported\",\n \"506\": \"variantAlsoNegotiates\",\n \"507\": \"insufficientStorage\",\n \"508\": \"loopDetected\",\n \"510\": \"notExtended\",\n \"511\": \"networkAuthenticationRequired\",\n} as const\n\nexport type StatusCategory = \"client\" | \"server\" | \"default\" | \"unknown\"\n\nexport function mapStatusToIdentifier(status: string): string {\n if (status === \"default\") return \"defaultError\"\n\n const trimmed = status.trim()\n const mapped = statusNameMap[trimmed]\n if (mapped) return mapped\n\n if (/^\\d{3}$/.test(trimmed)) {\n return `status${trimmed}`\n }\n\n const sanitized = trimmed\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \" \")\n .trim()\n\n if (!sanitized) return \"unknownError\"\n\n const parts = sanitized.split(/\\s+/)\n const [first, ...rest] = parts\n const candidate =\n first +\n rest\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join(\"\")\n\n if (!candidate) return \"unknownError\"\n\n return /^[a-zA-Z_$]/.test(candidate)\n ? candidate\n : `status${candidate.charAt(0).toUpperCase()}${candidate.slice(1)}`\n}\n\nexport function getStatusCategory(status: string): StatusCategory {\n if (status === \"default\") return \"default\"\n\n const code = Number(status)\n if (!Number.isInteger(code)) return \"unknown\"\n\n if (code >= 400 && code <= 499) return \"client\"\n if (code >= 500 && code <= 599) return \"server\"\n\n return \"unknown\"\n}\n\nexport function isErrorStatus(status: string): boolean {\n if (status === \"default\") return true\n const code = Number(status)\n if (!Number.isInteger(code)) return false\n return code >= 400\n}\n","import { topologicalSort, extractRefName } from \"./utils/topological-sort\"\nimport { formatPropertyName, isValidJSIdentifier } from \"./utils/property-name\"\nimport {\n getStatusCategory,\n isErrorStatus,\n mapStatusToIdentifier,\n} from \"./utils/http-status\"\n\nexport type OpenAPISpec = {\n openapi: string\n info: unknown\n paths: Record<string, Record<string, unknown>>\n components?: {\n schemas?: Record<string, unknown>\n parameters?: Record<string, unknown>\n }\n}\n\nexport type GenerateOptions = {\n strictDates?: boolean\n strictNumeric?: boolean\n}\n\ntype PathParam = {\n name: string\n type: string\n}\n\ntype Operation = {\n operationId: string\n path: string\n method: string\n pathParams: PathParam[]\n requestType?: string\n responseType?: string\n requestHeaders?: RequestHeader[]\n errors?: OperationErrorGroup\n}\ntype OperationErrorGroup = {\n clientErrors?: OperationErrorMap\n serverErrors?: OperationErrorMap\n defaultErrors?: OperationErrorMap\n otherErrors?: OperationErrorMap\n}\ntype OperationErrorMap = Record<string, string>\n\ntype RequestHeader = {\n name: string\n description?: string\n schema?: any\n required?: boolean\n}\n\nexport function generate(\n spec: OpenAPISpec,\n options: GenerateOptions = {}\n): string {\n const output: string[] = []\n const generatedTypes = new Set<string>()\n const { strictDates = false, strictNumeric = false } = options\n const schemaOptions: SchemaOptions = {\n strictDates,\n strictNumeric,\n }\n\n output.push('import { z } from \"zod\";')\n output.push(\"\")\n\n // Generate Zod schemas from components/schemas\n if (spec.components?.schemas) {\n output.push(\"// Generated Zod Schemas\")\n output.push(\"\")\n\n // Sort schemas by dependencies (topological sort)\n const sortedSchemas = topologicalSort(spec.components.schemas)\n\n for (const name of sortedSchemas) {\n const schema = spec.components.schemas[name]\n output.push(\n generateZodSchema(name, schema, generatedTypes, schemaOptions)\n )\n output.push(\"\")\n // Export inferred type\n output.push(`export type ${name} = z.infer<typeof ${name}>;`)\n output.push(\"\")\n }\n }\n\n // Parse all operations\n const operations = parseOperations(spec)\n\n // Generate path functions\n output.push(\"// Path Functions\")\n output.push(\"export const paths = {\")\n\n for (const op of operations) {\n if (op.pathParams.length === 0) {\n output.push(` ${op.operationId}: () => \"${op.path}\",`)\n } else {\n const paramNames = op.pathParams.map((p) => p.name).join(\", \")\n const paramTypes = op.pathParams\n .map((p) => `${p.name}: string`)\n .join(\", \")\n const pathWithParams = op.path.replace(/{([^}]+)}/g, \"${$1}\")\n output.push(\n ` ${op.operationId}: ({ ${paramNames} }: { ${paramTypes} }) => \\`${pathWithParams}\\`,`\n )\n }\n }\n\n output.push(\"} as const;\")\n output.push(\"\")\n\n // Generate header functions\n output.push(\"// Header Functions\")\n output.push(\"export const headers = {\")\n\n for (const op of operations) {\n if (!op.requestHeaders || op.requestHeaders.length === 0) {\n output.push(` ${op.operationId}: () => ({}),`)\n continue\n }\n\n const typeEntries = op.requestHeaders\n .map(\n (header) =>\n `${formatPropertyName(header.name)}${header.required ? \"\" : \"?\"}: ${mapHeaderType(\n header\n )}`\n )\n .join(\", \")\n\n const requiredHeaders = op.requestHeaders.filter(\n (header) => header.required\n )\n const optionalHeaders = op.requestHeaders.filter(\n (header) => !header.required\n )\n const hasRequired = requiredHeaders.length > 0\n const signature = hasRequired\n ? `(params: { ${typeEntries} })`\n : `(params: { ${typeEntries} } = {})`\n\n if (optionalHeaders.length === 0) {\n output.push(` ${op.operationId}: ${signature} => ({`)\n\n for (const header of requiredHeaders) {\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n output.push(` ${propertyKey}: ${accessor},`)\n }\n\n output.push(\" }),\")\n continue\n }\n\n if (!hasRequired && optionalHeaders.length === 1 && optionalHeaders[0]) {\n const header = optionalHeaders[0]\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n\n output.push(` ${op.operationId}: ${signature} =>`)\n output.push(\n ` ${accessor} !== undefined ? { ${propertyKey}: ${accessor} } : {},`\n )\n continue\n }\n\n const valueTypes = Array.from(\n new Set(optionalHeaders.map((header) => mapHeaderType(header)))\n ).join(\" | \")\n\n output.push(` ${op.operationId}: ${signature} => {`)\n\n if (hasRequired) {\n output.push(\" const headers = {\")\n for (const header of requiredHeaders) {\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n output.push(` ${propertyKey}: ${accessor},`)\n }\n output.push(\" }\")\n } else {\n output.push(` const headers: Record<string, ${valueTypes}> = {}`)\n }\n\n for (const header of optionalHeaders) {\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n const assignment = isValidJSIdentifier(header.name)\n ? `headers.${header.name}`\n : `headers[${propertyKey}]`\n\n output.push(` if (${accessor} !== undefined) {`)\n output.push(` ${assignment} = ${accessor}`)\n output.push(\" }\")\n }\n\n output.push(\" return headers\")\n output.push(\" },\")\n }\n\n output.push(\"} as const;\")\n output.push(\"\")\n\n // Generate operation objects\n output.push(\"// Operation Objects\")\n for (const op of operations) {\n output.push(`export const ${op.operationId} = {`)\n output.push(` path: paths.${op.operationId},`)\n\n appendOperationField(output, \"request\", op.requestType)\n appendOperationField(output, \"response\", op.responseType)\n\n if (op.requestHeaders && op.requestHeaders.length > 0) {\n output.push(` headers: headers.${op.operationId},`)\n }\n\n if (op.errors && hasAnyErrors(op.errors)) {\n output.push(\" errors: {\")\n appendErrorGroup(output, \"clientErrors\", op.errors.clientErrors)\n appendErrorGroup(output, \"serverErrors\", op.errors.serverErrors)\n appendErrorGroup(output, \"defaultErrors\", op.errors.defaultErrors)\n appendErrorGroup(output, \"otherErrors\", op.errors.otherErrors)\n output.push(\" },\")\n }\n\n output.push(\"} as const;\")\n output.push(\"\")\n }\n\n return output.join(\"\\n\")\n}\n\nfunction appendOperationField(\n buffer: string[],\n key: string,\n value?: string\n): void {\n if (!value) return\n buffer.push(` ${key}: ${value},`)\n}\n\nfunction appendErrorGroup(\n buffer: string[],\n label: string,\n errors?: OperationErrorMap\n): void {\n if (!errors || Object.keys(errors).length === 0) return\n buffer.push(` ${label}: {`)\n for (const [name, typeName] of Object.entries(errors)) {\n buffer.push(` ${formatPropertyName(name)}: ${typeName},`)\n }\n buffer.push(\" },\")\n}\n\nfunction hasAnyErrors(group: OperationErrorGroup): boolean {\n return [\n group.clientErrors,\n group.serverErrors,\n group.defaultErrors,\n group.otherErrors,\n ].some((bucket) => bucket && Object.keys(bucket).length > 0)\n}\n\nfunction parseOperations(spec: OpenAPISpec): Operation[] {\n const operations: Operation[] = []\n\n for (const [path, pathItem] of Object.entries(spec.paths)) {\n for (const [method, operation] of Object.entries(pathItem)) {\n if (!(operation as any).operationId) continue\n\n const pathParams = extractPathParams(path)\n const requestType = getRequestType(operation)\n const { successResponse, errors } = getResponseTypes(\n operation,\n (operation as any).operationId\n )\n const resolvedParameters = collectParameters(pathItem, operation, spec)\n const requestHeaders = getRequestHeaders(resolvedParameters)\n\n operations.push({\n operationId: (operation as any).operationId,\n path,\n method: method.toLowerCase(),\n pathParams,\n requestType,\n responseType: successResponse,\n requestHeaders,\n errors,\n })\n }\n }\n\n return operations\n}\n\nfunction collectParameters(\n pathItem: Record<string, unknown>,\n operation: unknown,\n spec: OpenAPISpec\n): any[] {\n const parametersMap = new Map<string, any>()\n\n const addParameters = (params: unknown) => {\n if (!Array.isArray(params)) return\n\n for (const param of params) {\n const resolved = resolveParameter(param, spec)\n if (!resolved) continue\n const key = `${resolved.in}:${resolved.name}`\n parametersMap.set(key, resolved)\n }\n }\n\n addParameters((pathItem as any).parameters)\n addParameters((operation as any).parameters)\n\n return Array.from(parametersMap.values())\n}\n\nfunction resolveParameter(parameter: any, spec: OpenAPISpec) {\n if (!parameter) return undefined\n\n if (parameter.$ref) {\n const refName = extractRefName(parameter.$ref)\n const resolved = spec.components?.parameters?.[refName]\n if (!resolved) return undefined\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { $ref, ...overrides } = parameter\n return {\n ...resolved,\n ...overrides,\n }\n }\n\n return parameter\n}\n\nfunction extractPathParams(path: string): PathParam[] {\n const params: PathParam[] = []\n const matches = path.match(/{([^}]+)}/g)\n\n if (matches) {\n for (const match of matches) {\n const paramName = match.slice(1, -1)\n params.push({\n name: paramName,\n type: \"string\", // OpenAPI path params are always strings\n })\n }\n }\n\n return params\n}\n\nfunction getRequestType(operation: any): string | undefined {\n const requestBody =\n operation.requestBody?.content?.[\"application/json\"]?.schema\n if (!requestBody) return undefined\n\n if (requestBody.$ref) {\n return extractRefName(requestBody.$ref)\n }\n\n // Generate inline type if needed\n const typeName = `${capitalize(operation.operationId)}Request`\n return typeName\n}\n\nfunction getResponseTypes(\n operation: any,\n operationId: string\n): { successResponse?: string; errors?: OperationErrorGroup } {\n const responses = operation.responses ?? {}\n const successCodes = new Map<string, string>()\n const errorEntries: Array<{ code: string; schema: any }> = []\n\n for (const [statusCode, response] of Object.entries(responses)) {\n const resolvedSchema = (response as any)?.content?.[\"application/json\"]\n ?.schema\n if (!resolvedSchema) continue\n\n if (isErrorStatus(statusCode)) {\n errorEntries.push({ code: statusCode, schema: resolvedSchema })\n continue\n }\n\n if (/^2\\d\\d$/.test(statusCode) || statusCode === \"default\") {\n successCodes.set(statusCode, resolvedSchema)\n }\n }\n\n const successResponse = selectSuccessResponse(successCodes, operationId)\n const errors = buildErrorGroups(errorEntries, operationId)\n\n return { successResponse, errors }\n}\n\nfunction selectSuccessResponse(\n responses: Map<string, any>,\n operationId: string\n): string | undefined {\n if (responses.size === 0) return undefined\n\n const preferredOrder = [\"200\", \"201\", \"204\"]\n for (const code of preferredOrder) {\n const schema = responses.get(code)\n if (schema) {\n return resolveResponseType(\n schema,\n `${capitalize(operationId)}Response${code}`\n )\n }\n }\n\n const [firstCode, firstSchema] = responses.entries().next().value ?? []\n if (!firstSchema) return undefined\n return resolveResponseType(\n firstSchema,\n `${capitalize(operationId)}Response${firstCode ?? \"Default\"}`\n )\n}\n\nfunction buildErrorGroups(\n errors: Array<{ code: string; schema: any }> = [],\n operationId: string\n): OperationErrorGroup | undefined {\n if (!errors.length) return undefined\n\n const group: OperationErrorGroup = {}\n\n for (const { code, schema } of errors) {\n const category = getStatusCategory(code)\n const identifier = mapStatusToIdentifier(code)\n const typeName = resolveResponseType(\n schema,\n `${capitalize(operationId)}${capitalize(identifier)}`\n )\n\n switch (category) {\n case \"client\":\n group.clientErrors ??= {}\n group.clientErrors[identifier] = typeName\n break\n case \"server\":\n group.serverErrors ??= {}\n group.serverErrors[identifier] = typeName\n break\n case \"default\":\n group.defaultErrors ??= {}\n group.defaultErrors[identifier] = typeName\n break\n default:\n group.otherErrors ??= {}\n group.otherErrors[identifier] = typeName\n break\n }\n }\n\n return group\n}\n\nfunction resolveResponseType(schema: any, fallbackName: string): string {\n if (schema.$ref) {\n return extractRefName(schema.$ref)\n }\n return fallbackName\n}\n\nfunction getRequestHeaders(parameters: any[]): RequestHeader[] {\n const headers: RequestHeader[] = []\n\n for (const param of parameters ?? []) {\n if ((param as any).in === \"header\") {\n headers.push({\n name: (param as any).name,\n description: (param as any).description,\n schema: (param as any).schema,\n required: (param as any).required,\n })\n }\n }\n\n return headers\n}\n\nfunction mapHeaderType(header: RequestHeader): string {\n const schemaType = header.schema?.type\n switch (schemaType) {\n case \"integer\":\n case \"number\":\n return \"number\"\n case \"boolean\":\n return \"boolean\"\n default:\n return \"string\"\n }\n}\n\ntype SchemaOptions = {\n strictDates: boolean\n strictNumeric: boolean\n}\n\nfunction generateZodSchema(\n name: string,\n schema: any,\n generatedTypes: Set<string>,\n options: SchemaOptions\n): string {\n if (generatedTypes.has(name)) return \"\"\n generatedTypes.add(name)\n\n if (schema.enum) {\n const enumValues = schema.enum.map((v: string) => `\"${v}\"`).join(\", \")\n return `export const ${name} = z.enum([${enumValues}]);`\n }\n\n if (schema.type === \"object\" || schema.properties) {\n const properties: string[] = []\n\n for (const [propName, propSchema] of Object.entries(\n schema.properties || {}\n )) {\n const isRequired = schema.required?.includes(propName) ?? false\n const zodType = getZodTypeFromSchema(propSchema as any, options)\n const finalType = isRequired ? zodType : `${zodType}.optional()`\n properties.push(` ${formatPropertyName(propName)}: ${finalType},`)\n }\n\n return `export const ${name} = z.object({\\n${properties.join(\"\\n\")}\\n});`\n }\n\n if (schema.type === \"array\") {\n const itemSchema = schema.items ?? { type: \"unknown\" }\n const itemType = getZodTypeFromSchema(itemSchema, options)\n const builder = applyStrictArrayBounds(\n schema,\n `z.array(${itemType})`,\n itemSchema,\n options.strictNumeric\n )\n return `export const ${name} = ${builder};`\n }\n\n return `export const ${name} = ${getZodTypeFromSchema(schema, options)};`\n}\n\nfunction getZodTypeFromSchema(schema: any, options: SchemaOptions): string {\n if (schema.$ref) {\n return extractRefName(schema.$ref)\n }\n\n if (schema.enum) {\n const enumValues = schema.enum.map((v: string) => `\"${v}\"`).join(\", \")\n return `z.enum([${enumValues}])`\n }\n\n switch (schema.type) {\n case \"string\":\n return buildString(schema, options)\n case \"boolean\":\n return \"z.boolean()\"\n case \"array\":\n return `z.array(${getZodTypeFromSchema(\n schema.items ?? { type: \"unknown\" },\n options\n )})`\n case \"null\":\n return \"z.null()\"\n case \"number\":\n return buildNumber(schema, options)\n case \"integer\":\n return buildInteger(schema, options)\n default:\n return \"z.unknown()\"\n }\n}\n\nfunction buildString(schema: any, options: SchemaOptions): string {\n if (options.strictDates) {\n switch (schema.format) {\n case \"date-time\":\n return \"z.string().datetime()\"\n case \"date\":\n return \"z.string().date()\"\n case \"time\":\n return \"z.string().time()\"\n case \"duration\":\n return \"z.string().duration()\"\n }\n }\n\n let builder = \"z.string()\"\n\n if (options.strictNumeric) {\n if (typeof schema.minLength === \"number\") {\n builder += `.min(${schema.minLength})`\n }\n\n if (typeof schema.maxLength === \"number\") {\n builder += `.max(${schema.maxLength})`\n }\n\n if (schema.pattern) {\n builder += `.regex(new RegExp(${JSON.stringify(schema.pattern)}))`\n }\n }\n\n switch (schema.format) {\n case \"uuid\":\n return `${builder}.uuid()`\n case \"email\":\n return `${builder}.email()`\n case \"uri\":\n case \"url\":\n return `${builder}.url()`\n case \"ipv4\":\n return `${builder}.ip({ version: \"v4\" })`\n case \"ipv6\":\n return `${builder}.ip({ version: \"v6\" })`\n default:\n return builder\n }\n}\n\nfunction buildNumber(schema: any, options: SchemaOptions): string {\n let builder = \"z.number()\"\n\n if (options.strictNumeric) {\n builder = applyNumericBounds(schema, builder)\n\n if (typeof schema.multipleOf === \"number\" && schema.multipleOf !== 0) {\n builder += `.refine((value) => Math.abs(value / ${schema.multipleOf} - Math.round(value / ${schema.multipleOf})) < Number.EPSILON, { message: \"Must be a multiple of ${schema.multipleOf}\" })`\n }\n }\n\n return builder\n}\n\nfunction buildInteger(schema: any, options: SchemaOptions): string {\n let builder = buildNumber(schema, options)\n builder += \".int()\"\n return builder\n}\n\nfunction applyStrictArrayBounds(\n schema: any,\n builder: string,\n itemSchema: any,\n enforceBounds: boolean\n): string {\n if (!enforceBounds) {\n return builder\n }\n\n if (typeof schema.minItems === \"number\") {\n builder += `.min(${schema.minItems})`\n }\n\n if (typeof schema.maxItems === \"number\") {\n builder += `.max(${schema.maxItems})`\n }\n\n if (schema.uniqueItems && isPrimitiveLike(itemSchema)) {\n builder +=\n '.refine((items) => new Set(items).size === items.length, { message: \"Items must be unique\" })'\n }\n\n return builder\n}\n\nfunction isPrimitiveLike(schema: any): boolean {\n if (schema?.$ref) return false\n\n const primitiveTypes = new Set([\"string\", \"number\", \"integer\", \"boolean\"])\n return primitiveTypes.has(schema?.type)\n}\n\nfunction applyNumericBounds(schema: any, builder: string): string {\n if (typeof schema.minimum === \"number\") {\n if (schema.exclusiveMinimum === true) {\n builder += `.gt(${schema.minimum})`\n } else {\n builder += `.min(${schema.minimum})`\n }\n } else if (typeof schema.exclusiveMinimum === \"number\") {\n builder += `.gt(${schema.exclusiveMinimum})`\n }\n\n if (typeof schema.maximum === \"number\") {\n if (schema.exclusiveMaximum === true) {\n builder += `.lt(${schema.maximum})`\n } else {\n builder += `.max(${schema.maximum})`\n }\n } else if (typeof schema.exclusiveMaximum === \"number\") {\n builder += `.lt(${schema.exclusiveMaximum})`\n }\n\n return builder\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../index.ts","../src/utils/topological-sort.ts","../src/utils/property-name.ts","../src/utils/http-status.ts","../src/zenko.ts"],"sourcesContent":["export {\n generate,\n type OpenAPISpec,\n type GenerateOptions,\n type TypesConfig,\n} from \"./src/zenko\"\nexport {\n type PathFn,\n type HeaderFn,\n type OperationErrors,\n type OperationDefinition,\n} from \"./src/types\"\n","export function topologicalSort(schemas: Record<string, any>): string[] {\n const visited = new Set<string>()\n const visiting = new Set<string>()\n const result: string[] = []\n\n const visit = (name: string): void => {\n if (visited.has(name)) return\n if (visiting.has(name)) {\n // Circular dependency detected, just add it anyway\n return\n }\n\n visiting.add(name)\n\n // Find dependencies of this schema\n const schema = schemas[name]\n const dependencies = extractDependencies(schema)\n\n // Visit dependencies first\n for (const dep of dependencies) {\n if (schemas[dep]) {\n visit(dep)\n }\n }\n\n visiting.delete(name)\n visited.add(name)\n result.push(name)\n }\n\n // Visit all schemas\n for (const name of Object.keys(schemas)) {\n visit(name)\n }\n\n return result\n}\n\nexport function extractDependencies(schema: any): string[] {\n const dependencies: string[] = []\n\n const traverse = (obj: any): void => {\n if (typeof obj !== \"object\" || obj === null) return\n\n if (obj.$ref && typeof obj.$ref === \"string\") {\n const refName = extractRefName(obj.$ref)\n dependencies.push(refName)\n return\n }\n\n if (Array.isArray(obj)) {\n obj.forEach(traverse)\n } else {\n Object.values(obj).forEach(traverse)\n }\n }\n\n traverse(schema)\n return [...new Set(dependencies)] // Remove duplicates\n}\n\nexport function extractRefName(ref: string): string {\n return ref.split(\"/\").pop() || \"Unknown\"\n}\n","/**\n * Checks if a string is a valid JavaScript identifier\n */\nexport function isValidJSIdentifier(name: string): boolean {\n // Check if name is empty\n if (!name) return false\n\n // Check if first character is valid (letter, underscore, or $)\n const firstChar = name.at(0)\n if (firstChar === undefined) return false\n if (!/[a-zA-Z_$]/.test(firstChar)) return false\n\n if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name)) return false\n\n // Check if it's a reserved word\n const reservedWords = new Set([\n \"abstract\",\n \"arguments\",\n \"await\",\n \"boolean\",\n \"break\",\n \"byte\",\n \"case\",\n \"catch\",\n \"char\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"double\",\n \"else\",\n \"enum\",\n \"eval\",\n \"export\",\n \"extends\",\n \"false\",\n \"final\",\n \"finally\",\n \"float\",\n \"for\",\n \"function\",\n \"goto\",\n \"if\",\n \"implements\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"int\",\n \"interface\",\n \"let\",\n \"long\",\n \"native\",\n \"new\",\n \"null\",\n \"package\",\n \"private\",\n \"protected\",\n \"public\",\n \"return\",\n \"short\",\n \"static\",\n \"super\",\n \"switch\",\n \"synchronized\",\n \"this\",\n \"throw\",\n \"throws\",\n \"transient\",\n \"true\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"volatile\",\n \"while\",\n \"with\",\n \"yield\",\n \"async\",\n ])\n\n return !reservedWords.has(name)\n}\n\n/**\n * Formats a property name for use in JavaScript/TypeScript object literals\n * Quotes the name if it's not a valid JavaScript identifier\n */\nexport function formatPropertyName(name: string): string {\n return isValidJSIdentifier(name) ? name : `\"${name}\"`\n}\n","const statusNameMap: Record<string, string> = {\n \"400\": \"badRequest\",\n \"401\": \"unauthorized\",\n \"402\": \"paymentRequired\",\n \"403\": \"forbidden\",\n \"404\": \"notFound\",\n \"405\": \"methodNotAllowed\",\n \"406\": \"notAcceptable\",\n \"407\": \"proxyAuthenticationRequired\",\n \"408\": \"requestTimeout\",\n \"409\": \"conflict\",\n \"410\": \"gone\",\n \"411\": \"lengthRequired\",\n \"412\": \"preconditionFailed\",\n \"413\": \"payloadTooLarge\",\n \"414\": \"uriTooLong\",\n \"415\": \"unsupportedMediaType\",\n \"416\": \"rangeNotSatisfiable\",\n \"417\": \"expectationFailed\",\n \"418\": \"imATeapot\",\n \"421\": \"misdirectedRequest\",\n \"422\": \"unprocessableEntity\",\n \"423\": \"locked\",\n \"424\": \"failedDependency\",\n \"425\": \"tooEarly\",\n \"426\": \"upgradeRequired\",\n \"428\": \"preconditionRequired\",\n \"429\": \"tooManyRequests\",\n \"431\": \"requestHeaderFieldsTooLarge\",\n \"451\": \"unavailableForLegalReasons\",\n \"500\": \"internalServerError\",\n \"501\": \"notImplemented\",\n \"502\": \"badGateway\",\n \"503\": \"serviceUnavailable\",\n \"504\": \"gatewayTimeout\",\n \"505\": \"httpVersionNotSupported\",\n \"506\": \"variantAlsoNegotiates\",\n \"507\": \"insufficientStorage\",\n \"508\": \"loopDetected\",\n \"510\": \"notExtended\",\n \"511\": \"networkAuthenticationRequired\",\n} as const\n\nexport type StatusCategory = \"client\" | \"server\" | \"default\" | \"unknown\"\n\nexport function mapStatusToIdentifier(status: string): string {\n if (status === \"default\") return \"defaultError\"\n\n const trimmed = status.trim()\n const mapped = statusNameMap[trimmed]\n if (mapped) return mapped\n\n if (/^\\d{3}$/.test(trimmed)) {\n return `status${trimmed}`\n }\n\n const sanitized = trimmed\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \" \")\n .trim()\n\n if (!sanitized) return \"unknownError\"\n\n const parts = sanitized.split(/\\s+/)\n const [first, ...rest] = parts\n const candidate =\n first +\n rest\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join(\"\")\n\n if (!candidate) return \"unknownError\"\n\n return /^[a-zA-Z_$]/.test(candidate)\n ? candidate\n : `status${candidate.charAt(0).toUpperCase()}${candidate.slice(1)}`\n}\n\nexport function getStatusCategory(status: string): StatusCategory {\n if (status === \"default\") return \"default\"\n\n const code = Number(status)\n if (!Number.isInteger(code)) return \"unknown\"\n\n if (code >= 400 && code <= 499) return \"client\"\n if (code >= 500 && code <= 599) return \"server\"\n\n return \"unknown\"\n}\n\nexport function isErrorStatus(status: string): boolean {\n if (status === \"default\") return true\n const code = Number(status)\n if (!Number.isInteger(code)) return false\n return code >= 400\n}\n","import { topologicalSort, extractRefName } from \"./utils/topological-sort\"\nimport { formatPropertyName, isValidJSIdentifier } from \"./utils/property-name\"\nimport {\n getStatusCategory,\n isErrorStatus,\n mapStatusToIdentifier,\n} from \"./utils/http-status\"\n\nexport type OpenAPISpec = {\n openapi: string\n info: unknown\n paths: Record<string, Record<string, unknown>>\n components?: {\n schemas?: Record<string, unknown>\n parameters?: Record<string, unknown>\n }\n}\n\nexport type TypesHelperMode = \"package\" | \"inline\" | \"file\"\n\nexport type TypesConfig = {\n emit?: boolean\n helpers?: TypesHelperMode\n helpersOutput?: string\n}\n\nexport type GenerateOptions = {\n strictDates?: boolean\n strictNumeric?: boolean\n types?: TypesConfig\n}\n\ntype PathParam = {\n name: string\n type: string\n}\n\ntype QueryParam = {\n name: string\n description?: string\n schema?: any\n required?: boolean\n}\n\ntype Operation = {\n operationId: string\n path: string\n method: string\n pathParams: PathParam[]\n queryParams: QueryParam[]\n requestType?: string\n responseType?: string\n requestHeaders?: RequestHeader[]\n errors?: OperationErrorGroup\n}\ntype OperationErrorGroup = {\n clientErrors?: OperationErrorMap\n serverErrors?: OperationErrorMap\n defaultErrors?: OperationErrorMap\n otherErrors?: OperationErrorMap\n}\ntype OperationErrorMap = Record<string, string>\n\ntype RequestHeader = {\n name: string\n description?: string\n schema?: any\n required?: boolean\n}\n\nexport function generate(\n spec: OpenAPISpec,\n options: GenerateOptions = {}\n): string {\n const output: string[] = []\n const generatedTypes = new Set<string>()\n const { strictDates = false, strictNumeric = false } = options\n const typesConfig = normalizeTypesConfig(options.types)\n const schemaOptions: SchemaOptions = {\n strictDates,\n strictNumeric,\n }\n\n output.push('import { z } from \"zod\";')\n appendHelperTypesImport(output, typesConfig)\n output.push(\"\")\n\n // Generate Zod schemas from components/schemas\n if (spec.components?.schemas) {\n output.push(\"// Generated Zod Schemas\")\n output.push(\"\")\n\n // Sort schemas by dependencies (topological sort)\n const sortedSchemas = topologicalSort(spec.components.schemas)\n\n for (const name of sortedSchemas) {\n const schema = spec.components.schemas[name]\n output.push(\n generateZodSchema(name, schema, generatedTypes, schemaOptions)\n )\n output.push(\"\")\n // Export inferred type\n output.push(`export type ${name} = z.infer<typeof ${name}>;`)\n output.push(\"\")\n }\n }\n\n // Parse all operations\n const operations = parseOperations(spec)\n\n // Generate path functions\n output.push(\"// Path Functions\")\n output.push(\"export const paths = {\")\n\n for (const op of operations) {\n const pathParamNames = op.pathParams.map((p) => p.name)\n const hasPathParams = pathParamNames.length > 0\n const hasQueryParams = op.queryParams.length > 0\n\n if (!hasPathParams && !hasQueryParams) {\n output.push(` ${op.operationId}: () => \"${op.path}\",`)\n continue\n }\n\n const allParamNames = [\n ...pathParamNames,\n ...op.queryParams.map((p) => p.name),\n ]\n const signaturePieces: string[] = []\n for (const param of op.pathParams) {\n signaturePieces.push(`${param.name}: string`)\n }\n for (const param of op.queryParams) {\n signaturePieces.push(\n `${param.name}${param.required ? \"\" : \"?\"}: ${mapQueryType(param)}`\n )\n }\n const signatureParams = signaturePieces.join(\", \")\n const needsDefaultObject =\n !hasPathParams &&\n hasQueryParams &&\n op.queryParams.every((param) => !param.required)\n const signatureArgs = allParamNames.length\n ? `{ ${allParamNames.join(\", \")} }`\n : \"{}\"\n const signature = `${signatureArgs}: { ${signatureParams} }${\n needsDefaultObject ? \" = {}\" : \"\"\n }`\n\n const pathWithParams = op.path.replace(/{([^}]+)}/g, \"${$1}\")\n\n if (!hasQueryParams) {\n output.push(\n ` ${op.operationId}: (${signature}) => \\`${pathWithParams}\\`,`\n )\n continue\n }\n\n output.push(` ${op.operationId}: (${signature}) => {`)\n\n output.push(\" const params = new URLSearchParams()\")\n for (const param of op.queryParams) {\n const propertyKey = formatPropertyName(param.name)\n const accessor = isValidJSIdentifier(param.name)\n ? param.name\n : propertyKey\n const schema = param.schema ?? {}\n\n if (schema?.type === \"array\") {\n const itemValueExpression = convertQueryParamValue(\n schema.items ?? {},\n \"value\"\n )\n\n if (param.required) {\n output.push(` for (const value of ${accessor}) {`)\n output.push(\n ` params.append(\"${param.name}\", ${itemValueExpression})`\n )\n output.push(\" }\")\n } else {\n output.push(` if (${accessor} !== undefined) {`)\n output.push(` for (const value of ${accessor}) {`)\n output.push(\n ` params.append(\"${param.name}\", ${itemValueExpression})`\n )\n output.push(\" }\")\n output.push(\" }\")\n }\n\n continue\n }\n\n const valueExpression = convertQueryParamValue(schema, accessor)\n if (param.required) {\n output.push(` params.set(\"${param.name}\", ${valueExpression})`)\n } else {\n output.push(` if (${accessor} !== undefined) {`)\n output.push(` params.set(\"${param.name}\", ${valueExpression})`)\n output.push(\" }\")\n }\n }\n\n output.push(\" const _searchParams = params.toString()\")\n output.push(\n ` return \\`${pathWithParams}\\${_searchParams ? \\`?\\${_searchParams}\\` : \"\"}\\``\n )\n output.push(\" },\")\n }\n\n output.push(\"} as const;\")\n output.push(\"\")\n\n // Generate header functions\n output.push(\"// Header Functions\")\n output.push(\"export const headers = {\")\n\n for (const op of operations) {\n if (!op.requestHeaders || op.requestHeaders.length === 0) {\n output.push(` ${op.operationId}: () => ({}),`)\n continue\n }\n\n const typeEntries = op.requestHeaders\n .map(\n (header) =>\n `${formatPropertyName(header.name)}${header.required ? \"\" : \"?\"}: ${mapHeaderType(\n header\n )}`\n )\n .join(\", \")\n\n const requiredHeaders = op.requestHeaders.filter(\n (header) => header.required\n )\n const optionalHeaders = op.requestHeaders.filter(\n (header) => !header.required\n )\n const hasRequired = requiredHeaders.length > 0\n const signature = hasRequired\n ? `(params: { ${typeEntries} })`\n : `(params: { ${typeEntries} } = {})`\n\n if (optionalHeaders.length === 0) {\n output.push(` ${op.operationId}: ${signature} => ({`)\n\n for (const header of requiredHeaders) {\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n output.push(` ${propertyKey}: ${accessor},`)\n }\n\n output.push(\" }),\")\n continue\n }\n\n if (!hasRequired && optionalHeaders.length === 1 && optionalHeaders[0]) {\n const header = optionalHeaders[0]\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n\n output.push(` ${op.operationId}: ${signature} =>`)\n output.push(\n ` ${accessor} !== undefined ? { ${propertyKey}: ${accessor} } : {},`\n )\n continue\n }\n\n const valueTypes = Array.from(\n new Set(optionalHeaders.map((header) => mapHeaderType(header)))\n ).join(\" | \")\n\n output.push(` ${op.operationId}: ${signature} => {`)\n\n if (hasRequired) {\n output.push(\" const headers = {\")\n for (const header of requiredHeaders) {\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n output.push(` ${propertyKey}: ${accessor},`)\n }\n output.push(\" }\")\n } else {\n output.push(` const headers: Record<string, ${valueTypes}> = {}`)\n }\n\n for (const header of optionalHeaders) {\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n const assignment = isValidJSIdentifier(header.name)\n ? `headers.${header.name}`\n : `headers[${propertyKey}]`\n\n output.push(` if (${accessor} !== undefined) {`)\n output.push(` ${assignment} = ${accessor}`)\n output.push(\" }\")\n }\n\n output.push(\" return headers\")\n output.push(\" },\")\n }\n\n output.push(\"} as const;\")\n output.push(\"\")\n\n // Generate operation objects\n output.push(\"// Operation Objects\")\n for (const op of operations) {\n output.push(`export const ${op.operationId} = {`)\n output.push(` path: paths.${op.operationId},`)\n\n appendOperationField(output, \"request\", op.requestType)\n appendOperationField(output, \"response\", op.responseType)\n\n if (op.requestHeaders && op.requestHeaders.length > 0) {\n output.push(` headers: headers.${op.operationId},`)\n }\n\n if (op.errors && hasAnyErrors(op.errors)) {\n output.push(\" errors: {\")\n appendErrorGroup(output, \"clientErrors\", op.errors.clientErrors)\n appendErrorGroup(output, \"serverErrors\", op.errors.serverErrors)\n appendErrorGroup(output, \"defaultErrors\", op.errors.defaultErrors)\n appendErrorGroup(output, \"otherErrors\", op.errors.otherErrors)\n output.push(\" },\")\n }\n\n output.push(\"} as const;\")\n output.push(\"\")\n }\n\n generateOperationTypes(output, operations, typesConfig)\n\n return output.join(\"\\n\")\n}\n\nfunction appendOperationField(\n buffer: string[],\n key: string,\n value?: string\n): void {\n if (!value) return\n buffer.push(` ${key}: ${value},`)\n}\n\nfunction appendErrorGroup(\n buffer: string[],\n label: string,\n errors?: OperationErrorMap\n): void {\n if (!errors || Object.keys(errors).length === 0) return\n buffer.push(` ${label}: {`)\n for (const [name, typeName] of Object.entries(errors)) {\n buffer.push(` ${formatPropertyName(name)}: ${typeName},`)\n }\n buffer.push(\" },\")\n}\n\nfunction hasAnyErrors(group: OperationErrorGroup): boolean {\n return [\n group.clientErrors,\n group.serverErrors,\n group.defaultErrors,\n group.otherErrors,\n ].some((bucket) => bucket && Object.keys(bucket).length > 0)\n}\n\nfunction parseOperations(spec: OpenAPISpec): Operation[] {\n const operations: Operation[] = []\n\n for (const [path, pathItem] of Object.entries(spec.paths)) {\n for (const [method, operation] of Object.entries(pathItem)) {\n if (!(operation as any).operationId) continue\n\n const pathParams = extractPathParams(path)\n const requestType = getRequestType(operation)\n const { successResponse, errors } = getResponseTypes(\n operation,\n (operation as any).operationId\n )\n const resolvedParameters = collectParameters(pathItem, operation, spec)\n const requestHeaders = getRequestHeaders(resolvedParameters)\n const queryParams = getQueryParams(resolvedParameters)\n\n operations.push({\n operationId: (operation as any).operationId,\n path,\n method: method.toLowerCase(),\n pathParams,\n queryParams,\n requestType,\n responseType: successResponse,\n requestHeaders,\n errors,\n })\n }\n }\n\n return operations\n}\n\nfunction normalizeTypesConfig(\n config: TypesConfig | undefined\n): NormalizedTypesConfig {\n return {\n emit: config?.emit ?? true,\n helpers: config?.helpers ?? \"package\",\n helpersOutput: config?.helpersOutput ?? \"./zenko-types\",\n }\n}\n\ntype NormalizedTypesConfig = {\n emit: boolean\n helpers: TypesHelperMode\n helpersOutput: string\n}\n\nfunction appendHelperTypesImport(\n buffer: string[],\n config: NormalizedTypesConfig\n) {\n if (!config.emit) return\n\n switch (config.helpers) {\n case \"package\":\n buffer.push(\n 'import type { PathFn, HeaderFn, OperationDefinition, OperationErrors } from \"zenko\";'\n )\n return\n case \"file\":\n buffer.push(\n `import type { PathFn, HeaderFn, OperationDefinition, OperationErrors } from \"${config.helpersOutput}\";`\n )\n return\n case \"inline\":\n buffer.push(\n \"type PathFn<TArgs extends unknown[] = []> = (...args: TArgs) => string;\"\n )\n buffer.push(\n \"type HeaderFn<TArgs extends unknown[] = [], TResult = Record<string, unknown> | Record<string, never>> = (...args: TArgs) => TResult;\"\n )\n buffer.push(\n \"type OperationErrors<TClient = unknown, TServer = unknown, TDefault = unknown, TOther = unknown> = {\"\n )\n buffer.push(\" clientErrors?: Record<string, TClient>;\")\n buffer.push(\" serverErrors?: Record<string, TServer>;\")\n buffer.push(\" defaultErrors?: Record<string, TDefault>;\")\n buffer.push(\" otherErrors?: Record<string, TOther>;\")\n buffer.push(\"};\")\n buffer.push(\n \"type OperationDefinition<TPath extends (...args: any[]) => string, TRequest = undefined, TResponse = undefined, THeaders extends HeaderFn | undefined = undefined, TErrors extends OperationErrors | undefined = undefined> = {\"\n )\n buffer.push(\" path: TPath;\")\n buffer.push(\" request?: TRequest;\")\n buffer.push(\" response?: TResponse;\")\n buffer.push(\" headers?: THeaders;\")\n buffer.push(\" errors?: TErrors;\")\n buffer.push(\"};\")\n return\n }\n}\n\nfunction generateOperationTypes(\n buffer: string[],\n operations: Operation[],\n config: NormalizedTypesConfig\n) {\n if (!config.emit) return\n\n buffer.push(\"// Operation Types\")\n\n for (const op of operations) {\n const headerType = op.requestHeaders?.length\n ? `typeof headers.${op.operationId}`\n : \"undefined\"\n const requestType = op.requestType ?? \"undefined\"\n const responseType = op.responseType ?? \"undefined\"\n const errorsType = buildOperationErrorsType(op.errors)\n\n buffer.push(\n `export type ${capitalize(op.operationId)}Operation = OperationDefinition<`\n )\n buffer.push(` typeof paths.${op.operationId},`)\n buffer.push(` ${requestType},`)\n buffer.push(` ${responseType},`)\n buffer.push(` ${headerType},`)\n buffer.push(` ${errorsType}`)\n buffer.push(`>;`)\n buffer.push(\"\")\n }\n}\n\nfunction buildOperationErrorsType(errors?: OperationErrorGroup): string {\n if (!errors || !hasAnyErrors(errors)) {\n return \"OperationErrors\"\n }\n\n const client = buildErrorBucket(errors.clientErrors)\n const server = buildErrorBucket(errors.serverErrors)\n const fallback = buildErrorBucket(errors.defaultErrors)\n const other = buildErrorBucket(errors.otherErrors)\n\n return `OperationErrors<${client}, ${server}, ${fallback}, ${other}>`\n}\n\nfunction buildErrorBucket(bucket?: OperationErrorMap): string {\n if (!bucket || Object.keys(bucket).length === 0) {\n return \"unknown\"\n }\n\n const entries = Object.entries(bucket)\n const typeEntries = entries\n .map(([name, type]) => `${formatPropertyName(name)}: ${type}`)\n .join(\"; \")\n\n return `{ ${typeEntries} }`\n}\n\nfunction collectParameters(\n pathItem: Record<string, unknown>,\n operation: unknown,\n spec: OpenAPISpec\n): any[] {\n const parametersMap = new Map<string, any>()\n\n const addParameters = (params: unknown) => {\n if (!Array.isArray(params)) return\n\n for (const param of params) {\n const resolved = resolveParameter(param, spec)\n if (!resolved) continue\n const key = `${resolved.in}:${resolved.name}`\n parametersMap.set(key, resolved)\n }\n }\n\n addParameters((pathItem as any).parameters)\n addParameters((operation as any).parameters)\n\n return Array.from(parametersMap.values())\n}\n\nfunction resolveParameter(parameter: any, spec: OpenAPISpec) {\n if (!parameter) return undefined\n\n if (parameter.$ref) {\n const refName = extractRefName(parameter.$ref)\n const resolved = spec.components?.parameters?.[refName]\n if (!resolved) return undefined\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { $ref, ...overrides } = parameter\n return {\n ...resolved,\n ...overrides,\n }\n }\n\n return parameter\n}\n\nfunction extractPathParams(path: string): PathParam[] {\n const params: PathParam[] = []\n const matches = path.match(/{([^}]+)}/g)\n\n if (matches) {\n for (const match of matches) {\n const paramName = match.slice(1, -1)\n params.push({\n name: paramName,\n type: \"string\", // OpenAPI path params are always strings\n })\n }\n }\n\n return params\n}\n\nfunction getRequestType(operation: any): string | undefined {\n const requestBody =\n operation.requestBody?.content?.[\"application/json\"]?.schema\n if (!requestBody) return undefined\n\n if (requestBody.$ref) {\n return extractRefName(requestBody.$ref)\n }\n\n // Generate inline type if needed\n const typeName = `${capitalize(operation.operationId)}Request`\n return typeName\n}\n\nfunction getResponseTypes(\n operation: any,\n operationId: string\n): { successResponse?: string; errors?: OperationErrorGroup } {\n const responses = operation.responses ?? {}\n const successCodes = new Map<string, string>()\n const errorEntries: Array<{ code: string; schema: any }> = []\n\n for (const [statusCode, response] of Object.entries(responses)) {\n const resolvedSchema = (response as any)?.content?.[\"application/json\"]\n ?.schema\n if (!resolvedSchema) continue\n\n if (isErrorStatus(statusCode)) {\n errorEntries.push({ code: statusCode, schema: resolvedSchema })\n continue\n }\n\n if (/^2\\d\\d$/.test(statusCode) || statusCode === \"default\") {\n successCodes.set(statusCode, resolvedSchema)\n }\n }\n\n const successResponse = selectSuccessResponse(successCodes, operationId)\n const errors = buildErrorGroups(errorEntries, operationId)\n\n return { successResponse, errors }\n}\n\nfunction selectSuccessResponse(\n responses: Map<string, any>,\n operationId: string\n): string | undefined {\n if (responses.size === 0) return undefined\n\n const preferredOrder = [\"200\", \"201\", \"204\"]\n for (const code of preferredOrder) {\n const schema = responses.get(code)\n if (schema) {\n return resolveResponseType(\n schema,\n `${capitalize(operationId)}Response${code}`\n )\n }\n }\n\n const [firstCode, firstSchema] = responses.entries().next().value ?? []\n if (!firstSchema) return undefined\n return resolveResponseType(\n firstSchema,\n `${capitalize(operationId)}Response${firstCode ?? \"Default\"}`\n )\n}\n\nfunction buildErrorGroups(\n errors: Array<{ code: string; schema: any }> = [],\n operationId: string\n): OperationErrorGroup | undefined {\n if (!errors.length) return undefined\n\n const group: OperationErrorGroup = {}\n\n for (const { code, schema } of errors) {\n const category = getStatusCategory(code)\n const identifier = mapStatusToIdentifier(code)\n const typeName = resolveResponseType(\n schema,\n `${capitalize(operationId)}${capitalize(identifier)}`\n )\n\n switch (category) {\n case \"client\":\n group.clientErrors ??= {}\n group.clientErrors[identifier] = typeName\n break\n case \"server\":\n group.serverErrors ??= {}\n group.serverErrors[identifier] = typeName\n break\n case \"default\":\n group.defaultErrors ??= {}\n group.defaultErrors[identifier] = typeName\n break\n default:\n group.otherErrors ??= {}\n group.otherErrors[identifier] = typeName\n break\n }\n }\n\n return group\n}\n\nfunction resolveResponseType(schema: any, fallbackName: string): string {\n if (schema.$ref) {\n return extractRefName(schema.$ref)\n }\n return fallbackName\n}\n\nfunction getRequestHeaders(parameters: any[]): RequestHeader[] {\n const headers: RequestHeader[] = []\n\n for (const param of parameters ?? []) {\n if ((param as any).in === \"header\") {\n headers.push({\n name: (param as any).name,\n description: (param as any).description,\n schema: (param as any).schema,\n required: (param as any).required,\n })\n }\n }\n\n return headers\n}\n\nfunction getQueryParams(parameters: any[]): QueryParam[] {\n const queryParams: QueryParam[] = []\n\n for (const param of parameters ?? []) {\n if ((param as any).in === \"query\") {\n queryParams.push({\n name: (param as any).name,\n description: (param as any).description,\n schema: (param as any).schema,\n required: (param as any).required,\n })\n }\n }\n\n return queryParams\n}\n\nfunction mapHeaderType(header: RequestHeader): string {\n const schemaType = header.schema?.type\n switch (schemaType) {\n case \"integer\":\n case \"number\":\n return \"number\"\n case \"boolean\":\n return \"boolean\"\n default:\n return \"string\"\n }\n}\n\nfunction mapQueryType(param: QueryParam): string {\n return mapQuerySchemaType(param.schema)\n}\n\nfunction mapQuerySchemaType(schema: any): string {\n if (!schema) return \"string\"\n\n if (schema.type === \"array\") {\n const itemType = mapQuerySchemaType(schema.items)\n return `Array<${itemType}>`\n }\n\n switch (schema.type) {\n case \"integer\":\n case \"number\":\n return \"number\"\n case \"boolean\":\n return \"boolean\"\n default:\n return \"string\"\n }\n}\n\nfunction convertQueryParamValue(schema: any, accessor: string): string {\n if (!schema) {\n return `String(${accessor})`\n }\n\n switch (schema.type) {\n case \"integer\":\n case \"number\":\n return `String(${accessor})`\n case \"boolean\":\n return `${accessor} ? \"true\" : \"false\"`\n default:\n return `String(${accessor})`\n }\n}\n\ntype SchemaOptions = {\n strictDates: boolean\n strictNumeric: boolean\n}\n\nfunction generateZodSchema(\n name: string,\n schema: any,\n generatedTypes: Set<string>,\n options: SchemaOptions\n): string {\n if (generatedTypes.has(name)) return \"\"\n generatedTypes.add(name)\n\n if (schema.enum) {\n const enumValues = schema.enum.map((v: string) => `\"${v}\"`).join(\", \")\n return `export const ${name} = z.enum([${enumValues}]);`\n }\n\n if (schema.type === \"object\" || schema.properties) {\n return `export const ${name} = ${buildZodObject(schema, options)};`\n }\n\n if (schema.type === \"array\") {\n const itemSchema = schema.items ?? { type: \"unknown\" }\n const itemType = getZodTypeFromSchema(itemSchema, options)\n const builder = applyStrictArrayBounds(\n schema,\n `z.array(${itemType})`,\n itemSchema,\n options.strictNumeric\n )\n return `export const ${name} = ${builder};`\n }\n\n return `export const ${name} = ${getZodTypeFromSchema(schema, options)};`\n}\n\nfunction getZodTypeFromSchema(schema: any, options: SchemaOptions): string {\n if (schema.$ref) {\n return extractRefName(schema.$ref)\n }\n\n if (schema.enum) {\n const enumValues = schema.enum.map((v: string) => `\"${v}\"`).join(\", \")\n return `z.enum([${enumValues}])`\n }\n\n if (schema.type === \"object\" || schema.properties) {\n return buildZodObject(schema, options)\n }\n\n switch (schema.type) {\n case \"string\":\n return buildString(schema, options)\n case \"boolean\":\n return \"z.boolean()\"\n case \"array\":\n return `z.array(${getZodTypeFromSchema(\n schema.items ?? { type: \"unknown\" },\n options\n )})`\n case \"null\":\n return \"z.null()\"\n case \"number\":\n return buildNumber(schema, options)\n case \"integer\":\n return buildInteger(schema, options)\n default:\n return \"z.unknown()\"\n }\n}\n\nfunction buildZodObject(schema: any, options: SchemaOptions): string {\n const properties: string[] = []\n\n for (const [propName, propSchema] of Object.entries(\n schema.properties || {}\n )) {\n const isRequired = schema.required?.includes(propName) ?? false\n const zodType = getZodTypeFromSchema(propSchema as any, options)\n const finalType = isRequired ? zodType : `${zodType}.optional()`\n properties.push(` ${formatPropertyName(propName)}: ${finalType},`)\n }\n\n if (properties.length === 0) {\n return \"z.object({})\"\n }\n\n return `z.object({\\n${properties.join(\"\\n\")}\\n})`\n}\n\nfunction buildString(schema: any, options: SchemaOptions): string {\n if (options.strictDates) {\n switch (schema.format) {\n case \"date-time\":\n return \"z.string().datetime()\"\n case \"date\":\n return \"z.string().date()\"\n case \"time\":\n return \"z.string().time()\"\n case \"duration\":\n return \"z.string().duration()\"\n }\n }\n\n let builder = \"z.string()\"\n\n if (options.strictNumeric) {\n if (typeof schema.minLength === \"number\") {\n builder += `.min(${schema.minLength})`\n }\n\n if (typeof schema.maxLength === \"number\") {\n builder += `.max(${schema.maxLength})`\n }\n\n if (schema.pattern) {\n builder += `.regex(new RegExp(${JSON.stringify(schema.pattern)}))`\n }\n }\n\n switch (schema.format) {\n case \"uuid\":\n return `${builder}.uuid()`\n case \"email\":\n return `${builder}.email()`\n case \"uri\":\n case \"url\":\n return `${builder}.url()`\n case \"ipv4\":\n return `${builder}.ip({ version: \"v4\" })`\n case \"ipv6\":\n return `${builder}.ip({ version: \"v6\" })`\n default:\n return builder\n }\n}\n\nfunction buildNumber(schema: any, options: SchemaOptions): string {\n let builder = \"z.number()\"\n\n if (options.strictNumeric) {\n builder = applyNumericBounds(schema, builder)\n\n if (typeof schema.multipleOf === \"number\" && schema.multipleOf !== 0) {\n builder += `.refine((value) => Math.abs(value / ${schema.multipleOf} - Math.round(value / ${schema.multipleOf})) < Number.EPSILON, { message: \"Must be a multiple of ${schema.multipleOf}\" })`\n }\n }\n\n return builder\n}\n\nfunction buildInteger(schema: any, options: SchemaOptions): string {\n let builder = buildNumber(schema, options)\n builder += \".int()\"\n return builder\n}\n\nfunction applyStrictArrayBounds(\n schema: any,\n builder: string,\n itemSchema: any,\n enforceBounds: boolean\n): string {\n if (!enforceBounds) {\n return builder\n }\n\n if (typeof schema.minItems === \"number\") {\n builder += `.min(${schema.minItems})`\n }\n\n if (typeof schema.maxItems === \"number\") {\n builder += `.max(${schema.maxItems})`\n }\n\n if (schema.uniqueItems && isPrimitiveLike(itemSchema)) {\n builder +=\n '.refine((items) => new Set(items).size === items.length, { message: \"Items must be unique\" })'\n }\n\n return builder\n}\n\nfunction isPrimitiveLike(schema: any): boolean {\n if (schema?.$ref) return false\n\n const primitiveTypes = new Set([\"string\", \"number\", \"integer\", \"boolean\"])\n return primitiveTypes.has(schema?.type)\n}\n\nfunction applyNumericBounds(schema: any, builder: string): string {\n if (typeof schema.minimum === \"number\") {\n if (schema.exclusiveMinimum === true) {\n builder += `.gt(${schema.minimum})`\n } else {\n builder += `.min(${schema.minimum})`\n }\n } else if (typeof schema.exclusiveMinimum === \"number\") {\n builder += `.gt(${schema.exclusiveMinimum})`\n }\n\n if (typeof schema.maximum === \"number\") {\n if (schema.exclusiveMaximum === true) {\n builder += `.lt(${schema.maximum})`\n } else {\n builder += `.max(${schema.maximum})`\n }\n } else if (typeof schema.exclusiveMaximum === \"number\") {\n builder += `.lt(${schema.exclusiveMaximum})`\n }\n\n return builder\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,SAAS,gBAAgB,SAAwC;AACtE,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,SAAmB,CAAC;AAE1B,QAAM,QAAQ,CAAC,SAAuB;AACpC,QAAI,QAAQ,IAAI,IAAI,EAAG;AACvB,QAAI,SAAS,IAAI,IAAI,GAAG;AAEtB;AAAA,IACF;AAEA,aAAS,IAAI,IAAI;AAGjB,UAAM,SAAS,QAAQ,IAAI;AAC3B,UAAM,eAAe,oBAAoB,MAAM;AAG/C,eAAW,OAAO,cAAc;AAC9B,UAAI,QAAQ,GAAG,GAAG;AAChB,cAAM,GAAG;AAAA,MACX;AAAA,IACF;AAEA,aAAS,OAAO,IAAI;AACpB,YAAQ,IAAI,IAAI;AAChB,WAAO,KAAK,IAAI;AAAA,EAClB;AAGA,aAAW,QAAQ,OAAO,KAAK,OAAO,GAAG;AACvC,UAAM,IAAI;AAAA,EACZ;AAEA,SAAO;AACT;AAEO,SAAS,oBAAoB,QAAuB;AACzD,QAAM,eAAyB,CAAC;AAEhC,QAAM,WAAW,CAAC,QAAmB;AACnC,QAAI,OAAO,QAAQ,YAAY,QAAQ,KAAM;AAE7C,QAAI,IAAI,QAAQ,OAAO,IAAI,SAAS,UAAU;AAC5C,YAAM,UAAU,eAAe,IAAI,IAAI;AACvC,mBAAa,KAAK,OAAO;AACzB;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,UAAI,QAAQ,QAAQ;AAAA,IACtB,OAAO;AACL,aAAO,OAAO,GAAG,EAAE,QAAQ,QAAQ;AAAA,IACrC;AAAA,EACF;AAEA,WAAS,MAAM;AACf,SAAO,CAAC,GAAG,IAAI,IAAI,YAAY,CAAC;AAClC;AAEO,SAAS,eAAe,KAAqB;AAClD,SAAO,IAAI,MAAM,GAAG,EAAE,IAAI,KAAK;AACjC;;;AC5DO,SAAS,oBAAoB,MAAuB;AAEzD,MAAI,CAAC,KAAM,QAAO;AAGlB,QAAM,YAAY,KAAK,GAAG,CAAC;AAC3B,MAAI,cAAc,OAAW,QAAO;AACpC,MAAI,CAAC,aAAa,KAAK,SAAS,EAAG,QAAO;AAE1C,MAAI,CAAC,6BAA6B,KAAK,IAAI,EAAG,QAAO;AAGrD,QAAM,gBAAgB,oBAAI,IAAI;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,CAAC,cAAc,IAAI,IAAI;AAChC;AAMO,SAAS,mBAAmB,MAAsB;AACvD,SAAO,oBAAoB,IAAI,IAAI,OAAO,IAAI,IAAI;AACpD;;;AC5FA,IAAM,gBAAwC;AAAA,EAC5C,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACT;AAIO,SAAS,sBAAsB,QAAwB;AAC5D,MAAI,WAAW,UAAW,QAAO;AAEjC,QAAM,UAAU,OAAO,KAAK;AAC5B,QAAM,SAAS,cAAc,OAAO;AACpC,MAAI,OAAQ,QAAO;AAEnB,MAAI,UAAU,KAAK,OAAO,GAAG;AAC3B,WAAO,SAAS,OAAO;AAAA,EACzB;AAEA,QAAM,YAAY,QACf,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,KAAK;AAER,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,QAAQ,UAAU,MAAM,KAAK;AACnC,QAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AACzB,QAAM,YACJ,QACA,KACG,IAAI,CAAC,YAAY,QAAQ,OAAO,CAAC,EAAE,YAAY,IAAI,QAAQ,MAAM,CAAC,CAAC,EACnE,KAAK,EAAE;AAEZ,MAAI,CAAC,UAAW,QAAO;AAEvB,SAAO,cAAc,KAAK,SAAS,IAC/B,YACA,SAAS,UAAU,OAAO,CAAC,EAAE,YAAY,CAAC,GAAG,UAAU,MAAM,CAAC,CAAC;AACrE;AAEO,SAAS,kBAAkB,QAAgC;AAChE,MAAI,WAAW,UAAW,QAAO;AAEjC,QAAM,OAAO,OAAO,MAAM;AAC1B,MAAI,CAAC,OAAO,UAAU,IAAI,EAAG,QAAO;AAEpC,MAAI,QAAQ,OAAO,QAAQ,IAAK,QAAO;AACvC,MAAI,QAAQ,OAAO,QAAQ,IAAK,QAAO;AAEvC,SAAO;AACT;AAEO,SAAS,cAAc,QAAyB;AACrD,MAAI,WAAW,UAAW,QAAO;AACjC,QAAM,OAAO,OAAO,MAAM;AAC1B,MAAI,CAAC,OAAO,UAAU,IAAI,EAAG,QAAO;AACpC,SAAO,QAAQ;AACjB;;;ACzBO,SAAS,SACd,MACA,UAA2B,CAAC,GACpB;AACR,QAAM,SAAmB,CAAC;AAC1B,QAAM,iBAAiB,oBAAI,IAAY;AACvC,QAAM,EAAE,cAAc,OAAO,gBAAgB,MAAM,IAAI;AACvD,QAAM,cAAc,qBAAqB,QAAQ,KAAK;AACtD,QAAM,gBAA+B;AAAA,IACnC;AAAA,IACA;AAAA,EACF;AAEA,SAAO,KAAK,0BAA0B;AACtC,0BAAwB,QAAQ,WAAW;AAC3C,SAAO,KAAK,EAAE;AAGd,MAAI,KAAK,YAAY,SAAS;AAC5B,WAAO,KAAK,0BAA0B;AACtC,WAAO,KAAK,EAAE;AAGd,UAAM,gBAAgB,gBAAgB,KAAK,WAAW,OAAO;AAE7D,eAAW,QAAQ,eAAe;AAChC,YAAM,SAAS,KAAK,WAAW,QAAQ,IAAI;AAC3C,aAAO;AAAA,QACL,kBAAkB,MAAM,QAAQ,gBAAgB,aAAa;AAAA,MAC/D;AACA,aAAO,KAAK,EAAE;AAEd,aAAO,KAAK,eAAe,IAAI,qBAAqB,IAAI,IAAI;AAC5D,aAAO,KAAK,EAAE;AAAA,IAChB;AAAA,EACF;AAGA,QAAM,aAAa,gBAAgB,IAAI;AAGvC,SAAO,KAAK,mBAAmB;AAC/B,SAAO,KAAK,wBAAwB;AAEpC,aAAW,MAAM,YAAY;AAC3B,UAAM,iBAAiB,GAAG,WAAW,IAAI,CAAC,MAAM,EAAE,IAAI;AACtD,UAAM,gBAAgB,eAAe,SAAS;AAC9C,UAAM,iBAAiB,GAAG,YAAY,SAAS;AAE/C,QAAI,CAAC,iBAAiB,CAAC,gBAAgB;AACrC,aAAO,KAAK,KAAK,GAAG,WAAW,YAAY,GAAG,IAAI,IAAI;AACtD;AAAA,IACF;AAEA,UAAM,gBAAgB;AAAA,MACpB,GAAG;AAAA,MACH,GAAG,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IACrC;AACA,UAAM,kBAA4B,CAAC;AACnC,eAAW,SAAS,GAAG,YAAY;AACjC,sBAAgB,KAAK,GAAG,MAAM,IAAI,UAAU;AAAA,IAC9C;AACA,eAAW,SAAS,GAAG,aAAa;AAClC,sBAAgB;AAAA,QACd,GAAG,MAAM,IAAI,GAAG,MAAM,WAAW,KAAK,GAAG,KAAK,aAAa,KAAK,CAAC;AAAA,MACnE;AAAA,IACF;AACA,UAAM,kBAAkB,gBAAgB,KAAK,IAAI;AACjD,UAAM,qBACJ,CAAC,iBACD,kBACA,GAAG,YAAY,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ;AACjD,UAAM,gBAAgB,cAAc,SAChC,KAAK,cAAc,KAAK,IAAI,CAAC,OAC7B;AACJ,UAAM,YAAY,GAAG,aAAa,OAAO,eAAe,KACtD,qBAAqB,UAAU,EACjC;AAEA,UAAM,iBAAiB,GAAG,KAAK,QAAQ,cAAc,OAAO;AAE5D,QAAI,CAAC,gBAAgB;AACnB,aAAO;AAAA,QACL,KAAK,GAAG,WAAW,MAAM,SAAS,UAAU,cAAc;AAAA,MAC5D;AACA;AAAA,IACF;AAEA,WAAO,KAAK,KAAK,GAAG,WAAW,MAAM,SAAS,QAAQ;AAEtD,WAAO,KAAK,0CAA0C;AACtD,eAAW,SAAS,GAAG,aAAa;AAClC,YAAM,cAAc,mBAAmB,MAAM,IAAI;AACjD,YAAM,WAAW,oBAAoB,MAAM,IAAI,IAC3C,MAAM,OACN;AACJ,YAAM,SAAS,MAAM,UAAU,CAAC;AAEhC,UAAI,QAAQ,SAAS,SAAS;AAC5B,cAAM,sBAAsB;AAAA,UAC1B,OAAO,SAAS,CAAC;AAAA,UACjB;AAAA,QACF;AAEA,YAAI,MAAM,UAAU;AAClB,iBAAO,KAAK,2BAA2B,QAAQ,KAAK;AACpD,iBAAO;AAAA,YACL,wBAAwB,MAAM,IAAI,MAAM,mBAAmB;AAAA,UAC7D;AACA,iBAAO,KAAK,OAAO;AAAA,QACrB,OAAO;AACL,iBAAO,KAAK,WAAW,QAAQ,mBAAmB;AAClD,iBAAO,KAAK,6BAA6B,QAAQ,KAAK;AACtD,iBAAO;AAAA,YACL,0BAA0B,MAAM,IAAI,MAAM,mBAAmB;AAAA,UAC/D;AACA,iBAAO,KAAK,SAAS;AACrB,iBAAO,KAAK,OAAO;AAAA,QACrB;AAEA;AAAA,MACF;AAEA,YAAM,kBAAkB,uBAAuB,QAAQ,QAAQ;AAC/D,UAAI,MAAM,UAAU;AAClB,eAAO,KAAK,mBAAmB,MAAM,IAAI,MAAM,eAAe,GAAG;AAAA,MACnE,OAAO;AACL,eAAO,KAAK,WAAW,QAAQ,mBAAmB;AAClD,eAAO,KAAK,qBAAqB,MAAM,IAAI,MAAM,eAAe,GAAG;AACnE,eAAO,KAAK,OAAO;AAAA,MACrB;AAAA,IACF;AAEA,WAAO,KAAK,6CAA6C;AACzD,WAAO;AAAA,MACL,gBAAgB,cAAc;AAAA,IAChC;AACA,WAAO,KAAK,MAAM;AAAA,EACpB;AAEA,SAAO,KAAK,aAAa;AACzB,SAAO,KAAK,EAAE;AAGd,SAAO,KAAK,qBAAqB;AACjC,SAAO,KAAK,0BAA0B;AAEtC,aAAW,MAAM,YAAY;AAC3B,QAAI,CAAC,GAAG,kBAAkB,GAAG,eAAe,WAAW,GAAG;AACxD,aAAO,KAAK,KAAK,GAAG,WAAW,eAAe;AAC9C;AAAA,IACF;AAEA,UAAM,cAAc,GAAG,eACpB;AAAA,MACC,CAAC,WACC,GAAG,mBAAmB,OAAO,IAAI,CAAC,GAAG,OAAO,WAAW,KAAK,GAAG,KAAK;AAAA,QAClE;AAAA,MACF,CAAC;AAAA,IACL,EACC,KAAK,IAAI;AAEZ,UAAM,kBAAkB,GAAG,eAAe;AAAA,MACxC,CAAC,WAAW,OAAO;AAAA,IACrB;AACA,UAAM,kBAAkB,GAAG,eAAe;AAAA,MACxC,CAAC,WAAW,CAAC,OAAO;AAAA,IACtB;AACA,UAAM,cAAc,gBAAgB,SAAS;AAC7C,UAAM,YAAY,cACd,cAAc,WAAW,QACzB,cAAc,WAAW;AAE7B,QAAI,gBAAgB,WAAW,GAAG;AAChC,aAAO,KAAK,KAAK,GAAG,WAAW,KAAK,SAAS,QAAQ;AAErD,iBAAW,UAAU,iBAAiB;AACpC,cAAM,cAAc,mBAAmB,OAAO,IAAI;AAClD,cAAM,WAAW,oBAAoB,OAAO,IAAI,IAC5C,UAAU,OAAO,IAAI,KACrB,UAAU,WAAW;AACzB,eAAO,KAAK,OAAO,WAAW,KAAK,QAAQ,GAAG;AAAA,MAChD;AAEA,aAAO,KAAK,OAAO;AACnB;AAAA,IACF;AAEA,QAAI,CAAC,eAAe,gBAAgB,WAAW,KAAK,gBAAgB,CAAC,GAAG;AACtE,YAAM,SAAS,gBAAgB,CAAC;AAChC,YAAM,cAAc,mBAAmB,OAAO,IAAI;AAClD,YAAM,WAAW,oBAAoB,OAAO,IAAI,IAC5C,UAAU,OAAO,IAAI,KACrB,UAAU,WAAW;AAEzB,aAAO,KAAK,KAAK,GAAG,WAAW,KAAK,SAAS,KAAK;AAClD,aAAO;AAAA,QACL,OAAO,QAAQ,sBAAsB,WAAW,KAAK,QAAQ;AAAA,MAC/D;AACA;AAAA,IACF;AAEA,UAAM,aAAa,MAAM;AAAA,MACvB,IAAI,IAAI,gBAAgB,IAAI,CAAC,WAAW,cAAc,MAAM,CAAC,CAAC;AAAA,IAChE,EAAE,KAAK,KAAK;AAEZ,WAAO,KAAK,KAAK,GAAG,WAAW,KAAK,SAAS,OAAO;AAEpD,QAAI,aAAa;AACf,aAAO,KAAK,uBAAuB;AACnC,iBAAW,UAAU,iBAAiB;AACpC,cAAM,cAAc,mBAAmB,OAAO,IAAI;AAClD,cAAM,WAAW,oBAAoB,OAAO,IAAI,IAC5C,UAAU,OAAO,IAAI,KACrB,UAAU,WAAW;AACzB,eAAO,KAAK,SAAS,WAAW,KAAK,QAAQ,GAAG;AAAA,MAClD;AACA,aAAO,KAAK,OAAO;AAAA,IACrB,OAAO;AACL,aAAO,KAAK,qCAAqC,UAAU,QAAQ;AAAA,IACrE;AAEA,eAAW,UAAU,iBAAiB;AACpC,YAAM,cAAc,mBAAmB,OAAO,IAAI;AAClD,YAAM,WAAW,oBAAoB,OAAO,IAAI,IAC5C,UAAU,OAAO,IAAI,KACrB,UAAU,WAAW;AACzB,YAAM,aAAa,oBAAoB,OAAO,IAAI,IAC9C,WAAW,OAAO,IAAI,KACtB,WAAW,WAAW;AAE1B,aAAO,KAAK,WAAW,QAAQ,mBAAmB;AAClD,aAAO,KAAK,SAAS,UAAU,MAAM,QAAQ,EAAE;AAC/C,aAAO,KAAK,OAAO;AAAA,IACrB;AAEA,WAAO,KAAK,oBAAoB;AAChC,WAAO,KAAK,MAAM;AAAA,EACpB;AAEA,SAAO,KAAK,aAAa;AACzB,SAAO,KAAK,EAAE;AAGd,SAAO,KAAK,sBAAsB;AAClC,aAAW,MAAM,YAAY;AAC3B,WAAO,KAAK,gBAAgB,GAAG,WAAW,MAAM;AAChD,WAAO,KAAK,iBAAiB,GAAG,WAAW,GAAG;AAE9C,yBAAqB,QAAQ,WAAW,GAAG,WAAW;AACtD,yBAAqB,QAAQ,YAAY,GAAG,YAAY;AAExD,QAAI,GAAG,kBAAkB,GAAG,eAAe,SAAS,GAAG;AACrD,aAAO,KAAK,sBAAsB,GAAG,WAAW,GAAG;AAAA,IACrD;AAEA,QAAI,GAAG,UAAU,aAAa,GAAG,MAAM,GAAG;AACxC,aAAO,KAAK,aAAa;AACzB,uBAAiB,QAAQ,gBAAgB,GAAG,OAAO,YAAY;AAC/D,uBAAiB,QAAQ,gBAAgB,GAAG,OAAO,YAAY;AAC/D,uBAAiB,QAAQ,iBAAiB,GAAG,OAAO,aAAa;AACjE,uBAAiB,QAAQ,eAAe,GAAG,OAAO,WAAW;AAC7D,aAAO,KAAK,MAAM;AAAA,IACpB;AAEA,WAAO,KAAK,aAAa;AACzB,WAAO,KAAK,EAAE;AAAA,EAChB;AAEA,yBAAuB,QAAQ,YAAY,WAAW;AAEtD,SAAO,OAAO,KAAK,IAAI;AACzB;AAEA,SAAS,qBACP,QACA,KACA,OACM;AACN,MAAI,CAAC,MAAO;AACZ,SAAO,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG;AACnC;AAEA,SAAS,iBACP,QACA,OACA,QACM;AACN,MAAI,CAAC,UAAU,OAAO,KAAK,MAAM,EAAE,WAAW,EAAG;AACjD,SAAO,KAAK,OAAO,KAAK,KAAK;AAC7B,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,MAAM,GAAG;AACrD,WAAO,KAAK,SAAS,mBAAmB,IAAI,CAAC,KAAK,QAAQ,GAAG;AAAA,EAC/D;AACA,SAAO,KAAK,QAAQ;AACtB;AAEA,SAAS,aAAa,OAAqC;AACzD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR,EAAE,KAAK,CAAC,WAAW,UAAU,OAAO,KAAK,MAAM,EAAE,SAAS,CAAC;AAC7D;AAEA,SAAS,gBAAgB,MAAgC;AACvD,QAAM,aAA0B,CAAC;AAEjC,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,KAAK,KAAK,GAAG;AACzD,eAAW,CAAC,QAAQ,SAAS,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC1D,UAAI,CAAE,UAAkB,YAAa;AAErC,YAAM,aAAa,kBAAkB,IAAI;AACzC,YAAM,cAAc,eAAe,SAAS;AAC5C,YAAM,EAAE,iBAAiB,OAAO,IAAI;AAAA,QAClC;AAAA,QACC,UAAkB;AAAA,MACrB;AACA,YAAM,qBAAqB,kBAAkB,UAAU,WAAW,IAAI;AACtE,YAAM,iBAAiB,kBAAkB,kBAAkB;AAC3D,YAAM,cAAc,eAAe,kBAAkB;AAErD,iBAAW,KAAK;AAAA,QACd,aAAc,UAAkB;AAAA,QAChC;AAAA,QACA,QAAQ,OAAO,YAAY;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBACP,QACuB;AACvB,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ;AAAA,IACtB,SAAS,QAAQ,WAAW;AAAA,IAC5B,eAAe,QAAQ,iBAAiB;AAAA,EAC1C;AACF;AAQA,SAAS,wBACP,QACA,QACA;AACA,MAAI,CAAC,OAAO,KAAM;AAElB,UAAQ,OAAO,SAAS;AAAA,IACtB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,gFAAgF,OAAO,aAAa;AAAA,MACtG;AACA;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,MACF;AACA,aAAO,KAAK,2CAA2C;AACvD,aAAO,KAAK,2CAA2C;AACvD,aAAO,KAAK,6CAA6C;AACzD,aAAO,KAAK,yCAAyC;AACrD,aAAO,KAAK,IAAI;AAChB,aAAO;AAAA,QACL;AAAA,MACF;AACA,aAAO,KAAK,gBAAgB;AAC5B,aAAO,KAAK,uBAAuB;AACnC,aAAO,KAAK,yBAAyB;AACrC,aAAO,KAAK,uBAAuB;AACnC,aAAO,KAAK,qBAAqB;AACjC,aAAO,KAAK,IAAI;AAChB;AAAA,EACJ;AACF;AAEA,SAAS,uBACP,QACA,YACA,QACA;AACA,MAAI,CAAC,OAAO,KAAM;AAElB,SAAO,KAAK,oBAAoB;AAEhC,aAAW,MAAM,YAAY;AAC3B,UAAM,aAAa,GAAG,gBAAgB,SAClC,kBAAkB,GAAG,WAAW,KAChC;AACJ,UAAM,cAAc,GAAG,eAAe;AACtC,UAAM,eAAe,GAAG,gBAAgB;AACxC,UAAM,aAAa,yBAAyB,GAAG,MAAM;AAErD,WAAO;AAAA,MACL,eAAe,WAAW,GAAG,WAAW,CAAC;AAAA,IAC3C;AACA,WAAO,KAAK,kBAAkB,GAAG,WAAW,GAAG;AAC/C,WAAO,KAAK,KAAK,WAAW,GAAG;AAC/B,WAAO,KAAK,KAAK,YAAY,GAAG;AAChC,WAAO,KAAK,KAAK,UAAU,GAAG;AAC9B,WAAO,KAAK,KAAK,UAAU,EAAE;AAC7B,WAAO,KAAK,IAAI;AAChB,WAAO,KAAK,EAAE;AAAA,EAChB;AACF;AAEA,SAAS,yBAAyB,QAAsC;AACtE,MAAI,CAAC,UAAU,CAAC,aAAa,MAAM,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,iBAAiB,OAAO,YAAY;AACnD,QAAM,SAAS,iBAAiB,OAAO,YAAY;AACnD,QAAM,WAAW,iBAAiB,OAAO,aAAa;AACtD,QAAM,QAAQ,iBAAiB,OAAO,WAAW;AAEjD,SAAO,mBAAmB,MAAM,KAAK,MAAM,KAAK,QAAQ,KAAK,KAAK;AACpE;AAEA,SAAS,iBAAiB,QAAoC;AAC5D,MAAI,CAAC,UAAU,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,QAAQ,MAAM;AACrC,QAAM,cAAc,QACjB,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,GAAG,mBAAmB,IAAI,CAAC,KAAK,IAAI,EAAE,EAC5D,KAAK,IAAI;AAEZ,SAAO,KAAK,WAAW;AACzB;AAEA,SAAS,kBACP,UACA,WACA,MACO;AACP,QAAM,gBAAgB,oBAAI,IAAiB;AAE3C,QAAM,gBAAgB,CAAC,WAAoB;AACzC,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG;AAE5B,eAAW,SAAS,QAAQ;AAC1B,YAAM,WAAW,iBAAiB,OAAO,IAAI;AAC7C,UAAI,CAAC,SAAU;AACf,YAAM,MAAM,GAAG,SAAS,EAAE,IAAI,SAAS,IAAI;AAC3C,oBAAc,IAAI,KAAK,QAAQ;AAAA,IACjC;AAAA,EACF;AAEA,gBAAe,SAAiB,UAAU;AAC1C,gBAAe,UAAkB,UAAU;AAE3C,SAAO,MAAM,KAAK,cAAc,OAAO,CAAC;AAC1C;AAEA,SAAS,iBAAiB,WAAgB,MAAmB;AAC3D,MAAI,CAAC,UAAW,QAAO;AAEvB,MAAI,UAAU,MAAM;AAClB,UAAM,UAAU,eAAe,UAAU,IAAI;AAC7C,UAAM,WAAW,KAAK,YAAY,aAAa,OAAO;AACtD,QAAI,CAAC,SAAU,QAAO;AAEtB,UAAM,EAAE,MAAM,GAAG,UAAU,IAAI;AAC/B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAA2B;AACpD,QAAM,SAAsB,CAAC;AAC7B,QAAM,UAAU,KAAK,MAAM,YAAY;AAEvC,MAAI,SAAS;AACX,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAY,MAAM,MAAM,GAAG,EAAE;AACnC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,WAAoC;AAC1D,QAAM,cACJ,UAAU,aAAa,UAAU,kBAAkB,GAAG;AACxD,MAAI,CAAC,YAAa,QAAO;AAEzB,MAAI,YAAY,MAAM;AACpB,WAAO,eAAe,YAAY,IAAI;AAAA,EACxC;AAGA,QAAM,WAAW,GAAG,WAAW,UAAU,WAAW,CAAC;AACrD,SAAO;AACT;AAEA,SAAS,iBACP,WACA,aAC4D;AAC5D,QAAM,YAAY,UAAU,aAAa,CAAC;AAC1C,QAAM,eAAe,oBAAI,IAAoB;AAC7C,QAAM,eAAqD,CAAC;AAE5D,aAAW,CAAC,YAAY,QAAQ,KAAK,OAAO,QAAQ,SAAS,GAAG;AAC9D,UAAM,iBAAkB,UAAkB,UAAU,kBAAkB,GAClE;AACJ,QAAI,CAAC,eAAgB;AAErB,QAAI,cAAc,UAAU,GAAG;AAC7B,mBAAa,KAAK,EAAE,MAAM,YAAY,QAAQ,eAAe,CAAC;AAC9D;AAAA,IACF;AAEA,QAAI,UAAU,KAAK,UAAU,KAAK,eAAe,WAAW;AAC1D,mBAAa,IAAI,YAAY,cAAc;AAAA,IAC7C;AAAA,EACF;AAEA,QAAM,kBAAkB,sBAAsB,cAAc,WAAW;AACvE,QAAM,SAAS,iBAAiB,cAAc,WAAW;AAEzD,SAAO,EAAE,iBAAiB,OAAO;AACnC;AAEA,SAAS,sBACP,WACA,aACoB;AACpB,MAAI,UAAU,SAAS,EAAG,QAAO;AAEjC,QAAM,iBAAiB,CAAC,OAAO,OAAO,KAAK;AAC3C,aAAW,QAAQ,gBAAgB;AACjC,UAAM,SAAS,UAAU,IAAI,IAAI;AACjC,QAAI,QAAQ;AACV,aAAO;AAAA,QACL;AAAA,QACA,GAAG,WAAW,WAAW,CAAC,WAAW,IAAI;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,CAAC,WAAW,WAAW,IAAI,UAAU,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC;AACtE,MAAI,CAAC,YAAa,QAAO;AACzB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,WAAW,WAAW,CAAC,WAAW,aAAa,SAAS;AAAA,EAC7D;AACF;AAEA,SAAS,iBACP,SAA+C,CAAC,GAChD,aACiC;AACjC,MAAI,CAAC,OAAO,OAAQ,QAAO;AAE3B,QAAM,QAA6B,CAAC;AAEpC,aAAW,EAAE,MAAM,OAAO,KAAK,QAAQ;AACrC,UAAM,WAAW,kBAAkB,IAAI;AACvC,UAAM,aAAa,sBAAsB,IAAI;AAC7C,UAAM,WAAW;AAAA,MACf;AAAA,MACA,GAAG,WAAW,WAAW,CAAC,GAAG,WAAW,UAAU,CAAC;AAAA,IACrD;AAEA,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,cAAM,iBAAiB,CAAC;AACxB,cAAM,aAAa,UAAU,IAAI;AACjC;AAAA,MACF,KAAK;AACH,cAAM,iBAAiB,CAAC;AACxB,cAAM,aAAa,UAAU,IAAI;AACjC;AAAA,MACF,KAAK;AACH,cAAM,kBAAkB,CAAC;AACzB,cAAM,cAAc,UAAU,IAAI;AAClC;AAAA,MACF;AACE,cAAM,gBAAgB,CAAC;AACvB,cAAM,YAAY,UAAU,IAAI;AAChC;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,QAAa,cAA8B;AACtE,MAAI,OAAO,MAAM;AACf,WAAO,eAAe,OAAO,IAAI;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,YAAoC;AAC7D,QAAM,UAA2B,CAAC;AAElC,aAAW,SAAS,cAAc,CAAC,GAAG;AACpC,QAAK,MAAc,OAAO,UAAU;AAClC,cAAQ,KAAK;AAAA,QACX,MAAO,MAAc;AAAA,QACrB,aAAc,MAAc;AAAA,QAC5B,QAAS,MAAc;AAAA,QACvB,UAAW,MAAc;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,YAAiC;AACvD,QAAM,cAA4B,CAAC;AAEnC,aAAW,SAAS,cAAc,CAAC,GAAG;AACpC,QAAK,MAAc,OAAO,SAAS;AACjC,kBAAY,KAAK;AAAA,QACf,MAAO,MAAc;AAAA,QACrB,aAAc,MAAc;AAAA,QAC5B,QAAS,MAAc;AAAA,QACvB,UAAW,MAAc;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,QAA+B;AACpD,QAAM,aAAa,OAAO,QAAQ;AAClC,UAAQ,YAAY;AAAA,IAClB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,aAAa,OAA2B;AAC/C,SAAO,mBAAmB,MAAM,MAAM;AACxC;AAEA,SAAS,mBAAmB,QAAqB;AAC/C,MAAI,CAAC,OAAQ,QAAO;AAEpB,MAAI,OAAO,SAAS,SAAS;AAC3B,UAAM,WAAW,mBAAmB,OAAO,KAAK;AAChD,WAAO,SAAS,QAAQ;AAAA,EAC1B;AAEA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,uBAAuB,QAAa,UAA0B;AACrE,MAAI,CAAC,QAAQ;AACX,WAAO,UAAU,QAAQ;AAAA,EAC3B;AAEA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,UAAU,QAAQ;AAAA,IAC3B,KAAK;AACH,aAAO,GAAG,QAAQ;AAAA,IACpB;AACE,aAAO,UAAU,QAAQ;AAAA,EAC7B;AACF;AAOA,SAAS,kBACP,MACA,QACA,gBACA,SACQ;AACR,MAAI,eAAe,IAAI,IAAI,EAAG,QAAO;AACrC,iBAAe,IAAI,IAAI;AAEvB,MAAI,OAAO,MAAM;AACf,UAAM,aAAa,OAAO,KAAK,IAAI,CAAC,MAAc,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AACrE,WAAO,gBAAgB,IAAI,cAAc,UAAU;AAAA,EACrD;AAEA,MAAI,OAAO,SAAS,YAAY,OAAO,YAAY;AACjD,WAAO,gBAAgB,IAAI,MAAM,eAAe,QAAQ,OAAO,CAAC;AAAA,EAClE;AAEA,MAAI,OAAO,SAAS,SAAS;AAC3B,UAAM,aAAa,OAAO,SAAS,EAAE,MAAM,UAAU;AACrD,UAAM,WAAW,qBAAqB,YAAY,OAAO;AACzD,UAAM,UAAU;AAAA,MACd;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA,QAAQ;AAAA,IACV;AACA,WAAO,gBAAgB,IAAI,MAAM,OAAO;AAAA,EAC1C;AAEA,SAAO,gBAAgB,IAAI,MAAM,qBAAqB,QAAQ,OAAO,CAAC;AACxE;AAEA,SAAS,qBAAqB,QAAa,SAAgC;AACzE,MAAI,OAAO,MAAM;AACf,WAAO,eAAe,OAAO,IAAI;AAAA,EACnC;AAEA,MAAI,OAAO,MAAM;AACf,UAAM,aAAa,OAAO,KAAK,IAAI,CAAC,MAAc,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AACrE,WAAO,WAAW,UAAU;AAAA,EAC9B;AAEA,MAAI,OAAO,SAAS,YAAY,OAAO,YAAY;AACjD,WAAO,eAAe,QAAQ,OAAO;AAAA,EACvC;AAEA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,YAAY,QAAQ,OAAO;AAAA,IACpC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,WAAW;AAAA,QAChB,OAAO,SAAS,EAAE,MAAM,UAAU;AAAA,QAClC;AAAA,MACF,CAAC;AAAA,IACH,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,YAAY,QAAQ,OAAO;AAAA,IACpC,KAAK;AACH,aAAO,aAAa,QAAQ,OAAO;AAAA,IACrC;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,eAAe,QAAa,SAAgC;AACnE,QAAM,aAAuB,CAAC;AAE9B,aAAW,CAAC,UAAU,UAAU,KAAK,OAAO;AAAA,IAC1C,OAAO,cAAc,CAAC;AAAA,EACxB,GAAG;AACD,UAAM,aAAa,OAAO,UAAU,SAAS,QAAQ,KAAK;AAC1D,UAAM,UAAU,qBAAqB,YAAmB,OAAO;AAC/D,UAAM,YAAY,aAAa,UAAU,GAAG,OAAO;AACnD,eAAW,KAAK,KAAK,mBAAmB,QAAQ,CAAC,KAAK,SAAS,GAAG;AAAA,EACpE;AAEA,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,EAAe,WAAW,KAAK,IAAI,CAAC;AAAA;AAC7C;AAEA,SAAS,YAAY,QAAa,SAAgC;AAChE,MAAI,QAAQ,aAAa;AACvB,YAAQ,OAAO,QAAQ;AAAA,MACrB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,IACX;AAAA,EACF;AAEA,MAAI,UAAU;AAEd,MAAI,QAAQ,eAAe;AACzB,QAAI,OAAO,OAAO,cAAc,UAAU;AACxC,iBAAW,QAAQ,OAAO,SAAS;AAAA,IACrC;AAEA,QAAI,OAAO,OAAO,cAAc,UAAU;AACxC,iBAAW,QAAQ,OAAO,SAAS;AAAA,IACrC;AAEA,QAAI,OAAO,SAAS;AAClB,iBAAW,qBAAqB,KAAK,UAAU,OAAO,OAAO,CAAC;AAAA,IAChE;AAAA,EACF;AAEA,UAAQ,OAAO,QAAQ;AAAA,IACrB,KAAK;AACH,aAAO,GAAG,OAAO;AAAA,IACnB,KAAK;AACH,aAAO,GAAG,OAAO;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAG,OAAO;AAAA,IACnB,KAAK;AACH,aAAO,GAAG,OAAO;AAAA,IACnB,KAAK;AACH,aAAO,GAAG,OAAO;AAAA,IACnB;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,YAAY,QAAa,SAAgC;AAChE,MAAI,UAAU;AAEd,MAAI,QAAQ,eAAe;AACzB,cAAU,mBAAmB,QAAQ,OAAO;AAE5C,QAAI,OAAO,OAAO,eAAe,YAAY,OAAO,eAAe,GAAG;AACpE,iBAAW,uCAAuC,OAAO,UAAU,yBAAyB,OAAO,UAAU,0DAA0D,OAAO,UAAU;AAAA,IAC1L;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,QAAa,SAAgC;AACjE,MAAI,UAAU,YAAY,QAAQ,OAAO;AACzC,aAAW;AACX,SAAO;AACT;AAEA,SAAS,uBACP,QACA,SACA,YACA,eACQ;AACR,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,OAAO,aAAa,UAAU;AACvC,eAAW,QAAQ,OAAO,QAAQ;AAAA,EACpC;AAEA,MAAI,OAAO,OAAO,aAAa,UAAU;AACvC,eAAW,QAAQ,OAAO,QAAQ;AAAA,EACpC;AAEA,MAAI,OAAO,eAAe,gBAAgB,UAAU,GAAG;AACrD,eACE;AAAA,EACJ;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,QAAsB;AAC7C,MAAI,QAAQ,KAAM,QAAO;AAEzB,QAAM,iBAAiB,oBAAI,IAAI,CAAC,UAAU,UAAU,WAAW,SAAS,CAAC;AACzE,SAAO,eAAe,IAAI,QAAQ,IAAI;AACxC;AAEA,SAAS,mBAAmB,QAAa,SAAyB;AAChE,MAAI,OAAO,OAAO,YAAY,UAAU;AACtC,QAAI,OAAO,qBAAqB,MAAM;AACpC,iBAAW,OAAO,OAAO,OAAO;AAAA,IAClC,OAAO;AACL,iBAAW,QAAQ,OAAO,OAAO;AAAA,IACnC;AAAA,EACF,WAAW,OAAO,OAAO,qBAAqB,UAAU;AACtD,eAAW,OAAO,OAAO,gBAAgB;AAAA,EAC3C;AAEA,MAAI,OAAO,OAAO,YAAY,UAAU;AACtC,QAAI,OAAO,qBAAqB,MAAM;AACpC,iBAAW,OAAO,OAAO,OAAO;AAAA,IAClC,OAAO;AACL,iBAAW,QAAQ,OAAO,OAAO;AAAA,IACnC;AAAA,EACF,WAAW,OAAO,OAAO,qBAAqB,UAAU;AACtD,eAAW,OAAO,OAAO,gBAAgB;AAAA,EAC3C;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,KAAqB;AACvC,SAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAClD;","names":[]}
package/dist/index.d.cts CHANGED
@@ -7,10 +7,33 @@ type OpenAPISpec = {
7
7
  parameters?: Record<string, unknown>;
8
8
  };
9
9
  };
10
+ type TypesHelperMode = "package" | "inline" | "file";
11
+ type TypesConfig = {
12
+ emit?: boolean;
13
+ helpers?: TypesHelperMode;
14
+ helpersOutput?: string;
15
+ };
10
16
  type GenerateOptions = {
11
17
  strictDates?: boolean;
12
18
  strictNumeric?: boolean;
19
+ types?: TypesConfig;
13
20
  };
14
21
  declare function generate(spec: OpenAPISpec, options?: GenerateOptions): string;
15
22
 
16
- export { type GenerateOptions, type OpenAPISpec, generate };
23
+ type PathFn<TArgs extends unknown[] = []> = (...args: TArgs) => string;
24
+ type HeaderFn<TArgs extends unknown[] = [], TResult = Record<string, unknown> | Record<string, never>> = (...args: TArgs) => TResult;
25
+ type OperationErrors<TClient = unknown, TServer = unknown, TDefault = unknown, TOther = unknown> = {
26
+ clientErrors?: Record<string, TClient>;
27
+ serverErrors?: Record<string, TServer>;
28
+ defaultErrors?: Record<string, TDefault>;
29
+ otherErrors?: Record<string, TOther>;
30
+ };
31
+ type OperationDefinition<TPath extends (...args: any[]) => string, TRequest = undefined, TResponse = undefined, THeaders extends HeaderFn | undefined = undefined, TErrors extends OperationErrors | undefined = undefined> = {
32
+ path: TPath;
33
+ request?: TRequest;
34
+ response?: TResponse;
35
+ headers?: THeaders;
36
+ errors?: TErrors;
37
+ };
38
+
39
+ export { type GenerateOptions, type HeaderFn, type OpenAPISpec, type OperationDefinition, type OperationErrors, type PathFn, type TypesConfig, generate };
package/dist/index.d.ts CHANGED
@@ -7,10 +7,33 @@ type OpenAPISpec = {
7
7
  parameters?: Record<string, unknown>;
8
8
  };
9
9
  };
10
+ type TypesHelperMode = "package" | "inline" | "file";
11
+ type TypesConfig = {
12
+ emit?: boolean;
13
+ helpers?: TypesHelperMode;
14
+ helpersOutput?: string;
15
+ };
10
16
  type GenerateOptions = {
11
17
  strictDates?: boolean;
12
18
  strictNumeric?: boolean;
19
+ types?: TypesConfig;
13
20
  };
14
21
  declare function generate(spec: OpenAPISpec, options?: GenerateOptions): string;
15
22
 
16
- export { type GenerateOptions, type OpenAPISpec, generate };
23
+ type PathFn<TArgs extends unknown[] = []> = (...args: TArgs) => string;
24
+ type HeaderFn<TArgs extends unknown[] = [], TResult = Record<string, unknown> | Record<string, never>> = (...args: TArgs) => TResult;
25
+ type OperationErrors<TClient = unknown, TServer = unknown, TDefault = unknown, TOther = unknown> = {
26
+ clientErrors?: Record<string, TClient>;
27
+ serverErrors?: Record<string, TServer>;
28
+ defaultErrors?: Record<string, TDefault>;
29
+ otherErrors?: Record<string, TOther>;
30
+ };
31
+ type OperationDefinition<TPath extends (...args: any[]) => string, TRequest = undefined, TResponse = undefined, THeaders extends HeaderFn | undefined = undefined, TErrors extends OperationErrors | undefined = undefined> = {
32
+ path: TPath;
33
+ request?: TRequest;
34
+ response?: TResponse;
35
+ headers?: THeaders;
36
+ errors?: TErrors;
37
+ };
38
+
39
+ export { type GenerateOptions, type HeaderFn, type OpenAPISpec, type OperationDefinition, type OperationErrors, type PathFn, type TypesConfig, generate };
package/dist/index.mjs CHANGED
@@ -206,11 +206,13 @@ function generate(spec, options = {}) {
206
206
  const output = [];
207
207
  const generatedTypes = /* @__PURE__ */ new Set();
208
208
  const { strictDates = false, strictNumeric = false } = options;
209
+ const typesConfig = normalizeTypesConfig(options.types);
209
210
  const schemaOptions = {
210
211
  strictDates,
211
212
  strictNumeric
212
213
  };
213
214
  output.push('import { z } from "zod";');
215
+ appendHelperTypesImport(output, typesConfig);
214
216
  output.push("");
215
217
  if (spec.components?.schemas) {
216
218
  output.push("// Generated Zod Schemas");
@@ -230,16 +232,79 @@ function generate(spec, options = {}) {
230
232
  output.push("// Path Functions");
231
233
  output.push("export const paths = {");
232
234
  for (const op of operations) {
233
- if (op.pathParams.length === 0) {
235
+ const pathParamNames = op.pathParams.map((p) => p.name);
236
+ const hasPathParams = pathParamNames.length > 0;
237
+ const hasQueryParams = op.queryParams.length > 0;
238
+ if (!hasPathParams && !hasQueryParams) {
234
239
  output.push(` ${op.operationId}: () => "${op.path}",`);
235
- } else {
236
- const paramNames = op.pathParams.map((p) => p.name).join(", ");
237
- const paramTypes = op.pathParams.map((p) => `${p.name}: string`).join(", ");
238
- const pathWithParams = op.path.replace(/{([^}]+)}/g, "${$1}");
240
+ continue;
241
+ }
242
+ const allParamNames = [
243
+ ...pathParamNames,
244
+ ...op.queryParams.map((p) => p.name)
245
+ ];
246
+ const signaturePieces = [];
247
+ for (const param of op.pathParams) {
248
+ signaturePieces.push(`${param.name}: string`);
249
+ }
250
+ for (const param of op.queryParams) {
251
+ signaturePieces.push(
252
+ `${param.name}${param.required ? "" : "?"}: ${mapQueryType(param)}`
253
+ );
254
+ }
255
+ const signatureParams = signaturePieces.join(", ");
256
+ const needsDefaultObject = !hasPathParams && hasQueryParams && op.queryParams.every((param) => !param.required);
257
+ const signatureArgs = allParamNames.length ? `{ ${allParamNames.join(", ")} }` : "{}";
258
+ const signature = `${signatureArgs}: { ${signatureParams} }${needsDefaultObject ? " = {}" : ""}`;
259
+ const pathWithParams = op.path.replace(/{([^}]+)}/g, "${$1}");
260
+ if (!hasQueryParams) {
239
261
  output.push(
240
- ` ${op.operationId}: ({ ${paramNames} }: { ${paramTypes} }) => \`${pathWithParams}\`,`
262
+ ` ${op.operationId}: (${signature}) => \`${pathWithParams}\`,`
241
263
  );
264
+ continue;
265
+ }
266
+ output.push(` ${op.operationId}: (${signature}) => {`);
267
+ output.push(" const params = new URLSearchParams()");
268
+ for (const param of op.queryParams) {
269
+ const propertyKey = formatPropertyName(param.name);
270
+ const accessor = isValidJSIdentifier(param.name) ? param.name : propertyKey;
271
+ const schema = param.schema ?? {};
272
+ if (schema?.type === "array") {
273
+ const itemValueExpression = convertQueryParamValue(
274
+ schema.items ?? {},
275
+ "value"
276
+ );
277
+ if (param.required) {
278
+ output.push(` for (const value of ${accessor}) {`);
279
+ output.push(
280
+ ` params.append("${param.name}", ${itemValueExpression})`
281
+ );
282
+ output.push(" }");
283
+ } else {
284
+ output.push(` if (${accessor} !== undefined) {`);
285
+ output.push(` for (const value of ${accessor}) {`);
286
+ output.push(
287
+ ` params.append("${param.name}", ${itemValueExpression})`
288
+ );
289
+ output.push(" }");
290
+ output.push(" }");
291
+ }
292
+ continue;
293
+ }
294
+ const valueExpression = convertQueryParamValue(schema, accessor);
295
+ if (param.required) {
296
+ output.push(` params.set("${param.name}", ${valueExpression})`);
297
+ } else {
298
+ output.push(` if (${accessor} !== undefined) {`);
299
+ output.push(` params.set("${param.name}", ${valueExpression})`);
300
+ output.push(" }");
301
+ }
242
302
  }
303
+ output.push(" const _searchParams = params.toString()");
304
+ output.push(
305
+ ` return \`${pathWithParams}\${_searchParams ? \`?\${_searchParams}\` : ""}\``
306
+ );
307
+ output.push(" },");
243
308
  }
244
309
  output.push("} as const;");
245
310
  output.push("");
@@ -331,6 +396,7 @@ function generate(spec, options = {}) {
331
396
  output.push("} as const;");
332
397
  output.push("");
333
398
  }
399
+ generateOperationTypes(output, operations, typesConfig);
334
400
  return output.join("\n");
335
401
  }
336
402
  function appendOperationField(buffer, key, value) {
@@ -366,11 +432,13 @@ function parseOperations(spec) {
366
432
  );
367
433
  const resolvedParameters = collectParameters(pathItem, operation, spec);
368
434
  const requestHeaders = getRequestHeaders(resolvedParameters);
435
+ const queryParams = getQueryParams(resolvedParameters);
369
436
  operations.push({
370
437
  operationId: operation.operationId,
371
438
  path,
372
439
  method: method.toLowerCase(),
373
440
  pathParams,
441
+ queryParams,
374
442
  requestType,
375
443
  responseType: successResponse,
376
444
  requestHeaders,
@@ -380,6 +448,91 @@ function parseOperations(spec) {
380
448
  }
381
449
  return operations;
382
450
  }
451
+ function normalizeTypesConfig(config) {
452
+ return {
453
+ emit: config?.emit ?? true,
454
+ helpers: config?.helpers ?? "package",
455
+ helpersOutput: config?.helpersOutput ?? "./zenko-types"
456
+ };
457
+ }
458
+ function appendHelperTypesImport(buffer, config) {
459
+ if (!config.emit) return;
460
+ switch (config.helpers) {
461
+ case "package":
462
+ buffer.push(
463
+ 'import type { PathFn, HeaderFn, OperationDefinition, OperationErrors } from "zenko";'
464
+ );
465
+ return;
466
+ case "file":
467
+ buffer.push(
468
+ `import type { PathFn, HeaderFn, OperationDefinition, OperationErrors } from "${config.helpersOutput}";`
469
+ );
470
+ return;
471
+ case "inline":
472
+ buffer.push(
473
+ "type PathFn<TArgs extends unknown[] = []> = (...args: TArgs) => string;"
474
+ );
475
+ buffer.push(
476
+ "type HeaderFn<TArgs extends unknown[] = [], TResult = Record<string, unknown> | Record<string, never>> = (...args: TArgs) => TResult;"
477
+ );
478
+ buffer.push(
479
+ "type OperationErrors<TClient = unknown, TServer = unknown, TDefault = unknown, TOther = unknown> = {"
480
+ );
481
+ buffer.push(" clientErrors?: Record<string, TClient>;");
482
+ buffer.push(" serverErrors?: Record<string, TServer>;");
483
+ buffer.push(" defaultErrors?: Record<string, TDefault>;");
484
+ buffer.push(" otherErrors?: Record<string, TOther>;");
485
+ buffer.push("};");
486
+ buffer.push(
487
+ "type OperationDefinition<TPath extends (...args: any[]) => string, TRequest = undefined, TResponse = undefined, THeaders extends HeaderFn | undefined = undefined, TErrors extends OperationErrors | undefined = undefined> = {"
488
+ );
489
+ buffer.push(" path: TPath;");
490
+ buffer.push(" request?: TRequest;");
491
+ buffer.push(" response?: TResponse;");
492
+ buffer.push(" headers?: THeaders;");
493
+ buffer.push(" errors?: TErrors;");
494
+ buffer.push("};");
495
+ return;
496
+ }
497
+ }
498
+ function generateOperationTypes(buffer, operations, config) {
499
+ if (!config.emit) return;
500
+ buffer.push("// Operation Types");
501
+ for (const op of operations) {
502
+ const headerType = op.requestHeaders?.length ? `typeof headers.${op.operationId}` : "undefined";
503
+ const requestType = op.requestType ?? "undefined";
504
+ const responseType = op.responseType ?? "undefined";
505
+ const errorsType = buildOperationErrorsType(op.errors);
506
+ buffer.push(
507
+ `export type ${capitalize(op.operationId)}Operation = OperationDefinition<`
508
+ );
509
+ buffer.push(` typeof paths.${op.operationId},`);
510
+ buffer.push(` ${requestType},`);
511
+ buffer.push(` ${responseType},`);
512
+ buffer.push(` ${headerType},`);
513
+ buffer.push(` ${errorsType}`);
514
+ buffer.push(`>;`);
515
+ buffer.push("");
516
+ }
517
+ }
518
+ function buildOperationErrorsType(errors) {
519
+ if (!errors || !hasAnyErrors(errors)) {
520
+ return "OperationErrors";
521
+ }
522
+ const client = buildErrorBucket(errors.clientErrors);
523
+ const server = buildErrorBucket(errors.serverErrors);
524
+ const fallback = buildErrorBucket(errors.defaultErrors);
525
+ const other = buildErrorBucket(errors.otherErrors);
526
+ return `OperationErrors<${client}, ${server}, ${fallback}, ${other}>`;
527
+ }
528
+ function buildErrorBucket(bucket) {
529
+ if (!bucket || Object.keys(bucket).length === 0) {
530
+ return "unknown";
531
+ }
532
+ const entries = Object.entries(bucket);
533
+ const typeEntries = entries.map(([name, type]) => `${formatPropertyName(name)}: ${type}`).join("; ");
534
+ return `{ ${typeEntries} }`;
535
+ }
383
536
  function collectParameters(pathItem, operation, spec) {
384
537
  const parametersMap = /* @__PURE__ */ new Map();
385
538
  const addParameters = (params) => {
@@ -522,6 +675,20 @@ function getRequestHeaders(parameters) {
522
675
  }
523
676
  return headers;
524
677
  }
678
+ function getQueryParams(parameters) {
679
+ const queryParams = [];
680
+ for (const param of parameters ?? []) {
681
+ if (param.in === "query") {
682
+ queryParams.push({
683
+ name: param.name,
684
+ description: param.description,
685
+ schema: param.schema,
686
+ required: param.required
687
+ });
688
+ }
689
+ }
690
+ return queryParams;
691
+ }
525
692
  function mapHeaderType(header) {
526
693
  const schemaType = header.schema?.type;
527
694
  switch (schemaType) {
@@ -534,6 +701,39 @@ function mapHeaderType(header) {
534
701
  return "string";
535
702
  }
536
703
  }
704
+ function mapQueryType(param) {
705
+ return mapQuerySchemaType(param.schema);
706
+ }
707
+ function mapQuerySchemaType(schema) {
708
+ if (!schema) return "string";
709
+ if (schema.type === "array") {
710
+ const itemType = mapQuerySchemaType(schema.items);
711
+ return `Array<${itemType}>`;
712
+ }
713
+ switch (schema.type) {
714
+ case "integer":
715
+ case "number":
716
+ return "number";
717
+ case "boolean":
718
+ return "boolean";
719
+ default:
720
+ return "string";
721
+ }
722
+ }
723
+ function convertQueryParamValue(schema, accessor) {
724
+ if (!schema) {
725
+ return `String(${accessor})`;
726
+ }
727
+ switch (schema.type) {
728
+ case "integer":
729
+ case "number":
730
+ return `String(${accessor})`;
731
+ case "boolean":
732
+ return `${accessor} ? "true" : "false"`;
733
+ default:
734
+ return `String(${accessor})`;
735
+ }
736
+ }
537
737
  function generateZodSchema(name, schema, generatedTypes, options) {
538
738
  if (generatedTypes.has(name)) return "";
539
739
  generatedTypes.add(name);
@@ -542,18 +742,7 @@ function generateZodSchema(name, schema, generatedTypes, options) {
542
742
  return `export const ${name} = z.enum([${enumValues}]);`;
543
743
  }
544
744
  if (schema.type === "object" || schema.properties) {
545
- const properties = [];
546
- for (const [propName, propSchema] of Object.entries(
547
- schema.properties || {}
548
- )) {
549
- const isRequired = schema.required?.includes(propName) ?? false;
550
- const zodType = getZodTypeFromSchema(propSchema, options);
551
- const finalType = isRequired ? zodType : `${zodType}.optional()`;
552
- properties.push(` ${formatPropertyName(propName)}: ${finalType},`);
553
- }
554
- return `export const ${name} = z.object({
555
- ${properties.join("\n")}
556
- });`;
745
+ return `export const ${name} = ${buildZodObject(schema, options)};`;
557
746
  }
558
747
  if (schema.type === "array") {
559
748
  const itemSchema = schema.items ?? { type: "unknown" };
@@ -576,6 +765,9 @@ function getZodTypeFromSchema(schema, options) {
576
765
  const enumValues = schema.enum.map((v) => `"${v}"`).join(", ");
577
766
  return `z.enum([${enumValues}])`;
578
767
  }
768
+ if (schema.type === "object" || schema.properties) {
769
+ return buildZodObject(schema, options);
770
+ }
579
771
  switch (schema.type) {
580
772
  case "string":
581
773
  return buildString(schema, options);
@@ -596,6 +788,23 @@ function getZodTypeFromSchema(schema, options) {
596
788
  return "z.unknown()";
597
789
  }
598
790
  }
791
+ function buildZodObject(schema, options) {
792
+ const properties = [];
793
+ for (const [propName, propSchema] of Object.entries(
794
+ schema.properties || {}
795
+ )) {
796
+ const isRequired = schema.required?.includes(propName) ?? false;
797
+ const zodType = getZodTypeFromSchema(propSchema, options);
798
+ const finalType = isRequired ? zodType : `${zodType}.optional()`;
799
+ properties.push(` ${formatPropertyName(propName)}: ${finalType},`);
800
+ }
801
+ if (properties.length === 0) {
802
+ return "z.object({})";
803
+ }
804
+ return `z.object({
805
+ ${properties.join("\n")}
806
+ })`;
807
+ }
599
808
  function buildString(schema, options) {
600
809
  if (options.strictDates) {
601
810
  switch (schema.format) {