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/README.md +60 -12
- package/dist/cli.cjs +245 -22
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.mjs +245 -22
- package/dist/cli.mjs.map +1 -1
- package/dist/index.cjs +227 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -1
- package/dist/index.d.ts +24 -1
- package/dist/index.mjs +227 -18
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -8
package/dist/index.mjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/utils/topological-sort.ts","../src/utils/property-name.ts","../src/utils/http-status.ts","../src/zenko.ts"],"sourcesContent":["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":["../src/utils/topological-sort.ts","../src/utils/property-name.ts","../src/utils/http-status.ts","../src/zenko.ts"],"sourcesContent":["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":[]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "zenko",
|
3
|
-
"version": "0.1.
|
3
|
+
"version": "0.1.1",
|
4
4
|
"description": "Generate TypeScript types and path functions from OpenAPI specs",
|
5
5
|
"main": "dist/index.cjs",
|
6
6
|
"module": "dist/index.mjs",
|
@@ -19,6 +19,11 @@
|
|
19
19
|
"types": "./dist/index.d.ts",
|
20
20
|
"import": "./dist/index.mjs",
|
21
21
|
"require": "./dist/index.cjs"
|
22
|
+
},
|
23
|
+
"./types": {
|
24
|
+
"types": "./dist/types.d.ts",
|
25
|
+
"import": "./dist/types.mjs",
|
26
|
+
"require": "./dist/types.cjs"
|
22
27
|
}
|
23
28
|
},
|
24
29
|
"repository": {
|
@@ -49,17 +54,11 @@
|
|
49
54
|
"test": "bun test",
|
50
55
|
"coverage": "bun test --coverage",
|
51
56
|
"prepublishOnly": "bun run build",
|
52
|
-
"
|
53
|
-
"format:check": "prettier --check '**/*'{js,ts,tsx,json} --experimental-cli",
|
54
|
-
"lint": "oxlint src --fix --max-warnings=0",
|
55
|
-
"lint:check": "oxlint src --fix --max-warnings=0"
|
57
|
+
"check-types": "tsc --noEmit"
|
56
58
|
},
|
57
59
|
"devDependencies": {
|
58
|
-
"@prettier/plugin-oxc": "0.0.4",
|
59
60
|
"@types/bun": "1.3.0",
|
60
61
|
"@types/js-yaml": "4.0.9",
|
61
|
-
"oxlint": "1.11.2",
|
62
|
-
"prettier": "3.6.2",
|
63
62
|
"tsup": "8.5.0",
|
64
63
|
"typescript": "5.9.3"
|
65
64
|
},
|