zenko 0.1.0 → 0.1.2

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/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,129 @@ 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 = wrapTypeReference(op.requestType);
530
+ const responseType = wrapTypeReference(op.responseType);
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 accessibleEntries = entries.map(([name, type]) => {
560
+ const propertyKey = formatPropertyName(name);
561
+ const valueType = wrapErrorValueType(type);
562
+ return `${propertyKey}: ${valueType}`;
563
+ });
564
+ return `{ ${accessibleEntries.join("; ")} }`;
565
+ }
566
+ var TYPE_KEYWORDS = /* @__PURE__ */ new Set([
567
+ "any",
568
+ "unknown",
569
+ "never",
570
+ "void",
571
+ "null",
572
+ "undefined",
573
+ "string",
574
+ "number",
575
+ "boolean",
576
+ "bigint",
577
+ "symbol"
578
+ ]);
579
+ function wrapTypeReference(typeName) {
580
+ if (!typeName) return "undefined";
581
+ if (typeName === "undefined") return "undefined";
582
+ if (TYPE_KEYWORDS.has(typeName)) return typeName;
583
+ if (typeName.startsWith("typeof ")) return typeName;
584
+ const identifierPattern = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
585
+ if (identifierPattern.test(typeName)) {
586
+ return `typeof ${typeName}`;
587
+ }
588
+ return typeName;
589
+ }
590
+ function wrapErrorValueType(typeName) {
591
+ if (!typeName) return "unknown";
592
+ if (TYPE_KEYWORDS.has(typeName)) return typeName;
593
+ if (typeName.startsWith("typeof ")) return typeName;
594
+ const identifierPattern = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
595
+ if (identifierPattern.test(typeName)) {
596
+ return `typeof ${typeName}`;
597
+ }
598
+ return typeName;
599
+ }
409
600
  function collectParameters(pathItem, operation, spec) {
410
601
  const parametersMap = /* @__PURE__ */ new Map();
411
602
  const addParameters = (params) => {
@@ -548,6 +739,20 @@ function getRequestHeaders(parameters) {
548
739
  }
549
740
  return headers;
550
741
  }
742
+ function getQueryParams(parameters) {
743
+ const queryParams = [];
744
+ for (const param of parameters ?? []) {
745
+ if (param.in === "query") {
746
+ queryParams.push({
747
+ name: param.name,
748
+ description: param.description,
749
+ schema: param.schema,
750
+ required: param.required
751
+ });
752
+ }
753
+ }
754
+ return queryParams;
755
+ }
551
756
  function mapHeaderType(header) {
552
757
  const schemaType = header.schema?.type;
553
758
  switch (schemaType) {
@@ -560,6 +765,39 @@ function mapHeaderType(header) {
560
765
  return "string";
561
766
  }
562
767
  }
768
+ function mapQueryType(param) {
769
+ return mapQuerySchemaType(param.schema);
770
+ }
771
+ function mapQuerySchemaType(schema) {
772
+ if (!schema) return "string";
773
+ if (schema.type === "array") {
774
+ const itemType = mapQuerySchemaType(schema.items);
775
+ return `Array<${itemType}>`;
776
+ }
777
+ switch (schema.type) {
778
+ case "integer":
779
+ case "number":
780
+ return "number";
781
+ case "boolean":
782
+ return "boolean";
783
+ default:
784
+ return "string";
785
+ }
786
+ }
787
+ function convertQueryParamValue(schema, accessor) {
788
+ if (!schema) {
789
+ return `String(${accessor})`;
790
+ }
791
+ switch (schema.type) {
792
+ case "integer":
793
+ case "number":
794
+ return `String(${accessor})`;
795
+ case "boolean":
796
+ return `${accessor} ? "true" : "false"`;
797
+ default:
798
+ return `String(${accessor})`;
799
+ }
800
+ }
563
801
  function generateZodSchema(name, schema, generatedTypes, options) {
564
802
  if (generatedTypes.has(name)) return "";
565
803
  generatedTypes.add(name);
@@ -568,18 +806,7 @@ function generateZodSchema(name, schema, generatedTypes, options) {
568
806
  return `export const ${name} = z.enum([${enumValues}]);`;
569
807
  }
570
808
  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
- });`;
809
+ return `export const ${name} = ${buildZodObject(schema, options)};`;
583
810
  }
584
811
  if (schema.type === "array") {
585
812
  const itemSchema = schema.items ?? { type: "unknown" };
@@ -602,6 +829,9 @@ function getZodTypeFromSchema(schema, options) {
602
829
  const enumValues = schema.enum.map((v) => `"${v}"`).join(", ");
603
830
  return `z.enum([${enumValues}])`;
604
831
  }
832
+ if (schema.type === "object" || schema.properties) {
833
+ return buildZodObject(schema, options);
834
+ }
605
835
  switch (schema.type) {
606
836
  case "string":
607
837
  return buildString(schema, options);
@@ -622,6 +852,23 @@ function getZodTypeFromSchema(schema, options) {
622
852
  return "z.unknown()";
623
853
  }
624
854
  }
855
+ function buildZodObject(schema, options) {
856
+ const properties = [];
857
+ for (const [propName, propSchema] of Object.entries(
858
+ schema.properties || {}
859
+ )) {
860
+ const isRequired = schema.required?.includes(propName) ?? false;
861
+ const zodType = getZodTypeFromSchema(propSchema, options);
862
+ const finalType = isRequired ? zodType : `${zodType}.optional()`;
863
+ properties.push(` ${formatPropertyName(propName)}: ${finalType},`);
864
+ }
865
+ if (properties.length === 0) {
866
+ return "z.object({})";
867
+ }
868
+ return `z.object({
869
+ ${properties.join("\n")}
870
+ })`;
871
+ }
625
872
  function buildString(schema, options) {
626
873
  if (options.strictDates) {
627
874
  switch (schema.format) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts","../src/utils/topological-sort.ts","../src/utils/property-name.ts","../src/utils/http-status.ts","../src/zenko.ts"],"sourcesContent":["export { generate, type OpenAPISpec, type GenerateOptions } from \"./src/zenko\"\n","export function topologicalSort(schemas: Record<string, any>): string[] {\n const visited = new Set<string>()\n const visiting = new Set<string>()\n const result: string[] = []\n\n const visit = (name: string): void => {\n if (visited.has(name)) return\n if (visiting.has(name)) {\n // Circular dependency detected, just add it anyway\n return\n }\n\n visiting.add(name)\n\n // Find dependencies of this schema\n const schema = schemas[name]\n const dependencies = extractDependencies(schema)\n\n // Visit dependencies first\n for (const dep of dependencies) {\n if (schemas[dep]) {\n visit(dep)\n }\n }\n\n visiting.delete(name)\n visited.add(name)\n result.push(name)\n }\n\n // Visit all schemas\n for (const name of Object.keys(schemas)) {\n visit(name)\n }\n\n return result\n}\n\nexport function extractDependencies(schema: any): string[] {\n const dependencies: string[] = []\n\n const traverse = (obj: any): void => {\n if (typeof obj !== \"object\" || obj === null) return\n\n if (obj.$ref && typeof obj.$ref === \"string\") {\n const refName = extractRefName(obj.$ref)\n dependencies.push(refName)\n return\n }\n\n if (Array.isArray(obj)) {\n obj.forEach(traverse)\n } else {\n Object.values(obj).forEach(traverse)\n }\n }\n\n traverse(schema)\n return [...new Set(dependencies)] // Remove duplicates\n}\n\nexport function extractRefName(ref: string): string {\n return ref.split(\"/\").pop() || \"Unknown\"\n}\n","/**\n * Checks if a string is a valid JavaScript identifier\n */\nexport function isValidJSIdentifier(name: string): boolean {\n // Check if name is empty\n if (!name) return false\n\n // Check if first character is valid (letter, underscore, or $)\n const firstChar = name.at(0)\n if (firstChar === undefined) return false\n if (!/[a-zA-Z_$]/.test(firstChar)) return false\n\n if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name)) return false\n\n // Check if it's a reserved word\n const reservedWords = new Set([\n \"abstract\",\n \"arguments\",\n \"await\",\n \"boolean\",\n \"break\",\n \"byte\",\n \"case\",\n \"catch\",\n \"char\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"double\",\n \"else\",\n \"enum\",\n \"eval\",\n \"export\",\n \"extends\",\n \"false\",\n \"final\",\n \"finally\",\n \"float\",\n \"for\",\n \"function\",\n \"goto\",\n \"if\",\n \"implements\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"int\",\n \"interface\",\n \"let\",\n \"long\",\n \"native\",\n \"new\",\n \"null\",\n \"package\",\n \"private\",\n \"protected\",\n \"public\",\n \"return\",\n \"short\",\n \"static\",\n \"super\",\n \"switch\",\n \"synchronized\",\n \"this\",\n \"throw\",\n \"throws\",\n \"transient\",\n \"true\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"volatile\",\n \"while\",\n \"with\",\n \"yield\",\n \"async\",\n ])\n\n return !reservedWords.has(name)\n}\n\n/**\n * Formats a property name for use in JavaScript/TypeScript object literals\n * Quotes the name if it's not a valid JavaScript identifier\n */\nexport function formatPropertyName(name: string): string {\n return isValidJSIdentifier(name) ? name : `\"${name}\"`\n}\n","const statusNameMap: Record<string, string> = {\n \"400\": \"badRequest\",\n \"401\": \"unauthorized\",\n \"402\": \"paymentRequired\",\n \"403\": \"forbidden\",\n \"404\": \"notFound\",\n \"405\": \"methodNotAllowed\",\n \"406\": \"notAcceptable\",\n \"407\": \"proxyAuthenticationRequired\",\n \"408\": \"requestTimeout\",\n \"409\": \"conflict\",\n \"410\": \"gone\",\n \"411\": \"lengthRequired\",\n \"412\": \"preconditionFailed\",\n \"413\": \"payloadTooLarge\",\n \"414\": \"uriTooLong\",\n \"415\": \"unsupportedMediaType\",\n \"416\": \"rangeNotSatisfiable\",\n \"417\": \"expectationFailed\",\n \"418\": \"imATeapot\",\n \"421\": \"misdirectedRequest\",\n \"422\": \"unprocessableEntity\",\n \"423\": \"locked\",\n \"424\": \"failedDependency\",\n \"425\": \"tooEarly\",\n \"426\": \"upgradeRequired\",\n \"428\": \"preconditionRequired\",\n \"429\": \"tooManyRequests\",\n \"431\": \"requestHeaderFieldsTooLarge\",\n \"451\": \"unavailableForLegalReasons\",\n \"500\": \"internalServerError\",\n \"501\": \"notImplemented\",\n \"502\": \"badGateway\",\n \"503\": \"serviceUnavailable\",\n \"504\": \"gatewayTimeout\",\n \"505\": \"httpVersionNotSupported\",\n \"506\": \"variantAlsoNegotiates\",\n \"507\": \"insufficientStorage\",\n \"508\": \"loopDetected\",\n \"510\": \"notExtended\",\n \"511\": \"networkAuthenticationRequired\",\n} as const\n\nexport type StatusCategory = \"client\" | \"server\" | \"default\" | \"unknown\"\n\nexport function mapStatusToIdentifier(status: string): string {\n if (status === \"default\") return \"defaultError\"\n\n const trimmed = status.trim()\n const mapped = statusNameMap[trimmed]\n if (mapped) return mapped\n\n if (/^\\d{3}$/.test(trimmed)) {\n return `status${trimmed}`\n }\n\n const sanitized = trimmed\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \" \")\n .trim()\n\n if (!sanitized) return \"unknownError\"\n\n const parts = sanitized.split(/\\s+/)\n const [first, ...rest] = parts\n const candidate =\n first +\n rest\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join(\"\")\n\n if (!candidate) return \"unknownError\"\n\n return /^[a-zA-Z_$]/.test(candidate)\n ? candidate\n : `status${candidate.charAt(0).toUpperCase()}${candidate.slice(1)}`\n}\n\nexport function getStatusCategory(status: string): StatusCategory {\n if (status === \"default\") return \"default\"\n\n const code = Number(status)\n if (!Number.isInteger(code)) return \"unknown\"\n\n if (code >= 400 && code <= 499) return \"client\"\n if (code >= 500 && code <= 599) return \"server\"\n\n return \"unknown\"\n}\n\nexport function isErrorStatus(status: string): boolean {\n if (status === \"default\") return true\n const code = Number(status)\n if (!Number.isInteger(code)) return false\n return code >= 400\n}\n","import { topologicalSort, extractRefName } from \"./utils/topological-sort\"\nimport { formatPropertyName, isValidJSIdentifier } from \"./utils/property-name\"\nimport {\n getStatusCategory,\n isErrorStatus,\n mapStatusToIdentifier,\n} from \"./utils/http-status\"\n\nexport type OpenAPISpec = {\n openapi: string\n info: unknown\n paths: Record<string, Record<string, unknown>>\n components?: {\n schemas?: Record<string, unknown>\n parameters?: Record<string, unknown>\n }\n}\n\nexport type GenerateOptions = {\n strictDates?: boolean\n strictNumeric?: boolean\n}\n\ntype PathParam = {\n name: string\n type: string\n}\n\ntype Operation = {\n operationId: string\n path: string\n method: string\n pathParams: PathParam[]\n requestType?: string\n responseType?: string\n requestHeaders?: RequestHeader[]\n errors?: OperationErrorGroup\n}\ntype OperationErrorGroup = {\n clientErrors?: OperationErrorMap\n serverErrors?: OperationErrorMap\n defaultErrors?: OperationErrorMap\n otherErrors?: OperationErrorMap\n}\ntype OperationErrorMap = Record<string, string>\n\ntype RequestHeader = {\n name: string\n description?: string\n schema?: any\n required?: boolean\n}\n\nexport function generate(\n spec: OpenAPISpec,\n options: GenerateOptions = {}\n): string {\n const output: string[] = []\n const generatedTypes = new Set<string>()\n const { strictDates = false, strictNumeric = false } = options\n const schemaOptions: SchemaOptions = {\n strictDates,\n strictNumeric,\n }\n\n output.push('import { z } from \"zod\";')\n output.push(\"\")\n\n // Generate Zod schemas from components/schemas\n if (spec.components?.schemas) {\n output.push(\"// Generated Zod Schemas\")\n output.push(\"\")\n\n // Sort schemas by dependencies (topological sort)\n const sortedSchemas = topologicalSort(spec.components.schemas)\n\n for (const name of sortedSchemas) {\n const schema = spec.components.schemas[name]\n output.push(\n generateZodSchema(name, schema, generatedTypes, schemaOptions)\n )\n output.push(\"\")\n // Export inferred type\n output.push(`export type ${name} = z.infer<typeof ${name}>;`)\n output.push(\"\")\n }\n }\n\n // Parse all operations\n const operations = parseOperations(spec)\n\n // Generate path functions\n output.push(\"// Path Functions\")\n output.push(\"export const paths = {\")\n\n for (const op of operations) {\n if (op.pathParams.length === 0) {\n output.push(` ${op.operationId}: () => \"${op.path}\",`)\n } else {\n const paramNames = op.pathParams.map((p) => p.name).join(\", \")\n const paramTypes = op.pathParams\n .map((p) => `${p.name}: string`)\n .join(\", \")\n const pathWithParams = op.path.replace(/{([^}]+)}/g, \"${$1}\")\n output.push(\n ` ${op.operationId}: ({ ${paramNames} }: { ${paramTypes} }) => \\`${pathWithParams}\\`,`\n )\n }\n }\n\n output.push(\"} as const;\")\n output.push(\"\")\n\n // Generate header functions\n output.push(\"// Header Functions\")\n output.push(\"export const headers = {\")\n\n for (const op of operations) {\n if (!op.requestHeaders || op.requestHeaders.length === 0) {\n output.push(` ${op.operationId}: () => ({}),`)\n continue\n }\n\n const typeEntries = op.requestHeaders\n .map(\n (header) =>\n `${formatPropertyName(header.name)}${header.required ? \"\" : \"?\"}: ${mapHeaderType(\n header\n )}`\n )\n .join(\", \")\n\n const requiredHeaders = op.requestHeaders.filter(\n (header) => header.required\n )\n const optionalHeaders = op.requestHeaders.filter(\n (header) => !header.required\n )\n const hasRequired = requiredHeaders.length > 0\n const signature = hasRequired\n ? `(params: { ${typeEntries} })`\n : `(params: { ${typeEntries} } = {})`\n\n if (optionalHeaders.length === 0) {\n output.push(` ${op.operationId}: ${signature} => ({`)\n\n for (const header of requiredHeaders) {\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n output.push(` ${propertyKey}: ${accessor},`)\n }\n\n output.push(\" }),\")\n continue\n }\n\n if (!hasRequired && optionalHeaders.length === 1 && optionalHeaders[0]) {\n const header = optionalHeaders[0]\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n\n output.push(` ${op.operationId}: ${signature} =>`)\n output.push(\n ` ${accessor} !== undefined ? { ${propertyKey}: ${accessor} } : {},`\n )\n continue\n }\n\n const valueTypes = Array.from(\n new Set(optionalHeaders.map((header) => mapHeaderType(header)))\n ).join(\" | \")\n\n output.push(` ${op.operationId}: ${signature} => {`)\n\n if (hasRequired) {\n output.push(\" const headers = {\")\n for (const header of requiredHeaders) {\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n output.push(` ${propertyKey}: ${accessor},`)\n }\n output.push(\" }\")\n } else {\n output.push(` const headers: Record<string, ${valueTypes}> = {}`)\n }\n\n for (const header of optionalHeaders) {\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n const assignment = isValidJSIdentifier(header.name)\n ? `headers.${header.name}`\n : `headers[${propertyKey}]`\n\n output.push(` if (${accessor} !== undefined) {`)\n output.push(` ${assignment} = ${accessor}`)\n output.push(\" }\")\n }\n\n output.push(\" return headers\")\n output.push(\" },\")\n }\n\n output.push(\"} as const;\")\n output.push(\"\")\n\n // Generate operation objects\n output.push(\"// Operation Objects\")\n for (const op of operations) {\n output.push(`export const ${op.operationId} = {`)\n output.push(` path: paths.${op.operationId},`)\n\n appendOperationField(output, \"request\", op.requestType)\n appendOperationField(output, \"response\", op.responseType)\n\n if (op.requestHeaders && op.requestHeaders.length > 0) {\n output.push(` headers: headers.${op.operationId},`)\n }\n\n if (op.errors && hasAnyErrors(op.errors)) {\n output.push(\" errors: {\")\n appendErrorGroup(output, \"clientErrors\", op.errors.clientErrors)\n appendErrorGroup(output, \"serverErrors\", op.errors.serverErrors)\n appendErrorGroup(output, \"defaultErrors\", op.errors.defaultErrors)\n appendErrorGroup(output, \"otherErrors\", op.errors.otherErrors)\n output.push(\" },\")\n }\n\n output.push(\"} as const;\")\n output.push(\"\")\n }\n\n return output.join(\"\\n\")\n}\n\nfunction appendOperationField(\n buffer: string[],\n key: string,\n value?: string\n): void {\n if (!value) return\n buffer.push(` ${key}: ${value},`)\n}\n\nfunction appendErrorGroup(\n buffer: string[],\n label: string,\n errors?: OperationErrorMap\n): void {\n if (!errors || Object.keys(errors).length === 0) return\n buffer.push(` ${label}: {`)\n for (const [name, typeName] of Object.entries(errors)) {\n buffer.push(` ${formatPropertyName(name)}: ${typeName},`)\n }\n buffer.push(\" },\")\n}\n\nfunction hasAnyErrors(group: OperationErrorGroup): boolean {\n return [\n group.clientErrors,\n group.serverErrors,\n group.defaultErrors,\n group.otherErrors,\n ].some((bucket) => bucket && Object.keys(bucket).length > 0)\n}\n\nfunction parseOperations(spec: OpenAPISpec): Operation[] {\n const operations: Operation[] = []\n\n for (const [path, pathItem] of Object.entries(spec.paths)) {\n for (const [method, operation] of Object.entries(pathItem)) {\n if (!(operation as any).operationId) continue\n\n const pathParams = extractPathParams(path)\n const requestType = getRequestType(operation)\n const { successResponse, errors } = getResponseTypes(\n operation,\n (operation as any).operationId\n )\n const resolvedParameters = collectParameters(pathItem, operation, spec)\n const requestHeaders = getRequestHeaders(resolvedParameters)\n\n operations.push({\n operationId: (operation as any).operationId,\n path,\n method: method.toLowerCase(),\n pathParams,\n requestType,\n responseType: successResponse,\n requestHeaders,\n errors,\n })\n }\n }\n\n return operations\n}\n\nfunction collectParameters(\n pathItem: Record<string, unknown>,\n operation: unknown,\n spec: OpenAPISpec\n): any[] {\n const parametersMap = new Map<string, any>()\n\n const addParameters = (params: unknown) => {\n if (!Array.isArray(params)) return\n\n for (const param of params) {\n const resolved = resolveParameter(param, spec)\n if (!resolved) continue\n const key = `${resolved.in}:${resolved.name}`\n parametersMap.set(key, resolved)\n }\n }\n\n addParameters((pathItem as any).parameters)\n addParameters((operation as any).parameters)\n\n return Array.from(parametersMap.values())\n}\n\nfunction resolveParameter(parameter: any, spec: OpenAPISpec) {\n if (!parameter) return undefined\n\n if (parameter.$ref) {\n const refName = extractRefName(parameter.$ref)\n const resolved = spec.components?.parameters?.[refName]\n if (!resolved) return undefined\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { $ref, ...overrides } = parameter\n return {\n ...resolved,\n ...overrides,\n }\n }\n\n return parameter\n}\n\nfunction extractPathParams(path: string): PathParam[] {\n const params: PathParam[] = []\n const matches = path.match(/{([^}]+)}/g)\n\n if (matches) {\n for (const match of matches) {\n const paramName = match.slice(1, -1)\n params.push({\n name: paramName,\n type: \"string\", // OpenAPI path params are always strings\n })\n }\n }\n\n return params\n}\n\nfunction getRequestType(operation: any): string | undefined {\n const requestBody =\n operation.requestBody?.content?.[\"application/json\"]?.schema\n if (!requestBody) return undefined\n\n if (requestBody.$ref) {\n return extractRefName(requestBody.$ref)\n }\n\n // Generate inline type if needed\n const typeName = `${capitalize(operation.operationId)}Request`\n return typeName\n}\n\nfunction getResponseTypes(\n operation: any,\n operationId: string\n): { successResponse?: string; errors?: OperationErrorGroup } {\n const responses = operation.responses ?? {}\n const successCodes = new Map<string, string>()\n const errorEntries: Array<{ code: string; schema: any }> = []\n\n for (const [statusCode, response] of Object.entries(responses)) {\n const resolvedSchema = (response as any)?.content?.[\"application/json\"]\n ?.schema\n if (!resolvedSchema) continue\n\n if (isErrorStatus(statusCode)) {\n errorEntries.push({ code: statusCode, schema: resolvedSchema })\n continue\n }\n\n if (/^2\\d\\d$/.test(statusCode) || statusCode === \"default\") {\n successCodes.set(statusCode, resolvedSchema)\n }\n }\n\n const successResponse = selectSuccessResponse(successCodes, operationId)\n const errors = buildErrorGroups(errorEntries, operationId)\n\n return { successResponse, errors }\n}\n\nfunction selectSuccessResponse(\n responses: Map<string, any>,\n operationId: string\n): string | undefined {\n if (responses.size === 0) return undefined\n\n const preferredOrder = [\"200\", \"201\", \"204\"]\n for (const code of preferredOrder) {\n const schema = responses.get(code)\n if (schema) {\n return resolveResponseType(\n schema,\n `${capitalize(operationId)}Response${code}`\n )\n }\n }\n\n const [firstCode, firstSchema] = responses.entries().next().value ?? []\n if (!firstSchema) return undefined\n return resolveResponseType(\n firstSchema,\n `${capitalize(operationId)}Response${firstCode ?? \"Default\"}`\n )\n}\n\nfunction buildErrorGroups(\n errors: Array<{ code: string; schema: any }> = [],\n operationId: string\n): OperationErrorGroup | undefined {\n if (!errors.length) return undefined\n\n const group: OperationErrorGroup = {}\n\n for (const { code, schema } of errors) {\n const category = getStatusCategory(code)\n const identifier = mapStatusToIdentifier(code)\n const typeName = resolveResponseType(\n schema,\n `${capitalize(operationId)}${capitalize(identifier)}`\n )\n\n switch (category) {\n case \"client\":\n group.clientErrors ??= {}\n group.clientErrors[identifier] = typeName\n break\n case \"server\":\n group.serverErrors ??= {}\n group.serverErrors[identifier] = typeName\n break\n case \"default\":\n group.defaultErrors ??= {}\n group.defaultErrors[identifier] = typeName\n break\n default:\n group.otherErrors ??= {}\n group.otherErrors[identifier] = typeName\n break\n }\n }\n\n return group\n}\n\nfunction resolveResponseType(schema: any, fallbackName: string): string {\n if (schema.$ref) {\n return extractRefName(schema.$ref)\n }\n return fallbackName\n}\n\nfunction getRequestHeaders(parameters: any[]): RequestHeader[] {\n const headers: RequestHeader[] = []\n\n for (const param of parameters ?? []) {\n if ((param as any).in === \"header\") {\n headers.push({\n name: (param as any).name,\n description: (param as any).description,\n schema: (param as any).schema,\n required: (param as any).required,\n })\n }\n }\n\n return headers\n}\n\nfunction mapHeaderType(header: RequestHeader): string {\n const schemaType = header.schema?.type\n switch (schemaType) {\n case \"integer\":\n case \"number\":\n return \"number\"\n case \"boolean\":\n return \"boolean\"\n default:\n return \"string\"\n }\n}\n\ntype SchemaOptions = {\n strictDates: boolean\n strictNumeric: boolean\n}\n\nfunction generateZodSchema(\n name: string,\n schema: any,\n generatedTypes: Set<string>,\n options: SchemaOptions\n): string {\n if (generatedTypes.has(name)) return \"\"\n generatedTypes.add(name)\n\n if (schema.enum) {\n const enumValues = schema.enum.map((v: string) => `\"${v}\"`).join(\", \")\n return `export const ${name} = z.enum([${enumValues}]);`\n }\n\n if (schema.type === \"object\" || schema.properties) {\n const properties: string[] = []\n\n for (const [propName, propSchema] of Object.entries(\n schema.properties || {}\n )) {\n const isRequired = schema.required?.includes(propName) ?? false\n const zodType = getZodTypeFromSchema(propSchema as any, options)\n const finalType = isRequired ? zodType : `${zodType}.optional()`\n properties.push(` ${formatPropertyName(propName)}: ${finalType},`)\n }\n\n return `export const ${name} = z.object({\\n${properties.join(\"\\n\")}\\n});`\n }\n\n if (schema.type === \"array\") {\n const itemSchema = schema.items ?? { type: \"unknown\" }\n const itemType = getZodTypeFromSchema(itemSchema, options)\n const builder = applyStrictArrayBounds(\n schema,\n `z.array(${itemType})`,\n itemSchema,\n options.strictNumeric\n )\n return `export const ${name} = ${builder};`\n }\n\n return `export const ${name} = ${getZodTypeFromSchema(schema, options)};`\n}\n\nfunction getZodTypeFromSchema(schema: any, options: SchemaOptions): string {\n if (schema.$ref) {\n return extractRefName(schema.$ref)\n }\n\n if (schema.enum) {\n const enumValues = schema.enum.map((v: string) => `\"${v}\"`).join(\", \")\n return `z.enum([${enumValues}])`\n }\n\n switch (schema.type) {\n case \"string\":\n return buildString(schema, options)\n case \"boolean\":\n return \"z.boolean()\"\n case \"array\":\n return `z.array(${getZodTypeFromSchema(\n schema.items ?? { type: \"unknown\" },\n options\n )})`\n case \"null\":\n return \"z.null()\"\n case \"number\":\n return buildNumber(schema, options)\n case \"integer\":\n return buildInteger(schema, options)\n default:\n return \"z.unknown()\"\n }\n}\n\nfunction buildString(schema: any, options: SchemaOptions): string {\n if (options.strictDates) {\n switch (schema.format) {\n case \"date-time\":\n return \"z.string().datetime()\"\n case \"date\":\n return \"z.string().date()\"\n case \"time\":\n return \"z.string().time()\"\n case \"duration\":\n return \"z.string().duration()\"\n }\n }\n\n let builder = \"z.string()\"\n\n if (options.strictNumeric) {\n if (typeof schema.minLength === \"number\") {\n builder += `.min(${schema.minLength})`\n }\n\n if (typeof schema.maxLength === \"number\") {\n builder += `.max(${schema.maxLength})`\n }\n\n if (schema.pattern) {\n builder += `.regex(new RegExp(${JSON.stringify(schema.pattern)}))`\n }\n }\n\n switch (schema.format) {\n case \"uuid\":\n return `${builder}.uuid()`\n case \"email\":\n return `${builder}.email()`\n case \"uri\":\n case \"url\":\n return `${builder}.url()`\n case \"ipv4\":\n return `${builder}.ip({ version: \"v4\" })`\n case \"ipv6\":\n return `${builder}.ip({ version: \"v6\" })`\n default:\n return builder\n }\n}\n\nfunction buildNumber(schema: any, options: SchemaOptions): string {\n let builder = \"z.number()\"\n\n if (options.strictNumeric) {\n builder = applyNumericBounds(schema, builder)\n\n if (typeof schema.multipleOf === \"number\" && schema.multipleOf !== 0) {\n builder += `.refine((value) => Math.abs(value / ${schema.multipleOf} - Math.round(value / ${schema.multipleOf})) < Number.EPSILON, { message: \"Must be a multiple of ${schema.multipleOf}\" })`\n }\n }\n\n return builder\n}\n\nfunction buildInteger(schema: any, options: SchemaOptions): string {\n let builder = buildNumber(schema, options)\n builder += \".int()\"\n return builder\n}\n\nfunction applyStrictArrayBounds(\n schema: any,\n builder: string,\n itemSchema: any,\n enforceBounds: boolean\n): string {\n if (!enforceBounds) {\n return builder\n }\n\n if (typeof schema.minItems === \"number\") {\n builder += `.min(${schema.minItems})`\n }\n\n if (typeof schema.maxItems === \"number\") {\n builder += `.max(${schema.maxItems})`\n }\n\n if (schema.uniqueItems && isPrimitiveLike(itemSchema)) {\n builder +=\n '.refine((items) => new Set(items).size === items.length, { message: \"Items must be unique\" })'\n }\n\n return builder\n}\n\nfunction isPrimitiveLike(schema: any): boolean {\n if (schema?.$ref) return false\n\n const primitiveTypes = new Set([\"string\", \"number\", \"integer\", \"boolean\"])\n return primitiveTypes.has(schema?.type)\n}\n\nfunction applyNumericBounds(schema: any, builder: string): string {\n if (typeof schema.minimum === \"number\") {\n if (schema.exclusiveMinimum === true) {\n builder += `.gt(${schema.minimum})`\n } else {\n builder += `.min(${schema.minimum})`\n }\n } else if (typeof schema.exclusiveMinimum === \"number\") {\n builder += `.gt(${schema.exclusiveMinimum})`\n }\n\n if (typeof schema.maximum === \"number\") {\n if (schema.exclusiveMaximum === true) {\n builder += `.lt(${schema.maximum})`\n } else {\n builder += `.max(${schema.maximum})`\n }\n } else if (typeof schema.exclusiveMaximum === \"number\") {\n builder += `.lt(${schema.exclusiveMaximum})`\n }\n\n return builder\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../index.ts","../src/utils/topological-sort.ts","../src/utils/property-name.ts","../src/utils/http-status.ts","../src/zenko.ts"],"sourcesContent":["export {\n generate,\n type OpenAPISpec,\n type GenerateOptions,\n type TypesConfig,\n} from \"./src/zenko\"\nexport {\n type PathFn,\n type HeaderFn,\n type OperationErrors,\n type OperationDefinition,\n} from \"./src/types\"\n","export function topologicalSort(schemas: Record<string, any>): string[] {\n const visited = new Set<string>()\n const visiting = new Set<string>()\n const result: string[] = []\n\n const visit = (name: string): void => {\n if (visited.has(name)) return\n if (visiting.has(name)) {\n // Circular dependency detected, just add it anyway\n return\n }\n\n visiting.add(name)\n\n // Find dependencies of this schema\n const schema = schemas[name]\n const dependencies = extractDependencies(schema)\n\n // Visit dependencies first\n for (const dep of dependencies) {\n if (schemas[dep]) {\n visit(dep)\n }\n }\n\n visiting.delete(name)\n visited.add(name)\n result.push(name)\n }\n\n // Visit all schemas\n for (const name of Object.keys(schemas)) {\n visit(name)\n }\n\n return result\n}\n\nexport function extractDependencies(schema: any): string[] {\n const dependencies: string[] = []\n\n const traverse = (obj: any): void => {\n if (typeof obj !== \"object\" || obj === null) return\n\n if (obj.$ref && typeof obj.$ref === \"string\") {\n const refName = extractRefName(obj.$ref)\n dependencies.push(refName)\n return\n }\n\n if (Array.isArray(obj)) {\n obj.forEach(traverse)\n } else {\n Object.values(obj).forEach(traverse)\n }\n }\n\n traverse(schema)\n return [...new Set(dependencies)] // Remove duplicates\n}\n\nexport function extractRefName(ref: string): string {\n return ref.split(\"/\").pop() || \"Unknown\"\n}\n","/**\n * Checks if a string is a valid JavaScript identifier\n */\nexport function isValidJSIdentifier(name: string): boolean {\n // Check if name is empty\n if (!name) return false\n\n // Check if first character is valid (letter, underscore, or $)\n const firstChar = name.at(0)\n if (firstChar === undefined) return false\n if (!/[a-zA-Z_$]/.test(firstChar)) return false\n\n if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name)) return false\n\n // Check if it's a reserved word\n const reservedWords = new Set([\n \"abstract\",\n \"arguments\",\n \"await\",\n \"boolean\",\n \"break\",\n \"byte\",\n \"case\",\n \"catch\",\n \"char\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"double\",\n \"else\",\n \"enum\",\n \"eval\",\n \"export\",\n \"extends\",\n \"false\",\n \"final\",\n \"finally\",\n \"float\",\n \"for\",\n \"function\",\n \"goto\",\n \"if\",\n \"implements\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"int\",\n \"interface\",\n \"let\",\n \"long\",\n \"native\",\n \"new\",\n \"null\",\n \"package\",\n \"private\",\n \"protected\",\n \"public\",\n \"return\",\n \"short\",\n \"static\",\n \"super\",\n \"switch\",\n \"synchronized\",\n \"this\",\n \"throw\",\n \"throws\",\n \"transient\",\n \"true\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"volatile\",\n \"while\",\n \"with\",\n \"yield\",\n \"async\",\n ])\n\n return !reservedWords.has(name)\n}\n\n/**\n * Formats a property name for use in JavaScript/TypeScript object literals\n * Quotes the name if it's not a valid JavaScript identifier\n */\nexport function formatPropertyName(name: string): string {\n return isValidJSIdentifier(name) ? name : `\"${name}\"`\n}\n","const statusNameMap: Record<string, string> = {\n \"400\": \"badRequest\",\n \"401\": \"unauthorized\",\n \"402\": \"paymentRequired\",\n \"403\": \"forbidden\",\n \"404\": \"notFound\",\n \"405\": \"methodNotAllowed\",\n \"406\": \"notAcceptable\",\n \"407\": \"proxyAuthenticationRequired\",\n \"408\": \"requestTimeout\",\n \"409\": \"conflict\",\n \"410\": \"gone\",\n \"411\": \"lengthRequired\",\n \"412\": \"preconditionFailed\",\n \"413\": \"payloadTooLarge\",\n \"414\": \"uriTooLong\",\n \"415\": \"unsupportedMediaType\",\n \"416\": \"rangeNotSatisfiable\",\n \"417\": \"expectationFailed\",\n \"418\": \"imATeapot\",\n \"421\": \"misdirectedRequest\",\n \"422\": \"unprocessableEntity\",\n \"423\": \"locked\",\n \"424\": \"failedDependency\",\n \"425\": \"tooEarly\",\n \"426\": \"upgradeRequired\",\n \"428\": \"preconditionRequired\",\n \"429\": \"tooManyRequests\",\n \"431\": \"requestHeaderFieldsTooLarge\",\n \"451\": \"unavailableForLegalReasons\",\n \"500\": \"internalServerError\",\n \"501\": \"notImplemented\",\n \"502\": \"badGateway\",\n \"503\": \"serviceUnavailable\",\n \"504\": \"gatewayTimeout\",\n \"505\": \"httpVersionNotSupported\",\n \"506\": \"variantAlsoNegotiates\",\n \"507\": \"insufficientStorage\",\n \"508\": \"loopDetected\",\n \"510\": \"notExtended\",\n \"511\": \"networkAuthenticationRequired\",\n} as const\n\nexport type StatusCategory = \"client\" | \"server\" | \"default\" | \"unknown\"\n\nexport function mapStatusToIdentifier(status: string): string {\n if (status === \"default\") return \"defaultError\"\n\n const trimmed = status.trim()\n const mapped = statusNameMap[trimmed]\n if (mapped) return mapped\n\n if (/^\\d{3}$/.test(trimmed)) {\n return `status${trimmed}`\n }\n\n const sanitized = trimmed\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \" \")\n .trim()\n\n if (!sanitized) return \"unknownError\"\n\n const parts = sanitized.split(/\\s+/)\n const [first, ...rest] = parts\n const candidate =\n first +\n rest\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join(\"\")\n\n if (!candidate) return \"unknownError\"\n\n return /^[a-zA-Z_$]/.test(candidate)\n ? candidate\n : `status${candidate.charAt(0).toUpperCase()}${candidate.slice(1)}`\n}\n\nexport function getStatusCategory(status: string): StatusCategory {\n if (status === \"default\") return \"default\"\n\n const code = Number(status)\n if (!Number.isInteger(code)) return \"unknown\"\n\n if (code >= 400 && code <= 499) return \"client\"\n if (code >= 500 && code <= 599) return \"server\"\n\n return \"unknown\"\n}\n\nexport function isErrorStatus(status: string): boolean {\n if (status === \"default\") return true\n const code = Number(status)\n if (!Number.isInteger(code)) return false\n return code >= 400\n}\n","import { topologicalSort, extractRefName } from \"./utils/topological-sort\"\nimport { formatPropertyName, isValidJSIdentifier } from \"./utils/property-name\"\nimport {\n getStatusCategory,\n isErrorStatus,\n mapStatusToIdentifier,\n} from \"./utils/http-status\"\n\nexport type OpenAPISpec = {\n openapi: string\n info: unknown\n paths: Record<string, Record<string, unknown>>\n components?: {\n schemas?: Record<string, unknown>\n parameters?: Record<string, unknown>\n }\n}\n\nexport type TypesHelperMode = \"package\" | \"inline\" | \"file\"\n\nexport type TypesConfig = {\n emit?: boolean\n helpers?: TypesHelperMode\n helpersOutput?: string\n}\n\nexport type GenerateOptions = {\n strictDates?: boolean\n strictNumeric?: boolean\n types?: TypesConfig\n}\n\ntype PathParam = {\n name: string\n type: string\n}\n\ntype QueryParam = {\n name: string\n description?: string\n schema?: any\n required?: boolean\n}\n\ntype Operation = {\n operationId: string\n path: string\n method: string\n pathParams: PathParam[]\n queryParams: QueryParam[]\n requestType?: string\n responseType?: string\n requestHeaders?: RequestHeader[]\n errors?: OperationErrorGroup\n}\ntype OperationErrorGroup = {\n clientErrors?: OperationErrorMap\n serverErrors?: OperationErrorMap\n defaultErrors?: OperationErrorMap\n otherErrors?: OperationErrorMap\n}\ntype OperationErrorMap = Record<string, string>\n\ntype RequestHeader = {\n name: string\n description?: string\n schema?: any\n required?: boolean\n}\n\nexport function generate(\n spec: OpenAPISpec,\n options: GenerateOptions = {}\n): string {\n const output: string[] = []\n const generatedTypes = new Set<string>()\n const { strictDates = false, strictNumeric = false } = options\n const typesConfig = normalizeTypesConfig(options.types)\n const schemaOptions: SchemaOptions = {\n strictDates,\n strictNumeric,\n }\n\n output.push('import { z } from \"zod\";')\n appendHelperTypesImport(output, typesConfig)\n output.push(\"\")\n\n // Generate Zod schemas from components/schemas\n if (spec.components?.schemas) {\n output.push(\"// Generated Zod Schemas\")\n output.push(\"\")\n\n // Sort schemas by dependencies (topological sort)\n const sortedSchemas = topologicalSort(spec.components.schemas)\n\n for (const name of sortedSchemas) {\n const schema = spec.components.schemas[name]\n output.push(\n generateZodSchema(name, schema, generatedTypes, schemaOptions)\n )\n output.push(\"\")\n // Export inferred type\n output.push(`export type ${name} = z.infer<typeof ${name}>;`)\n output.push(\"\")\n }\n }\n\n // Parse all operations\n const operations = parseOperations(spec)\n\n // Generate path functions\n output.push(\"// Path Functions\")\n output.push(\"export const paths = {\")\n\n for (const op of operations) {\n const pathParamNames = op.pathParams.map((p) => p.name)\n const hasPathParams = pathParamNames.length > 0\n const hasQueryParams = op.queryParams.length > 0\n\n if (!hasPathParams && !hasQueryParams) {\n output.push(` ${op.operationId}: () => \"${op.path}\",`)\n continue\n }\n\n const allParamNames = [\n ...pathParamNames,\n ...op.queryParams.map((p) => p.name),\n ]\n const signaturePieces: string[] = []\n for (const param of op.pathParams) {\n signaturePieces.push(`${param.name}: string`)\n }\n for (const param of op.queryParams) {\n signaturePieces.push(\n `${param.name}${param.required ? \"\" : \"?\"}: ${mapQueryType(param)}`\n )\n }\n const signatureParams = signaturePieces.join(\", \")\n const needsDefaultObject =\n !hasPathParams &&\n hasQueryParams &&\n op.queryParams.every((param) => !param.required)\n const signatureArgs = allParamNames.length\n ? `{ ${allParamNames.join(\", \")} }`\n : \"{}\"\n const signature = `${signatureArgs}: { ${signatureParams} }${\n needsDefaultObject ? \" = {}\" : \"\"\n }`\n\n const pathWithParams = op.path.replace(/{([^}]+)}/g, \"${$1}\")\n\n if (!hasQueryParams) {\n output.push(\n ` ${op.operationId}: (${signature}) => \\`${pathWithParams}\\`,`\n )\n continue\n }\n\n output.push(` ${op.operationId}: (${signature}) => {`)\n\n output.push(\" const params = new URLSearchParams()\")\n for (const param of op.queryParams) {\n const propertyKey = formatPropertyName(param.name)\n const accessor = isValidJSIdentifier(param.name)\n ? param.name\n : propertyKey\n const schema = param.schema ?? {}\n\n if (schema?.type === \"array\") {\n const itemValueExpression = convertQueryParamValue(\n schema.items ?? {},\n \"value\"\n )\n\n if (param.required) {\n output.push(` for (const value of ${accessor}) {`)\n output.push(\n ` params.append(\"${param.name}\", ${itemValueExpression})`\n )\n output.push(\" }\")\n } else {\n output.push(` if (${accessor} !== undefined) {`)\n output.push(` for (const value of ${accessor}) {`)\n output.push(\n ` params.append(\"${param.name}\", ${itemValueExpression})`\n )\n output.push(\" }\")\n output.push(\" }\")\n }\n\n continue\n }\n\n const valueExpression = convertQueryParamValue(schema, accessor)\n if (param.required) {\n output.push(` params.set(\"${param.name}\", ${valueExpression})`)\n } else {\n output.push(` if (${accessor} !== undefined) {`)\n output.push(` params.set(\"${param.name}\", ${valueExpression})`)\n output.push(\" }\")\n }\n }\n\n output.push(\" const _searchParams = params.toString()\")\n output.push(\n ` return \\`${pathWithParams}\\${_searchParams ? \\`?\\${_searchParams}\\` : \"\"}\\``\n )\n output.push(\" },\")\n }\n\n output.push(\"} as const;\")\n output.push(\"\")\n\n // Generate header functions\n output.push(\"// Header Functions\")\n output.push(\"export const headers = {\")\n\n for (const op of operations) {\n if (!op.requestHeaders || op.requestHeaders.length === 0) {\n output.push(` ${op.operationId}: () => ({}),`)\n continue\n }\n\n const typeEntries = op.requestHeaders\n .map(\n (header) =>\n `${formatPropertyName(header.name)}${header.required ? \"\" : \"?\"}: ${mapHeaderType(\n header\n )}`\n )\n .join(\", \")\n\n const requiredHeaders = op.requestHeaders.filter(\n (header) => header.required\n )\n const optionalHeaders = op.requestHeaders.filter(\n (header) => !header.required\n )\n const hasRequired = requiredHeaders.length > 0\n const signature = hasRequired\n ? `(params: { ${typeEntries} })`\n : `(params: { ${typeEntries} } = {})`\n\n if (optionalHeaders.length === 0) {\n output.push(` ${op.operationId}: ${signature} => ({`)\n\n for (const header of requiredHeaders) {\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n output.push(` ${propertyKey}: ${accessor},`)\n }\n\n output.push(\" }),\")\n continue\n }\n\n if (!hasRequired && optionalHeaders.length === 1 && optionalHeaders[0]) {\n const header = optionalHeaders[0]\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n\n output.push(` ${op.operationId}: ${signature} =>`)\n output.push(\n ` ${accessor} !== undefined ? { ${propertyKey}: ${accessor} } : {},`\n )\n continue\n }\n\n const valueTypes = Array.from(\n new Set(optionalHeaders.map((header) => mapHeaderType(header)))\n ).join(\" | \")\n\n output.push(` ${op.operationId}: ${signature} => {`)\n\n if (hasRequired) {\n output.push(\" const headers = {\")\n for (const header of requiredHeaders) {\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n output.push(` ${propertyKey}: ${accessor},`)\n }\n output.push(\" }\")\n } else {\n output.push(` const headers: Record<string, ${valueTypes}> = {}`)\n }\n\n for (const header of optionalHeaders) {\n const propertyKey = formatPropertyName(header.name)\n const accessor = isValidJSIdentifier(header.name)\n ? `params.${header.name}`\n : `params[${propertyKey}]`\n const assignment = isValidJSIdentifier(header.name)\n ? `headers.${header.name}`\n : `headers[${propertyKey}]`\n\n output.push(` if (${accessor} !== undefined) {`)\n output.push(` ${assignment} = ${accessor}`)\n output.push(\" }\")\n }\n\n output.push(\" return headers\")\n output.push(\" },\")\n }\n\n output.push(\"} as const;\")\n output.push(\"\")\n\n // Generate operation objects\n output.push(\"// Operation Objects\")\n for (const op of operations) {\n output.push(`export const ${op.operationId} = {`)\n output.push(` path: paths.${op.operationId},`)\n\n appendOperationField(output, \"request\", op.requestType)\n appendOperationField(output, \"response\", op.responseType)\n\n if (op.requestHeaders && op.requestHeaders.length > 0) {\n output.push(` headers: headers.${op.operationId},`)\n }\n\n if (op.errors && hasAnyErrors(op.errors)) {\n output.push(\" errors: {\")\n appendErrorGroup(output, \"clientErrors\", op.errors.clientErrors)\n appendErrorGroup(output, \"serverErrors\", op.errors.serverErrors)\n appendErrorGroup(output, \"defaultErrors\", op.errors.defaultErrors)\n appendErrorGroup(output, \"otherErrors\", op.errors.otherErrors)\n output.push(\" },\")\n }\n\n output.push(\"} as const;\")\n output.push(\"\")\n }\n\n generateOperationTypes(output, operations, typesConfig)\n\n return output.join(\"\\n\")\n}\n\nfunction appendOperationField(\n buffer: string[],\n key: string,\n value?: string\n): void {\n if (!value) return\n buffer.push(` ${key}: ${value},`)\n}\n\nfunction appendErrorGroup(\n buffer: string[],\n label: string,\n errors?: OperationErrorMap\n): void {\n if (!errors || Object.keys(errors).length === 0) return\n buffer.push(` ${label}: {`)\n for (const [name, typeName] of Object.entries(errors)) {\n buffer.push(` ${formatPropertyName(name)}: ${typeName},`)\n }\n buffer.push(\" },\")\n}\n\nfunction hasAnyErrors(group: OperationErrorGroup): boolean {\n return [\n group.clientErrors,\n group.serverErrors,\n group.defaultErrors,\n group.otherErrors,\n ].some((bucket) => bucket && Object.keys(bucket).length > 0)\n}\n\nfunction parseOperations(spec: OpenAPISpec): Operation[] {\n const operations: Operation[] = []\n\n for (const [path, pathItem] of Object.entries(spec.paths)) {\n for (const [method, operation] of Object.entries(pathItem)) {\n if (!(operation as any).operationId) continue\n\n const pathParams = extractPathParams(path)\n const requestType = getRequestType(operation)\n const { successResponse, errors } = getResponseTypes(\n operation,\n (operation as any).operationId\n )\n const resolvedParameters = collectParameters(pathItem, operation, spec)\n const requestHeaders = getRequestHeaders(resolvedParameters)\n const queryParams = getQueryParams(resolvedParameters)\n\n operations.push({\n operationId: (operation as any).operationId,\n path,\n method: method.toLowerCase(),\n pathParams,\n queryParams,\n requestType,\n responseType: successResponse,\n requestHeaders,\n errors,\n })\n }\n }\n\n return operations\n}\n\nfunction normalizeTypesConfig(\n config: TypesConfig | undefined\n): NormalizedTypesConfig {\n return {\n emit: config?.emit ?? true,\n helpers: config?.helpers ?? \"package\",\n helpersOutput: config?.helpersOutput ?? \"./zenko-types\",\n }\n}\n\ntype NormalizedTypesConfig = {\n emit: boolean\n helpers: TypesHelperMode\n helpersOutput: string\n}\n\nfunction appendHelperTypesImport(\n buffer: string[],\n config: NormalizedTypesConfig\n) {\n if (!config.emit) return\n\n switch (config.helpers) {\n case \"package\":\n buffer.push(\n 'import type { PathFn, HeaderFn, OperationDefinition, OperationErrors } from \"zenko\";'\n )\n return\n case \"file\":\n buffer.push(\n `import type { PathFn, HeaderFn, OperationDefinition, OperationErrors } from \"${config.helpersOutput}\";`\n )\n return\n case \"inline\":\n buffer.push(\n \"type PathFn<TArgs extends unknown[] = []> = (...args: TArgs) => string;\"\n )\n buffer.push(\n \"type HeaderFn<TArgs extends unknown[] = [], TResult = Record<string, unknown> | Record<string, never>> = (...args: TArgs) => TResult;\"\n )\n buffer.push(\n \"type OperationErrors<TClient = unknown, TServer = unknown, TDefault = unknown, TOther = unknown> = {\"\n )\n buffer.push(\" clientErrors?: Record<string, TClient>;\")\n buffer.push(\" serverErrors?: Record<string, TServer>;\")\n buffer.push(\" defaultErrors?: Record<string, TDefault>;\")\n buffer.push(\" otherErrors?: Record<string, TOther>;\")\n buffer.push(\"};\")\n buffer.push(\n \"type OperationDefinition<TPath extends (...args: any[]) => string, TRequest = undefined, TResponse = undefined, THeaders extends HeaderFn | undefined = undefined, TErrors extends OperationErrors | undefined = undefined> = {\"\n )\n buffer.push(\" path: TPath;\")\n buffer.push(\" request?: TRequest;\")\n buffer.push(\" response?: TResponse;\")\n buffer.push(\" headers?: THeaders;\")\n buffer.push(\" errors?: TErrors;\")\n buffer.push(\"};\")\n return\n }\n}\n\nfunction generateOperationTypes(\n buffer: string[],\n operations: Operation[],\n config: NormalizedTypesConfig\n) {\n if (!config.emit) return\n\n buffer.push(\"// Operation Types\")\n\n for (const op of operations) {\n const headerType = op.requestHeaders?.length\n ? `typeof headers.${op.operationId}`\n : \"undefined\"\n const requestType = wrapTypeReference(op.requestType)\n const responseType = wrapTypeReference(op.responseType)\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 accessibleEntries = entries.map(([name, type]) => {\n const propertyKey = formatPropertyName(name)\n const valueType = wrapErrorValueType(type)\n return `${propertyKey}: ${valueType}`\n })\n\n return `{ ${accessibleEntries.join(\"; \")} }`\n}\n\nconst TYPE_KEYWORDS = new Set([\n \"any\",\n \"unknown\",\n \"never\",\n \"void\",\n \"null\",\n \"undefined\",\n \"string\",\n \"number\",\n \"boolean\",\n \"bigint\",\n \"symbol\",\n])\n\nfunction wrapTypeReference(typeName?: string): string {\n if (!typeName) return \"undefined\"\n if (typeName === \"undefined\") return \"undefined\"\n if (TYPE_KEYWORDS.has(typeName)) return typeName\n if (typeName.startsWith(\"typeof \")) return typeName\n\n const identifierPattern = /^[A-Za-z_$][A-Za-z0-9_$]*$/\n if (identifierPattern.test(typeName)) {\n return `typeof ${typeName}`\n }\n\n return typeName\n}\n\nfunction wrapErrorValueType(typeName?: string): string {\n if (!typeName) return \"unknown\"\n if (TYPE_KEYWORDS.has(typeName)) return typeName\n if (typeName.startsWith(\"typeof \")) return typeName\n const identifierPattern = /^[A-Za-z_$][A-Za-z0-9_$]*$/\n if (identifierPattern.test(typeName)) {\n return `typeof ${typeName}`\n }\n return typeName\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/dist/index.d.cts CHANGED
@@ -7,10 +7,33 @@ type OpenAPISpec = {
7
7
  parameters?: Record<string, unknown>;
8
8
  };
9
9
  };
10
+ type TypesHelperMode = "package" | "inline" | "file";
11
+ type TypesConfig = {
12
+ emit?: boolean;
13
+ helpers?: TypesHelperMode;
14
+ helpersOutput?: string;
15
+ };
10
16
  type GenerateOptions = {
11
17
  strictDates?: boolean;
12
18
  strictNumeric?: boolean;
19
+ types?: TypesConfig;
13
20
  };
14
21
  declare function generate(spec: OpenAPISpec, options?: GenerateOptions): string;
15
22
 
16
- export { type GenerateOptions, type OpenAPISpec, generate };
23
+ type PathFn<TArgs extends unknown[] = []> = (...args: TArgs) => string;
24
+ type HeaderFn<TArgs extends unknown[] = [], TResult = Record<string, unknown> | Record<string, never>> = (...args: TArgs) => TResult;
25
+ type OperationErrors<TClient = unknown, TServer = unknown, TDefault = unknown, TOther = unknown> = {
26
+ clientErrors?: Record<string, TClient>;
27
+ serverErrors?: Record<string, TServer>;
28
+ defaultErrors?: Record<string, TDefault>;
29
+ otherErrors?: Record<string, TOther>;
30
+ };
31
+ type OperationDefinition<TPath extends (...args: any[]) => string, TRequest = undefined, TResponse = undefined, THeaders extends HeaderFn | undefined = undefined, TErrors extends OperationErrors | undefined = undefined> = {
32
+ path: TPath;
33
+ request?: TRequest;
34
+ response?: TResponse;
35
+ headers?: THeaders;
36
+ errors?: TErrors;
37
+ };
38
+
39
+ export { type GenerateOptions, type HeaderFn, type OpenAPISpec, type OperationDefinition, type OperationErrors, type PathFn, type TypesConfig, generate };