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.
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/utils/topological-sort.ts","../src/utils/property-name.ts","../src/utils/http-status.ts","../src/zenko.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as fs from \"fs\"\nimport * as path from \"path\"\nimport { pathToFileURL } from \"url\"\nimport { load } from \"js-yaml\"\nimport { generate, type OpenAPISpec } from \"./zenko.js\"\n\ntype CliConfigEntry = {\n input: string\n output: string\n strictDates?: boolean\n strictNumeric?: boolean\n}\n\ntype CliConfigFile = {\n schemas: CliConfigEntry[]\n}\n\ntype ParsedArgs = {\n showHelp: boolean\n strictDates: boolean\n strictNumeric: boolean\n configPath?: string\n positional: string[]\n}\n\nasync function main() {\n const args = process.argv.slice(2)\n const parsed = parseArgs(args)\n\n if (\n parsed.showHelp ||\n (!parsed.configPath && parsed.positional.length === 0)\n ) {\n printHelp()\n process.exit(parsed.showHelp ? 0 : 1)\n return\n }\n\n try {\n if (parsed.configPath) {\n await runFromConfig(parsed)\n } else {\n if (parsed.positional.length !== 2) {\n printHelp()\n process.exit(1)\n return\n }\n\n const [inputFile, outputFile] = parsed.positional\n if (!inputFile || !outputFile) {\n printHelp()\n process.exit(1)\n return\n }\n await generateSingle({\n inputFile,\n outputFile,\n strictDates: parsed.strictDates,\n strictNumeric: parsed.strictNumeric,\n })\n }\n } catch (error) {\n console.error(\"❌ Error:\", error)\n process.exit(1)\n }\n}\n\nfunction parseArgs(args: string[]): ParsedArgs {\n const parsed: ParsedArgs = {\n showHelp: false,\n strictDates: false,\n strictNumeric: false,\n positional: [],\n }\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index]!\n\n if (arg === \"-h\" || arg === \"--help\") {\n parsed.showHelp = true\n continue\n }\n\n if (arg === \"--strict-dates\") {\n parsed.strictDates = true\n continue\n }\n\n if (arg === \"--strict-numeric\") {\n parsed.strictNumeric = true\n continue\n }\n\n if (arg === \"--config\" || arg === \"-c\") {\n const next = args[index + 1]\n if (!next) {\n throw new Error(\"--config flag requires a file path\")\n }\n parsed.configPath = next\n index += 1\n continue\n }\n\n parsed.positional.push(arg)\n }\n\n return parsed\n}\n\nfunction printHelp() {\n console.log(\"Usage:\")\n console.log(\" zenko <input-file> <output-file> [options]\")\n console.log(\" zenko --config <config-file> [options]\")\n console.log(\"\")\n console.log(\"Options:\")\n console.log(\" -h, --help Show this help message\")\n console.log(\n \" --strict-dates Use ISO datetime parsing (can be set per config entry)\"\n )\n console.log(\n \" --strict-numeric Preserve numeric min/max bounds (can be set per config entry)\"\n )\n console.log(\n \" -c, --config Path to config file (JSON, YAML, or JS module)\"\n )\n console.log(\"\")\n console.log(\"Config file format:\")\n console.log(\n ' {\"schemas\": [{ input, output, strictDates?, strictNumeric? }] }'\n )\n}\n\nasync function runFromConfig(parsed: ParsedArgs) {\n const configPath = parsed.configPath!\n const resolvedConfigPath = path.resolve(configPath)\n const config = await loadConfig(resolvedConfigPath)\n validateConfig(config)\n\n const baseDir = path.dirname(resolvedConfigPath)\n\n for (const entry of config.schemas) {\n const inputFile = resolvePath(entry.input, baseDir)\n const outputFile = resolvePath(entry.output, baseDir)\n await generateSingle({\n inputFile,\n outputFile,\n strictDates: entry.strictDates ?? parsed.strictDates,\n strictNumeric: entry.strictNumeric ?? parsed.strictNumeric,\n })\n }\n}\n\nasync function loadConfig(filePath: string): Promise<unknown> {\n const extension = path.extname(filePath).toLowerCase()\n\n if (extension === \".json\") {\n const content = fs.readFileSync(filePath, \"utf8\")\n return JSON.parse(content)\n }\n\n if (extension === \".yaml\" || extension === \".yml\") {\n const content = fs.readFileSync(filePath, \"utf8\")\n return load(content)\n }\n\n const fileUrl = pathToFileURL(filePath).href\n const module = await import(fileUrl)\n return module.default ?? module.config ?? module\n}\n\nfunction validateConfig(config: unknown): asserts config is CliConfigFile {\n if (!config || typeof config !== \"object\") {\n throw new Error(\"Config file must export an object\")\n }\n\n if (!Array.isArray((config as CliConfigFile).schemas)) {\n throw new Error(\"Config file must contain a 'schemas' array\")\n }\n\n for (const entry of (config as CliConfigFile).schemas) {\n if (!entry || typeof entry !== \"object\") {\n throw new Error(\"Each schema entry must be an object\")\n }\n if (typeof entry.input !== \"string\" || typeof entry.output !== \"string\") {\n throw new Error(\"Each schema entry requires 'input' and 'output' paths\")\n }\n }\n}\n\nfunction resolvePath(filePath: string, baseDir: string): string {\n return path.isAbsolute(filePath) ? filePath : path.join(baseDir, filePath)\n}\n\nasync function generateSingle(options: {\n inputFile: string\n outputFile: string\n strictDates: boolean\n strictNumeric: boolean\n}) {\n const { inputFile, outputFile, strictDates, strictNumeric } = options\n const resolvedInput = path.resolve(inputFile)\n const resolvedOutput = path.resolve(outputFile)\n\n const spec = readSpec(resolvedInput)\n const output = generate(spec, { strictDates, strictNumeric })\n\n fs.mkdirSync(path.dirname(resolvedOutput), { recursive: true })\n fs.writeFileSync(resolvedOutput, output)\n\n console.log(`✅ Generated TypeScript types in ${resolvedOutput}`)\n console.log(`📄 Processed ${Object.keys(spec.paths).length} paths`)\n}\n\nfunction readSpec(filePath: string): OpenAPISpec {\n if (!fs.existsSync(filePath)) {\n throw new Error(`Input file not found: ${filePath}`)\n }\n\n const content = fs.readFileSync(filePath, \"utf8\")\n\n if (filePath.endsWith(\".yaml\") || filePath.endsWith(\".yml\")) {\n return load(content) as OpenAPISpec\n }\n\n return JSON.parse(content) as OpenAPISpec\n}\n\nmain().catch((error) => {\n console.error(\"❌ Error:\", error)\n process.exit(1)\n})\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":["path"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/utils/topological-sort.ts","../src/utils/property-name.ts","../src/utils/http-status.ts","../src/zenko.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as fs from \"fs\"\nimport * as path from \"path\"\nimport { pathToFileURL } from \"url\"\nimport { load } from \"js-yaml\"\nimport { generate, type OpenAPISpec, type TypesConfig } from \"./zenko.js\"\n\ntype CliConfigEntry = {\n input: string\n output: string\n strictDates?: boolean\n strictNumeric?: boolean\n types?: TypesConfig\n}\n\ntype CliConfigFile = {\n schemas: CliConfigEntry[]\n types?: TypesConfig\n}\n\ntype ParsedArgs = {\n showHelp: boolean\n strictDates: boolean\n strictNumeric: boolean\n configPath?: string\n positional: string[]\n}\n\nasync function main() {\n const args = process.argv.slice(2)\n const parsed = parseArgs(args)\n\n if (\n parsed.showHelp ||\n (!parsed.configPath && parsed.positional.length === 0)\n ) {\n printHelp()\n process.exit(parsed.showHelp ? 0 : 1)\n return\n }\n\n try {\n if (parsed.configPath) {\n await runFromConfig(parsed)\n } else {\n if (parsed.positional.length !== 2) {\n printHelp()\n process.exit(1)\n return\n }\n\n const [inputFile, outputFile] = parsed.positional\n if (!inputFile || !outputFile) {\n printHelp()\n process.exit(1)\n return\n }\n await generateSingle({\n inputFile,\n outputFile,\n strictDates: parsed.strictDates,\n strictNumeric: parsed.strictNumeric,\n })\n }\n } catch (error) {\n console.error(\"❌ Error:\", error)\n process.exit(1)\n }\n}\n\nfunction parseArgs(args: string[]): ParsedArgs {\n const parsed: ParsedArgs = {\n showHelp: false,\n strictDates: false,\n strictNumeric: false,\n positional: [],\n }\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index]!\n\n if (arg === \"-h\" || arg === \"--help\") {\n parsed.showHelp = true\n continue\n }\n\n if (arg === \"--strict-dates\") {\n parsed.strictDates = true\n continue\n }\n\n if (arg === \"--strict-numeric\") {\n parsed.strictNumeric = true\n continue\n }\n\n if (arg === \"--config\" || arg === \"-c\") {\n const next = args[index + 1]\n if (!next) {\n throw new Error(\"--config flag requires a file path\")\n }\n parsed.configPath = next\n index += 1\n continue\n }\n\n parsed.positional.push(arg)\n }\n\n return parsed\n}\n\nfunction printHelp() {\n console.log(\"Usage:\")\n console.log(\" zenko <input-file> <output-file> [options]\")\n console.log(\" zenko --config <config-file> [options]\")\n console.log(\"\")\n console.log(\"Options:\")\n console.log(\" -h, --help Show this help message\")\n console.log(\n \" --strict-dates Use ISO datetime parsing (can be set per config entry)\"\n )\n console.log(\n \" --strict-numeric Preserve numeric min/max bounds (can be set per config entry)\"\n )\n console.log(\n \" -c, --config Path to config file (JSON, YAML, or JS module)\"\n )\n console.log(\"\")\n console.log(\"Config file format:\")\n console.log(\n ' {\"types\"?: { emit?, helpers?, helpersOutput? }, \"schemas\": [{ input, output, strictDates?, strictNumeric?, types? }] }'\n )\n}\n\nasync function runFromConfig(parsed: ParsedArgs) {\n const configPath = parsed.configPath!\n const resolvedConfigPath = path.resolve(configPath)\n const config = await loadConfig(resolvedConfigPath)\n validateConfig(config)\n\n const baseDir = path.dirname(resolvedConfigPath)\n const baseTypesConfig = config.types\n\n for (const entry of config.schemas) {\n const inputFile = resolvePath(entry.input, baseDir)\n const outputFile = resolvePath(entry.output, baseDir)\n const typesConfig = resolveTypesConfig(baseTypesConfig, entry.types)\n await generateSingle({\n inputFile,\n outputFile,\n strictDates: entry.strictDates ?? parsed.strictDates,\n strictNumeric: entry.strictNumeric ?? parsed.strictNumeric,\n typesConfig,\n })\n }\n}\n\nasync function loadConfig(filePath: string): Promise<unknown> {\n const extension = path.extname(filePath).toLowerCase()\n\n if (extension === \".json\") {\n const content = fs.readFileSync(filePath, \"utf8\")\n return JSON.parse(content)\n }\n\n if (extension === \".yaml\" || extension === \".yml\") {\n const content = fs.readFileSync(filePath, \"utf8\")\n return load(content)\n }\n\n const fileUrl = pathToFileURL(filePath).href\n const module = await import(fileUrl)\n return module.default ?? module.config ?? module\n}\n\nfunction validateConfig(config: unknown): asserts config is CliConfigFile {\n if (!config || typeof config !== \"object\") {\n throw new Error(\"Config file must export an object\")\n }\n\n if (!Array.isArray((config as CliConfigFile).schemas)) {\n throw new Error(\"Config file must contain a 'schemas' array\")\n }\n\n for (const entry of (config as CliConfigFile).schemas) {\n if (!entry || typeof entry !== \"object\") {\n throw new Error(\"Each schema entry must be an object\")\n }\n if (typeof entry.input !== \"string\" || typeof entry.output !== \"string\") {\n throw new Error(\"Each schema entry requires 'input' and 'output' paths\")\n }\n }\n}\n\nfunction resolvePath(filePath: string, baseDir: string): string {\n return path.isAbsolute(filePath) ? filePath : path.join(baseDir, filePath)\n}\n\nfunction resolveTypesConfig(\n baseConfig: TypesConfig | undefined,\n entryConfig: TypesConfig | undefined\n): TypesConfig | undefined {\n if (!baseConfig && !entryConfig) return undefined\n return {\n ...baseConfig,\n ...entryConfig,\n }\n}\n\nasync function generateSingle(options: {\n inputFile: string\n outputFile: string\n strictDates: boolean\n strictNumeric: boolean\n typesConfig?: TypesConfig\n}) {\n const { inputFile, outputFile, strictDates, strictNumeric, typesConfig } =\n options\n const resolvedInput = path.resolve(inputFile)\n const resolvedOutput = path.resolve(outputFile)\n\n const spec = readSpec(resolvedInput)\n const output = generate(spec, {\n strictDates,\n strictNumeric,\n types: typesConfig,\n })\n\n fs.mkdirSync(path.dirname(resolvedOutput), { recursive: true })\n fs.writeFileSync(resolvedOutput, output)\n\n console.log(`✅ Generated TypeScript types in ${resolvedOutput}`)\n console.log(`📄 Processed ${Object.keys(spec.paths).length} paths`)\n}\n\nfunction readSpec(filePath: string): OpenAPISpec {\n if (!fs.existsSync(filePath)) {\n throw new Error(`Input file not found: ${filePath}`)\n }\n\n const content = fs.readFileSync(filePath, \"utf8\")\n\n if (filePath.endsWith(\".yaml\") || filePath.endsWith(\".yml\")) {\n return load(content) as OpenAPISpec\n }\n\n return JSON.parse(content) as OpenAPISpec\n}\n\nmain().catch((error) => {\n console.error(\"❌ Error:\", error)\n process.exit(1)\n})\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":"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","names":["path"]}
package/dist/index.cjs CHANGED
@@ -232,11 +232,13 @@ function generate(spec, options = {}) {
232
232
  const output = [];
233
233
  const generatedTypes = /* @__PURE__ */ new Set();
234
234
  const { strictDates = false, strictNumeric = false } = options;
235
+ const typesConfig = normalizeTypesConfig(options.types);
235
236
  const schemaOptions = {
236
237
  strictDates,
237
238
  strictNumeric
238
239
  };
239
240
  output.push('import { z } from "zod";');
241
+ appendHelperTypesImport(output, typesConfig);
240
242
  output.push("");
241
243
  if (spec.components?.schemas) {
242
244
  output.push("// Generated Zod Schemas");
@@ -256,16 +258,79 @@ function generate(spec, options = {}) {
256
258
  output.push("// Path Functions");
257
259
  output.push("export const paths = {");
258
260
  for (const op of operations) {
259
- if (op.pathParams.length === 0) {
261
+ const pathParamNames = op.pathParams.map((p) => p.name);
262
+ const hasPathParams = pathParamNames.length > 0;
263
+ const hasQueryParams = op.queryParams.length > 0;
264
+ if (!hasPathParams && !hasQueryParams) {
260
265
  output.push(` ${op.operationId}: () => "${op.path}",`);
261
- } else {
262
- const paramNames = op.pathParams.map((p) => p.name).join(", ");
263
- const paramTypes = op.pathParams.map((p) => `${p.name}: string`).join(", ");
264
- const pathWithParams = op.path.replace(/{([^}]+)}/g, "${$1}");
266
+ continue;
267
+ }
268
+ const allParamNames = [
269
+ ...pathParamNames,
270
+ ...op.queryParams.map((p) => p.name)
271
+ ];
272
+ const signaturePieces = [];
273
+ for (const param of op.pathParams) {
274
+ signaturePieces.push(`${param.name}: string`);
275
+ }
276
+ for (const param of op.queryParams) {
277
+ signaturePieces.push(
278
+ `${param.name}${param.required ? "" : "?"}: ${mapQueryType(param)}`
279
+ );
280
+ }
281
+ const signatureParams = signaturePieces.join(", ");
282
+ const needsDefaultObject = !hasPathParams && hasQueryParams && op.queryParams.every((param) => !param.required);
283
+ const signatureArgs = allParamNames.length ? `{ ${allParamNames.join(", ")} }` : "{}";
284
+ const signature = `${signatureArgs}: { ${signatureParams} }${needsDefaultObject ? " = {}" : ""}`;
285
+ const pathWithParams = op.path.replace(/{([^}]+)}/g, "${$1}");
286
+ if (!hasQueryParams) {
265
287
  output.push(
266
- ` ${op.operationId}: ({ ${paramNames} }: { ${paramTypes} }) => \`${pathWithParams}\`,`
288
+ ` ${op.operationId}: (${signature}) => \`${pathWithParams}\`,`
267
289
  );
290
+ continue;
291
+ }
292
+ output.push(` ${op.operationId}: (${signature}) => {`);
293
+ output.push(" const params = new URLSearchParams()");
294
+ for (const param of op.queryParams) {
295
+ const propertyKey = formatPropertyName(param.name);
296
+ const accessor = isValidJSIdentifier(param.name) ? param.name : propertyKey;
297
+ const schema = param.schema ?? {};
298
+ if (schema?.type === "array") {
299
+ const itemValueExpression = convertQueryParamValue(
300
+ schema.items ?? {},
301
+ "value"
302
+ );
303
+ if (param.required) {
304
+ output.push(` for (const value of ${accessor}) {`);
305
+ output.push(
306
+ ` params.append("${param.name}", ${itemValueExpression})`
307
+ );
308
+ output.push(" }");
309
+ } else {
310
+ output.push(` if (${accessor} !== undefined) {`);
311
+ output.push(` for (const value of ${accessor}) {`);
312
+ output.push(
313
+ ` params.append("${param.name}", ${itemValueExpression})`
314
+ );
315
+ output.push(" }");
316
+ output.push(" }");
317
+ }
318
+ continue;
319
+ }
320
+ const valueExpression = convertQueryParamValue(schema, accessor);
321
+ if (param.required) {
322
+ output.push(` params.set("${param.name}", ${valueExpression})`);
323
+ } else {
324
+ output.push(` if (${accessor} !== undefined) {`);
325
+ output.push(` params.set("${param.name}", ${valueExpression})`);
326
+ output.push(" }");
327
+ }
268
328
  }
329
+ output.push(" const _searchParams = params.toString()");
330
+ output.push(
331
+ ` return \`${pathWithParams}\${_searchParams ? \`?\${_searchParams}\` : ""}\``
332
+ );
333
+ output.push(" },");
269
334
  }
270
335
  output.push("} as const;");
271
336
  output.push("");
@@ -357,6 +422,7 @@ function generate(spec, options = {}) {
357
422
  output.push("} as const;");
358
423
  output.push("");
359
424
  }
425
+ generateOperationTypes(output, operations, typesConfig);
360
426
  return output.join("\n");
361
427
  }
362
428
  function appendOperationField(buffer, key, value) {
@@ -392,11 +458,13 @@ function parseOperations(spec) {
392
458
  );
393
459
  const resolvedParameters = collectParameters(pathItem, operation, spec);
394
460
  const requestHeaders = getRequestHeaders(resolvedParameters);
461
+ const queryParams = getQueryParams(resolvedParameters);
395
462
  operations.push({
396
463
  operationId: operation.operationId,
397
464
  path,
398
465
  method: method.toLowerCase(),
399
466
  pathParams,
467
+ queryParams,
400
468
  requestType,
401
469
  responseType: successResponse,
402
470
  requestHeaders,
@@ -406,6 +474,91 @@ function parseOperations(spec) {
406
474
  }
407
475
  return operations;
408
476
  }
477
+ function normalizeTypesConfig(config) {
478
+ return {
479
+ emit: config?.emit ?? true,
480
+ helpers: config?.helpers ?? "package",
481
+ helpersOutput: config?.helpersOutput ?? "./zenko-types"
482
+ };
483
+ }
484
+ function appendHelperTypesImport(buffer, config) {
485
+ if (!config.emit) return;
486
+ switch (config.helpers) {
487
+ case "package":
488
+ buffer.push(
489
+ 'import type { PathFn, HeaderFn, OperationDefinition, OperationErrors } from "zenko";'
490
+ );
491
+ return;
492
+ case "file":
493
+ buffer.push(
494
+ `import type { PathFn, HeaderFn, OperationDefinition, OperationErrors } from "${config.helpersOutput}";`
495
+ );
496
+ return;
497
+ case "inline":
498
+ buffer.push(
499
+ "type PathFn<TArgs extends unknown[] = []> = (...args: TArgs) => string;"
500
+ );
501
+ buffer.push(
502
+ "type HeaderFn<TArgs extends unknown[] = [], TResult = Record<string, unknown> | Record<string, never>> = (...args: TArgs) => TResult;"
503
+ );
504
+ buffer.push(
505
+ "type OperationErrors<TClient = unknown, TServer = unknown, TDefault = unknown, TOther = unknown> = {"
506
+ );
507
+ buffer.push(" clientErrors?: Record<string, TClient>;");
508
+ buffer.push(" serverErrors?: Record<string, TServer>;");
509
+ buffer.push(" defaultErrors?: Record<string, TDefault>;");
510
+ buffer.push(" otherErrors?: Record<string, TOther>;");
511
+ buffer.push("};");
512
+ buffer.push(
513
+ "type OperationDefinition<TPath extends (...args: any[]) => string, TRequest = undefined, TResponse = undefined, THeaders extends HeaderFn | undefined = undefined, TErrors extends OperationErrors | undefined = undefined> = {"
514
+ );
515
+ buffer.push(" path: TPath;");
516
+ buffer.push(" request?: TRequest;");
517
+ buffer.push(" response?: TResponse;");
518
+ buffer.push(" headers?: THeaders;");
519
+ buffer.push(" errors?: TErrors;");
520
+ buffer.push("};");
521
+ return;
522
+ }
523
+ }
524
+ function generateOperationTypes(buffer, operations, config) {
525
+ if (!config.emit) return;
526
+ buffer.push("// Operation Types");
527
+ for (const op of operations) {
528
+ const headerType = op.requestHeaders?.length ? `typeof headers.${op.operationId}` : "undefined";
529
+ const requestType = op.requestType ?? "undefined";
530
+ const responseType = op.responseType ?? "undefined";
531
+ const errorsType = buildOperationErrorsType(op.errors);
532
+ buffer.push(
533
+ `export type ${capitalize(op.operationId)}Operation = OperationDefinition<`
534
+ );
535
+ buffer.push(` typeof paths.${op.operationId},`);
536
+ buffer.push(` ${requestType},`);
537
+ buffer.push(` ${responseType},`);
538
+ buffer.push(` ${headerType},`);
539
+ buffer.push(` ${errorsType}`);
540
+ buffer.push(`>;`);
541
+ buffer.push("");
542
+ }
543
+ }
544
+ function buildOperationErrorsType(errors) {
545
+ if (!errors || !hasAnyErrors(errors)) {
546
+ return "OperationErrors";
547
+ }
548
+ const client = buildErrorBucket(errors.clientErrors);
549
+ const server = buildErrorBucket(errors.serverErrors);
550
+ const fallback = buildErrorBucket(errors.defaultErrors);
551
+ const other = buildErrorBucket(errors.otherErrors);
552
+ return `OperationErrors<${client}, ${server}, ${fallback}, ${other}>`;
553
+ }
554
+ function buildErrorBucket(bucket) {
555
+ if (!bucket || Object.keys(bucket).length === 0) {
556
+ return "unknown";
557
+ }
558
+ const entries = Object.entries(bucket);
559
+ const typeEntries = entries.map(([name, type]) => `${formatPropertyName(name)}: ${type}`).join("; ");
560
+ return `{ ${typeEntries} }`;
561
+ }
409
562
  function collectParameters(pathItem, operation, spec) {
410
563
  const parametersMap = /* @__PURE__ */ new Map();
411
564
  const addParameters = (params) => {
@@ -548,6 +701,20 @@ function getRequestHeaders(parameters) {
548
701
  }
549
702
  return headers;
550
703
  }
704
+ function getQueryParams(parameters) {
705
+ const queryParams = [];
706
+ for (const param of parameters ?? []) {
707
+ if (param.in === "query") {
708
+ queryParams.push({
709
+ name: param.name,
710
+ description: param.description,
711
+ schema: param.schema,
712
+ required: param.required
713
+ });
714
+ }
715
+ }
716
+ return queryParams;
717
+ }
551
718
  function mapHeaderType(header) {
552
719
  const schemaType = header.schema?.type;
553
720
  switch (schemaType) {
@@ -560,6 +727,39 @@ function mapHeaderType(header) {
560
727
  return "string";
561
728
  }
562
729
  }
730
+ function mapQueryType(param) {
731
+ return mapQuerySchemaType(param.schema);
732
+ }
733
+ function mapQuerySchemaType(schema) {
734
+ if (!schema) return "string";
735
+ if (schema.type === "array") {
736
+ const itemType = mapQuerySchemaType(schema.items);
737
+ return `Array<${itemType}>`;
738
+ }
739
+ switch (schema.type) {
740
+ case "integer":
741
+ case "number":
742
+ return "number";
743
+ case "boolean":
744
+ return "boolean";
745
+ default:
746
+ return "string";
747
+ }
748
+ }
749
+ function convertQueryParamValue(schema, accessor) {
750
+ if (!schema) {
751
+ return `String(${accessor})`;
752
+ }
753
+ switch (schema.type) {
754
+ case "integer":
755
+ case "number":
756
+ return `String(${accessor})`;
757
+ case "boolean":
758
+ return `${accessor} ? "true" : "false"`;
759
+ default:
760
+ return `String(${accessor})`;
761
+ }
762
+ }
563
763
  function generateZodSchema(name, schema, generatedTypes, options) {
564
764
  if (generatedTypes.has(name)) return "";
565
765
  generatedTypes.add(name);
@@ -568,18 +768,7 @@ function generateZodSchema(name, schema, generatedTypes, options) {
568
768
  return `export const ${name} = z.enum([${enumValues}]);`;
569
769
  }
570
770
  if (schema.type === "object" || schema.properties) {
571
- const properties = [];
572
- for (const [propName, propSchema] of Object.entries(
573
- schema.properties || {}
574
- )) {
575
- const isRequired = schema.required?.includes(propName) ?? false;
576
- const zodType = getZodTypeFromSchema(propSchema, options);
577
- const finalType = isRequired ? zodType : `${zodType}.optional()`;
578
- properties.push(` ${formatPropertyName(propName)}: ${finalType},`);
579
- }
580
- return `export const ${name} = z.object({
581
- ${properties.join("\n")}
582
- });`;
771
+ return `export const ${name} = ${buildZodObject(schema, options)};`;
583
772
  }
584
773
  if (schema.type === "array") {
585
774
  const itemSchema = schema.items ?? { type: "unknown" };
@@ -602,6 +791,9 @@ function getZodTypeFromSchema(schema, options) {
602
791
  const enumValues = schema.enum.map((v) => `"${v}"`).join(", ");
603
792
  return `z.enum([${enumValues}])`;
604
793
  }
794
+ if (schema.type === "object" || schema.properties) {
795
+ return buildZodObject(schema, options);
796
+ }
605
797
  switch (schema.type) {
606
798
  case "string":
607
799
  return buildString(schema, options);
@@ -622,6 +814,23 @@ function getZodTypeFromSchema(schema, options) {
622
814
  return "z.unknown()";
623
815
  }
624
816
  }
817
+ function buildZodObject(schema, options) {
818
+ const properties = [];
819
+ for (const [propName, propSchema] of Object.entries(
820
+ schema.properties || {}
821
+ )) {
822
+ const isRequired = schema.required?.includes(propName) ?? false;
823
+ const zodType = getZodTypeFromSchema(propSchema, options);
824
+ const finalType = isRequired ? zodType : `${zodType}.optional()`;
825
+ properties.push(` ${formatPropertyName(propName)}: ${finalType},`);
826
+ }
827
+ if (properties.length === 0) {
828
+ return "z.object({})";
829
+ }
830
+ return `z.object({
831
+ ${properties.join("\n")}
832
+ })`;
833
+ }
625
834
  function buildString(schema, options) {
626
835
  if (options.strictDates) {
627
836
  switch (schema.format) {