@orval/zod 8.13.0 → 8.15.0

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.d.mts CHANGED
@@ -20,6 +20,15 @@ interface TimeOptions {
20
20
  }
21
21
  declare const generateZodValidationSchemaDefinition: (schema: OpenApiSchemaObject | OpenApiReferenceObject | undefined, context: ContextSpec, name: string, strict: boolean, isZodV4: boolean, rules?: {
22
22
  required?: boolean;
23
+ /**
24
+ * Required keys inherited from sibling `allOf` members. Per JSON Schema /
25
+ * OpenAPI 3.1, a `required` array in one `allOf` member applies to
26
+ * properties contributed by ANY member, so it is collected at the `allOf`
27
+ * level and applied here. Consumed at THIS object level only — never
28
+ * forwarded into nested property schemas, so a deeper object sharing a key
29
+ * name is unaffected. (#3171)
30
+ */
31
+ additionalRequired?: string[];
23
32
  dateTimeOptions?: DateTimeOptions;
24
33
  timeOptions?: TimeOptions;
25
34
  /**
@@ -38,18 +47,52 @@ declare const generateZodValidationSchemaDefinition: (schema: OpenApiSchemaObjec
38
47
  * placeholder instead of being inlined.
39
48
  */
40
49
  useReusableSchemas?: boolean;
50
+ /**
51
+ * When true (and `isZodV4`), the top-level (named component) schema emits a
52
+ * `.meta({ id, description?, deprecated? })` instead of `.describe(...)`.
53
+ * Set ONLY for top-level component-schema generation — recursive calls omit
54
+ * it, so nested schemas keep `.describe()` and never get a duplicate `id`.
55
+ */
56
+ emitMeta?: boolean;
41
57
  }) => ZodValidationSchemaDefinition;
42
- declare const parseZodValidationSchemaDefinition: (input: ZodValidationSchemaDefinition, context: ContextSpec, coerceTypes: boolean | ZodCoerceType[] | undefined, strict: boolean, isZodV4: boolean, preprocess?: GeneratorMutator) => {
58
+ /**
59
+ * Runtime shape passed to the user-supplied `override.zod.params` function for
60
+ * every emitted validator. Exported so consumers can type their function with
61
+ * `import type { ZodParamsContext } from 'orval'` instead of hand-writing it.
62
+ */
63
+ interface ZodParamsContext {
64
+ /** The OpenAPI `operationId`, or `''` for shared component schemas. */
65
+ operationId: string;
66
+ /** `'schema'` is used for shared component schemas with no owning operation. */
67
+ location: 'param' | 'query' | 'header' | 'body' | 'response' | 'schema';
68
+ /** Generated schema name, e.g. `CreateUserBody`, or the component name. */
69
+ schemaName: string;
70
+ /** Path to the current property within the schema. Only object property names are appended. */
71
+ fieldPath: string[];
72
+ /** The Zod method being emitted, e.g. `'string'`, `'min'`, `'email'`. */
73
+ validator: string;
74
+ }
75
+ interface ZodParamsInjection extends Pick<ZodParamsContext, 'operationId' | 'location' | 'schemaName'> {
76
+ mutator: GeneratorMutator;
77
+ }
78
+ declare const parseZodValidationSchemaDefinition: (input: ZodValidationSchemaDefinition, context: ContextSpec, coerceTypes: boolean | ZodCoerceType[] | undefined, strict: boolean, isZodV4: boolean, preprocess?: GeneratorMutator, paramsInjection?: ZodParamsInjection) => {
43
79
  zod: string;
44
80
  consts: string;
45
81
  usedRefs: Set<string>;
46
82
  };
47
83
  /**
48
- * Recursively inlines all `$ref` references in an OpenAPI schema tree,
49
- * producing a fully-resolved schema suitable for Zod code generation.
84
+ * Recursively inlines all `$ref` and `$dynamicRef` references in an OpenAPI
85
+ * schema tree, producing a fully-resolved schema suitable for Zod code generation.
50
86
  *
51
87
  * Tracks visited `$ref` paths via `context.parents` to break circular
52
88
  * references (returning `{}` for cycles).
89
+ *
90
+ * `$dynamicRef` is resolved using the dynamic scope attached to `context`:
91
+ * 1. Look up the anchor name in `context.dynamicScope`.
92
+ * 2. If not found, fall back to scanning `components.schemas` for a schema
93
+ * that declares `$dynamicAnchor` with the same name.
94
+ * 3. If resolved to a concrete schema, inline it (same as `$ref`).
95
+ * 4. If unresolved, external, or a generic parameter → return `{}`.
53
96
  */
54
97
  declare const dereference: (schema: OpenApiSchemaObject | OpenApiReferenceObject, context: ContextSpec) => OpenApiSchemaObject;
55
98
  /**
@@ -96,5 +139,5 @@ declare const parseParameters: ({
96
139
  declare const generateZod: ClientBuilder;
97
140
  declare const builder: () => () => ClientGeneratorsBuilder;
98
141
  //#endregion
99
- export { ZodValidationSchemaDefinition, builder, builder as default, dereference, generateFormDataZodSchema, generateZod, generateZodValidationSchemaDefinition, getZodDependencies, isZodVersionV4, parseParameters, parseZodValidationSchemaDefinition, predefinedZodFormats };
142
+ export { ZodParamsContext, ZodParamsInjection, ZodValidationSchemaDefinition, builder, builder as default, dereference, generateFormDataZodSchema, generateZod, generateZodValidationSchemaDefinition, getZodDependencies, isZodVersionV4, parseParameters, parseZodValidationSchemaDefinition, predefinedZodFormats };
100
143
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { camel, compareVersions, conventionName, escape, generateMutator, getFormDataFieldFileType, getNumberWord, getRefInfo, isBoolean, isNumber, isObject, isString, jsStringEscape, logVerbose, pascal, resolveRef, stringify } from "@orval/core";
1
+ import { buildDynamicScope, camel, compareVersions, escape, generateMutator, getDynamicAnchorName, getFormDataFieldFileType, getNumberWord, getRefInfo, isBoolean, isDynamicReference, isNumber, isObject, isString, jsStringEscape, logVerbose, pascal, resolveDynamicRef, resolveRef, stringify } from "@orval/core";
2
2
  import { unique } from "remeda";
3
3
  //#region src/compatible-v4.ts
4
4
  const getZodPackageVersion = (packageJson) => {
@@ -124,38 +124,40 @@ const generateZodValidationSchemaDefinition = (schema, context, name, strict, is
124
124
  functions: [],
125
125
  consts: []
126
126
  };
127
+ const CHAINABLE_SIBLINGS = new Set([
128
+ "nullable",
129
+ "default",
130
+ "description"
131
+ ]);
132
+ const isChainable = (k) => CHAINABLE_SIBLINGS.has(k);
133
+ const applyChainableSiblings = (functions, consts, siblingSchema) => {
134
+ const refRequired = rules?.required ?? false;
135
+ const refHasDefault = siblingSchema.default !== void 0;
136
+ if (!refRequired && siblingSchema.nullable) functions.push(["nullish", void 0]);
137
+ else if (siblingSchema.nullable) functions.push(["nullable", void 0]);
138
+ else if (!refRequired && !refHasDefault) functions.push(["optional", void 0]);
139
+ if (refHasDefault) {
140
+ const registry = rules?.constNameRegistry ?? {};
141
+ const counter = isNumber(registry[name]) ? registry[name] + 1 : 0;
142
+ registry[name] = counter;
143
+ const defaultVarName = `${name}Default${counter ? pascal(getNumberWord(counter)) : ""}`;
144
+ const defaultLiteral = stringify(siblingSchema.default);
145
+ if (defaultLiteral !== void 0) {
146
+ consts.push(`export const ${defaultVarName} = ${defaultLiteral};`);
147
+ functions.push(["default", defaultVarName]);
148
+ }
149
+ }
150
+ if (typeof siblingSchema.description === "string") functions.push(["describe", `"${escape(siblingSchema.description)}"`]);
151
+ };
127
152
  if (rules?.useReusableSchemas && "$ref" in schema && typeof schema.$ref === "string" && isComponentSchemaRef(schema.$ref)) {
128
153
  const siblings = Object.keys(schema).filter((k) => k !== "$ref");
129
- const CHAINABLE_SIBLINGS = new Set([
130
- "nullable",
131
- "default",
132
- "description"
133
- ]);
134
- const isChainable = (k) => CHAINABLE_SIBLINGS.has(k);
135
154
  if (siblings.every((k) => isChainable(k))) {
136
155
  const functions = [["namedRef", {
137
- name: conventionName(getRefInfo(schema.$ref, context).originalName, context.output.namingConvention),
156
+ name: getRefInfo(schema.$ref, context).name,
138
157
  sourceRef: schema.$ref
139
158
  }]];
140
159
  const consts = [];
141
- const refSchema = schema;
142
- const refRequired = rules.required ?? false;
143
- const refHasDefault = refSchema.default !== void 0;
144
- if (!refRequired && refSchema.nullable) functions.push(["nullish", void 0]);
145
- else if (refSchema.nullable) functions.push(["nullable", void 0]);
146
- else if (!refRequired && !refHasDefault) functions.push(["optional", void 0]);
147
- if (refHasDefault) {
148
- const registry = rules.constNameRegistry ?? {};
149
- const counter = isNumber(registry[name]) ? registry[name] + 1 : 0;
150
- registry[name] = counter;
151
- const defaultVarName = `${name}Default${counter ? pascal(getNumberWord(counter)) : ""}`;
152
- const defaultLiteral = stringify(refSchema.default);
153
- if (defaultLiteral !== void 0) {
154
- consts.push(`export const ${defaultVarName} = ${defaultLiteral};`);
155
- functions.push(["default", defaultVarName]);
156
- }
157
- }
158
- if (typeof refSchema.description === "string") functions.push(["describe", `"${escape(refSchema.description)}"`]);
160
+ applyChainableSiblings(functions, consts, schema);
159
161
  return {
160
162
  functions,
161
163
  consts
@@ -164,6 +166,29 @@ const generateZodValidationSchemaDefinition = (schema, context, name, strict, is
164
166
  logVerbose(`[orval/zod] $ref ${schema.$ref} has non-chainable siblings [${siblings.filter((s) => !isChainable(s)).join(", ")}]; falling back to inlining.`);
165
167
  schema = dereference(schema, context);
166
168
  }
169
+ if (rules?.useReusableSchemas && isDynamicReference(schema)) {
170
+ const anchorName = getDynamicAnchorName(schema.$dynamicRef);
171
+ if (anchorName) {
172
+ const { resolvedTypeName, schemaName } = resolveDynamicRef(anchorName, context);
173
+ if (resolvedTypeName !== "unknown" && schemaName) {
174
+ const siblings = Object.keys(schema).filter((k) => k !== "$dynamicRef");
175
+ if (siblings.every((k) => isChainable(k))) {
176
+ const functions = [["namedRef", {
177
+ name: resolvedTypeName,
178
+ sourceRef: `${COMPONENT_SCHEMAS_PREFIX}${encodeSegment(schemaName)}`
179
+ }]];
180
+ const consts = [];
181
+ applyChainableSiblings(functions, consts, schema);
182
+ return {
183
+ functions,
184
+ consts
185
+ };
186
+ }
187
+ logVerbose(`[orval/zod] $dynamicRef ${schema.$dynamicRef} has non-chainable siblings [${siblings.filter((s) => !isChainable(s)).join(", ")}]; falling back to inlining.`);
188
+ }
189
+ }
190
+ schema = dereference(schema, context);
191
+ }
167
192
  const useReusableSchemas = rules?.useReusableSchemas ?? false;
168
193
  const consts = [];
169
194
  const constNameRegistry = rules?.constNameRegistry ?? {};
@@ -171,6 +196,16 @@ const generateZodValidationSchemaDefinition = (schema, context, name, strict, is
171
196
  const constsCounterValue = constsCounter ? pascal(getNumberWord(constsCounter)) : "";
172
197
  constNameRegistry[name] = constsCounter;
173
198
  const functions = [];
199
+ const pushDescriptionOrMeta = () => {
200
+ const description = typeof schema.description === "string" && schema.description.length > 0 ? schema.description : void 0;
201
+ const deprecated = "deprecated" in schema && schema.deprecated === true ? true : void 0;
202
+ if (rules?.emitMeta && isZodV4) {
203
+ const meta = { id: name };
204
+ if (description !== void 0) meta.description = description;
205
+ if (deprecated) meta.deprecated = true;
206
+ functions.push(["meta", meta]);
207
+ } else if (description !== void 0) functions.push(["describe", `'${jsStringEscape(description)}'`]);
208
+ };
174
209
  const type = resolveZodType(schema);
175
210
  const required = rules?.required ?? false;
176
211
  const hasDefault = schema.default !== void 0;
@@ -187,8 +222,14 @@ const generateZodValidationSchemaDefinition = (schema, context, name, strict, is
187
222
  let skipSwitchStatement = false;
188
223
  if (schema.allOf || schema.oneOf || schema.anyOf) {
189
224
  const separator = schema.allOf ? "allOf" : schema.oneOf ? "oneOf" : "anyOf";
190
- const baseSchemas = (schema.allOf ?? schema.oneOf ?? schema.anyOf).map((schema, index) => generateZodValidationSchemaDefinition(schema, context, `${camel(name)}${pascal(getNumberWord(index + 1))}`, strict, isZodV4, {
225
+ const schemas = schema.allOf ?? schema.oneOf ?? schema.anyOf;
226
+ const allOfRequired = schema.allOf ? [...new Set([...schema.required ?? [], ...schemas.flatMap((member) => {
227
+ const memberRequired = ("$ref" in member && typeof member.$ref === "string" ? tryResolveRefSchema(member.$ref, context) : member)?.required;
228
+ return Array.isArray(memberRequired) ? memberRequired : [];
229
+ })])] : void 0;
230
+ const baseSchemas = schemas.map((schema, index) => generateZodValidationSchemaDefinition(schema, context, `${camel(name)}${pascal(getNumberWord(index + 1))}`, strict, isZodV4, {
191
231
  required: true,
232
+ additionalRequired: allOfRequired,
192
233
  constNameRegistry,
193
234
  useReusableSchemas
194
235
  }));
@@ -202,6 +243,7 @@ const generateZodValidationSchemaDefinition = (schema, context, name, strict, is
202
243
  const additionalIndex = baseSchemas.length + 1;
203
244
  const additionalPropertiesDefinition = generateZodValidationSchemaDefinition(additionalPropertiesSchema, context, `${camel(name)}${pascal(getNumberWord(additionalIndex))}`, strict, isZodV4, {
204
245
  required: true,
246
+ additionalRequired: allOfRequired,
205
247
  constNameRegistry,
206
248
  useReusableSchemas
207
249
  });
@@ -251,6 +293,7 @@ const generateZodValidationSchemaDefinition = (schema, context, name, strict, is
251
293
  if (!required && nullable) functions.push(["nullish", void 0]);
252
294
  else if (nullable) functions.push(["nullable", void 0]);
253
295
  else if (!required) functions.push(["optional", void 0]);
296
+ pushDescriptionOrMeta();
254
297
  return {
255
298
  functions,
256
299
  consts
@@ -368,8 +411,9 @@ const generateZodValidationSchemaDefinition = (schema, context, name, strict, is
368
411
  const shouldUseLooseObject = type === "object" && !hasDefinedProperties && schema.additionalProperties === void 0 && !hasAdditionalPropertiesSchema;
369
412
  if (hasProperties && hasDefinedProperties) {
370
413
  const objectType = getObjectFunctionName(isZodV4, strict);
414
+ const requiredKeys = new Set([...schema.required ?? [], ...rules?.additionalRequired ?? []]);
371
415
  functions.push([objectType, Object.keys(properties).map((key) => ({ [key]: rules?.propertyOverrides?.[key] ?? generateZodValidationSchemaDefinition(properties[key], context, camel(`${name}-${key}`), strict, isZodV4, {
372
- required: schema.required?.includes(key),
416
+ required: requiredKeys.has(key),
373
417
  constNameRegistry,
374
418
  useReusableSchemas
375
419
  }) })).reduce((acc, curr) => ({
@@ -443,13 +487,32 @@ const generateZodValidationSchemaDefinition = (schema, context, name, strict, is
443
487
  else if (nullable) functions.push(["nullable", void 0]);
444
488
  else if (!required && !hasDefault) functions.push(["optional", void 0]);
445
489
  if (hasDefault) functions.push(["default", defaultVarName]);
446
- if (schema.description) functions.push(["describe", `'${jsStringEscape(schema.description)}'`]);
490
+ pushDescriptionOrMeta();
447
491
  return {
448
492
  functions,
449
493
  consts: unique(consts)
450
494
  };
451
495
  };
452
- const parseZodValidationSchemaDefinition = (input, context, coerceTypes = false, strict, isZodV4, preprocess) => {
496
+ const PARAMS_MODIFIER_VALIDATORS = new Set([
497
+ "optional",
498
+ "nullable",
499
+ "nullish",
500
+ "default",
501
+ "describe",
502
+ "unknown",
503
+ "any",
504
+ "never",
505
+ "null",
506
+ "undefined",
507
+ "void"
508
+ ]);
509
+ const PARAMS_MERGE_INTO_OPTIONS_VALIDATORS = new Set([
510
+ "datetime",
511
+ "time",
512
+ "iso.datetime",
513
+ "iso.time"
514
+ ]);
515
+ const parseZodValidationSchemaDefinition = (input, context, coerceTypes = false, strict, isZodV4, preprocess, paramsInjection) => {
453
516
  if (input.functions.length === 0) return {
454
517
  zod: "",
455
518
  consts: "",
@@ -471,13 +534,32 @@ const parseZodValidationSchemaDefinition = (input, context, coerceTypes = false,
471
534
  if (isNumber(value) || isBoolean(value)) return `${value}`;
472
535
  return "";
473
536
  };
474
- const parseProperty = (property) => {
537
+ const buildParamsArg = (fn, fieldPath) => {
538
+ if (!paramsInjection) return void 0;
539
+ if (PARAMS_MODIFIER_VALIDATORS.has(fn)) return void 0;
540
+ const ctx = {
541
+ operationId: paramsInjection.operationId,
542
+ location: paramsInjection.location,
543
+ schemaName: paramsInjection.schemaName,
544
+ fieldPath: [...fieldPath],
545
+ validator: fn
546
+ };
547
+ return `${paramsInjection.mutator.name}(${JSON.stringify(ctx)})`;
548
+ };
549
+ const parseProperty = (property, fieldPath = []) => {
475
550
  const [fn, args = ""] = property;
476
551
  if (fn === "namedRef") {
477
552
  const refArgs = args;
478
553
  usedRefs.add(refArgs.name);
479
554
  return `__REF_${refArgs.name}__`;
480
555
  }
556
+ if (fn === "meta") {
557
+ const metaArgs = args;
558
+ const parts = [`id: '${jsStringEscape(metaArgs.id)}'`];
559
+ if (metaArgs.description !== void 0) parts.push(`description: '${jsStringEscape(metaArgs.description)}'`);
560
+ if (metaArgs.deprecated) parts.push("deprecated: true");
561
+ return `.meta({ ${parts.join(", ")} })`;
562
+ }
481
563
  if (fn === "fileOrString") return "zod.instanceof(File).or(zod.string())";
482
564
  if (fn === "allOf") {
483
565
  const allOfArgs = args;
@@ -499,7 +581,7 @@ const parseZodValidationSchemaDefinition = (input, context, coerceTypes = false,
499
581
  if (allConsts.length > 0) appendConstsChunk(allConsts);
500
582
  const mergedObjectString = `zod.${getObjectFunctionName(isZodV4, strict)}({
501
583
  ${Object.entries(mergedProperties).map(([key, schema]) => {
502
- const value = schema.functions.map((prop) => parseProperty(prop)).join("");
584
+ const value = schema.functions.map((prop) => parseProperty(prop, [...fieldPath, key])).join("");
503
585
  appendConstsChunk(schema.consts.join("\n"));
504
586
  return ` "${key}": ${value.startsWith(".") ? "zod" : ""}${value}`;
505
587
  }).join(",\n")}
@@ -509,7 +591,7 @@ ${Object.entries(mergedProperties).map(([key, schema]) => {
509
591
  }
510
592
  let acc = "";
511
593
  for (const partSchema of allOfArgs) {
512
- const value = partSchema.functions.map((prop) => parseProperty(prop)).join("");
594
+ const value = partSchema.functions.map((prop) => parseProperty(prop, fieldPath)).join("");
513
595
  const valueWithZod = `${value.startsWith(".") ? "zod" : ""}${value}`;
514
596
  if (partSchema.consts.length > 0) appendConstsChunk(partSchema.consts.join("\n"));
515
597
  if (acc.length === 0) acc = valueWithZod;
@@ -519,9 +601,12 @@ ${Object.entries(mergedProperties).map(([key, schema]) => {
519
601
  }
520
602
  if (fn === "oneOf" || fn === "anyOf") {
521
603
  const unionArgs = args;
522
- if (unionArgs.length === 1) return unionArgs[0].functions.map((prop) => parseProperty(prop)).join("");
604
+ if (unionArgs.length === 1) {
605
+ appendConstsChunk(unionArgs[0].consts.join("\n"));
606
+ return unionArgs[0].functions.map((prop) => parseProperty(prop, fieldPath)).join("");
607
+ }
523
608
  return `.union([${unionArgs.map(({ functions, consts: argConsts }) => {
524
- const value = functions.map((prop) => parseProperty(prop)).join("");
609
+ const value = functions.map((prop) => parseProperty(prop, fieldPath)).join("");
525
610
  const valueWithZod = `${value.startsWith(".") ? "zod" : ""}${value}`;
526
611
  appendConstsChunk(argConsts.join("\n"));
527
612
  return valueWithZod;
@@ -529,7 +614,7 @@ ${Object.entries(mergedProperties).map(([key, schema]) => {
529
614
  }
530
615
  if (fn === "additionalProperties") {
531
616
  const additionalPropertiesArgs = args;
532
- const value = additionalPropertiesArgs.functions.map((prop) => parseProperty(prop)).join("");
617
+ const value = additionalPropertiesArgs.functions.map((prop) => parseProperty(prop, fieldPath)).join("");
533
618
  const valueWithZod = `${value.startsWith(".") ? "zod" : ""}${value}`;
534
619
  if (Array.isArray(additionalPropertiesArgs.consts)) appendConstsChunk(additionalPropertiesArgs.consts.join("\n"));
535
620
  return `zod.record(zod.string(), ${valueWithZod})`;
@@ -538,7 +623,7 @@ ${Object.entries(mergedProperties).map(([key, schema]) => {
538
623
  const objectArgs = args;
539
624
  const parsedObject = `zod.${fn === "looseObject" ? isZodV4 ? "looseObject" : "object" : getObjectFunctionName(isZodV4, strict)}({
540
625
  ${Object.entries(objectArgs).map(([key, schema]) => {
541
- const value = schema.functions.map((prop) => parseProperty(prop)).join("");
626
+ const value = schema.functions.map((prop) => parseProperty(prop, [...fieldPath, key])).join("");
542
627
  appendConstsChunk(schema.consts.join("\n"));
543
628
  return ` "${key}": ${value.startsWith(".") ? "zod" : ""}${value}`;
544
629
  }).join(",\n")}
@@ -549,20 +634,26 @@ ${Object.entries(objectArgs).map(([key, schema]) => {
549
634
  if (fn === "passthrough") return ".passthrough()";
550
635
  if (fn === "array") {
551
636
  const arrayArgs = args;
552
- const value = arrayArgs.functions.map((prop) => parseProperty(prop)).join("");
637
+ const value = arrayArgs.functions.map((prop) => parseProperty(prop, fieldPath)).join("");
553
638
  if (isString(arrayArgs.consts)) appendConstsChunk(arrayArgs.consts);
554
639
  else if (Array.isArray(arrayArgs.consts)) appendConstsChunk(arrayArgs.consts.join("\n"));
555
640
  return `.array(${value.startsWith(".") ? "zod" : ""}${value})`;
556
641
  }
557
642
  if (fn === "strict" && !isZodV4) return ".strict()";
558
643
  if (fn === "tuple") return `zod.tuple([${args.map((x) => {
559
- const value = x.functions.map((prop) => parseProperty(prop)).join("");
644
+ const value = x.functions.map((prop) => parseProperty(prop, fieldPath)).join("");
560
645
  return `${value.startsWith(".") ? "zod" : ""}${value}`;
561
646
  }).join(",\n")}])`;
562
- if (fn === "rest") return `.rest(zod${args.functions.map((prop) => parseProperty(prop)).join("")})`;
647
+ if (fn === "rest") return `.rest(zod${args.functions.map((prop) => parseProperty(prop, fieldPath)).join("")})`;
563
648
  const shouldCoerceType = coerceTypes && (Array.isArray(coerceTypes) ? coerceTypes.includes(fn) : COERCIBLE_TYPES.has(fn));
564
- if (fn !== "date" && shouldCoerceType || fn === "date" && shouldCoerceType && context.output.override.useDates) return `.coerce.${fn}(${formatFunctionArgs(args)})`;
565
- return `.${fn}(${formatFunctionArgs(args)})`;
649
+ const formattedArgs = formatFunctionArgs(args);
650
+ const paramsArg = buildParamsArg(fn, fieldPath);
651
+ let combinedArgs;
652
+ if (paramsArg && formattedArgs && PARAMS_MERGE_INTO_OPTIONS_VALIDATORS.has(fn)) combinedArgs = `{ ...${formattedArgs}, ...${paramsArg} }`;
653
+ else if (paramsArg) combinedArgs = formattedArgs ? `${formattedArgs}, ${paramsArg}` : paramsArg;
654
+ else combinedArgs = formattedArgs;
655
+ if (fn !== "date" && shouldCoerceType || fn === "date" && shouldCoerceType && context.output.override.useDates) return `.coerce.${fn}(${combinedArgs})`;
656
+ return `.${fn}(${combinedArgs})`;
566
657
  };
567
658
  appendConstsChunk(input.consts.join("\n"));
568
659
  const schema = input.functions.map((prop) => parseProperty(prop)).join("");
@@ -593,16 +684,30 @@ function tryResolveRefSchema($ref, context) {
593
684
  return;
594
685
  }
595
686
  }
687
+ const COMPONENT_SCHEMAS_PREFIX = "#/components/schemas/";
688
+ function extractSchemaNameFromRef($ref) {
689
+ if (!$ref.startsWith(COMPONENT_SCHEMAS_PREFIX)) return void 0;
690
+ const raw = $ref.slice(21);
691
+ return decodeURIComponent(raw.replaceAll("~1", "/").replaceAll("~0", "~"));
692
+ }
596
693
  /**
597
- * Recursively inlines all `$ref` references in an OpenAPI schema tree,
598
- * producing a fully-resolved schema suitable for Zod code generation.
694
+ * Recursively inlines all `$ref` and `$dynamicRef` references in an OpenAPI
695
+ * schema tree, producing a fully-resolved schema suitable for Zod code generation.
599
696
  *
600
697
  * Tracks visited `$ref` paths via `context.parents` to break circular
601
698
  * references (returning `{}` for cycles).
699
+ *
700
+ * `$dynamicRef` is resolved using the dynamic scope attached to `context`:
701
+ * 1. Look up the anchor name in `context.dynamicScope`.
702
+ * 2. If not found, fall back to scanning `components.schemas` for a schema
703
+ * that declares `$dynamicAnchor` with the same name.
704
+ * 3. If resolved to a concrete schema, inline it (same as `$ref`).
705
+ * 4. If unresolved, external, or a generic parameter → return `{}`.
602
706
  */
603
707
  const dereference = (schema, context) => {
604
708
  const refName = "$ref" in schema ? schema.$ref : void 0;
605
709
  if (refName && context.parents?.includes(refName)) return {};
710
+ if (isDynamicReference(schema)) return dereferenceDynamicRef(schema, context);
606
711
  const childContext = {
607
712
  ...context,
608
713
  ...refName ? { parents: [...context.parents ?? [], refName] } : void 0
@@ -617,17 +722,56 @@ const dereference = (schema, context) => {
617
722
  };
618
723
  })() : schema;
619
724
  if (!resolvedSchema) return {};
620
- const resolvedContext = childContext;
621
- return Object.entries(resolvedSchema).reduce((acc, [key, value]) => {
725
+ const resolvedContext = buildScopedContext(childContext, refName, resolvedSchema);
726
+ if (isDynamicReference(resolvedSchema)) return dereferenceDynamicRef(resolvedSchema, resolvedContext);
727
+ return dereferenceProperties(resolvedSchema, resolvedContext);
728
+ };
729
+ function dereferenceProperties(schema, context) {
730
+ return Object.entries(schema).reduce((acc, [key, value]) => {
622
731
  if (key === "properties" && isObject(value)) acc[key] = Object.entries(value).reduce((props, [propKey, propSchema]) => {
623
- props[propKey] = dereference(propSchema, resolvedContext);
732
+ props[propKey] = dereference(propSchema, context);
624
733
  return props;
625
734
  }, {});
626
735
  else if (key === "default" || key === "example" || key === "examples") acc[key] = value;
627
- else acc[key] = dereferenceScalar(value, resolvedContext);
736
+ else acc[key] = dereferenceScalar(value, context);
628
737
  return acc;
629
738
  }, {});
630
- };
739
+ }
740
+ function buildScopedContext(childContext, refName, resolvedSchema) {
741
+ if (!refName) return childContext;
742
+ const schemaName = extractSchemaNameFromRef(refName);
743
+ if (!schemaName) return childContext;
744
+ const schemaRecord = resolvedSchema;
745
+ const hasDynamicAnchor = typeof schemaRecord.$dynamicAnchor === "string";
746
+ const defs = schemaRecord.$defs;
747
+ const hasDefsAnchors = defs && typeof defs === "object" && Object.values(defs).some((d) => d && typeof d === "object" && "$dynamicAnchor" in d);
748
+ if (!hasDynamicAnchor && !hasDefsAnchors) return childContext;
749
+ return {
750
+ ...childContext,
751
+ dynamicScope: buildDynamicScope(schemaName, resolvedSchema, childContext)
752
+ };
753
+ }
754
+ function dereferenceDynamicRef(schema, context) {
755
+ const dynamicRef = schema.$dynamicRef;
756
+ const anchorName = getDynamicAnchorName(dynamicRef);
757
+ if (!anchorName) return {};
758
+ const { resolvedTypeName, schema: resolvedSchema, schemaName } = resolveDynamicRef(anchorName, context);
759
+ const dynamicRefPath = `$dynamicRef:${dynamicRef}@${schemaName ?? "?"}`;
760
+ if (context.parents?.includes(dynamicRefPath)) return {};
761
+ if (resolvedTypeName === "unknown" || !isObject(resolvedSchema)) return {};
762
+ const scopedContext = buildScopedContext({
763
+ ...context,
764
+ parents: [...context.parents ?? [], dynamicRefPath]
765
+ }, schemaName ? `${COMPONENT_SCHEMAS_PREFIX}${encodeSegment(schemaName)}` : void 0, resolvedSchema);
766
+ const siblingProperties = Object.fromEntries(Object.entries(schema).filter(([key]) => key !== "$dynamicRef"));
767
+ return dereferenceProperties({
768
+ ...resolvedSchema,
769
+ ...siblingProperties
770
+ }, scopedContext);
771
+ }
772
+ function encodeSegment(segment) {
773
+ return segment.replaceAll("~", "~0").replaceAll("/", "~1");
774
+ }
631
775
  /**
632
776
  * Generate zod schema for form-data request body.
633
777
  * Handles file type detection for top-level properties based on encoding.contentType
@@ -669,13 +813,24 @@ const parseBodyAndResponse = ({ data, context, name, strict, generate, isZodV4,
669
813
  const formDataContent = contentEntries.find(isMediaType(String.raw`^multipart\/form-data$`));
670
814
  const [contentType, mediaType] = jsonContent ? ["application/json", jsonContent[1]] : formDataContent ? ["multipart/form-data", formDataContent[1]] : [void 0, void 0];
671
815
  const schema = mediaType?.schema;
672
- if (!schema) return {
673
- input: {
674
- functions: [],
675
- consts: []
676
- },
677
- isArray: false
678
- };
816
+ if (!schema) {
817
+ if (parseType === "response") {
818
+ if (contentEntries.find(isMediaType(String.raw`^text\/plain$`))) return {
819
+ input: {
820
+ functions: [["string", void 0]],
821
+ consts: []
822
+ },
823
+ isArray: false
824
+ };
825
+ }
826
+ return {
827
+ input: {
828
+ functions: [],
829
+ consts: []
830
+ },
831
+ isArray: false
832
+ };
833
+ }
679
834
  const encoding = mediaType.encoding;
680
835
  const resolvedJsonSchema = dereference(schema, context);
681
836
  if (resolvedJsonSchema.items) {
@@ -706,7 +861,7 @@ const parseBodyAndResponse = ({ data, context, name, strict, generate, isZodV4,
706
861
  const isMediaType = (pattern) => ([contentType]) => new RegExp(pattern).test(contentType.split(";")[0].trim().toLowerCase());
707
862
  const getSingleResponse = (responses) => {
708
863
  if (!responses) return;
709
- return responses["200"] ?? responses["2XX"] ?? responses["2xx"];
864
+ return responses["200"] ?? responses["2XX"] ?? responses["2xx"] ?? responses["204"] ?? responses["205"];
710
865
  };
711
866
  const parseParameters = ({ data, context, operationName, isZodV4, strict, generate, useReusableSchemas }) => {
712
867
  if (!data) return {
@@ -804,7 +959,7 @@ const parseParameters = ({ data, context, operationName, isZodV4, strict, genera
804
959
  params
805
960
  };
806
961
  };
807
- const generateZodRoute = async ({ operationName, verb, override }, { pathRoute, context, output }) => {
962
+ const generateZodRoute = async ({ operationId, operationName, verb, override }, { pathRoute, context, output }) => {
808
963
  const isZodV4 = !!context.output.packageJson && isZodVersionV4(context.output.packageJson);
809
964
  const useReusableSchemas = context.output.override.zod.generateReusableSchemas;
810
965
  const spec = context.spec.paths?.[pathRoute];
@@ -842,36 +997,50 @@ const generateZodRoute = async ({ operationName, verb, override }, { pathRoute,
842
997
  }));
843
998
  const preprocessParams = override.zod.preprocess?.param ? await generateMutator({
844
999
  output,
845
- mutator: override.zod.preprocess.response,
1000
+ mutator: override.zod.preprocess.param,
846
1001
  name: `${operationName}PreprocessParams`,
847
1002
  workspace: context.workspace,
848
1003
  tsconfig: context.output.tsconfig
849
1004
  }) : void 0;
850
- let inputParams = parseZodValidationSchemaDefinition(parsedParameters.params, context, override.zod.coerce.param, override.zod.strict.param, isZodV4, preprocessParams);
1005
+ const paramsMutator = override.zod.params ? await generateMutator({
1006
+ output,
1007
+ mutator: override.zod.params,
1008
+ name: `${operationName}ZodParams`,
1009
+ workspace: context.workspace,
1010
+ tsconfig: context.output.tsconfig
1011
+ }) : void 0;
1012
+ const pascalOperationName = pascal(operationName);
1013
+ const makeParamsInjection = (location, schemaSuffix) => paramsMutator ? {
1014
+ mutator: paramsMutator,
1015
+ operationId,
1016
+ location,
1017
+ schemaName: `${pascalOperationName}${schemaSuffix}`
1018
+ } : void 0;
1019
+ let inputParams = parseZodValidationSchemaDefinition(parsedParameters.params, context, override.zod.coerce.param, override.zod.strict.param, isZodV4, preprocessParams, makeParamsInjection("param", "Params"));
851
1020
  const preprocessQueryParams = override.zod.preprocess?.query ? await generateMutator({
852
1021
  output,
853
- mutator: override.zod.preprocess.response,
1022
+ mutator: override.zod.preprocess.query,
854
1023
  name: `${operationName}PreprocessQueryParams`,
855
1024
  workspace: context.workspace,
856
1025
  tsconfig: context.output.tsconfig
857
1026
  }) : void 0;
858
- let inputQueryParams = parseZodValidationSchemaDefinition(parsedParameters.queryParams, context, override.zod.coerce.query, override.zod.strict.query, isZodV4, preprocessQueryParams);
1027
+ let inputQueryParams = parseZodValidationSchemaDefinition(parsedParameters.queryParams, context, override.zod.coerce.query, override.zod.strict.query, isZodV4, preprocessQueryParams, makeParamsInjection("query", "QueryParams"));
859
1028
  const preprocessHeader = override.zod.preprocess?.header ? await generateMutator({
860
1029
  output,
861
- mutator: override.zod.preprocess.response,
1030
+ mutator: override.zod.preprocess.header,
862
1031
  name: `${operationName}PreprocessHeader`,
863
1032
  workspace: context.workspace,
864
1033
  tsconfig: context.output.tsconfig
865
1034
  }) : void 0;
866
- let inputHeaders = parseZodValidationSchemaDefinition(parsedParameters.headers, context, override.zod.coerce.header, override.zod.strict.header, isZodV4, preprocessHeader);
1035
+ let inputHeaders = parseZodValidationSchemaDefinition(parsedParameters.headers, context, override.zod.coerce.header, override.zod.strict.header, isZodV4, preprocessHeader, makeParamsInjection("header", "Header"));
867
1036
  const preprocessBody = override.zod.preprocess?.body ? await generateMutator({
868
1037
  output,
869
- mutator: override.zod.preprocess.response,
1038
+ mutator: override.zod.preprocess.body,
870
1039
  name: `${operationName}PreprocessBody`,
871
1040
  workspace: context.workspace,
872
1041
  tsconfig: context.output.tsconfig
873
1042
  }) : void 0;
874
- let inputBody = parseZodValidationSchemaDefinition(parsedBody.input, context, override.zod.coerce.body, override.zod.strict.body, isZodV4, preprocessBody);
1043
+ let inputBody = parseZodValidationSchemaDefinition(parsedBody.input, context, override.zod.coerce.body, override.zod.strict.body, isZodV4, preprocessBody, makeParamsInjection("body", "Body"));
875
1044
  const preprocessResponse = override.zod.preprocess?.response ? await generateMutator({
876
1045
  output,
877
1046
  mutator: override.zod.preprocess.response,
@@ -879,7 +1048,7 @@ const generateZodRoute = async ({ operationName, verb, override }, { pathRoute,
879
1048
  workspace: context.workspace,
880
1049
  tsconfig: context.output.tsconfig
881
1050
  }) : void 0;
882
- const inputResponses = parsedResponses.map((parsedResponse) => parseZodValidationSchemaDefinition(parsedResponse.input, context, override.zod.coerce.response, override.zod.strict.response, isZodV4, preprocessResponse));
1051
+ const inputResponses = parsedResponses.map((parsedResponse, index) => parseZodValidationSchemaDefinition(parsedResponse.input, context, override.zod.coerce.response, override.zod.strict.response, isZodV4, preprocessResponse, makeParamsInjection("response", responses[index][0] ? `${responses[index][0]}Response` : "Response")));
883
1052
  const SENTINEL_PATTERN = /__REF_([A-Za-z_$][A-Za-z0-9_$]*)__/g;
884
1053
  const rewriteSentinels = (s) => s.replaceAll(SENTINEL_PATTERN, (_m, name) => name);
885
1054
  const allUsedRefs = new Set([
@@ -911,32 +1080,68 @@ const generateZodRoute = async ({ operationName, verb, override }, { pathRoute,
911
1080
  zod: rewriteSentinels(inputResponses[i].zod)
912
1081
  };
913
1082
  }
914
- if (!inputParams.zod && !inputQueryParams.zod && !inputHeaders.zod && !inputBody.zod && !inputResponses.some((inputResponse) => inputResponse.zod)) return {
1083
+ if (!inputParams.zod && !inputQueryParams.zod && !inputHeaders.zod && !inputBody.zod && responses.length === 0) return {
915
1084
  implementation: "",
916
1085
  mutators: [],
917
1086
  usedRefs: /* @__PURE__ */ new Set()
918
1087
  };
919
- const pascalOperationName = pascal(operationName);
920
1088
  const useBrandedTypes = override.zod.useBrandedTypes;
921
1089
  const brand = (name) => useBrandedTypes ? isZodV4 ? `.brand("${name}")` : `.brand<"${name}">()` : "";
1090
+ const localTaken = new Set(allUsedRefs);
1091
+ const allocateExportName = (baseName, hasItem) => {
1092
+ const collides = (name) => localTaken.has(name) || hasItem && localTaken.has(`${name}Item`);
1093
+ const reserve = (name) => {
1094
+ localTaken.add(name);
1095
+ if (hasItem) localTaken.add(`${name}Item`);
1096
+ };
1097
+ if (!collides(baseName)) {
1098
+ reserve(baseName);
1099
+ return baseName;
1100
+ }
1101
+ let counter = 0;
1102
+ let candidate = `${baseName}Schema`;
1103
+ while (collides(candidate)) {
1104
+ counter += 1;
1105
+ candidate = `${baseName}Schema${counter}`;
1106
+ }
1107
+ reserve(candidate);
1108
+ return candidate;
1109
+ };
1110
+ const paramsName = allocateExportName(`${pascalOperationName}Params`, false);
1111
+ const queryParamsName = allocateExportName(`${pascalOperationName}QueryParams`, false);
1112
+ const headerName = allocateExportName(`${pascalOperationName}Header`, false);
1113
+ const bodyName = allocateExportName(`${pascalOperationName}Body`, parsedBody.isArray);
922
1114
  return {
923
1115
  implementation: [
924
1116
  ...inputParams.consts ? [inputParams.consts] : [],
925
- ...inputParams.zod ? [`export const ${pascalOperationName}Params = ${inputParams.zod}${brand(`${pascalOperationName}Params`)}`] : [],
1117
+ ...inputParams.zod ? [`export const ${paramsName} = ${inputParams.zod}${brand(paramsName)}`] : [],
926
1118
  ...inputQueryParams.consts ? [inputQueryParams.consts] : [],
927
- ...inputQueryParams.zod ? [`export const ${pascalOperationName}QueryParams = ${inputQueryParams.zod}${brand(`${pascalOperationName}QueryParams`)}`] : [],
1119
+ ...inputQueryParams.zod ? [`export const ${queryParamsName} = ${inputQueryParams.zod}${brand(queryParamsName)}`] : [],
928
1120
  ...inputHeaders.consts ? [inputHeaders.consts] : [],
929
- ...inputHeaders.zod ? [`export const ${pascalOperationName}Header = ${inputHeaders.zod}${brand(`${pascalOperationName}Header`)}`] : [],
1121
+ ...inputHeaders.zod ? [`export const ${headerName} = ${inputHeaders.zod}${brand(headerName)}`] : [],
930
1122
  ...inputBody.consts ? [inputBody.consts] : [],
931
- ...inputBody.zod ? [parsedBody.isArray ? `export const ${pascalOperationName}BodyItem = ${inputBody.zod}
932
- export const ${pascalOperationName}Body = zod.array(${pascalOperationName}BodyItem)${parsedBody.rules?.min ? `.min(${parsedBody.rules.min})` : ""}${parsedBody.rules?.max ? `.max(${parsedBody.rules.max})` : ""}${brand(`${pascalOperationName}Body`)}` : `export const ${pascalOperationName}Body = ${inputBody.zod}${brand(`${pascalOperationName}Body`)}`] : [],
1123
+ ...inputBody.zod ? [parsedBody.isArray ? `export const ${bodyName}Item = ${inputBody.zod}
1124
+ export const ${bodyName} = zod.array(${bodyName}Item)${parsedBody.rules?.min ? `.min(${parsedBody.rules.min})` : ""}${parsedBody.rules?.max ? `.max(${parsedBody.rules.max})` : ""}${brand(bodyName)}` : `export const ${bodyName} = ${inputBody.zod}${brand(bodyName)}`] : [],
933
1125
  ...inputResponses.flatMap((inputResponse, index) => {
934
- const operationResponse = pascal(`${operationName}-${responses[index][0]}-response`);
935
- return [...inputResponse.consts ? [inputResponse.consts] : [], ...inputResponse.zod ? [parsedResponses[index].isArray ? `export const ${operationResponse}Item = ${inputResponse.zod}
936
- export const ${operationResponse} = zod.array(${operationResponse}Item)${parsedResponses[index].rules?.min ? `.min(${parsedResponses[index].rules.min})` : ""}${parsedResponses[index].rules?.max ? `.max(${parsedResponses[index].rules.max})` : ""}${brand(operationResponse)}` : `export const ${operationResponse} = ${inputResponse.zod}${brand(operationResponse)}`] : []];
1126
+ const operationResponse = allocateExportName(pascal(`${operationName}-${responses[index][0]}-response`), parsedResponses[index].isArray);
1127
+ if (!inputResponse.zod) {
1128
+ if (!override.zod.generate.response) return [];
1129
+ const noContentStatusCodes = new Set(["204", "205"]);
1130
+ const statusCode = responses[index][0];
1131
+ const isEachHttpStatusMode = !!statusCode;
1132
+ let isNoContent;
1133
+ if (isEachHttpStatusMode) isNoContent = noContentStatusCodes.has(statusCode);
1134
+ else {
1135
+ const specResponseKeys = new Set(Object.keys(spec[verb]?.responses ?? {}));
1136
+ isNoContent = !(specResponseKeys.has("200") || specResponseKeys.has("2XX") || specResponseKeys.has("2xx"));
1137
+ }
1138
+ return [`export const ${operationResponse} = ${isNoContent ? "zod.void()" : "zod.unknown()"}${brand(operationResponse)}`];
1139
+ }
1140
+ return [...inputResponse.consts ? [inputResponse.consts] : [], parsedResponses[index].isArray ? `export const ${operationResponse}Item = ${inputResponse.zod}
1141
+ export const ${operationResponse} = zod.array(${operationResponse}Item)${parsedResponses[index].rules?.min ? `.min(${parsedResponses[index].rules.min})` : ""}${parsedResponses[index].rules?.max ? `.max(${parsedResponses[index].rules.max})` : ""}${brand(operationResponse)}` : `export const ${operationResponse} = ${inputResponse.zod}${brand(operationResponse)}`];
937
1142
  })
938
1143
  ].join("\n\n"),
939
- mutators: preprocessResponse ? [preprocessResponse] : [],
1144
+ mutators: [...preprocessResponse ? [preprocessResponse] : [], ...paramsMutator ? [paramsMutator] : []],
940
1145
  usedRefs: useReusableSchemas ? allUsedRefs : /* @__PURE__ */ new Set()
941
1146
  };
942
1147
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/compatible-v4.ts","../src/index.ts"],"sourcesContent":["import { compareVersions, type PackageJson } from '@orval/core';\n\nconst getZodPackageVersion = (packageJson: PackageJson) => {\n return (\n packageJson.resolvedVersions?.zod ??\n packageJson.dependencies?.zod ??\n packageJson.devDependencies?.zod ??\n packageJson.peerDependencies?.zod\n );\n};\n\nexport const isZodVersionV4 = (packageJson: PackageJson) => {\n const version = getZodPackageVersion(packageJson);\n\n if (!version) {\n return false;\n }\n\n const withoutRc = version.split('-')[0];\n\n return compareVersions(withoutRc, '4.0.0');\n};\n\nexport const getZodDateFormat = (isZodV4: boolean) => {\n return isZodV4 ? 'iso.date' : 'date';\n};\n\nexport const getZodTimeFormat = (isZodV4: boolean) => {\n return isZodV4 ? 'iso.time' : 'time';\n};\n\nexport const getZodDateTimeFormat = (isZodV4: boolean) => {\n return isZodV4 ? 'iso.datetime' : 'datetime';\n};\n\ntype ParameterDefinitions = Record<string, unknown>;\ntype ParameterFunction = [string, ParameterDefinitions | undefined];\nexport const getParameterFunctions = (\n isZodV4: boolean,\n strict: boolean,\n parameters: ParameterDefinitions,\n): ParameterFunction[] => {\n if (isZodV4 && strict) {\n return [['strictObject', parameters]];\n } else {\n return strict\n ? [\n ['object', parameters],\n ['strict', undefined],\n ]\n : [['object', parameters]];\n }\n};\n\nexport const getObjectFunctionName = (isZodV4: boolean, strict: boolean) => {\n return isZodV4 && strict ? 'strictObject' : 'object';\n};\n\n/**\n * Returns the object constructor to use for open/generic objects.\n *\n * - Zod v4 supports `zod.looseObject({...})` directly.\n * - Zod v3 falls back to `zod.object({...})` and is finalized with\n * `.passthrough()` during parsing.\n */\nexport const getLooseObjectFunctionName = (isZodV4: boolean) => {\n return isZodV4 ? 'looseObject' : 'object';\n};\n","/* eslint-disable unicorn/no-array-reduce */\n\nimport {\n camel,\n type ClientBuilder,\n type ClientGeneratorsBuilder,\n type ContextSpec,\n conventionName,\n escape,\n generateMutator,\n type GeneratorDependency,\n type GeneratorMutator,\n type GeneratorOptions,\n type GeneratorVerbOptions,\n getFormDataFieldFileType,\n getNumberWord,\n getRefInfo,\n isBoolean,\n isNumber,\n isObject,\n isString,\n jsStringEscape,\n logVerbose,\n type OpenApiParameterObject,\n type OpenApiReferenceObject,\n type OpenApiRequestBodyObject,\n type OpenApiResponseObject,\n type OpenApiSchemaObject,\n pascal,\n resolveRef,\n stringify,\n type ZodCoerceType,\n} from '@orval/core';\nimport { unique } from 'remeda';\n\nimport {\n getLooseObjectFunctionName,\n getObjectFunctionName,\n getParameterFunctions,\n getZodDateFormat,\n getZodDateTimeFormat,\n getZodTimeFormat,\n isZodVersionV4,\n} from './compatible-v4';\n\nconst ZOD_DEPENDENCIES: GeneratorDependency[] = [\n {\n exports: [\n {\n default: false,\n name: 'zod',\n syntheticDefaultImport: false,\n namespaceImport: true,\n values: true,\n },\n ],\n dependency: 'zod',\n },\n];\n\nexport const getZodDependencies = () => ZOD_DEPENDENCIES;\n\n/**\n * values that may appear in \"type\". Equals SchemaObjectType\n */\nconst possibleSchemaTypes = new Set([\n 'integer',\n 'number',\n 'string',\n 'boolean',\n 'object',\n 'strictObject',\n 'null',\n 'array',\n]);\n\nexport const predefinedZodFormats = new Set([\n 'date',\n 'time',\n 'date-time',\n 'email',\n 'uri',\n 'hostname',\n 'uuid',\n]);\n\ntype ResolvedZodType =\n | string\n | {\n multiType: string[];\n };\n\nconst resolveZodType = (schema: OpenApiSchemaObject): ResolvedZodType => {\n const schemaTypeValue = schema.type as unknown;\n\n // Handle array of types (OpenAPI 3.1+)\n if (Array.isArray(schemaTypeValue)) {\n // Filter out 'null' type as it's handled separately via nullable\n const nonNullTypes = schemaTypeValue\n .filter((t): t is string => isString(t))\n .filter((t) => t !== 'null' && possibleSchemaTypes.has(t))\n .map((t) => (t === 'integer' ? 'number' : t));\n\n // If multiple types, return a special marker for union handling\n if (nonNullTypes.length > 1) {\n return { multiType: nonNullTypes };\n }\n\n // Single type\n const type = nonNullTypes[0];\n\n // Handle prefixItems for tuples\n if (type === 'array' && 'prefixItems' in schema) {\n return 'tuple';\n }\n\n return type;\n }\n\n // Handle single type value\n const type = isString(schemaTypeValue) ? schemaTypeValue : undefined;\n\n // TODO: if \"prefixItems\" exists and type is \"array\", then generate a \"tuple\"\n if (schema.type === 'array' && 'prefixItems' in schema) {\n return 'tuple';\n }\n\n switch (type) {\n case 'integer': {\n return 'number';\n }\n default: {\n return type ?? 'unknown';\n }\n }\n};\n\n// https://github.com/colinhacks/zod#coercion-for-primitives\nconst COERCIBLE_TYPES = new Set([\n 'string',\n 'number',\n 'boolean',\n 'bigint',\n 'date',\n]);\n\nexport interface ZodValidationSchemaDefinition {\n functions: [string, unknown][];\n consts: string[];\n}\n\nconst minAndMaxTypes = new Set(['number', 'string', 'array']);\n\nconst removeReadOnlyProperties = (\n schema: OpenApiSchemaObject,\n): OpenApiSchemaObject => {\n if (schema.properties && isObject(schema.properties)) {\n const filteredProperties: Record<string, OpenApiSchemaObject> = {};\n\n for (const [key, value] of Object.entries(schema.properties)) {\n if (isObject(value) && 'readOnly' in value && value.readOnly) {\n continue;\n }\n filteredProperties[key] = value as OpenApiSchemaObject;\n }\n\n return {\n ...(schema as Record<string, unknown>),\n properties: filteredProperties,\n };\n }\n if (schema.items && isObject(schema.items) && 'properties' in schema.items) {\n return {\n ...(schema as Record<string, unknown>),\n items: removeReadOnlyProperties(schema.items as OpenApiSchemaObject),\n };\n }\n return schema;\n};\n\ninterface DateTimeOptions {\n offset?: boolean;\n local?: boolean;\n precision?: number;\n}\n\ninterface TimeOptions {\n precision?: -1 | 0 | 1 | 2 | 3;\n}\n\n/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n\nconst COMPONENT_SCHEMAS_REF_PATTERN = /^#\\/components\\/schemas\\/[^/]+$/;\n\nconst isComponentSchemaRef = (ref: string): boolean =>\n COMPONENT_SCHEMAS_REF_PATTERN.test(ref);\n\nexport const generateZodValidationSchemaDefinition = (\n schema: OpenApiSchemaObject | OpenApiReferenceObject | undefined,\n context: ContextSpec,\n name: string,\n strict: boolean,\n isZodV4: boolean,\n rules?: {\n required?: boolean;\n dateTimeOptions?: DateTimeOptions;\n timeOptions?: TimeOptions;\n /**\n * Override schemas for properties at THIS level only.\n * Not passed to nested schemas. Used by form-data for file type handling.\n */\n propertyOverrides?: Record<string, ZodValidationSchemaDefinition>;\n /**\n * Internal registry to keep generated const names unique within a single\n * schema generation tree without leaking suffixes across unrelated top-level\n * schemas.\n */\n constNameRegistry?: Record<string, number>;\n /**\n * When true, plain `$ref`s into `#/components/schemas/*` emit a `namedRef`\n * placeholder instead of being inlined.\n */\n useReusableSchemas?: boolean;\n },\n): ZodValidationSchemaDefinition => {\n if (!schema) return { functions: [], consts: [] };\n\n // Ref-aware path: emit a placeholder that the orchestrator will rewrite into\n // either a direct identifier or `z.lazy(() => Name)`.\n if (\n rules?.useReusableSchemas &&\n '$ref' in schema &&\n typeof schema.$ref === 'string' &&\n isComponentSchemaRef(schema.$ref)\n ) {\n const siblings = Object.keys(schema).filter((k) => k !== '$ref');\n\n const CHAINABLE_SIBLINGS = new Set(['nullable', 'default', 'description']);\n const isChainable = (k: string) => CHAINABLE_SIBLINGS.has(k);\n const allSiblingsChainable = siblings.every((k) => isChainable(k));\n\n if (allSiblingsChainable) {\n const refName = conventionName(\n getRefInfo(schema.$ref, context).originalName,\n context.output.namingConvention,\n );\n const functions: [string, unknown][] = [\n ['namedRef', { name: refName, sourceRef: schema.$ref }],\n ];\n const consts: string[] = [];\n\n const refSchema = schema as OpenApiSchemaObject & {\n $ref: string;\n nullable?: boolean;\n default?: unknown;\n description?: string;\n };\n const refRequired = rules.required ?? false;\n const refHasDefault = refSchema.default !== undefined;\n\n // Match the main-path modifier ordering: nullability/optional first,\n // then default, then describe. Combining `.default()` with `.optional()`\n // is wrong in zod — `.optional()` short-circuits on `undefined` before\n // the inner default runs — so skip `.optional()` whenever a default is\n // present (matches the existing non-reusable behaviour at line ~932).\n if (!refRequired && refSchema.nullable) {\n functions.push(['nullish', undefined]);\n } else if (refSchema.nullable) {\n functions.push(['nullable', undefined]);\n } else if (!refRequired && !refHasDefault) {\n functions.push(['optional', undefined]);\n }\n\n // .default(...) — emit a const for non-primitive defaults. Use the same\n // constNameRegistry-based suffix that the rest of the generator uses so\n // multiple defaults sharing `name` don't collide on `<name>Default`.\n if (refHasDefault) {\n const registry = rules.constNameRegistry ?? {};\n const counter = isNumber(registry[name]) ? registry[name] + 1 : 0;\n registry[name] = counter;\n const suffix = counter ? pascal(getNumberWord(counter)) : '';\n const defaultVarName = `${name}Default${suffix}`;\n const defaultLiteral = stringify(refSchema.default);\n if (defaultLiteral !== undefined) {\n consts.push(`export const ${defaultVarName} = ${defaultLiteral};`);\n functions.push(['default', defaultVarName]);\n }\n }\n\n // .describe('...')\n if (typeof refSchema.description === 'string') {\n functions.push(['describe', `\"${escape(refSchema.description)}\"`]);\n }\n\n return { functions, consts };\n }\n\n // Non-chainable sibling present — fall back to inlining at this site only.\n // We reassign the local `schema` reference to the dereferenced form and let\n // the rest of the function process it normally.\n logVerbose(\n `[orval/zod] $ref ${schema.$ref} has non-chainable siblings ` +\n `[${siblings.filter((s) => !isChainable(s)).join(', ')}]; falling back to inlining.`,\n );\n schema = dereference(\n schema as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n );\n }\n\n const useReusableSchemas = rules?.useReusableSchemas ?? false;\n const consts: string[] = [];\n const constNameRegistry = rules?.constNameRegistry ?? {};\n const constsCounter = isNumber(constNameRegistry[name])\n ? constNameRegistry[name] + 1\n : 0;\n\n const constsCounterValue = constsCounter\n ? pascal(getNumberWord(constsCounter))\n : '';\n\n constNameRegistry[name] = constsCounter;\n\n const functions: [string, unknown][] = [];\n const type = resolveZodType(schema);\n const required = rules?.required ?? false;\n const hasDefault = schema.default !== undefined;\n const nullable =\n // changing to ?? here changes behavior - so don't\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n ('nullable' in schema && schema.nullable) ||\n (Array.isArray(schema.type) && schema.type.includes('null'));\n const min = schema.minimum ?? schema.minLength ?? schema.minItems;\n const max = schema.maximum ?? schema.maxLength ?? schema.maxItems;\n\n // Handle exclusiveMinimum and exclusiveMaximum (OpenAPI 3.0 vs 3.1 compatibility)\n // OpenAPI 3.0: exclusiveMinimum/exclusiveMaximum are booleans indicating if minimum/maximum is exclusive\n // OpenAPI 3.1: exclusiveMinimum/exclusiveMaximum are numbers (the value itself)\n const exclusiveMinRaw =\n 'exclusiveMinimum' in schema ? schema.exclusiveMinimum : undefined;\n const exclusiveMaxRaw =\n 'exclusiveMaximum' in schema ? schema.exclusiveMaximum : undefined;\n\n // Convert boolean to number if using OpenAPI 3.0 format\n const exclusiveMin =\n isBoolean(exclusiveMinRaw) && exclusiveMinRaw ? min : exclusiveMinRaw;\n const exclusiveMax =\n isBoolean(exclusiveMaxRaw) && exclusiveMaxRaw ? max : exclusiveMaxRaw;\n\n const multipleOf = schema.multipleOf;\n const matches = schema.pattern ?? undefined;\n // Enum-based schemas are emitted as `zod.enum(...)` or literal unions, so\n // chaining scalar constraints onto the parent schema would generate invalid\n // Zod output. Arrays are handled separately via their item schema.\n const hasNonArrayEnum = !!schema.enum && type !== 'array';\n\n // Check for allOf/oneOf/anyOf BEFORE processing by type\n // This ensures these constraints work with any base type (string, number, object, etc.)\n let skipSwitchStatement = false;\n if (schema.allOf || schema.oneOf || schema.anyOf) {\n const separator = schema.allOf ? 'allOf' : schema.oneOf ? 'oneOf' : 'anyOf';\n\n const schemas = (schema.allOf ?? schema.oneOf ?? schema.anyOf) as (\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n )[];\n\n // Use index-based naming to ensure uniqueness when processing multiple schemas\n // This prevents duplicate schema names when nullable refs are used\n const baseSchemas = schemas.map((schema, index) =>\n generateZodValidationSchemaDefinition(\n schema as OpenApiSchemaObject,\n context,\n `${camel(name)}${pascal(getNumberWord(index + 1))}`,\n strict,\n isZodV4,\n {\n required: true,\n constNameRegistry,\n useReusableSchemas,\n },\n ),\n );\n\n // Handle allOf/oneOf/anyOf with additional properties - merge additional properties into the schema\n if ((schema.allOf || schema.oneOf || schema.anyOf) && schema.properties) {\n const additionalPropertiesSchema = {\n properties: schema.properties,\n required: schema.required,\n additionalProperties: schema.additionalProperties,\n type: schema.type,\n } as OpenApiSchemaObject;\n\n // Use index-based naming to ensure uniqueness\n const additionalIndex = baseSchemas.length + 1;\n const additionalPropertiesDefinition =\n generateZodValidationSchemaDefinition(\n additionalPropertiesSchema,\n context,\n `${camel(name)}${pascal(getNumberWord(additionalIndex))}`,\n strict,\n isZodV4,\n {\n required: true,\n constNameRegistry,\n useReusableSchemas,\n },\n );\n\n // For oneOf/anyOf, use allOf to combine union with common properties\n // This generates: zod.union([...]).and(commonProperties)\n if (schema.oneOf || schema.anyOf) {\n functions.push([\n 'allOf',\n [\n { functions: [[separator, baseSchemas]], consts: [] },\n additionalPropertiesDefinition,\n ],\n ]);\n } else {\n // For allOf, just add to the list\n baseSchemas.push(additionalPropertiesDefinition);\n functions.push([separator, baseSchemas]);\n }\n } else {\n functions.push([separator, baseSchemas]);\n }\n skipSwitchStatement = true;\n }\n\n let defaultVarName: string | undefined;\n if (schema.default !== undefined) {\n defaultVarName = `${name}Default${constsCounterValue}`;\n let defaultValue: string | undefined;\n\n const isDateType =\n schema.type === 'string' &&\n (schema.format === 'date' || schema.format === 'date-time') &&\n context.output.override.useDates;\n\n if (isDateType) {\n // OpenApiSchemaObject defines default as 'any'\n defaultValue = `new Date(\"${escape(schema.default)}\")`;\n } else if (isObject(schema.default)) {\n // Narrow string literals individually with `as const` so `zod.enum([...])`\n // properties accept the emitted default (#3244). Whole-object/array\n // `as const` would make nested arrays `readonly`, which zod v4's\n // `.default()` rejects against its mutable parameter type (#3399).\n const entries = Object.entries(schema.default)\n .map(([key, value]) => {\n if (isString(value)) {\n return `${key}: \"${escape(value)}\" as const`;\n }\n\n if (Array.isArray(value)) {\n const arrayItems = value.map((item) =>\n isString(item) ? `\"${escape(item)}\" as const` : `${item}`,\n );\n return `${key}: [${arrayItems.join(', ')}]`;\n }\n\n if (\n value === null ||\n value === undefined ||\n isNumber(value) ||\n isBoolean(value)\n )\n return `${key}: ${value}`;\n })\n .join(', ');\n defaultValue = entries.length === 0 ? `{}` : `{ ${entries} }`;\n } else {\n // OpenApiSchemaObject defines default as 'any'\n const rawStringified = stringify(schema.default);\n defaultValue =\n rawStringified === undefined\n ? 'null'\n : rawStringified.replaceAll(\"'\", '`');\n\n // If the schema is an array with enum items, inject inplace to avoid issues with default values\n const isArrayWithEnumItems =\n Array.isArray(schema.default) &&\n type === 'array' &&\n schema.items &&\n 'enum' in schema.items &&\n schema.default.length > 0;\n\n if (isArrayWithEnumItems) {\n defaultVarName = defaultValue;\n defaultValue = undefined;\n }\n }\n if (defaultValue) {\n consts.push(`export const ${defaultVarName} = ${defaultValue};`);\n }\n }\n\n // Handle multi-type schemas (OpenAPI 3.1+ type arrays)\n if (isObject(type) && 'multiType' in type) {\n const types = type.multiType;\n functions.push([\n 'oneOf',\n types.map((t) =>\n generateZodValidationSchemaDefinition(\n {\n ...(schema as Record<string, unknown>),\n type: t,\n } as OpenApiSchemaObject,\n context,\n name,\n strict,\n isZodV4,\n {\n required: true,\n constNameRegistry,\n useReusableSchemas,\n },\n ),\n ),\n ]);\n\n if (!required && nullable) {\n functions.push(['nullish', undefined]);\n } else if (nullable) {\n functions.push(['nullable', undefined]);\n } else if (!required) {\n functions.push(['optional', undefined]);\n }\n\n return { functions, consts };\n }\n\n if (!skipSwitchStatement) {\n switch (type) {\n case 'tuple': {\n /**\n *\n * > 10.3.1.1. prefixItems\n * > The value of \"prefixItems\" MUST be a non-empty array of valid JSON Schemas.\n * >\n * > Validation succeeds if each element of the instance validates against the schema at the same position, if any.\n * > This keyword does not constrain the length of the array. If the array is longer than this keyword's value,\n * > this keyword validates only the prefix of matching length.\n * >\n * > This keyword produces an annotation value which is the largest index to which this keyword applied a subschema.\n * > The value MAY be a boolean true if a subschema was applied to every index of the instance, such as is produced by the \"items\" keyword.\n * > This annotation affects the behavior of \"items\" and \"unevaluatedItems\".\n * >\n * > Omitting this keyword has the same assertion behavior as an empty array.\n */\n if ('prefixItems' in schema) {\n const schema31 = schema as OpenApiSchemaObject;\n const prefixItems = Array.isArray(schema31.prefixItems)\n ? (schema31.prefixItems as (\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n )[])\n : [];\n\n if (prefixItems.length > 0) {\n functions.push([\n 'tuple',\n prefixItems.map((item, idx) =>\n generateZodValidationSchemaDefinition(\n dereference(item, context),\n context,\n camel(`${name}-${idx}-item`),\n isZodV4,\n strict,\n {\n required: true,\n constNameRegistry,\n useReusableSchemas,\n },\n ),\n ),\n ]);\n\n if (\n schema.items &&\n (max ?? Number.POSITIVE_INFINITY) > prefixItems.length\n ) {\n // only add zod.rest() if number of tuple elements can exceed provided prefixItems:\n functions.push([\n 'rest',\n generateZodValidationSchemaDefinition(\n schema.items as OpenApiSchemaObject | undefined,\n context,\n camel(`${name}-item`),\n strict,\n isZodV4,\n {\n required: true,\n constNameRegistry,\n useReusableSchemas,\n },\n ),\n ]);\n }\n }\n }\n break;\n }\n case 'array': {\n functions.push([\n 'array',\n generateZodValidationSchemaDefinition(\n schema.items as OpenApiSchemaObject | undefined,\n context,\n camel(`${name}-item`),\n strict,\n isZodV4,\n {\n required: true,\n constNameRegistry,\n useReusableSchemas,\n },\n ),\n ]);\n break;\n }\n case 'string': {\n if (schema.enum) {\n break;\n }\n\n if (\n context.output.override.useDates &&\n (schema.format === 'date' || schema.format === 'date-time')\n ) {\n functions.push(['date', undefined]);\n break;\n }\n\n if (schema.format === 'binary') {\n functions.push(['instanceof', 'File']);\n break;\n }\n\n // The @scalar/openapi-parser upgrader converts format: binary to\n // contentMediaType: application/octet-stream when upgrading\n // Swagger 2.0 / OAS 3.0 → OAS 3.1. Treat it the same as\n // format: binary so $ref-based model types generate File validation.\n if (\n schema.contentMediaType === 'application/octet-stream' &&\n !schema.contentEncoding\n ) {\n functions.push(['instanceof', 'File']);\n break;\n }\n\n if (isZodV4) {\n if (!predefinedZodFormats.has(schema.format ?? '')) {\n if ('const' in schema) {\n functions.push(['literal', `\"${schema.const}\"`]);\n } else if (schema.pattern && schema.format) {\n const isStartWithSlash = schema.pattern.startsWith('/');\n const isEndWithSlash = schema.pattern.endsWith('/');\n const regexp = `new RegExp('${jsStringEscape(\n schema.pattern.slice(\n isStartWithSlash ? 1 : 0,\n isEndWithSlash ? -1 : undefined,\n ),\n )}')`;\n consts.push(\n `export const ${name}RegExp${constsCounterValue} = ${regexp};\\n`,\n );\n functions.push([\n 'stringFormat',\n [\n `'${escape(schema.format)}'`,\n `${name}RegExp${constsCounterValue}`,\n ],\n ]);\n } else {\n functions.push([type as string, undefined]);\n }\n break;\n }\n } else {\n if ('const' in schema) {\n functions.push(['literal', `\"${schema.const}\"`]);\n } else {\n functions.push([type as string, undefined]);\n }\n }\n\n if (schema.format === 'date') {\n const formatAPI = getZodDateFormat(isZodV4);\n\n functions.push([formatAPI, undefined]);\n break;\n }\n\n if (schema.format === 'time') {\n const options = context.output.override.zod.timeOptions;\n const formatAPI = getZodTimeFormat(isZodV4);\n\n functions.push([formatAPI, JSON.stringify(options)]);\n break;\n }\n\n if (schema.format === 'date-time') {\n const options = context.output.override.zod.dateTimeOptions;\n const formatAPI = getZodDateTimeFormat(isZodV4);\n\n functions.push([formatAPI, JSON.stringify(options)]);\n break;\n }\n\n if (schema.format === 'email') {\n functions.push(['email', undefined]);\n break;\n }\n\n if (schema.format === 'uri') {\n functions.push(['url', undefined]);\n break;\n }\n\n if (schema.format === 'hostname') {\n if (isZodV4) {\n functions.push(['hostname', undefined]);\n } else {\n functions.push(['url', undefined]);\n }\n break;\n }\n\n if (schema.format === 'uuid') {\n functions.push(['uuid', undefined]);\n break;\n }\n\n break;\n }\n default: {\n const hasProperties = !!schema.properties;\n const properties = schema.properties ?? {};\n const hasDefinedProperties = Object.keys(properties).length > 0;\n const hasAdditionalPropertiesSchema =\n !!schema.additionalProperties &&\n !isBoolean(schema.additionalProperties);\n\n // A plain `type: object` without explicit properties/additionalProperties\n // represents an open dictionary-like object in OpenAPI and should not be\n // generated as a strict object.\n const shouldUseLooseObject =\n type === 'object' &&\n !hasDefinedProperties &&\n schema.additionalProperties === undefined &&\n !hasAdditionalPropertiesSchema;\n\n if (hasProperties && hasDefinedProperties) {\n const objectType = getObjectFunctionName(isZodV4, strict);\n\n functions.push([\n objectType,\n Object.keys(properties)\n .map((key) => ({\n [key]:\n rules?.propertyOverrides?.[key] ??\n generateZodValidationSchemaDefinition(\n properties[key] as OpenApiSchemaObject | undefined,\n context,\n camel(`${name}-${key}`),\n strict,\n isZodV4,\n {\n required: schema.required?.includes(key),\n constNameRegistry,\n useReusableSchemas,\n },\n ),\n }))\n .reduce((acc, curr) => ({ ...acc, ...curr }), {}),\n ]);\n\n if (strict && !isZodV4) {\n functions.push(['strict', undefined]);\n }\n\n break;\n }\n\n if (shouldUseLooseObject) {\n const looseObjectType = getLooseObjectFunctionName(isZodV4);\n\n functions.push([looseObjectType, {}]);\n\n if (!isZodV4) {\n functions.push(['passthrough', undefined]);\n }\n\n break;\n }\n\n if (schema.additionalProperties) {\n functions.push([\n 'additionalProperties',\n generateZodValidationSchemaDefinition(\n isBoolean(schema.additionalProperties)\n ? {}\n : (schema.additionalProperties as OpenApiSchemaObject),\n context,\n name,\n strict,\n isZodV4,\n {\n required: true,\n constNameRegistry,\n useReusableSchemas,\n },\n ),\n ]);\n\n break;\n }\n\n if (schema.enum) {\n break;\n }\n\n functions.push([type, undefined]);\n\n break;\n }\n }\n }\n\n if (!hasNonArrayEnum && isString(type) && minAndMaxTypes.has(type)) {\n // Handle minimum constraints: exclusiveMinimum (>.gt()) takes priority over minimum (.min())\n // Check if exclusive flag was set (boolean format in OpenAPI 3.0) or a different value (OpenAPI 3.1)\n const shouldUseExclusiveMin = exclusiveMinRaw !== undefined;\n const shouldUseExclusiveMax = exclusiveMaxRaw !== undefined;\n\n if (shouldUseExclusiveMin && exclusiveMin !== undefined) {\n consts.push(\n `export const ${name}ExclusiveMin${constsCounterValue} = ${exclusiveMin};`,\n );\n // Generate .gt() for exclusive minimum (> instead of >=)\n functions.push(['gt', `${name}ExclusiveMin${constsCounterValue}`]);\n } else if (min !== undefined) {\n if (min === 1) {\n functions.push(['min', `${min}`]);\n } else {\n consts.push(`export const ${name}Min${constsCounterValue} = ${min};`);\n functions.push(['min', `${name}Min${constsCounterValue}`]);\n }\n }\n\n // Handle maximum constraints: exclusiveMaximum (<.lt()) takes priority over maximum (.max())\n if (shouldUseExclusiveMax && exclusiveMax !== undefined) {\n consts.push(\n `export const ${name}ExclusiveMax${constsCounterValue} = ${exclusiveMax};`,\n );\n // Generate .lt() for exclusive maximum (< instead of <=)\n functions.push(['lt', `${name}ExclusiveMax${constsCounterValue}`]);\n } else if (max !== undefined) {\n consts.push(`export const ${name}Max${constsCounterValue} = ${max};`);\n functions.push(['max', `${name}Max${constsCounterValue}`]);\n }\n\n if (multipleOf !== undefined) {\n consts.push(\n `export const ${name}MultipleOf${constsCounterValue} = ${multipleOf.toString()};`,\n );\n functions.push(['multipleOf', `${name}MultipleOf${constsCounterValue}`]);\n }\n if (\n exclusiveMin !== undefined ||\n min !== undefined ||\n exclusiveMax !== undefined ||\n multipleOf !== undefined ||\n max !== undefined\n ) {\n consts.push(`\\n`);\n }\n }\n\n const stringFormatAlreadyEmitted =\n isZodV4 &&\n type === 'string' &&\n !!matches &&\n !!schema.format &&\n !predefinedZodFormats.has(schema.format ?? '');\n\n if (\n matches &&\n !hasNonArrayEnum &&\n type === 'string' &&\n !stringFormatAlreadyEmitted\n ) {\n const isStartWithSlash = matches.startsWith('/');\n const isEndWithSlash = matches.endsWith('/');\n\n const regexp = `new RegExp('${jsStringEscape(\n matches.slice(isStartWithSlash ? 1 : 0, isEndWithSlash ? -1 : undefined),\n )}')`;\n\n consts.push(\n `export const ${name}RegExp${constsCounterValue} = ${regexp};\\n`,\n );\n if (schema.format && !predefinedZodFormats.has(schema.format) && isZodV4) {\n functions.push([\n 'stringFormat',\n [`'${escape(schema.format)}'`, `${name}RegExp${constsCounterValue}`],\n ]);\n } else {\n functions.push(['regex', `${name}RegExp${constsCounterValue}`]);\n }\n }\n\n // Array item enums are handled by the nested item schema. Guard parent-array\n // enum emission to avoid generating invalid trailing `.enum(...)` chains.\n if (schema.enum && type !== 'array') {\n const uniqueEnumValues = unique(schema.enum);\n\n if (uniqueEnumValues.every((value) => isString(value))) {\n functions.push([\n 'enum',\n `[${uniqueEnumValues.map((value) => `'${escape(value)}'`).join(', ')}]`,\n ]);\n } else {\n functions.push([\n 'oneOf',\n uniqueEnumValues.map((value) => ({\n functions: [\n ['literal', isString(value) ? `'${escape(value)}'` : value],\n ],\n consts: [],\n })),\n ]);\n }\n }\n\n if (!required && nullable) {\n functions.push(['nullish', undefined]);\n } else if (nullable) {\n functions.push(['nullable', undefined]);\n } else if (!required && !hasDefault) {\n functions.push(['optional', undefined]);\n }\n\n if (hasDefault) {\n functions.push(['default', defaultVarName]);\n }\n\n if (schema.description) {\n functions.push(['describe', `'${jsStringEscape(schema.description)}'`]);\n }\n\n return { functions, consts: unique(consts) };\n};\n\nexport const parseZodValidationSchemaDefinition = (\n input: ZodValidationSchemaDefinition,\n context: ContextSpec,\n coerceTypes: boolean | ZodCoerceType[] = false,\n strict: boolean,\n isZodV4: boolean,\n preprocess?: GeneratorMutator,\n): { zod: string; consts: string; usedRefs: Set<string> } => {\n if (input.functions.length === 0) {\n return { zod: '', consts: '', usedRefs: new Set() };\n }\n\n let consts = '';\n const usedRefs = new Set<string>();\n\n const appendConstsChunk = (chunk: string) => {\n if (!chunk) {\n return;\n }\n\n if (\n consts.length > 0 &&\n !consts.endsWith('\\n') &&\n !chunk.startsWith('\\n')\n ) {\n consts += '\\n';\n }\n\n consts += chunk;\n };\n\n const formatFunctionArgs = (value: unknown): string => {\n if (value === undefined) return '';\n if (value === null) return 'null';\n if (isString(value)) return value;\n if (Array.isArray(value)) {\n return value.map((item) => formatFunctionArgs(item)).join(', ');\n }\n if (isObject(value)) {\n return stringify(value) ?? '';\n }\n if (isNumber(value) || isBoolean(value)) return `${value}`;\n return '';\n };\n\n const parseProperty = (property: [string, unknown]): string => {\n const [fn, args = ''] = property;\n\n if (fn === 'namedRef') {\n const refArgs = args as { name: string; sourceRef: string };\n usedRefs.add(refArgs.name);\n return `__REF_${refArgs.name}__`;\n }\n\n // File | string for text contentMediaType/encoding (user can pass string, runtime wraps in Blob)\n if (fn === 'fileOrString') {\n return 'zod.instanceof(File).or(zod.string())';\n }\n\n if (fn === 'allOf') {\n const allOfArgs = args as ZodValidationSchemaDefinition[];\n // Check if all parts are objects and we need to merge them for strict mode\n const allAreObjects =\n strict &&\n allOfArgs.length > 0 &&\n allOfArgs.every((partSchema) => {\n if (partSchema.functions.length === 0) return false;\n const firstFn = partSchema.functions[0][0];\n // Check if first function is object or strictObject\n // For Zod v3 with strict, it will be object followed by strict\n return firstFn === 'object' || firstFn === 'strictObject';\n });\n\n if (allAreObjects) {\n // Merge all object properties into a single object\n const mergedProperties: Record<string, ZodValidationSchemaDefinition> =\n {};\n let allConsts = '';\n\n for (const partSchema of allOfArgs) {\n if (partSchema.consts.length > 0) {\n allConsts += partSchema.consts.join('\\n');\n }\n\n // Find the object function (might be first or second after strict)\n const objectFunctionIndex = partSchema.functions.findIndex(\n ([fnName]) => fnName === 'object' || fnName === 'strictObject',\n );\n\n if (objectFunctionIndex !== -1) {\n const objectArgs = partSchema.functions[objectFunctionIndex][1];\n if (isObject(objectArgs)) {\n // Merge properties (later schemas override earlier ones)\n Object.assign(\n mergedProperties,\n objectArgs as Record<string, ZodValidationSchemaDefinition>,\n );\n }\n }\n }\n\n if (allConsts.length > 0) {\n appendConstsChunk(allConsts);\n }\n\n // Generate merged object\n const objectType = getObjectFunctionName(isZodV4, strict);\n const mergedObjectString = `zod.${objectType}({\n${Object.entries(mergedProperties)\n .map(([key, schema]) => {\n const value = schema.functions.map((prop) => parseProperty(prop)).join('');\n appendConstsChunk(schema.consts.join('\\n'));\n return ` \"${key}\": ${value.startsWith('.') ? 'zod' : ''}${value}`;\n })\n .join(',\\n')}\n})`;\n\n // Apply strict only once for Zod v3 (v4 uses strictObject)\n if (!isZodV4) {\n return `${mergedObjectString}.strict()`;\n }\n\n return mergedObjectString;\n }\n\n // Fallback to original .and() approach for non-object or non-strict cases\n let acc = '';\n for (const partSchema of allOfArgs) {\n const value = partSchema.functions\n .map((prop) => parseProperty(prop))\n .join('');\n const valueWithZod = `${value.startsWith('.') ? 'zod' : ''}${value}`;\n\n if (partSchema.consts.length > 0) {\n appendConstsChunk(partSchema.consts.join('\\n'));\n }\n\n if (acc.length === 0) {\n acc = valueWithZod;\n } else {\n acc += `.and(${valueWithZod})`;\n }\n }\n\n return acc;\n }\n if (fn === 'oneOf' || fn === 'anyOf') {\n const unionArgs = args as ZodValidationSchemaDefinition[];\n // Can't use zod.union() with a single item\n if (unionArgs.length === 1) {\n return unionArgs[0].functions\n .map((prop: [string, unknown]) => parseProperty(prop))\n .join('');\n }\n\n const union = unionArgs.map(\n ({\n functions,\n consts: argConsts,\n }: {\n functions: [string, unknown][];\n consts: string[];\n }) => {\n const value = functions.map((prop) => parseProperty(prop)).join('');\n const valueWithZod = `${value.startsWith('.') ? 'zod' : ''}${value}`;\n // consts are missing here\n appendConstsChunk(argConsts.join('\\n'));\n return valueWithZod;\n },\n );\n\n return `.union([${union.join(',')}])`;\n }\n\n if (fn === 'additionalProperties') {\n const additionalPropertiesArgs = args as ZodValidationSchemaDefinition;\n const value = additionalPropertiesArgs.functions\n .map((prop: [string, unknown]) => parseProperty(prop))\n .join('');\n const valueWithZod = `${value.startsWith('.') ? 'zod' : ''}${value}`;\n if (Array.isArray(additionalPropertiesArgs.consts)) {\n appendConstsChunk(additionalPropertiesArgs.consts.join('\\n'));\n }\n return `zod.record(zod.string(), ${valueWithZod})`;\n }\n\n if (fn === 'object' || fn === 'strictObject' || fn === 'looseObject') {\n const objectArgs = args as Record<string, ZodValidationSchemaDefinition>;\n const objectType =\n fn === 'looseObject'\n ? isZodV4\n ? 'looseObject'\n : 'object'\n : getObjectFunctionName(isZodV4, strict);\n\n const parsedObject = `zod.${objectType}({\n${Object.entries(objectArgs)\n .map(([key, schema]) => {\n const value = schema.functions.map((prop) => parseProperty(prop)).join('');\n appendConstsChunk(schema.consts.join('\\n'));\n return ` \"${key}\": ${value.startsWith('.') ? 'zod' : ''}${value}`;\n })\n .join(',\\n')}\n})`;\n\n if (fn === 'looseObject' && !isZodV4) {\n return `${parsedObject}.passthrough()`;\n }\n\n return parsedObject;\n }\n\n if (fn === 'passthrough') {\n return '.passthrough()';\n }\n\n if (fn === 'array') {\n const arrayArgs = args as ZodValidationSchemaDefinition;\n const value = arrayArgs.functions\n .map((prop: [string, unknown]) => parseProperty(prop))\n .join('');\n if (isString(arrayArgs.consts)) {\n appendConstsChunk(arrayArgs.consts);\n } else if (Array.isArray(arrayArgs.consts)) {\n appendConstsChunk(arrayArgs.consts.join('\\n'));\n }\n return `.array(${value.startsWith('.') ? 'zod' : ''}${value})`;\n }\n\n if (fn === 'strict' && !isZodV4) {\n return '.strict()';\n }\n\n if (fn === 'tuple') {\n return `zod.tuple([${(args as ZodValidationSchemaDefinition[])\n .map((x) => {\n const value = x.functions.map((prop) => parseProperty(prop)).join('');\n return `${value.startsWith('.') ? 'zod' : ''}${value}`;\n })\n .join(',\\n')}])`;\n }\n if (fn === 'rest') {\n return `.rest(zod${(args as ZodValidationSchemaDefinition).functions\n .map((prop) => parseProperty(prop))\n .join('')})`;\n }\n const shouldCoerceType =\n coerceTypes &&\n (Array.isArray(coerceTypes)\n ? coerceTypes.includes(fn as ZodCoerceType)\n : COERCIBLE_TYPES.has(fn));\n\n if (\n (fn !== 'date' && shouldCoerceType) ||\n (fn === 'date' && shouldCoerceType && context.output.override.useDates)\n ) {\n return `.coerce.${fn}(${formatFunctionArgs(args)})`;\n }\n\n return `.${fn}(${formatFunctionArgs(args)})`;\n };\n\n appendConstsChunk(input.consts.join('\\n'));\n\n const schema = input.functions.map((prop) => parseProperty(prop)).join('');\n const value = preprocess\n ? `.preprocess(${preprocess.name}, ${\n schema.startsWith('.') ? 'zod' : ''\n }${schema})`\n : schema;\n\n const zod = `${value.startsWith('.') ? 'zod' : ''}${value}`;\n // Some export consts includes `,` as prefix, adding replace to remove those\n if (consts.includes(',export')) {\n consts = consts.replaceAll(',export', '\\nexport');\n }\n return { zod, consts, usedRefs };\n};\n\nconst dereferenceScalar = (value: unknown, context: ContextSpec): unknown => {\n if (isObject(value)) {\n return dereference(\n value as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n );\n } else if (Array.isArray(value)) {\n return value.map((item) => dereferenceScalar(item, context));\n } else {\n return value;\n }\n};\n\n/**\n * Attempts to resolve a `$ref` to its target schema. Returns `undefined`\n * instead of throwing when the ref cannot be found (e.g. external refs\n * not yet bundled). Logs a verbose warning on failure to aid debugging.\n */\nfunction tryResolveRefSchema(\n $ref: string,\n context: ContextSpec,\n): OpenApiSchemaObject | undefined {\n try {\n return resolveRef({ $ref } as OpenApiReferenceObject, context)\n .schema as OpenApiSchemaObject;\n } catch (error) {\n logVerbose(\n `[orval/zod] Failed to resolve $ref \"${$ref}\":`,\n error instanceof Error ? error.message : error,\n );\n return;\n }\n}\n\n/**\n * Recursively inlines all `$ref` references in an OpenAPI schema tree,\n * producing a fully-resolved schema suitable for Zod code generation.\n *\n * Tracks visited `$ref` paths via `context.parents` to break circular\n * references (returning `{}` for cycles).\n */\nexport const dereference = (\n schema: OpenApiSchemaObject | OpenApiReferenceObject,\n context: ContextSpec,\n): OpenApiSchemaObject => {\n const refName = '$ref' in schema ? schema.$ref : undefined;\n if (refName && context.parents?.includes(refName)) {\n return {};\n }\n\n const childContext: ContextSpec = {\n ...context,\n ...(refName\n ? { parents: [...(context.parents ?? []), refName] }\n : undefined),\n };\n\n const resolvedSchema: OpenApiSchemaObject | undefined =\n '$ref' in schema\n ? (() => {\n const referencedSchema = tryResolveRefSchema(schema.$ref, context);\n\n if (!referencedSchema || !isObject(referencedSchema)) {\n return;\n }\n\n const siblingProperties = Object.fromEntries(\n Object.entries(schema as Record<string, unknown>).filter(\n ([key]) => key !== '$ref',\n ),\n );\n\n return {\n ...(referencedSchema as Record<string, unknown>),\n ...siblingProperties,\n } as OpenApiSchemaObject;\n })()\n : schema;\n\n if (!resolvedSchema) {\n return {};\n }\n\n const resolvedContext = childContext;\n\n return Object.entries(resolvedSchema).reduce<Record<string, unknown>>(\n (acc, [key, value]) => {\n if (key === 'properties' && isObject(value)) {\n acc[key] = Object.entries(value).reduce<\n Record<string, OpenApiSchemaObject>\n >((props, [propKey, propSchema]) => {\n props[propKey] = dereference(\n propSchema as OpenApiSchemaObject | OpenApiReferenceObject,\n resolvedContext,\n );\n return props;\n }, {});\n } else if (key === 'default' || key === 'example' || key === 'examples') {\n acc[key] = value;\n } else {\n acc[key] = dereferenceScalar(value, resolvedContext);\n }\n\n return acc;\n },\n {},\n ) as OpenApiSchemaObject;\n};\n\n/**\n * Generate zod schema for form-data request body.\n * Handles file type detection for top-level properties based on encoding.contentType\n * and contentMediaType. Mirrors type gen's resolveFormDataRootObject.\n */\nexport const generateFormDataZodSchema = (\n schema: OpenApiSchemaObject,\n context: ContextSpec,\n name: string,\n strict: boolean,\n isZodV4: boolean,\n encoding?: Record<string, { contentType?: string }>,\n useReusableSchemas?: boolean,\n): ZodValidationSchemaDefinition => {\n // Precompute file type overrides for top-level properties only\n const propertyOverrides: Record<string, ZodValidationSchemaDefinition> = {};\n\n if (schema.properties) {\n for (const key of Object.keys(schema.properties)) {\n const propSchema = schema.properties[key];\n const resolvedPropSchema = propSchema\n ? dereference(\n propSchema as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n )\n : undefined;\n\n const fileType = resolvedPropSchema\n ? getFormDataFieldFileType(\n resolvedPropSchema,\n encoding?.[key]?.contentType,\n )\n : undefined;\n\n if (fileType) {\n const isRequired = schema.required?.includes(key);\n const fileFunctions: [string, unknown][] = [\n fileType === 'binary'\n ? ['instanceof', 'File']\n : ['fileOrString', undefined],\n ];\n if (!isRequired) {\n fileFunctions.push(['optional', undefined]);\n }\n propertyOverrides[key] = { functions: fileFunctions, consts: [] };\n }\n }\n }\n\n // Delegate to generic handler with file type overrides\n return generateZodValidationSchemaDefinition(\n schema,\n context,\n name,\n strict,\n isZodV4,\n {\n required: true,\n propertyOverrides:\n Object.keys(propertyOverrides).length > 0\n ? propertyOverrides\n : undefined,\n useReusableSchemas,\n },\n );\n};\n\nconst parseBodyAndResponse = ({\n data,\n context,\n name,\n strict,\n generate,\n isZodV4,\n parseType,\n useReusableSchemas,\n}: {\n data:\n | OpenApiResponseObject\n | OpenApiRequestBodyObject\n | OpenApiReferenceObject\n | undefined;\n context: ContextSpec;\n name: string;\n strict: boolean;\n generate: boolean;\n isZodV4: boolean;\n parseType: 'body' | 'response';\n useReusableSchemas?: boolean;\n}): {\n input: ZodValidationSchemaDefinition;\n isArray: boolean;\n rules?: {\n min?: number;\n max?: number;\n };\n} => {\n if (!data || !generate) {\n return {\n input: { functions: [], consts: [] },\n isArray: false,\n };\n }\n\n const resolvedRef = resolveRef(data, context).schema as\n | OpenApiResponseObject\n | OpenApiRequestBodyObject;\n\n // Only handle JSON and form-data; other content types (e.g., application/octet-stream)\n // Only handle JSON and form-data; other content types (e.g., application/octet-stream)\n // are skipped - unclear if this is correct behavior for root-level binary/text bodies.\n const contentEntries = Object.entries(resolvedRef.content ?? {});\n\n const jsonContent = contentEntries.find(\n isMediaType(\n // application/json\n // application/geo+json\n // application/ld+json\n // application/manifest+json\n // application/vnd.api+json (and other valid vendor subtypes)\n String.raw`^application\\/([^/;]+\\+)?json$`,\n ),\n );\n const formDataContent = contentEntries.find(\n isMediaType(String.raw`^multipart\\/form-data$`),\n );\n const [contentType, mediaType] = jsonContent\n ? (['application/json', jsonContent[1]] as const)\n : formDataContent\n ? (['multipart/form-data', formDataContent[1]] as const)\n : [undefined, undefined];\n\n const schema = mediaType?.schema;\n\n if (!schema) {\n return {\n input: { functions: [], consts: [] },\n isArray: false,\n };\n }\n const encoding = mediaType.encoding;\n\n const resolvedJsonSchema = dereference(schema, context);\n\n // keep the same behaviour for array\n if (resolvedJsonSchema.items) {\n const min =\n resolvedJsonSchema.minimum ??\n resolvedJsonSchema.minLength ??\n resolvedJsonSchema.minItems;\n const max =\n resolvedJsonSchema.maximum ??\n resolvedJsonSchema.maxLength ??\n resolvedJsonSchema.maxItems;\n\n // When useReusableSchemas is on, shallow-resolve one level so that $ref\n // references inside the items schema are preserved for named-ref emission.\n // E.g. Pets = array of {$ref: Pet} → we want to emit Pet (namedRef)\n // rather than inlining Pet's full schema.\n const rawItems: OpenApiSchemaObject | OpenApiReferenceObject =\n useReusableSchemas\n ? (() => {\n const shallowArraySchema = resolveRef(schema, context)\n .schema as OpenApiSchemaObject;\n return (shallowArraySchema.items ??\n resolvedJsonSchema.items) as OpenApiSchemaObject;\n })()\n : resolvedJsonSchema.items;\n\n return {\n input: generateZodValidationSchemaDefinition(\n parseType === 'body'\n ? removeReadOnlyProperties(rawItems as OpenApiSchemaObject)\n : (rawItems as OpenApiSchemaObject),\n context,\n name,\n strict,\n isZodV4,\n {\n required: true,\n useReusableSchemas,\n },\n ),\n isArray: true,\n rules: {\n ...(min === undefined ? {} : { min }),\n ...(max === undefined ? {} : { max }),\n },\n };\n }\n\n // When useReusableSchemas is on, pass the original schema (possibly a $ref)\n // directly to generateZodValidationSchemaDefinition so that component schema\n // references are emitted as named identifiers instead of being inlined.\n const effectiveSchema: OpenApiSchemaObject | OpenApiReferenceObject =\n useReusableSchemas\n ? parseType === 'body'\n ? removeReadOnlyProperties(schema as OpenApiSchemaObject)\n : schema\n : parseType === 'body'\n ? removeReadOnlyProperties(resolvedJsonSchema)\n : resolvedJsonSchema;\n\n const isFormData = contentType === 'multipart/form-data';\n\n return {\n input: isFormData\n ? generateFormDataZodSchema(\n effectiveSchema,\n context,\n name,\n strict,\n isZodV4,\n encoding,\n useReusableSchemas,\n )\n : generateZodValidationSchemaDefinition(\n effectiveSchema,\n context,\n name,\n strict,\n isZodV4,\n { required: true, useReusableSchemas },\n ),\n isArray: false,\n };\n};\n\nconst isMediaType =\n (pattern: string) =>\n ([contentType]: [string, object]): boolean =>\n new RegExp(pattern).test(contentType.split(';')[0].trim().toLowerCase());\n\nconst getSingleResponse = (\n responses:\n | Record<string, OpenApiResponseObject | OpenApiReferenceObject | undefined>\n | undefined,\n) => {\n if (!responses) {\n return;\n }\n\n return responses['200'] ?? responses['2XX'] ?? responses['2xx'];\n};\n\n/* eslint-enable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n\nexport const parseParameters = ({\n data,\n context,\n operationName,\n isZodV4,\n strict,\n generate,\n useReusableSchemas,\n}: {\n data: (OpenApiParameterObject | OpenApiReferenceObject)[] | undefined;\n context: ContextSpec;\n operationName: string;\n isZodV4: boolean;\n strict: {\n param: boolean;\n query: boolean;\n header: boolean;\n body: boolean;\n response: boolean;\n };\n generate: {\n param: boolean;\n query: boolean;\n header: boolean;\n body: boolean;\n response: boolean;\n };\n useReusableSchemas?: boolean;\n}): {\n headers: ZodValidationSchemaDefinition;\n queryParams: ZodValidationSchemaDefinition;\n params: ZodValidationSchemaDefinition;\n} => {\n if (!data) {\n return {\n headers: {\n functions: [],\n consts: [],\n },\n queryParams: {\n functions: [],\n consts: [],\n },\n params: {\n functions: [],\n consts: [],\n },\n };\n }\n\n const initialDefinitionsByParameters: Record<\n 'headers' | 'queryParams' | 'params',\n Record<string, { functions: [string, unknown][]; consts: string[] }>\n > = {\n headers: {},\n queryParams: {},\n params: {},\n };\n\n const defintionsByParameters = data.reduce((acc, val) => {\n const { schema: parameter }: { schema: OpenApiParameterObject } =\n resolveRef(val, context);\n\n if (!parameter.schema) {\n return acc;\n }\n if (!parameter.in || !parameter.name) {\n return acc;\n }\n\n // When useReusableSchemas is on, preserve `$ref` schemas verbatim so the\n // generator can take the namedRef path. We only shallow-clone to attach\n // the parameter-level `description` without mutating the shared ref object.\n // When off, fall back to dereferencing for backward compatibility.\n const schemaForGen: OpenApiSchemaObject | OpenApiReferenceObject =\n useReusableSchemas\n ? parameter.description\n ? Object.assign({}, parameter.schema, {\n description: parameter.description,\n })\n : parameter.schema\n : (() => {\n const s = dereference(parameter.schema, context);\n s.description = parameter.description;\n return s;\n })();\n\n const mapStrict = {\n path: strict.param,\n query: strict.query,\n header: strict.header,\n };\n\n const mapGenerate = {\n path: generate.param,\n query: generate.query,\n header: generate.header,\n };\n\n if (\n parameter.in !== 'path' &&\n parameter.in !== 'query' &&\n parameter.in !== 'header'\n ) {\n return acc;\n }\n\n const definition = generateZodValidationSchemaDefinition(\n schemaForGen,\n context,\n camel(`${operationName}-${parameter.in}-${parameter.name}`),\n mapStrict[parameter.in],\n isZodV4,\n {\n required: parameter.required,\n useReusableSchemas,\n },\n );\n\n if (parameter.in === 'header' && mapGenerate.header) {\n return {\n ...acc,\n headers: { ...acc.headers, [parameter.name]: definition },\n };\n }\n\n if (parameter.in === 'query' && mapGenerate.query) {\n return {\n ...acc,\n queryParams: { ...acc.queryParams, [parameter.name]: definition },\n };\n }\n\n if (parameter.in === 'path' && mapGenerate.path) {\n return {\n ...acc,\n params: { ...acc.params, [parameter.name]: definition },\n };\n }\n\n return acc;\n }, initialDefinitionsByParameters);\n\n const headers: ZodValidationSchemaDefinition = {\n functions: [],\n consts: [],\n };\n\n if (Object.keys(defintionsByParameters.headers).length > 0) {\n const parameterFunctions = getParameterFunctions(\n isZodV4,\n strict.header,\n defintionsByParameters.headers,\n );\n\n headers.functions.push(...parameterFunctions);\n }\n\n const queryParams: ZodValidationSchemaDefinition = {\n functions: [],\n consts: [],\n };\n\n if (Object.keys(defintionsByParameters.queryParams).length > 0) {\n const parameterFunctions = getParameterFunctions(\n isZodV4,\n strict.query,\n defintionsByParameters.queryParams,\n );\n\n queryParams.functions.push(...parameterFunctions);\n }\n\n const params: ZodValidationSchemaDefinition = {\n functions: [],\n consts: [],\n };\n\n if (Object.keys(defintionsByParameters.params).length > 0) {\n const parameterFunctions = getParameterFunctions(\n isZodV4,\n strict.param,\n defintionsByParameters.params,\n );\n\n params.functions.push(...parameterFunctions);\n }\n\n return {\n headers,\n queryParams,\n params,\n };\n};\n\nconst generateZodRoute = async (\n { operationName, verb, override }: GeneratorVerbOptions,\n { pathRoute, context, output }: GeneratorOptions,\n) => {\n const isZodV4 =\n !!context.output.packageJson && isZodVersionV4(context.output.packageJson);\n const useReusableSchemas =\n context.output.override.zod.generateReusableSchemas;\n const spec = context.spec.paths?.[pathRoute];\n\n if (spec == undefined) {\n throw new Error(`No such path ${pathRoute} in ${context.projectName}`);\n }\n\n const parameters = [\n ...(spec.parameters ?? []),\n ...(spec[verb]?.parameters ?? []),\n ];\n\n const parsedParameters = parseParameters({\n data: parameters,\n context,\n operationName,\n isZodV4,\n strict: override.zod.strict,\n generate: override.zod.generate,\n useReusableSchemas,\n });\n\n const requestBody = spec[verb]?.requestBody;\n const parsedBody = parseBodyAndResponse({\n data: requestBody,\n context,\n name: camel(`${operationName}-body`),\n strict: override.zod.strict.body,\n generate: override.zod.generate.body,\n isZodV4,\n parseType: 'body',\n useReusableSchemas,\n });\n\n const responses = (\n context.output.override.zod.generateEachHttpStatus\n ? Object.entries(spec[verb]?.responses ?? {})\n : [['', getSingleResponse(spec[verb]?.responses)]]\n ) as [string, OpenApiResponseObject | OpenApiReferenceObject][];\n const parsedResponses = responses.map(([code, response]) =>\n parseBodyAndResponse({\n data: response,\n context,\n name: camel(`${operationName}-${code}-response`),\n strict: override.zod.strict.response,\n generate: override.zod.generate.response,\n isZodV4,\n parseType: 'response',\n useReusableSchemas,\n }),\n );\n\n const preprocessParams = override.zod.preprocess?.param\n ? await generateMutator({\n output,\n mutator: override.zod.preprocess.response,\n name: `${operationName}PreprocessParams`,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n let inputParams = parseZodValidationSchemaDefinition(\n parsedParameters.params,\n context,\n override.zod.coerce.param,\n override.zod.strict.param,\n isZodV4,\n preprocessParams,\n );\n\n const preprocessQueryParams = override.zod.preprocess?.query\n ? await generateMutator({\n output,\n mutator: override.zod.preprocess.response,\n name: `${operationName}PreprocessQueryParams`,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n let inputQueryParams = parseZodValidationSchemaDefinition(\n parsedParameters.queryParams,\n context,\n override.zod.coerce.query,\n override.zod.strict.query,\n isZodV4,\n preprocessQueryParams,\n );\n\n const preprocessHeader = override.zod.preprocess?.header\n ? await generateMutator({\n output,\n mutator: override.zod.preprocess.response,\n name: `${operationName}PreprocessHeader`,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n let inputHeaders = parseZodValidationSchemaDefinition(\n parsedParameters.headers,\n context,\n override.zod.coerce.header,\n override.zod.strict.header,\n isZodV4,\n preprocessHeader,\n );\n\n const preprocessBody = override.zod.preprocess?.body\n ? await generateMutator({\n output,\n mutator: override.zod.preprocess.response,\n name: `${operationName}PreprocessBody`,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n let inputBody = parseZodValidationSchemaDefinition(\n parsedBody.input,\n context,\n override.zod.coerce.body,\n override.zod.strict.body,\n isZodV4,\n preprocessBody,\n );\n\n const preprocessResponse = override.zod.preprocess?.response\n ? await generateMutator({\n output,\n mutator: override.zod.preprocess.response,\n name: `${operationName}PreprocessResponse`,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n const inputResponses = parsedResponses.map((parsedResponse) =>\n parseZodValidationSchemaDefinition(\n parsedResponse.input,\n context,\n override.zod.coerce.response,\n override.zod.strict.response,\n isZodV4,\n preprocessResponse,\n ),\n );\n\n const SENTINEL_PATTERN = /__REF_([A-Za-z_$][A-Za-z0-9_$]*)__/g;\n const rewriteSentinels = (s: string): string =>\n s.replaceAll(SENTINEL_PATTERN, (_m, name: string) => name);\n\n const allUsedRefs = new Set<string>([\n ...inputParams.usedRefs,\n ...inputQueryParams.usedRefs,\n ...inputHeaders.usedRefs,\n ...inputBody.usedRefs,\n ...inputResponses.flatMap((r) => [...r.usedRefs]),\n ]);\n\n if (useReusableSchemas && allUsedRefs.size > 0) {\n inputParams = { ...inputParams, zod: rewriteSentinels(inputParams.zod) };\n inputQueryParams = {\n ...inputQueryParams,\n zod: rewriteSentinels(inputQueryParams.zod),\n };\n inputHeaders = {\n ...inputHeaders,\n zod: rewriteSentinels(inputHeaders.zod),\n };\n inputBody = { ...inputBody, zod: rewriteSentinels(inputBody.zod) };\n for (let i = 0; i < inputResponses.length; i++) {\n inputResponses[i] = {\n ...inputResponses[i],\n zod: rewriteSentinels(inputResponses[i].zod),\n };\n }\n }\n\n if (\n !inputParams.zod &&\n !inputQueryParams.zod &&\n !inputHeaders.zod &&\n !inputBody.zod &&\n !inputResponses.some((inputResponse) => inputResponse.zod)\n ) {\n return {\n implementation: '',\n mutators: [],\n usedRefs: new Set<string>(),\n };\n }\n\n const pascalOperationName = pascal(operationName);\n\n const useBrandedTypes = override.zod.useBrandedTypes;\n const brand = (name: string) =>\n useBrandedTypes\n ? isZodV4\n ? `.brand(\"${name}\")`\n : `.brand<\"${name}\">()`\n : '';\n\n return {\n implementation: [\n ...(inputParams.consts ? [inputParams.consts] : []),\n ...(inputParams.zod\n ? [\n `export const ${pascalOperationName}Params = ${inputParams.zod}${brand(`${pascalOperationName}Params`)}`,\n ]\n : []),\n ...(inputQueryParams.consts ? [inputQueryParams.consts] : []),\n ...(inputQueryParams.zod\n ? [\n `export const ${pascalOperationName}QueryParams = ${inputQueryParams.zod}${brand(`${pascalOperationName}QueryParams`)}`,\n ]\n : []),\n ...(inputHeaders.consts ? [inputHeaders.consts] : []),\n ...(inputHeaders.zod\n ? [\n `export const ${pascalOperationName}Header = ${inputHeaders.zod}${brand(`${pascalOperationName}Header`)}`,\n ]\n : []),\n ...(inputBody.consts ? [inputBody.consts] : []),\n ...(inputBody.zod\n ? [\n parsedBody.isArray\n ? `export const ${pascalOperationName}BodyItem = ${inputBody.zod}\nexport const ${pascalOperationName}Body = zod.array(${pascalOperationName}BodyItem)${\n parsedBody.rules?.min ? `.min(${parsedBody.rules.min})` : ''\n }${\n parsedBody.rules?.max ? `.max(${parsedBody.rules.max})` : ''\n }${brand(`${pascalOperationName}Body`)}`\n : `export const ${pascalOperationName}Body = ${inputBody.zod}${brand(`${pascalOperationName}Body`)}`,\n ]\n : []),\n ...inputResponses.flatMap((inputResponse, index) => {\n const operationResponse = pascal(\n `${operationName}-${responses[index][0]}-response`,\n );\n return [\n ...(inputResponse.consts ? [inputResponse.consts] : []),\n ...(inputResponse.zod\n ? [\n parsedResponses[index].isArray\n ? `export const ${operationResponse}Item = ${\n inputResponse.zod\n }\nexport const ${operationResponse} = zod.array(${operationResponse}Item)${\n parsedResponses[index].rules?.min\n ? `.min(${parsedResponses[index].rules.min})`\n : ''\n }${\n parsedResponses[index].rules?.max\n ? `.max(${parsedResponses[index].rules.max})`\n : ''\n }${brand(operationResponse)}`\n : `export const ${operationResponse} = ${inputResponse.zod}${brand(operationResponse)}`,\n ]\n : []),\n ];\n }),\n ].join('\\n\\n'),\n mutators: preprocessResponse ? [preprocessResponse] : [],\n usedRefs: useReusableSchemas ? allUsedRefs : new Set<string>(),\n };\n};\n\nexport const generateZod: ClientBuilder = async (verbOptions, options) => {\n const { implementation, mutators, usedRefs } = await generateZodRoute(\n verbOptions,\n options,\n );\n\n return {\n implementation: implementation ? `${implementation}\\n\\n` : '',\n // Zod schemas are runtime values (not type-only), so mark with values: true\n // to prevent the import writer from emitting `import type { ... }`. Sort\n // by name so import order is stable across runs.\n imports: [...usedRefs].toSorted().map((name) => ({\n name,\n schemaName: name,\n values: true,\n })),\n mutators,\n };\n};\n\nconst zodClientBuilder: ClientGeneratorsBuilder = {\n client: generateZod,\n dependencies: getZodDependencies,\n};\n\nexport const builder = () => () => zodClientBuilder;\n\nexport { isZodVersionV4 } from './compatible-v4';\n\nexport default builder;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/compatible-v4.ts","../src/index.ts"],"sourcesContent":["import { compareVersions, type PackageJson } from '@orval/core';\n\nconst getZodPackageVersion = (packageJson: PackageJson) => {\n return (\n packageJson.resolvedVersions?.zod ??\n packageJson.dependencies?.zod ??\n packageJson.devDependencies?.zod ??\n packageJson.peerDependencies?.zod\n );\n};\n\nexport const isZodVersionV4 = (packageJson: PackageJson) => {\n const version = getZodPackageVersion(packageJson);\n\n if (!version) {\n return false;\n }\n\n const withoutRc = version.split('-')[0];\n\n return compareVersions(withoutRc, '4.0.0');\n};\n\nexport const getZodDateFormat = (isZodV4: boolean) => {\n return isZodV4 ? 'iso.date' : 'date';\n};\n\nexport const getZodTimeFormat = (isZodV4: boolean) => {\n return isZodV4 ? 'iso.time' : 'time';\n};\n\nexport const getZodDateTimeFormat = (isZodV4: boolean) => {\n return isZodV4 ? 'iso.datetime' : 'datetime';\n};\n\ntype ParameterDefinitions = Record<string, unknown>;\ntype ParameterFunction = [string, ParameterDefinitions | undefined];\nexport const getParameterFunctions = (\n isZodV4: boolean,\n strict: boolean,\n parameters: ParameterDefinitions,\n): ParameterFunction[] => {\n if (isZodV4 && strict) {\n return [['strictObject', parameters]];\n } else {\n return strict\n ? [\n ['object', parameters],\n ['strict', undefined],\n ]\n : [['object', parameters]];\n }\n};\n\nexport const getObjectFunctionName = (isZodV4: boolean, strict: boolean) => {\n return isZodV4 && strict ? 'strictObject' : 'object';\n};\n\n/**\n * Returns the object constructor to use for open/generic objects.\n *\n * - Zod v4 supports `zod.looseObject({...})` directly.\n * - Zod v3 falls back to `zod.object({...})` and is finalized with\n * `.passthrough()` during parsing.\n */\nexport const getLooseObjectFunctionName = (isZodV4: boolean) => {\n return isZodV4 ? 'looseObject' : 'object';\n};\n","/* eslint-disable unicorn/no-array-reduce */\n\nimport {\n buildDynamicScope,\n camel,\n type ClientBuilder,\n type ClientGeneratorsBuilder,\n type ContextSpec,\n escape,\n generateMutator,\n type GeneratorDependency,\n type GeneratorMutator,\n type GeneratorOptions,\n type GeneratorVerbOptions,\n getDynamicAnchorName,\n getFormDataFieldFileType,\n getNumberWord,\n getRefInfo,\n isBoolean,\n isDynamicReference,\n isNumber,\n isObject,\n isString,\n jsStringEscape,\n logVerbose,\n type OpenApiParameterObject,\n type OpenApiReferenceObject,\n type OpenApiRequestBodyObject,\n type OpenApiResponseObject,\n type OpenApiSchemaObject,\n pascal,\n resolveDynamicRef,\n resolveRef,\n stringify,\n type ZodCoerceType,\n} from '@orval/core';\nimport { unique } from 'remeda';\n\nimport {\n getLooseObjectFunctionName,\n getObjectFunctionName,\n getParameterFunctions,\n getZodDateFormat,\n getZodDateTimeFormat,\n getZodTimeFormat,\n isZodVersionV4,\n} from './compatible-v4';\n\nconst ZOD_DEPENDENCIES: GeneratorDependency[] = [\n {\n exports: [\n {\n default: false,\n name: 'zod',\n syntheticDefaultImport: false,\n namespaceImport: true,\n values: true,\n },\n ],\n dependency: 'zod',\n },\n];\n\nexport const getZodDependencies = () => ZOD_DEPENDENCIES;\n\n/**\n * values that may appear in \"type\". Equals SchemaObjectType\n */\nconst possibleSchemaTypes = new Set([\n 'integer',\n 'number',\n 'string',\n 'boolean',\n 'object',\n 'strictObject',\n 'null',\n 'array',\n]);\n\nexport const predefinedZodFormats = new Set([\n 'date',\n 'time',\n 'date-time',\n 'email',\n 'uri',\n 'hostname',\n 'uuid',\n]);\n\ntype ResolvedZodType =\n | string\n | {\n multiType: string[];\n };\n\nconst resolveZodType = (schema: OpenApiSchemaObject): ResolvedZodType => {\n const schemaTypeValue = schema.type as unknown;\n\n // Handle array of types (OpenAPI 3.1+)\n if (Array.isArray(schemaTypeValue)) {\n // Filter out 'null' type as it's handled separately via nullable\n const nonNullTypes = schemaTypeValue\n .filter((t): t is string => isString(t))\n .filter((t) => t !== 'null' && possibleSchemaTypes.has(t))\n .map((t) => (t === 'integer' ? 'number' : t));\n\n // If multiple types, return a special marker for union handling\n if (nonNullTypes.length > 1) {\n return { multiType: nonNullTypes };\n }\n\n // Single type\n const type = nonNullTypes[0];\n\n // Handle prefixItems for tuples\n if (type === 'array' && 'prefixItems' in schema) {\n return 'tuple';\n }\n\n return type;\n }\n\n // Handle single type value\n const type = isString(schemaTypeValue) ? schemaTypeValue : undefined;\n\n // TODO: if \"prefixItems\" exists and type is \"array\", then generate a \"tuple\"\n if (schema.type === 'array' && 'prefixItems' in schema) {\n return 'tuple';\n }\n\n switch (type) {\n case 'integer': {\n return 'number';\n }\n default: {\n return type ?? 'unknown';\n }\n }\n};\n\n// https://github.com/colinhacks/zod#coercion-for-primitives\nconst COERCIBLE_TYPES = new Set([\n 'string',\n 'number',\n 'boolean',\n 'bigint',\n 'date',\n]);\n\nexport interface ZodValidationSchemaDefinition {\n functions: [string, unknown][];\n consts: string[];\n}\n\nconst minAndMaxTypes = new Set(['number', 'string', 'array']);\n\nconst removeReadOnlyProperties = (\n schema: OpenApiSchemaObject,\n): OpenApiSchemaObject => {\n if (schema.properties && isObject(schema.properties)) {\n const filteredProperties: Record<string, OpenApiSchemaObject> = {};\n\n for (const [key, value] of Object.entries(schema.properties)) {\n if (isObject(value) && 'readOnly' in value && value.readOnly) {\n continue;\n }\n filteredProperties[key] = value as OpenApiSchemaObject;\n }\n\n return {\n ...(schema as Record<string, unknown>),\n properties: filteredProperties,\n };\n }\n if (schema.items && isObject(schema.items) && 'properties' in schema.items) {\n return {\n ...(schema as Record<string, unknown>),\n items: removeReadOnlyProperties(schema.items as OpenApiSchemaObject),\n };\n }\n return schema;\n};\n\ninterface DateTimeOptions {\n offset?: boolean;\n local?: boolean;\n precision?: number;\n}\n\ninterface TimeOptions {\n precision?: -1 | 0 | 1 | 2 | 3;\n}\n\n/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n\nconst COMPONENT_SCHEMAS_REF_PATTERN = /^#\\/components\\/schemas\\/[^/]+$/;\n\nconst isComponentSchemaRef = (ref: string): boolean =>\n COMPONENT_SCHEMAS_REF_PATTERN.test(ref);\n\nexport const generateZodValidationSchemaDefinition = (\n schema: OpenApiSchemaObject | OpenApiReferenceObject | undefined,\n context: ContextSpec,\n name: string,\n strict: boolean,\n isZodV4: boolean,\n rules?: {\n required?: boolean;\n /**\n * Required keys inherited from sibling `allOf` members. Per JSON Schema /\n * OpenAPI 3.1, a `required` array in one `allOf` member applies to\n * properties contributed by ANY member, so it is collected at the `allOf`\n * level and applied here. Consumed at THIS object level only — never\n * forwarded into nested property schemas, so a deeper object sharing a key\n * name is unaffected. (#3171)\n */\n additionalRequired?: string[];\n dateTimeOptions?: DateTimeOptions;\n timeOptions?: TimeOptions;\n /**\n * Override schemas for properties at THIS level only.\n * Not passed to nested schemas. Used by form-data for file type handling.\n */\n propertyOverrides?: Record<string, ZodValidationSchemaDefinition>;\n /**\n * Internal registry to keep generated const names unique within a single\n * schema generation tree without leaking suffixes across unrelated top-level\n * schemas.\n */\n constNameRegistry?: Record<string, number>;\n /**\n * When true, plain `$ref`s into `#/components/schemas/*` emit a `namedRef`\n * placeholder instead of being inlined.\n */\n useReusableSchemas?: boolean;\n /**\n * When true (and `isZodV4`), the top-level (named component) schema emits a\n * `.meta({ id, description?, deprecated? })` instead of `.describe(...)`.\n * Set ONLY for top-level component-schema generation — recursive calls omit\n * it, so nested schemas keep `.describe()` and never get a duplicate `id`.\n */\n emitMeta?: boolean;\n },\n): ZodValidationSchemaDefinition => {\n if (!schema) return { functions: [], consts: [] };\n\n const CHAINABLE_SIBLINGS = new Set(['nullable', 'default', 'description']);\n const isChainable = (k: string) => CHAINABLE_SIBLINGS.has(k);\n\n const applyChainableSiblings = (\n functions: [string, unknown][],\n consts: string[],\n siblingSchema: OpenApiSchemaObject & {\n nullable?: boolean;\n default?: unknown;\n description?: string;\n },\n ): void => {\n const refRequired = rules?.required ?? false;\n const refHasDefault = siblingSchema.default !== undefined;\n\n if (!refRequired && siblingSchema.nullable) {\n functions.push(['nullish', undefined]);\n } else if (siblingSchema.nullable) {\n functions.push(['nullable', undefined]);\n } else if (!refRequired && !refHasDefault) {\n functions.push(['optional', undefined]);\n }\n\n if (refHasDefault) {\n const registry = rules?.constNameRegistry ?? {};\n const counter = isNumber(registry[name]) ? registry[name] + 1 : 0;\n registry[name] = counter;\n const suffix = counter ? pascal(getNumberWord(counter)) : '';\n const defaultVarName = `${name}Default${suffix}`;\n const defaultLiteral = stringify(siblingSchema.default);\n if (defaultLiteral !== undefined) {\n consts.push(`export const ${defaultVarName} = ${defaultLiteral};`);\n functions.push(['default', defaultVarName]);\n }\n }\n\n if (typeof siblingSchema.description === 'string') {\n functions.push(['describe', `\"${escape(siblingSchema.description)}\"`]);\n }\n };\n\n // Ref-aware path: emit a placeholder that the orchestrator will rewrite into\n // either a direct identifier or `z.lazy(() => Name)`.\n if (\n rules?.useReusableSchemas &&\n '$ref' in schema &&\n typeof schema.$ref === 'string' &&\n isComponentSchemaRef(schema.$ref)\n ) {\n const siblings = Object.keys(schema).filter((k) => k !== '$ref');\n const allSiblingsChainable = siblings.every((k) => isChainable(k));\n\n if (allSiblingsChainable) {\n const refName = getRefInfo(schema.$ref, context).name;\n const functions: [string, unknown][] = [\n ['namedRef', { name: refName, sourceRef: schema.$ref }],\n ];\n const consts: string[] = [];\n\n applyChainableSiblings(\n functions,\n consts,\n schema as OpenApiSchemaObject & {\n $ref: string;\n nullable?: boolean;\n default?: unknown;\n description?: string;\n },\n );\n\n return { functions, consts };\n }\n\n logVerbose(\n `[orval/zod] $ref ${schema.$ref} has non-chainable siblings ` +\n `[${siblings.filter((s) => !isChainable(s)).join(', ')}]; falling back to inlining.`,\n );\n schema = dereference(\n schema as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n );\n }\n\n // Dynamic-ref-aware path: when useReusableSchemas is true, resolve the\n // anchor and emit a namedRef sentinel if the target is a concrete component\n // schema. The SCC pipeline then decides direct vs zod.lazy().\n if (rules?.useReusableSchemas && isDynamicReference(schema)) {\n const anchorName = getDynamicAnchorName(schema.$dynamicRef);\n if (anchorName) {\n const { resolvedTypeName, schemaName } = resolveDynamicRef(\n anchorName,\n context,\n );\n\n if (resolvedTypeName !== 'unknown' && schemaName) {\n const siblings = Object.keys(schema).filter((k) => k !== '$dynamicRef');\n const allSiblingsChainable = siblings.every((k) => isChainable(k));\n\n if (allSiblingsChainable) {\n const sourceRef = `${COMPONENT_SCHEMAS_PREFIX}${encodeSegment(schemaName)}`;\n const functions: [string, unknown][] = [\n ['namedRef', { name: resolvedTypeName, sourceRef }],\n ];\n const consts: string[] = [];\n\n applyChainableSiblings(\n functions,\n consts,\n schema as OpenApiSchemaObject & {\n $dynamicRef: string;\n nullable?: boolean;\n default?: unknown;\n description?: string;\n },\n );\n\n return { functions, consts };\n }\n\n logVerbose(\n `[orval/zod] $dynamicRef ${schema.$dynamicRef} has non-chainable siblings ` +\n `[${siblings.filter((s) => !isChainable(s)).join(', ')}]; falling back to inlining.`,\n );\n }\n }\n\n // Not emitted as namedRef (non-chainable siblings, unresolvable anchor,\n // or external ref) — dereference now so the main body sees a resolved\n // schema with a proper type instead of the raw $dynamicRef (which\n // resolveZodType classifies as 'unknown').\n schema = dereference(\n schema as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n );\n }\n\n const useReusableSchemas = rules?.useReusableSchemas ?? false;\n const consts: string[] = [];\n const constNameRegistry = rules?.constNameRegistry ?? {};\n const constsCounter = isNumber(constNameRegistry[name])\n ? constNameRegistry[name] + 1\n : 0;\n\n const constsCounterValue = constsCounter\n ? pascal(getNumberWord(constsCounter))\n : '';\n\n constNameRegistry[name] = constsCounter;\n\n const functions: [string, unknown][] = [];\n\n // Emit the schema's trailing description/metadata. On zod v4 with `emitMeta`\n // (top-level component schemas only) this is a single `.meta({ id, ... })`\n // carrying the schema name as `id` plus description/deprecated when present;\n // otherwise it falls back to the plain `.describe(...)`. Called from both\n // return points (the multi-type union exit and the main exit) so every schema\n // shape is covered. `.meta()` must be the LAST modifier in the chain — zod v4\n // turns `.meta({id}).describe(...)` into a `$ref` wrapper, whereas\n // `.describe(...).meta({id})` (and a lone `.meta`) stay flat.\n const pushDescriptionOrMeta = () => {\n // Empty-string descriptions are treated as absent — preserves the prior\n // `if (schema.description)` falsy-check semantics (which skipped both `''`\n // and `undefined`), so this change never emits a no-op `.describe('')` or\n // `description: ''` in meta.\n const description =\n typeof schema.description === 'string' && schema.description.length > 0\n ? schema.description\n : undefined;\n const deprecated =\n 'deprecated' in schema && schema.deprecated === true ? true : undefined;\n\n if (rules?.emitMeta && isZodV4) {\n const meta: Record<string, unknown> = { id: name };\n if (description !== undefined) meta.description = description;\n if (deprecated) meta.deprecated = true;\n functions.push(['meta', meta]);\n } else if (description !== undefined) {\n functions.push(['describe', `'${jsStringEscape(description)}'`]);\n }\n };\n\n const type = resolveZodType(schema);\n const required = rules?.required ?? false;\n const hasDefault = schema.default !== undefined;\n const nullable =\n // changing to ?? here changes behavior - so don't\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n ('nullable' in schema && schema.nullable) ||\n (Array.isArray(schema.type) && schema.type.includes('null'));\n const min = schema.minimum ?? schema.minLength ?? schema.minItems;\n const max = schema.maximum ?? schema.maxLength ?? schema.maxItems;\n\n // Handle exclusiveMinimum and exclusiveMaximum (OpenAPI 3.0 vs 3.1 compatibility)\n // OpenAPI 3.0: exclusiveMinimum/exclusiveMaximum are booleans indicating if minimum/maximum is exclusive\n // OpenAPI 3.1: exclusiveMinimum/exclusiveMaximum are numbers (the value itself)\n const exclusiveMinRaw =\n 'exclusiveMinimum' in schema ? schema.exclusiveMinimum : undefined;\n const exclusiveMaxRaw =\n 'exclusiveMaximum' in schema ? schema.exclusiveMaximum : undefined;\n\n // Convert boolean to number if using OpenAPI 3.0 format\n const exclusiveMin =\n isBoolean(exclusiveMinRaw) && exclusiveMinRaw ? min : exclusiveMinRaw;\n const exclusiveMax =\n isBoolean(exclusiveMaxRaw) && exclusiveMaxRaw ? max : exclusiveMaxRaw;\n\n const multipleOf = schema.multipleOf;\n const matches = schema.pattern ?? undefined;\n // Enum-based schemas are emitted as `zod.enum(...)` or literal unions, so\n // chaining scalar constraints onto the parent schema would generate invalid\n // Zod output. Arrays are handled separately via their item schema.\n const hasNonArrayEnum = !!schema.enum && type !== 'array';\n\n // Check for allOf/oneOf/anyOf BEFORE processing by type\n // This ensures these constraints work with any base type (string, number, object, etc.)\n let skipSwitchStatement = false;\n if (schema.allOf || schema.oneOf || schema.anyOf) {\n const separator = schema.allOf ? 'allOf' : schema.oneOf ? 'oneOf' : 'anyOf';\n\n const schemas = (schema.allOf ?? schema.oneOf ?? schema.anyOf) as (\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n )[];\n\n // In JSON Schema / OpenAPI 3.1 a `required` array in any `allOf` member\n // (and on the composing schema itself) applies to properties contributed by\n // any member. Collect them all so each member's own properties can be marked\n // required even when the `required` lives in a sibling member — e.g. props\n // in a `$ref` base + `required` in a constraint-only sibling. Only valid for\n // `allOf` (a conjunction); `oneOf`/`anyOf` are alternatives. (#3171)\n const allOfRequired = schema.allOf\n ? [\n ...new Set([\n ...(schema.required ?? []),\n ...schemas.flatMap((member) => {\n // Only the member's top-level `required` is needed. For `$ref`\n // members resolve shallowly (no deep property dereference) and\n // tolerate unresolvable refs — they simply contribute no keys.\n const resolved =\n '$ref' in member && typeof member.$ref === 'string'\n ? tryResolveRefSchema(member.$ref, context)\n : (member as OpenApiSchemaObject);\n const memberRequired = resolved?.required;\n return Array.isArray(memberRequired)\n ? (memberRequired as string[])\n : [];\n }),\n ]),\n ]\n : undefined;\n\n // Use index-based naming to ensure uniqueness when processing multiple schemas\n // This prevents duplicate schema names when nullable refs are used\n const baseSchemas = schemas.map((schema, index) =>\n generateZodValidationSchemaDefinition(\n schema as OpenApiSchemaObject,\n context,\n `${camel(name)}${pascal(getNumberWord(index + 1))}`,\n strict,\n isZodV4,\n {\n required: true,\n additionalRequired: allOfRequired,\n constNameRegistry,\n useReusableSchemas,\n },\n ),\n );\n\n // Handle allOf/oneOf/anyOf with additional properties - merge additional properties into the schema\n if ((schema.allOf || schema.oneOf || schema.anyOf) && schema.properties) {\n const additionalPropertiesSchema = {\n properties: schema.properties,\n required: schema.required,\n additionalProperties: schema.additionalProperties,\n type: schema.type,\n } as OpenApiSchemaObject;\n\n // Use index-based naming to ensure uniqueness\n const additionalIndex = baseSchemas.length + 1;\n const additionalPropertiesDefinition =\n generateZodValidationSchemaDefinition(\n additionalPropertiesSchema,\n context,\n `${camel(name)}${pascal(getNumberWord(additionalIndex))}`,\n strict,\n isZodV4,\n {\n required: true,\n additionalRequired: allOfRequired,\n constNameRegistry,\n useReusableSchemas,\n },\n );\n\n // For oneOf/anyOf, use allOf to combine union with common properties\n // This generates: zod.union([...]).and(commonProperties)\n if (schema.oneOf || schema.anyOf) {\n functions.push([\n 'allOf',\n [\n { functions: [[separator, baseSchemas]], consts: [] },\n additionalPropertiesDefinition,\n ],\n ]);\n } else {\n // For allOf, just add to the list\n baseSchemas.push(additionalPropertiesDefinition);\n functions.push([separator, baseSchemas]);\n }\n } else {\n functions.push([separator, baseSchemas]);\n }\n skipSwitchStatement = true;\n }\n\n let defaultVarName: string | undefined;\n if (schema.default !== undefined) {\n defaultVarName = `${name}Default${constsCounterValue}`;\n let defaultValue: string | undefined;\n\n const isDateType =\n schema.type === 'string' &&\n (schema.format === 'date' || schema.format === 'date-time') &&\n context.output.override.useDates;\n\n if (isDateType) {\n // OpenApiSchemaObject defines default as 'any'\n defaultValue = `new Date(\"${escape(schema.default)}\")`;\n } else if (isObject(schema.default)) {\n // Narrow string literals individually with `as const` so `zod.enum([...])`\n // properties accept the emitted default (#3244). Whole-object/array\n // `as const` would make nested arrays `readonly`, which zod v4's\n // `.default()` rejects against its mutable parameter type (#3399).\n const entries = Object.entries(schema.default)\n .map(([key, value]) => {\n if (isString(value)) {\n return `${key}: \"${escape(value)}\" as const`;\n }\n\n if (Array.isArray(value)) {\n const arrayItems = value.map((item) =>\n isString(item) ? `\"${escape(item)}\" as const` : `${item}`,\n );\n return `${key}: [${arrayItems.join(', ')}]`;\n }\n\n if (\n value === null ||\n value === undefined ||\n isNumber(value) ||\n isBoolean(value)\n )\n return `${key}: ${value}`;\n })\n .join(', ');\n defaultValue = entries.length === 0 ? `{}` : `{ ${entries} }`;\n } else {\n // OpenApiSchemaObject defines default as 'any'\n const rawStringified = stringify(schema.default);\n defaultValue =\n rawStringified === undefined\n ? 'null'\n : rawStringified.replaceAll(\"'\", '`');\n\n // If the schema is an array with enum items, inject inplace to avoid issues with default values\n const isArrayWithEnumItems =\n Array.isArray(schema.default) &&\n type === 'array' &&\n schema.items &&\n 'enum' in schema.items &&\n schema.default.length > 0;\n\n if (isArrayWithEnumItems) {\n defaultVarName = defaultValue;\n defaultValue = undefined;\n }\n }\n if (defaultValue) {\n consts.push(`export const ${defaultVarName} = ${defaultValue};`);\n }\n }\n\n // Handle multi-type schemas (OpenAPI 3.1+ type arrays)\n if (isObject(type) && 'multiType' in type) {\n const types = type.multiType;\n functions.push([\n 'oneOf',\n types.map((t) =>\n generateZodValidationSchemaDefinition(\n {\n ...(schema as Record<string, unknown>),\n type: t,\n } as OpenApiSchemaObject,\n context,\n name,\n strict,\n isZodV4,\n {\n required: true,\n constNameRegistry,\n useReusableSchemas,\n },\n ),\n ),\n ]);\n\n if (!required && nullable) {\n functions.push(['nullish', undefined]);\n } else if (nullable) {\n functions.push(['nullable', undefined]);\n } else if (!required) {\n functions.push(['optional', undefined]);\n }\n\n pushDescriptionOrMeta();\n\n return { functions, consts };\n }\n\n if (!skipSwitchStatement) {\n switch (type) {\n case 'tuple': {\n /**\n *\n * > 10.3.1.1. prefixItems\n * > The value of \"prefixItems\" MUST be a non-empty array of valid JSON Schemas.\n * >\n * > Validation succeeds if each element of the instance validates against the schema at the same position, if any.\n * > This keyword does not constrain the length of the array. If the array is longer than this keyword's value,\n * > this keyword validates only the prefix of matching length.\n * >\n * > This keyword produces an annotation value which is the largest index to which this keyword applied a subschema.\n * > The value MAY be a boolean true if a subschema was applied to every index of the instance, such as is produced by the \"items\" keyword.\n * > This annotation affects the behavior of \"items\" and \"unevaluatedItems\".\n * >\n * > Omitting this keyword has the same assertion behavior as an empty array.\n */\n if ('prefixItems' in schema) {\n const schema31 = schema as OpenApiSchemaObject;\n const prefixItems = Array.isArray(schema31.prefixItems)\n ? (schema31.prefixItems as (\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n )[])\n : [];\n\n if (prefixItems.length > 0) {\n functions.push([\n 'tuple',\n prefixItems.map((item, idx) =>\n generateZodValidationSchemaDefinition(\n dereference(item, context),\n context,\n camel(`${name}-${idx}-item`),\n isZodV4,\n strict,\n {\n required: true,\n constNameRegistry,\n useReusableSchemas,\n },\n ),\n ),\n ]);\n\n if (\n schema.items &&\n (max ?? Number.POSITIVE_INFINITY) > prefixItems.length\n ) {\n // only add zod.rest() if number of tuple elements can exceed provided prefixItems:\n functions.push([\n 'rest',\n generateZodValidationSchemaDefinition(\n schema.items as OpenApiSchemaObject | undefined,\n context,\n camel(`${name}-item`),\n strict,\n isZodV4,\n {\n required: true,\n constNameRegistry,\n useReusableSchemas,\n },\n ),\n ]);\n }\n }\n }\n break;\n }\n case 'array': {\n functions.push([\n 'array',\n generateZodValidationSchemaDefinition(\n schema.items as OpenApiSchemaObject | undefined,\n context,\n camel(`${name}-item`),\n strict,\n isZodV4,\n {\n required: true,\n constNameRegistry,\n useReusableSchemas,\n },\n ),\n ]);\n break;\n }\n case 'string': {\n if (schema.enum) {\n break;\n }\n\n if (\n context.output.override.useDates &&\n (schema.format === 'date' || schema.format === 'date-time')\n ) {\n functions.push(['date', undefined]);\n break;\n }\n\n if (schema.format === 'binary') {\n functions.push(['instanceof', 'File']);\n break;\n }\n\n // The @scalar/openapi-parser upgrader converts format: binary to\n // contentMediaType: application/octet-stream when upgrading\n // Swagger 2.0 / OAS 3.0 → OAS 3.1. Treat it the same as\n // format: binary so $ref-based model types generate File validation.\n if (\n schema.contentMediaType === 'application/octet-stream' &&\n !schema.contentEncoding\n ) {\n functions.push(['instanceof', 'File']);\n break;\n }\n\n if (isZodV4) {\n if (!predefinedZodFormats.has(schema.format ?? '')) {\n if ('const' in schema) {\n functions.push(['literal', `\"${schema.const}\"`]);\n } else if (schema.pattern && schema.format) {\n const isStartWithSlash = schema.pattern.startsWith('/');\n const isEndWithSlash = schema.pattern.endsWith('/');\n const regexp = `new RegExp('${jsStringEscape(\n schema.pattern.slice(\n isStartWithSlash ? 1 : 0,\n isEndWithSlash ? -1 : undefined,\n ),\n )}')`;\n consts.push(\n `export const ${name}RegExp${constsCounterValue} = ${regexp};\\n`,\n );\n functions.push([\n 'stringFormat',\n [\n `'${escape(schema.format)}'`,\n `${name}RegExp${constsCounterValue}`,\n ],\n ]);\n } else {\n functions.push([type as string, undefined]);\n }\n break;\n }\n } else {\n if ('const' in schema) {\n functions.push(['literal', `\"${schema.const}\"`]);\n } else {\n functions.push([type as string, undefined]);\n }\n }\n\n if (schema.format === 'date') {\n const formatAPI = getZodDateFormat(isZodV4);\n\n functions.push([formatAPI, undefined]);\n break;\n }\n\n if (schema.format === 'time') {\n const options = context.output.override.zod.timeOptions;\n const formatAPI = getZodTimeFormat(isZodV4);\n\n functions.push([formatAPI, JSON.stringify(options)]);\n break;\n }\n\n if (schema.format === 'date-time') {\n const options = context.output.override.zod.dateTimeOptions;\n const formatAPI = getZodDateTimeFormat(isZodV4);\n\n functions.push([formatAPI, JSON.stringify(options)]);\n break;\n }\n\n if (schema.format === 'email') {\n functions.push(['email', undefined]);\n break;\n }\n\n if (schema.format === 'uri') {\n functions.push(['url', undefined]);\n break;\n }\n\n if (schema.format === 'hostname') {\n if (isZodV4) {\n functions.push(['hostname', undefined]);\n } else {\n functions.push(['url', undefined]);\n }\n break;\n }\n\n if (schema.format === 'uuid') {\n functions.push(['uuid', undefined]);\n break;\n }\n\n break;\n }\n default: {\n const hasProperties = !!schema.properties;\n const properties = schema.properties ?? {};\n const hasDefinedProperties = Object.keys(properties).length > 0;\n const hasAdditionalPropertiesSchema =\n !!schema.additionalProperties &&\n !isBoolean(schema.additionalProperties);\n\n // A plain `type: object` without explicit properties/additionalProperties\n // represents an open dictionary-like object in OpenAPI and should not be\n // generated as a strict object.\n const shouldUseLooseObject =\n type === 'object' &&\n !hasDefinedProperties &&\n schema.additionalProperties === undefined &&\n !hasAdditionalPropertiesSchema;\n\n if (hasProperties && hasDefinedProperties) {\n const objectType = getObjectFunctionName(isZodV4, strict);\n\n // A property is required when this schema requires it OR when a\n // sibling `allOf` member requires it (propagated via additionalRequired). (#3171)\n const requiredKeys = new Set<string>([\n ...(schema.required ?? []),\n ...(rules?.additionalRequired ?? []),\n ]);\n\n functions.push([\n objectType,\n Object.keys(properties)\n .map((key) => ({\n [key]:\n rules?.propertyOverrides?.[key] ??\n generateZodValidationSchemaDefinition(\n properties[key] as OpenApiSchemaObject | undefined,\n context,\n camel(`${name}-${key}`),\n strict,\n isZodV4,\n {\n required: requiredKeys.has(key),\n constNameRegistry,\n useReusableSchemas,\n },\n ),\n }))\n .reduce((acc, curr) => ({ ...acc, ...curr }), {}),\n ]);\n\n if (strict && !isZodV4) {\n functions.push(['strict', undefined]);\n }\n\n break;\n }\n\n if (shouldUseLooseObject) {\n const looseObjectType = getLooseObjectFunctionName(isZodV4);\n\n functions.push([looseObjectType, {}]);\n\n if (!isZodV4) {\n functions.push(['passthrough', undefined]);\n }\n\n break;\n }\n\n if (schema.additionalProperties) {\n functions.push([\n 'additionalProperties',\n generateZodValidationSchemaDefinition(\n isBoolean(schema.additionalProperties)\n ? {}\n : (schema.additionalProperties as OpenApiSchemaObject),\n context,\n name,\n strict,\n isZodV4,\n {\n required: true,\n constNameRegistry,\n useReusableSchemas,\n },\n ),\n ]);\n\n break;\n }\n\n if (schema.enum) {\n break;\n }\n\n functions.push([type, undefined]);\n\n break;\n }\n }\n }\n\n if (!hasNonArrayEnum && isString(type) && minAndMaxTypes.has(type)) {\n // Handle minimum constraints: exclusiveMinimum (>.gt()) takes priority over minimum (.min())\n // Check if exclusive flag was set (boolean format in OpenAPI 3.0) or a different value (OpenAPI 3.1)\n const shouldUseExclusiveMin = exclusiveMinRaw !== undefined;\n const shouldUseExclusiveMax = exclusiveMaxRaw !== undefined;\n\n if (shouldUseExclusiveMin && exclusiveMin !== undefined) {\n consts.push(\n `export const ${name}ExclusiveMin${constsCounterValue} = ${exclusiveMin};`,\n );\n // Generate .gt() for exclusive minimum (> instead of >=)\n functions.push(['gt', `${name}ExclusiveMin${constsCounterValue}`]);\n } else if (min !== undefined) {\n if (min === 1) {\n functions.push(['min', `${min}`]);\n } else {\n consts.push(`export const ${name}Min${constsCounterValue} = ${min};`);\n functions.push(['min', `${name}Min${constsCounterValue}`]);\n }\n }\n\n // Handle maximum constraints: exclusiveMaximum (<.lt()) takes priority over maximum (.max())\n if (shouldUseExclusiveMax && exclusiveMax !== undefined) {\n consts.push(\n `export const ${name}ExclusiveMax${constsCounterValue} = ${exclusiveMax};`,\n );\n // Generate .lt() for exclusive maximum (< instead of <=)\n functions.push(['lt', `${name}ExclusiveMax${constsCounterValue}`]);\n } else if (max !== undefined) {\n consts.push(`export const ${name}Max${constsCounterValue} = ${max};`);\n functions.push(['max', `${name}Max${constsCounterValue}`]);\n }\n\n if (multipleOf !== undefined) {\n consts.push(\n `export const ${name}MultipleOf${constsCounterValue} = ${multipleOf.toString()};`,\n );\n functions.push(['multipleOf', `${name}MultipleOf${constsCounterValue}`]);\n }\n if (\n exclusiveMin !== undefined ||\n min !== undefined ||\n exclusiveMax !== undefined ||\n multipleOf !== undefined ||\n max !== undefined\n ) {\n consts.push(`\\n`);\n }\n }\n\n const stringFormatAlreadyEmitted =\n isZodV4 &&\n type === 'string' &&\n !!matches &&\n !!schema.format &&\n !predefinedZodFormats.has(schema.format ?? '');\n\n if (\n matches &&\n !hasNonArrayEnum &&\n type === 'string' &&\n !stringFormatAlreadyEmitted\n ) {\n const isStartWithSlash = matches.startsWith('/');\n const isEndWithSlash = matches.endsWith('/');\n\n const regexp = `new RegExp('${jsStringEscape(\n matches.slice(isStartWithSlash ? 1 : 0, isEndWithSlash ? -1 : undefined),\n )}')`;\n\n consts.push(\n `export const ${name}RegExp${constsCounterValue} = ${regexp};\\n`,\n );\n if (schema.format && !predefinedZodFormats.has(schema.format) && isZodV4) {\n functions.push([\n 'stringFormat',\n [`'${escape(schema.format)}'`, `${name}RegExp${constsCounterValue}`],\n ]);\n } else {\n functions.push(['regex', `${name}RegExp${constsCounterValue}`]);\n }\n }\n\n // Array item enums are handled by the nested item schema. Guard parent-array\n // enum emission to avoid generating invalid trailing `.enum(...)` chains.\n if (schema.enum && type !== 'array') {\n const uniqueEnumValues = unique(schema.enum);\n\n if (uniqueEnumValues.every((value) => isString(value))) {\n functions.push([\n 'enum',\n `[${uniqueEnumValues.map((value) => `'${escape(value)}'`).join(', ')}]`,\n ]);\n } else {\n functions.push([\n 'oneOf',\n uniqueEnumValues.map((value) => ({\n functions: [\n ['literal', isString(value) ? `'${escape(value)}'` : value],\n ],\n consts: [],\n })),\n ]);\n }\n }\n\n if (!required && nullable) {\n functions.push(['nullish', undefined]);\n } else if (nullable) {\n functions.push(['nullable', undefined]);\n } else if (!required && !hasDefault) {\n functions.push(['optional', undefined]);\n }\n\n if (hasDefault) {\n functions.push(['default', defaultVarName]);\n }\n\n pushDescriptionOrMeta();\n\n return { functions, consts: unique(consts) };\n};\n\n/**\n * Runtime shape passed to the user-supplied `override.zod.params` function for\n * every emitted validator. Exported so consumers can type their function with\n * `import type { ZodParamsContext } from 'orval'` instead of hand-writing it.\n */\nexport interface ZodParamsContext {\n /** The OpenAPI `operationId`, or `''` for shared component schemas. */\n operationId: string;\n /** `'schema'` is used for shared component schemas with no owning operation. */\n location: 'param' | 'query' | 'header' | 'body' | 'response' | 'schema';\n /** Generated schema name, e.g. `CreateUserBody`, or the component name. */\n schemaName: string;\n /** Path to the current property within the schema. Only object property names are appended. */\n fieldPath: string[];\n /** The Zod method being emitted, e.g. `'string'`, `'min'`, `'email'`. */\n validator: string;\n}\n\nexport interface ZodParamsInjection extends Pick<\n ZodParamsContext,\n 'operationId' | 'location' | 'schemaName'\n> {\n mutator: GeneratorMutator;\n}\n\nconst PARAMS_MODIFIER_VALIDATORS = new Set([\n 'optional',\n 'nullable',\n 'nullish',\n 'default',\n 'describe',\n // Nullary / degenerate validators — either no params arg accepted in zod v3\n // (e.g. .unknown(), .any(), .never(), .null(), .undefined(), .void()) or no\n // meaningful error to attach (unknown/any accept everything).\n 'unknown',\n 'any',\n 'never',\n 'null',\n 'undefined',\n 'void',\n]);\n\n// Validators whose single argument is already a params-shaped options object\n// (e.g. `z.iso.datetime({ offset, precision })`). For these, the injected\n// params must merge into the existing object rather than be appended as a\n// second argument.\nconst PARAMS_MERGE_INTO_OPTIONS_VALIDATORS = new Set([\n 'datetime',\n 'time',\n 'iso.datetime',\n 'iso.time',\n]);\n\nexport const parseZodValidationSchemaDefinition = (\n input: ZodValidationSchemaDefinition,\n context: ContextSpec,\n coerceTypes: boolean | ZodCoerceType[] = false,\n strict: boolean,\n isZodV4: boolean,\n preprocess?: GeneratorMutator,\n paramsInjection?: ZodParamsInjection,\n): { zod: string; consts: string; usedRefs: Set<string> } => {\n if (input.functions.length === 0) {\n return { zod: '', consts: '', usedRefs: new Set() };\n }\n\n let consts = '';\n const usedRefs = new Set<string>();\n\n const appendConstsChunk = (chunk: string) => {\n if (!chunk) {\n return;\n }\n\n if (\n consts.length > 0 &&\n !consts.endsWith('\\n') &&\n !chunk.startsWith('\\n')\n ) {\n consts += '\\n';\n }\n\n consts += chunk;\n };\n\n const formatFunctionArgs = (value: unknown): string => {\n if (value === undefined) return '';\n if (value === null) return 'null';\n if (isString(value)) return value;\n if (Array.isArray(value)) {\n return value.map((item) => formatFunctionArgs(item)).join(', ');\n }\n if (isObject(value)) {\n return stringify(value) ?? '';\n }\n if (isNumber(value) || isBoolean(value)) return `${value}`;\n return '';\n };\n\n const buildParamsArg = (\n fn: string,\n fieldPath: readonly string[],\n ): string | undefined => {\n if (!paramsInjection) return undefined;\n if (PARAMS_MODIFIER_VALIDATORS.has(fn)) return undefined;\n const ctx: ZodParamsContext = {\n operationId: paramsInjection.operationId,\n location: paramsInjection.location,\n schemaName: paramsInjection.schemaName,\n fieldPath: [...fieldPath],\n validator: fn,\n };\n return `${paramsInjection.mutator.name}(${JSON.stringify(ctx)})`;\n };\n\n const parseProperty = (\n property: [string, unknown],\n fieldPath: readonly string[] = [],\n ): string => {\n const [fn, args = ''] = property;\n\n if (fn === 'namedRef') {\n const refArgs = args as { name: string; sourceRef: string };\n usedRefs.add(refArgs.name);\n return `__REF_${refArgs.name}__`;\n }\n\n // `.meta({ id, description?, deprecated? })` — registry metadata for zod v4.\n // Built explicitly (rather than via stringify) so the description is\n // JS-string-escaped and the field order is stable: id, description,\n // deprecated.\n if (fn === 'meta') {\n const metaArgs = args as {\n id: string;\n description?: string;\n deprecated?: boolean;\n };\n const parts = [`id: '${jsStringEscape(metaArgs.id)}'`];\n if (metaArgs.description !== undefined) {\n parts.push(`description: '${jsStringEscape(metaArgs.description)}'`);\n }\n if (metaArgs.deprecated) {\n parts.push('deprecated: true');\n }\n return `.meta({ ${parts.join(', ')} })`;\n }\n\n // File | string for text contentMediaType/encoding (user can pass string, runtime wraps in Blob)\n if (fn === 'fileOrString') {\n return 'zod.instanceof(File).or(zod.string())';\n }\n\n if (fn === 'allOf') {\n const allOfArgs = args as ZodValidationSchemaDefinition[];\n // Check if all parts are objects and we need to merge them for strict mode\n const allAreObjects =\n strict &&\n allOfArgs.length > 0 &&\n allOfArgs.every((partSchema) => {\n if (partSchema.functions.length === 0) return false;\n const firstFn = partSchema.functions[0][0];\n // Check if first function is object or strictObject\n // For Zod v3 with strict, it will be object followed by strict\n return firstFn === 'object' || firstFn === 'strictObject';\n });\n\n if (allAreObjects) {\n // Merge all object properties into a single object\n const mergedProperties: Record<string, ZodValidationSchemaDefinition> =\n {};\n let allConsts = '';\n\n for (const partSchema of allOfArgs) {\n if (partSchema.consts.length > 0) {\n allConsts += partSchema.consts.join('\\n');\n }\n\n // Find the object function (might be first or second after strict)\n const objectFunctionIndex = partSchema.functions.findIndex(\n ([fnName]) => fnName === 'object' || fnName === 'strictObject',\n );\n\n if (objectFunctionIndex !== -1) {\n const objectArgs = partSchema.functions[objectFunctionIndex][1];\n if (isObject(objectArgs)) {\n // Merge properties (later schemas override earlier ones)\n Object.assign(\n mergedProperties,\n objectArgs as Record<string, ZodValidationSchemaDefinition>,\n );\n }\n }\n }\n\n if (allConsts.length > 0) {\n appendConstsChunk(allConsts);\n }\n\n // Generate merged object\n const objectType = getObjectFunctionName(isZodV4, strict);\n const mergedObjectString = `zod.${objectType}({\n${Object.entries(mergedProperties)\n .map(([key, schema]) => {\n const value = schema.functions\n .map((prop) => parseProperty(prop, [...fieldPath, key]))\n .join('');\n appendConstsChunk(schema.consts.join('\\n'));\n return ` \"${key}\": ${value.startsWith('.') ? 'zod' : ''}${value}`;\n })\n .join(',\\n')}\n})`;\n\n // Apply strict only once for Zod v3 (v4 uses strictObject)\n if (!isZodV4) {\n return `${mergedObjectString}.strict()`;\n }\n\n return mergedObjectString;\n }\n\n // Fallback to original .and() approach for non-object or non-strict cases\n let acc = '';\n for (const partSchema of allOfArgs) {\n const value = partSchema.functions\n .map((prop) => parseProperty(prop, fieldPath))\n .join('');\n const valueWithZod = `${value.startsWith('.') ? 'zod' : ''}${value}`;\n\n if (partSchema.consts.length > 0) {\n appendConstsChunk(partSchema.consts.join('\\n'));\n }\n\n if (acc.length === 0) {\n acc = valueWithZod;\n } else {\n acc += `.and(${valueWithZod})`;\n }\n }\n\n return acc;\n }\n if (fn === 'oneOf' || fn === 'anyOf') {\n const unionArgs = args as ZodValidationSchemaDefinition[];\n // Can't use zod.union() with a single item\n if (unionArgs.length === 1) {\n appendConstsChunk(unionArgs[0].consts.join('\\n'));\n return unionArgs[0].functions\n .map((prop: [string, unknown]) => parseProperty(prop, fieldPath))\n .join('');\n }\n\n const union = unionArgs.map(\n ({\n functions,\n consts: argConsts,\n }: {\n functions: [string, unknown][];\n consts: string[];\n }) => {\n const value = functions\n .map((prop) => parseProperty(prop, fieldPath))\n .join('');\n const valueWithZod = `${value.startsWith('.') ? 'zod' : ''}${value}`;\n // consts are missing here\n appendConstsChunk(argConsts.join('\\n'));\n return valueWithZod;\n },\n );\n\n return `.union([${union.join(',')}])`;\n }\n\n if (fn === 'additionalProperties') {\n const additionalPropertiesArgs = args as ZodValidationSchemaDefinition;\n const value = additionalPropertiesArgs.functions\n .map((prop: [string, unknown]) => parseProperty(prop, fieldPath))\n .join('');\n const valueWithZod = `${value.startsWith('.') ? 'zod' : ''}${value}`;\n if (Array.isArray(additionalPropertiesArgs.consts)) {\n appendConstsChunk(additionalPropertiesArgs.consts.join('\\n'));\n }\n return `zod.record(zod.string(), ${valueWithZod})`;\n }\n\n if (fn === 'object' || fn === 'strictObject' || fn === 'looseObject') {\n const objectArgs = args as Record<string, ZodValidationSchemaDefinition>;\n const objectType =\n fn === 'looseObject'\n ? isZodV4\n ? 'looseObject'\n : 'object'\n : getObjectFunctionName(isZodV4, strict);\n\n const parsedObject = `zod.${objectType}({\n${Object.entries(objectArgs)\n .map(([key, schema]) => {\n const value = schema.functions\n .map((prop) => parseProperty(prop, [...fieldPath, key]))\n .join('');\n appendConstsChunk(schema.consts.join('\\n'));\n return ` \"${key}\": ${value.startsWith('.') ? 'zod' : ''}${value}`;\n })\n .join(',\\n')}\n})`;\n\n if (fn === 'looseObject' && !isZodV4) {\n return `${parsedObject}.passthrough()`;\n }\n\n return parsedObject;\n }\n\n if (fn === 'passthrough') {\n return '.passthrough()';\n }\n\n if (fn === 'array') {\n const arrayArgs = args as ZodValidationSchemaDefinition;\n const value = arrayArgs.functions\n .map((prop: [string, unknown]) => parseProperty(prop, fieldPath))\n .join('');\n if (isString(arrayArgs.consts)) {\n appendConstsChunk(arrayArgs.consts);\n } else if (Array.isArray(arrayArgs.consts)) {\n appendConstsChunk(arrayArgs.consts.join('\\n'));\n }\n return `.array(${value.startsWith('.') ? 'zod' : ''}${value})`;\n }\n\n if (fn === 'strict' && !isZodV4) {\n return '.strict()';\n }\n\n if (fn === 'tuple') {\n return `zod.tuple([${(args as ZodValidationSchemaDefinition[])\n .map((x) => {\n const value = x.functions\n .map((prop) => parseProperty(prop, fieldPath))\n .join('');\n return `${value.startsWith('.') ? 'zod' : ''}${value}`;\n })\n .join(',\\n')}])`;\n }\n if (fn === 'rest') {\n return `.rest(zod${(args as ZodValidationSchemaDefinition).functions\n .map((prop) => parseProperty(prop, fieldPath))\n .join('')})`;\n }\n const shouldCoerceType =\n coerceTypes &&\n (Array.isArray(coerceTypes)\n ? coerceTypes.includes(fn as ZodCoerceType)\n : COERCIBLE_TYPES.has(fn));\n\n const formattedArgs = formatFunctionArgs(args);\n const paramsArg = buildParamsArg(fn, fieldPath);\n let combinedArgs: string;\n if (\n paramsArg &&\n formattedArgs &&\n PARAMS_MERGE_INTO_OPTIONS_VALIDATORS.has(fn)\n ) {\n combinedArgs = `{ ...${formattedArgs}, ...${paramsArg} }`;\n } else if (paramsArg) {\n combinedArgs = formattedArgs\n ? `${formattedArgs}, ${paramsArg}`\n : paramsArg;\n } else {\n combinedArgs = formattedArgs;\n }\n\n if (\n (fn !== 'date' && shouldCoerceType) ||\n (fn === 'date' && shouldCoerceType && context.output.override.useDates)\n ) {\n return `.coerce.${fn}(${combinedArgs})`;\n }\n\n return `.${fn}(${combinedArgs})`;\n };\n\n appendConstsChunk(input.consts.join('\\n'));\n\n const schema = input.functions.map((prop) => parseProperty(prop)).join('');\n const value = preprocess\n ? `.preprocess(${preprocess.name}, ${\n schema.startsWith('.') ? 'zod' : ''\n }${schema})`\n : schema;\n\n const zod = `${value.startsWith('.') ? 'zod' : ''}${value}`;\n // Some export consts includes `,` as prefix, adding replace to remove those\n if (consts.includes(',export')) {\n consts = consts.replaceAll(',export', '\\nexport');\n }\n return { zod, consts, usedRefs };\n};\n\nconst dereferenceScalar = (value: unknown, context: ContextSpec): unknown => {\n if (isObject(value)) {\n return dereference(\n value as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n );\n } else if (Array.isArray(value)) {\n return value.map((item) => dereferenceScalar(item, context));\n } else {\n return value;\n }\n};\n\n/**\n * Attempts to resolve a `$ref` to its target schema. Returns `undefined`\n * instead of throwing when the ref cannot be found (e.g. external refs\n * not yet bundled). Logs a verbose warning on failure to aid debugging.\n */\nfunction tryResolveRefSchema(\n $ref: string,\n context: ContextSpec,\n): OpenApiSchemaObject | undefined {\n try {\n return resolveRef({ $ref } as OpenApiReferenceObject, context)\n .schema as OpenApiSchemaObject;\n } catch (error) {\n logVerbose(\n `[orval/zod] Failed to resolve $ref \"${$ref}\":`,\n error instanceof Error ? error.message : error,\n );\n return;\n }\n}\n\nconst COMPONENT_SCHEMAS_PREFIX = '#/components/schemas/';\n\nfunction extractSchemaNameFromRef($ref: string): string | undefined {\n if (!$ref.startsWith(COMPONENT_SCHEMAS_PREFIX)) return undefined;\n const raw = $ref.slice(COMPONENT_SCHEMAS_PREFIX.length);\n return decodeURIComponent(raw.replaceAll('~1', '/').replaceAll('~0', '~'));\n}\n\n/**\n * Recursively inlines all `$ref` and `$dynamicRef` references in an OpenAPI\n * schema tree, producing a fully-resolved schema suitable for Zod code generation.\n *\n * Tracks visited `$ref` paths via `context.parents` to break circular\n * references (returning `{}` for cycles).\n *\n * `$dynamicRef` is resolved using the dynamic scope attached to `context`:\n * 1. Look up the anchor name in `context.dynamicScope`.\n * 2. If not found, fall back to scanning `components.schemas` for a schema\n * that declares `$dynamicAnchor` with the same name.\n * 3. If resolved to a concrete schema, inline it (same as `$ref`).\n * 4. If unresolved, external, or a generic parameter → return `{}`.\n */\nexport const dereference = (\n schema: OpenApiSchemaObject | OpenApiReferenceObject,\n context: ContextSpec,\n): OpenApiSchemaObject => {\n const refName = '$ref' in schema ? schema.$ref : undefined;\n if (refName && context.parents?.includes(refName)) {\n return {};\n }\n\n if (isDynamicReference(schema)) {\n return dereferenceDynamicRef(schema, context);\n }\n\n const childContext: ContextSpec = {\n ...context,\n ...(refName\n ? { parents: [...(context.parents ?? []), refName] }\n : undefined),\n };\n\n const resolvedSchema: OpenApiSchemaObject | undefined =\n '$ref' in schema\n ? (() => {\n const referencedSchema = tryResolveRefSchema(schema.$ref, context);\n\n if (!referencedSchema || !isObject(referencedSchema)) {\n return;\n }\n\n const siblingProperties = Object.fromEntries(\n Object.entries(schema as Record<string, unknown>).filter(\n ([key]) => key !== '$ref',\n ),\n );\n\n return {\n ...(referencedSchema as Record<string, unknown>),\n ...siblingProperties,\n } as OpenApiSchemaObject;\n })()\n : schema;\n\n if (!resolvedSchema) {\n return {};\n }\n\n const resolvedContext = buildScopedContext(\n childContext,\n refName,\n resolvedSchema,\n );\n\n if (isDynamicReference(resolvedSchema)) {\n return dereferenceDynamicRef(resolvedSchema, resolvedContext);\n }\n\n return dereferenceProperties(resolvedSchema, resolvedContext);\n};\n\nfunction dereferenceProperties(\n schema: OpenApiSchemaObject,\n context: ContextSpec,\n): OpenApiSchemaObject {\n return Object.entries(schema).reduce<Record<string, unknown>>(\n (acc, [key, value]) => {\n if (key === 'properties' && isObject(value)) {\n acc[key] = Object.entries(value).reduce<\n Record<string, OpenApiSchemaObject>\n >((props, [propKey, propSchema]) => {\n props[propKey] = dereference(\n propSchema as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n );\n return props;\n }, {});\n } else if (key === 'default' || key === 'example' || key === 'examples') {\n acc[key] = value;\n } else {\n acc[key] = dereferenceScalar(value, context);\n }\n\n return acc;\n },\n {},\n ) as OpenApiSchemaObject;\n}\n\nfunction buildScopedContext(\n childContext: ContextSpec,\n refName: string | undefined,\n resolvedSchema: OpenApiSchemaObject,\n): ContextSpec {\n if (!refName) return childContext;\n\n const schemaName = extractSchemaNameFromRef(refName);\n if (!schemaName) return childContext;\n\n const schemaRecord = resolvedSchema as Record<string, unknown>;\n const hasDynamicAnchor = typeof schemaRecord.$dynamicAnchor === 'string';\n const defs = schemaRecord.$defs as Record<string, unknown> | undefined;\n const hasDefsAnchors =\n defs &&\n typeof defs === 'object' &&\n Object.values(defs).some(\n (d) => d && typeof d === 'object' && '$dynamicAnchor' in d,\n );\n\n if (!hasDynamicAnchor && !hasDefsAnchors) return childContext;\n\n return {\n ...childContext,\n dynamicScope: buildDynamicScope(schemaName, resolvedSchema, childContext),\n };\n}\n\nfunction dereferenceDynamicRef(\n schema: object & { $dynamicRef: string },\n context: ContextSpec,\n): OpenApiSchemaObject {\n const dynamicRef = schema.$dynamicRef;\n const anchorName = getDynamicAnchorName(dynamicRef);\n if (!anchorName) {\n return {};\n }\n\n const {\n resolvedTypeName,\n schema: resolvedSchema,\n schemaName,\n } = resolveDynamicRef(anchorName, context);\n\n const dynamicRefPath = `$dynamicRef:${dynamicRef}@${schemaName ?? '?'}`;\n if (context.parents?.includes(dynamicRefPath)) {\n return {};\n }\n\n if (resolvedTypeName === 'unknown' || !isObject(resolvedSchema)) {\n return {};\n }\n\n const childContext: ContextSpec = {\n ...context,\n parents: [...(context.parents ?? []), dynamicRefPath],\n };\n\n const scopedContext = buildScopedContext(\n childContext,\n schemaName\n ? `${COMPONENT_SCHEMAS_PREFIX}${encodeSegment(schemaName)}`\n : undefined,\n resolvedSchema,\n );\n\n const siblingProperties = Object.fromEntries(\n Object.entries(schema).filter(([key]) => key !== '$dynamicRef'),\n );\n\n const merged: OpenApiSchemaObject = {\n ...(resolvedSchema as Record<string, unknown>),\n ...siblingProperties,\n } as OpenApiSchemaObject;\n\n return dereferenceProperties(merged, scopedContext);\n}\n\nfunction encodeSegment(segment: string): string {\n return segment.replaceAll('~', '~0').replaceAll('/', '~1');\n}\n\n/**\n * Generate zod schema for form-data request body.\n * Handles file type detection for top-level properties based on encoding.contentType\n * and contentMediaType. Mirrors type gen's resolveFormDataRootObject.\n */\nexport const generateFormDataZodSchema = (\n schema: OpenApiSchemaObject,\n context: ContextSpec,\n name: string,\n strict: boolean,\n isZodV4: boolean,\n encoding?: Record<string, { contentType?: string }>,\n useReusableSchemas?: boolean,\n): ZodValidationSchemaDefinition => {\n // Precompute file type overrides for top-level properties only\n const propertyOverrides: Record<string, ZodValidationSchemaDefinition> = {};\n\n if (schema.properties) {\n for (const key of Object.keys(schema.properties)) {\n const propSchema = schema.properties[key];\n const resolvedPropSchema = propSchema\n ? dereference(\n propSchema as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n )\n : undefined;\n\n const fileType = resolvedPropSchema\n ? getFormDataFieldFileType(\n resolvedPropSchema,\n encoding?.[key]?.contentType,\n )\n : undefined;\n\n if (fileType) {\n const isRequired = schema.required?.includes(key);\n const fileFunctions: [string, unknown][] = [\n fileType === 'binary'\n ? ['instanceof', 'File']\n : ['fileOrString', undefined],\n ];\n if (!isRequired) {\n fileFunctions.push(['optional', undefined]);\n }\n propertyOverrides[key] = { functions: fileFunctions, consts: [] };\n }\n }\n }\n\n // Delegate to generic handler with file type overrides\n return generateZodValidationSchemaDefinition(\n schema,\n context,\n name,\n strict,\n isZodV4,\n {\n required: true,\n propertyOverrides:\n Object.keys(propertyOverrides).length > 0\n ? propertyOverrides\n : undefined,\n useReusableSchemas,\n },\n );\n};\n\nconst parseBodyAndResponse = ({\n data,\n context,\n name,\n strict,\n generate,\n isZodV4,\n parseType,\n useReusableSchemas,\n}: {\n data:\n | OpenApiResponseObject\n | OpenApiRequestBodyObject\n | OpenApiReferenceObject\n | undefined;\n context: ContextSpec;\n name: string;\n strict: boolean;\n generate: boolean;\n isZodV4: boolean;\n parseType: 'body' | 'response';\n useReusableSchemas?: boolean;\n}): {\n input: ZodValidationSchemaDefinition;\n isArray: boolean;\n rules?: {\n min?: number;\n max?: number;\n };\n} => {\n if (!data || !generate) {\n return {\n input: { functions: [], consts: [] },\n isArray: false,\n };\n }\n\n const resolvedRef = resolveRef(data, context).schema as\n | OpenApiResponseObject\n | OpenApiRequestBodyObject;\n\n // Only handle JSON and form-data; other content types (e.g., application/octet-stream)\n // Only handle JSON and form-data; other content types (e.g., application/octet-stream)\n // are skipped - unclear if this is correct behavior for root-level binary/text bodies.\n const contentEntries = Object.entries(resolvedRef.content ?? {});\n\n const jsonContent = contentEntries.find(\n isMediaType(\n // application/json\n // application/geo+json\n // application/ld+json\n // application/manifest+json\n // application/vnd.api+json (and other valid vendor subtypes)\n String.raw`^application\\/([^/;]+\\+)?json$`,\n ),\n );\n const formDataContent = contentEntries.find(\n isMediaType(String.raw`^multipart\\/form-data$`),\n );\n const [contentType, mediaType] = jsonContent\n ? (['application/json', jsonContent[1]] as const)\n : formDataContent\n ? (['multipart/form-data', formDataContent[1]] as const)\n : [undefined, undefined];\n\n const schema = mediaType?.schema;\n\n if (!schema) {\n if (parseType === 'response') {\n const textPlainContent = contentEntries.find(\n isMediaType(String.raw`^text\\/plain$`),\n );\n if (textPlainContent) {\n return {\n input: { functions: [['string', undefined]], consts: [] },\n isArray: false,\n };\n }\n }\n\n return {\n input: { functions: [], consts: [] },\n isArray: false,\n };\n }\n\n const encoding = mediaType.encoding;\n const resolvedJsonSchema = dereference(schema, context);\n\n // keep the same behaviour for array\n if (resolvedJsonSchema.items) {\n const min =\n resolvedJsonSchema.minimum ??\n resolvedJsonSchema.minLength ??\n resolvedJsonSchema.minItems;\n const max =\n resolvedJsonSchema.maximum ??\n resolvedJsonSchema.maxLength ??\n resolvedJsonSchema.maxItems;\n\n // When useReusableSchemas is on, shallow-resolve one level so that $ref\n // references inside the items schema are preserved for named-ref emission.\n // E.g. Pets = array of {$ref: Pet} → we want to emit Pet (namedRef)\n // rather than inlining Pet's full schema.\n const rawItems: OpenApiSchemaObject | OpenApiReferenceObject =\n useReusableSchemas\n ? (() => {\n const shallowArraySchema = resolveRef(schema, context)\n .schema as OpenApiSchemaObject;\n return (shallowArraySchema.items ??\n resolvedJsonSchema.items) as OpenApiSchemaObject;\n })()\n : resolvedJsonSchema.items;\n\n return {\n input: generateZodValidationSchemaDefinition(\n parseType === 'body'\n ? removeReadOnlyProperties(rawItems as OpenApiSchemaObject)\n : (rawItems as OpenApiSchemaObject),\n context,\n name,\n strict,\n isZodV4,\n {\n required: true,\n useReusableSchemas,\n },\n ),\n isArray: true,\n rules: {\n ...(min === undefined ? {} : { min }),\n ...(max === undefined ? {} : { max }),\n },\n };\n }\n\n // When useReusableSchemas is on, pass the original schema (possibly a $ref)\n // directly to generateZodValidationSchemaDefinition so that component schema\n // references are emitted as named identifiers instead of being inlined.\n const effectiveSchema: OpenApiSchemaObject | OpenApiReferenceObject =\n useReusableSchemas\n ? parseType === 'body'\n ? removeReadOnlyProperties(schema as OpenApiSchemaObject)\n : schema\n : parseType === 'body'\n ? removeReadOnlyProperties(resolvedJsonSchema)\n : resolvedJsonSchema;\n\n const isFormData = contentType === 'multipart/form-data';\n\n return {\n input: isFormData\n ? generateFormDataZodSchema(\n effectiveSchema,\n context,\n name,\n strict,\n isZodV4,\n encoding,\n useReusableSchemas,\n )\n : generateZodValidationSchemaDefinition(\n effectiveSchema,\n context,\n name,\n strict,\n isZodV4,\n { required: true, useReusableSchemas },\n ),\n isArray: false,\n };\n};\n\nconst isMediaType =\n (pattern: string) =>\n ([contentType]: [string, object]): boolean =>\n new RegExp(pattern).test(contentType.split(';')[0].trim().toLowerCase());\n\nconst getSingleResponse = (\n responses:\n | Record<string, OpenApiResponseObject | OpenApiReferenceObject | undefined>\n | undefined,\n) => {\n if (!responses) {\n return;\n }\n\n return (\n responses['200'] ??\n responses['2XX'] ??\n responses['2xx'] ??\n responses['204'] ??\n responses['205']\n );\n};\n\n/* eslint-enable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n\nexport const parseParameters = ({\n data,\n context,\n operationName,\n isZodV4,\n strict,\n generate,\n useReusableSchemas,\n}: {\n data: (OpenApiParameterObject | OpenApiReferenceObject)[] | undefined;\n context: ContextSpec;\n operationName: string;\n isZodV4: boolean;\n strict: {\n param: boolean;\n query: boolean;\n header: boolean;\n body: boolean;\n response: boolean;\n };\n generate: {\n param: boolean;\n query: boolean;\n header: boolean;\n body: boolean;\n response: boolean;\n };\n useReusableSchemas?: boolean;\n}): {\n headers: ZodValidationSchemaDefinition;\n queryParams: ZodValidationSchemaDefinition;\n params: ZodValidationSchemaDefinition;\n} => {\n if (!data) {\n return {\n headers: {\n functions: [],\n consts: [],\n },\n queryParams: {\n functions: [],\n consts: [],\n },\n params: {\n functions: [],\n consts: [],\n },\n };\n }\n\n const initialDefinitionsByParameters: Record<\n 'headers' | 'queryParams' | 'params',\n Record<string, { functions: [string, unknown][]; consts: string[] }>\n > = {\n headers: {},\n queryParams: {},\n params: {},\n };\n\n const defintionsByParameters = data.reduce((acc, val) => {\n const { schema: parameter }: { schema: OpenApiParameterObject } =\n resolveRef(val, context);\n\n if (!parameter.schema) {\n return acc;\n }\n if (!parameter.in || !parameter.name) {\n return acc;\n }\n\n // When useReusableSchemas is on, preserve `$ref` schemas verbatim so the\n // generator can take the namedRef path. We only shallow-clone to attach\n // the parameter-level `description` without mutating the shared ref object.\n // When off, fall back to dereferencing for backward compatibility.\n const schemaForGen: OpenApiSchemaObject | OpenApiReferenceObject =\n useReusableSchemas\n ? parameter.description\n ? Object.assign({}, parameter.schema, {\n description: parameter.description,\n })\n : parameter.schema\n : (() => {\n const s = dereference(parameter.schema, context);\n s.description = parameter.description;\n return s;\n })();\n\n const mapStrict = {\n path: strict.param,\n query: strict.query,\n header: strict.header,\n };\n\n const mapGenerate = {\n path: generate.param,\n query: generate.query,\n header: generate.header,\n };\n\n if (\n parameter.in !== 'path' &&\n parameter.in !== 'query' &&\n parameter.in !== 'header'\n ) {\n return acc;\n }\n\n const definition = generateZodValidationSchemaDefinition(\n schemaForGen,\n context,\n camel(`${operationName}-${parameter.in}-${parameter.name}`),\n mapStrict[parameter.in],\n isZodV4,\n {\n required: parameter.required,\n useReusableSchemas,\n },\n );\n\n if (parameter.in === 'header' && mapGenerate.header) {\n return {\n ...acc,\n headers: { ...acc.headers, [parameter.name]: definition },\n };\n }\n\n if (parameter.in === 'query' && mapGenerate.query) {\n return {\n ...acc,\n queryParams: { ...acc.queryParams, [parameter.name]: definition },\n };\n }\n\n if (parameter.in === 'path' && mapGenerate.path) {\n return {\n ...acc,\n params: { ...acc.params, [parameter.name]: definition },\n };\n }\n\n return acc;\n }, initialDefinitionsByParameters);\n\n const headers: ZodValidationSchemaDefinition = {\n functions: [],\n consts: [],\n };\n\n if (Object.keys(defintionsByParameters.headers).length > 0) {\n const parameterFunctions = getParameterFunctions(\n isZodV4,\n strict.header,\n defintionsByParameters.headers,\n );\n\n headers.functions.push(...parameterFunctions);\n }\n\n const queryParams: ZodValidationSchemaDefinition = {\n functions: [],\n consts: [],\n };\n\n if (Object.keys(defintionsByParameters.queryParams).length > 0) {\n const parameterFunctions = getParameterFunctions(\n isZodV4,\n strict.query,\n defintionsByParameters.queryParams,\n );\n\n queryParams.functions.push(...parameterFunctions);\n }\n\n const params: ZodValidationSchemaDefinition = {\n functions: [],\n consts: [],\n };\n\n if (Object.keys(defintionsByParameters.params).length > 0) {\n const parameterFunctions = getParameterFunctions(\n isZodV4,\n strict.param,\n defintionsByParameters.params,\n );\n\n params.functions.push(...parameterFunctions);\n }\n\n return {\n headers,\n queryParams,\n params,\n };\n};\n\nconst generateZodRoute = async (\n { operationId, operationName, verb, override }: GeneratorVerbOptions,\n { pathRoute, context, output }: GeneratorOptions,\n) => {\n const isZodV4 =\n !!context.output.packageJson && isZodVersionV4(context.output.packageJson);\n const useReusableSchemas =\n context.output.override.zod.generateReusableSchemas;\n const spec = context.spec.paths?.[pathRoute];\n\n if (spec == undefined) {\n throw new Error(`No such path ${pathRoute} in ${context.projectName}`);\n }\n\n const parameters = [\n ...(spec.parameters ?? []),\n ...(spec[verb]?.parameters ?? []),\n ];\n\n const parsedParameters = parseParameters({\n data: parameters,\n context,\n operationName,\n isZodV4,\n strict: override.zod.strict,\n generate: override.zod.generate,\n useReusableSchemas,\n });\n\n const requestBody = spec[verb]?.requestBody;\n const parsedBody = parseBodyAndResponse({\n data: requestBody,\n context,\n name: camel(`${operationName}-body`),\n strict: override.zod.strict.body,\n generate: override.zod.generate.body,\n isZodV4,\n parseType: 'body',\n useReusableSchemas,\n });\n\n const responses = (\n context.output.override.zod.generateEachHttpStatus\n ? Object.entries(spec[verb]?.responses ?? {})\n : [['', getSingleResponse(spec[verb]?.responses)]]\n ) as [string, OpenApiResponseObject | OpenApiReferenceObject][];\n const parsedResponses = responses.map(([code, response]) =>\n parseBodyAndResponse({\n data: response,\n context,\n name: camel(`${operationName}-${code}-response`),\n strict: override.zod.strict.response,\n generate: override.zod.generate.response,\n isZodV4,\n parseType: 'response',\n useReusableSchemas,\n }),\n );\n\n const preprocessParams = override.zod.preprocess?.param\n ? await generateMutator({\n output,\n mutator: override.zod.preprocess.param,\n name: `${operationName}PreprocessParams`,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n const paramsMutator = override.zod.params\n ? await generateMutator({\n output,\n mutator: override.zod.params,\n name: `${operationName}ZodParams`,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n const pascalOperationName = pascal(operationName);\n const makeParamsInjection = (\n location: ZodParamsInjection['location'],\n schemaSuffix: string,\n ): ZodParamsInjection | undefined =>\n paramsMutator\n ? {\n mutator: paramsMutator,\n operationId,\n location,\n schemaName: `${pascalOperationName}${schemaSuffix}`,\n }\n : undefined;\n\n let inputParams = parseZodValidationSchemaDefinition(\n parsedParameters.params,\n context,\n override.zod.coerce.param,\n override.zod.strict.param,\n isZodV4,\n preprocessParams,\n makeParamsInjection('param', 'Params'),\n );\n\n const preprocessQueryParams = override.zod.preprocess?.query\n ? await generateMutator({\n output,\n mutator: override.zod.preprocess.query,\n name: `${operationName}PreprocessQueryParams`,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n let inputQueryParams = parseZodValidationSchemaDefinition(\n parsedParameters.queryParams,\n context,\n override.zod.coerce.query,\n override.zod.strict.query,\n isZodV4,\n preprocessQueryParams,\n makeParamsInjection('query', 'QueryParams'),\n );\n\n const preprocessHeader = override.zod.preprocess?.header\n ? await generateMutator({\n output,\n mutator: override.zod.preprocess.header,\n name: `${operationName}PreprocessHeader`,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n let inputHeaders = parseZodValidationSchemaDefinition(\n parsedParameters.headers,\n context,\n override.zod.coerce.header,\n override.zod.strict.header,\n isZodV4,\n preprocessHeader,\n makeParamsInjection('header', 'Header'),\n );\n\n const preprocessBody = override.zod.preprocess?.body\n ? await generateMutator({\n output,\n mutator: override.zod.preprocess.body,\n name: `${operationName}PreprocessBody`,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n let inputBody = parseZodValidationSchemaDefinition(\n parsedBody.input,\n context,\n override.zod.coerce.body,\n override.zod.strict.body,\n isZodV4,\n preprocessBody,\n makeParamsInjection('body', 'Body'),\n );\n\n const preprocessResponse = override.zod.preprocess?.response\n ? await generateMutator({\n output,\n mutator: override.zod.preprocess.response,\n name: `${operationName}PreprocessResponse`,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n const inputResponses = parsedResponses.map((parsedResponse, index) =>\n parseZodValidationSchemaDefinition(\n parsedResponse.input,\n context,\n override.zod.coerce.response,\n override.zod.strict.response,\n isZodV4,\n preprocessResponse,\n makeParamsInjection(\n 'response',\n responses[index][0] ? `${responses[index][0]}Response` : 'Response',\n ),\n ),\n );\n\n const SENTINEL_PATTERN = /__REF_([A-Za-z_$][A-Za-z0-9_$]*)__/g;\n const rewriteSentinels = (s: string): string =>\n s.replaceAll(SENTINEL_PATTERN, (_m, name: string) => name);\n\n const allUsedRefs = new Set<string>([\n ...inputParams.usedRefs,\n ...inputQueryParams.usedRefs,\n ...inputHeaders.usedRefs,\n ...inputBody.usedRefs,\n ...inputResponses.flatMap((r) => [...r.usedRefs]),\n ]);\n\n if (useReusableSchemas && allUsedRefs.size > 0) {\n inputParams = { ...inputParams, zod: rewriteSentinels(inputParams.zod) };\n inputQueryParams = {\n ...inputQueryParams,\n zod: rewriteSentinels(inputQueryParams.zod),\n };\n inputHeaders = {\n ...inputHeaders,\n zod: rewriteSentinels(inputHeaders.zod),\n };\n inputBody = { ...inputBody, zod: rewriteSentinels(inputBody.zod) };\n for (let i = 0; i < inputResponses.length; i++) {\n inputResponses[i] = {\n ...inputResponses[i],\n zod: rewriteSentinels(inputResponses[i].zod),\n };\n }\n }\n\n if (\n !inputParams.zod &&\n !inputQueryParams.zod &&\n !inputHeaders.zod &&\n !inputBody.zod &&\n responses.length === 0\n ) {\n return {\n implementation: '',\n mutators: [],\n usedRefs: new Set<string>(),\n };\n }\n\n const useBrandedTypes = override.zod.useBrandedTypes;\n const brand = (name: string) =>\n useBrandedTypes\n ? isZodV4\n ? `.brand(\"${name}\")`\n : `.brand<\"${name}\">()`\n : '';\n\n // With `generateReusableSchemas`, operations import component schemas by\n // their PascalCase name from a sibling schemas module. When an operation's\n // own pascalized wrapper name (e.g. `ListPetsResponse` from operationId\n // `listPets`) matches an imported ref, the generated `export const` shadows\n // the import and produces a self-referential initializer that TS rejects\n // with TS7022. Detect the collision and append `Schema` (with a counter for\n // further collisions) so the import keeps its meaning. For the array case\n // both the wrapper and its `Item` companion are checked together so they\n // stay in sync. The original name is preserved when there is no collision,\n // so non-colliding operations are unaffected.\n //\n // `localTaken` seeds from the imported refs and accumulates the names this\n // call hands out, so wrappers within the same operation (`Params`, `Body`,\n // per-status `Response`, …) can't pick a name another wrapper just claimed.\n // The fixed suffixes already keep these distinct in practice, but tracking\n // allocations removes the implicit invariant — future suffix additions stay\n // safe by construction.\n const localTaken = new Set(allUsedRefs);\n const allocateExportName = (baseName: string, hasItem: boolean): string => {\n const collides = (name: string) =>\n localTaken.has(name) || (hasItem && localTaken.has(`${name}Item`));\n const reserve = (name: string) => {\n localTaken.add(name);\n if (hasItem) localTaken.add(`${name}Item`);\n };\n if (!collides(baseName)) {\n reserve(baseName);\n return baseName;\n }\n let counter = 0;\n let candidate = `${baseName}Schema`;\n while (collides(candidate)) {\n counter += 1;\n candidate = `${baseName}Schema${counter}`;\n }\n reserve(candidate);\n return candidate;\n };\n\n const paramsName = allocateExportName(`${pascalOperationName}Params`, false);\n const queryParamsName = allocateExportName(\n `${pascalOperationName}QueryParams`,\n false,\n );\n const headerName = allocateExportName(`${pascalOperationName}Header`, false);\n const bodyName = allocateExportName(\n `${pascalOperationName}Body`,\n parsedBody.isArray,\n );\n\n return {\n implementation: [\n ...(inputParams.consts ? [inputParams.consts] : []),\n ...(inputParams.zod\n ? [\n `export const ${paramsName} = ${inputParams.zod}${brand(paramsName)}`,\n ]\n : []),\n ...(inputQueryParams.consts ? [inputQueryParams.consts] : []),\n ...(inputQueryParams.zod\n ? [\n `export const ${queryParamsName} = ${inputQueryParams.zod}${brand(queryParamsName)}`,\n ]\n : []),\n ...(inputHeaders.consts ? [inputHeaders.consts] : []),\n ...(inputHeaders.zod\n ? [\n `export const ${headerName} = ${inputHeaders.zod}${brand(headerName)}`,\n ]\n : []),\n ...(inputBody.consts ? [inputBody.consts] : []),\n ...(inputBody.zod\n ? [\n parsedBody.isArray\n ? `export const ${bodyName}Item = ${inputBody.zod}\nexport const ${bodyName} = zod.array(${bodyName}Item)${\n parsedBody.rules?.min ? `.min(${parsedBody.rules.min})` : ''\n }${\n parsedBody.rules?.max ? `.max(${parsedBody.rules.max})` : ''\n }${brand(bodyName)}`\n : `export const ${bodyName} = ${inputBody.zod}${brand(bodyName)}`,\n ]\n : []),\n ...inputResponses.flatMap((inputResponse, index) => {\n const operationResponse = allocateExportName(\n pascal(`${operationName}-${responses[index][0]}-response`),\n parsedResponses[index].isArray,\n );\n\n if (!inputResponse.zod) {\n if (!override.zod.generate.response) {\n return [];\n }\n\n const noContentStatusCodes = new Set(['204', '205']);\n const statusCode = responses[index][0];\n const isEachHttpStatusMode = !!statusCode;\n\n let isNoContent: boolean;\n if (isEachHttpStatusMode) {\n isNoContent = noContentStatusCodes.has(statusCode);\n } else {\n const specResponseKeys = new Set(\n Object.keys(spec[verb]?.responses ?? {}),\n );\n const hasStandardSuccess =\n specResponseKeys.has('200') ||\n specResponseKeys.has('2XX') ||\n specResponseKeys.has('2xx');\n isNoContent = !hasStandardSuccess;\n }\n const noContentSchema = isNoContent ? 'zod.void()' : 'zod.unknown()';\n\n return [\n `export const ${operationResponse} = ${noContentSchema}${brand(operationResponse)}`,\n ];\n }\n\n return [\n ...(inputResponse.consts ? [inputResponse.consts] : []),\n parsedResponses[index].isArray\n ? `export const ${operationResponse}Item = ${inputResponse.zod}\nexport const ${operationResponse} = zod.array(${operationResponse}Item)${\n parsedResponses[index].rules?.min\n ? `.min(${parsedResponses[index].rules.min})`\n : ''\n }${\n parsedResponses[index].rules?.max\n ? `.max(${parsedResponses[index].rules.max})`\n : ''\n }${brand(operationResponse)}`\n : `export const ${operationResponse} = ${inputResponse.zod}${brand(operationResponse)}`,\n ];\n }),\n ].join('\\n\\n'),\n mutators: [\n ...(preprocessResponse ? [preprocessResponse] : []),\n // Unconditional even when this operation's parsed schemas don't\n // reference `paramsMutator.name`: in `single` mode, inline component\n // schemas (which DO reference it) rely on this entry to emit the\n // import. The cost is one harmless `import { zodParams }` line on\n // operations whose request/response have no leaf validators to inject.\n ...(paramsMutator ? [paramsMutator] : []),\n ],\n usedRefs: useReusableSchemas ? allUsedRefs : new Set<string>(),\n };\n};\n\nexport const generateZod: ClientBuilder = async (verbOptions, options) => {\n const { implementation, mutators, usedRefs } = await generateZodRoute(\n verbOptions,\n options,\n );\n\n return {\n implementation: implementation ? `${implementation}\\n\\n` : '',\n // Zod schemas are runtime values (not type-only), so mark with values: true\n // to prevent the import writer from emitting `import type { ... }`. Sort\n // by name so import order is stable across runs.\n imports: [...usedRefs].toSorted().map((name) => ({\n name,\n schemaName: name,\n values: true,\n })),\n mutators,\n };\n};\n\nconst zodClientBuilder: ClientGeneratorsBuilder = {\n client: generateZod,\n dependencies: getZodDependencies,\n};\n\nexport const builder = () => () => zodClientBuilder;\n\nexport { isZodVersionV4 } from './compatible-v4';\n\nexport default builder;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orval/zod",
3
- "version": "8.13.0",
3
+ "version": "8.15.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -35,7 +35,7 @@
35
35
  "nuke": "rimraf .turbo dist node_modules"
36
36
  },
37
37
  "dependencies": {
38
- "@orval/core": "8.13.0",
38
+ "@orval/core": "8.15.0",
39
39
  "remeda": "^2.33.6"
40
40
  },
41
41
  "devDependencies": {