@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 +47 -4
- package/dist/index.mjs +283 -78
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
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
|
-
|
|
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
|
|
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,
|
|
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:
|
|
156
|
+
name: getRefInfo(schema.$ref, context).name,
|
|
138
157
|
sourceRef: schema.$ref
|
|
139
158
|
}]];
|
|
140
159
|
const consts = [];
|
|
141
|
-
|
|
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
|
|
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:
|
|
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
|
-
|
|
490
|
+
pushDescriptionOrMeta();
|
|
447
491
|
return {
|
|
448
492
|
functions,
|
|
449
493
|
consts: unique(consts)
|
|
450
494
|
};
|
|
451
495
|
};
|
|
452
|
-
const
|
|
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
|
|
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)
|
|
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
|
-
|
|
565
|
-
|
|
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
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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)
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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 &&
|
|
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 ${
|
|
1117
|
+
...inputParams.zod ? [`export const ${paramsName} = ${inputParams.zod}${brand(paramsName)}`] : [],
|
|
926
1118
|
...inputQueryParams.consts ? [inputQueryParams.consts] : [],
|
|
927
|
-
...inputQueryParams.zod ? [`export const ${
|
|
1119
|
+
...inputQueryParams.zod ? [`export const ${queryParamsName} = ${inputQueryParams.zod}${brand(queryParamsName)}`] : [],
|
|
928
1120
|
...inputHeaders.consts ? [inputHeaders.consts] : [],
|
|
929
|
-
...inputHeaders.zod ? [`export const ${
|
|
1121
|
+
...inputHeaders.zod ? [`export const ${headerName} = ${inputHeaders.zod}${brand(headerName)}`] : [],
|
|
930
1122
|
...inputBody.consts ? [inputBody.consts] : [],
|
|
931
|
-
...inputBody.zod ? [parsedBody.isArray ? `export const ${
|
|
932
|
-
export const ${
|
|
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
|
-
|
|
936
|
-
|
|
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
|
};
|
package/dist/index.mjs.map
CHANGED
|
@@ -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.
|
|
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.
|
|
38
|
+
"@orval/core": "8.15.0",
|
|
39
39
|
"remeda": "^2.33.6"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|