fix optional recipe schema zod validation (#4900)

This commit is contained in:
Zane
2025-09-30 10:33:37 -07:00
committed by GitHub
parent 29fd4b97aa
commit 4af7e7b821
+6 -16
View File
@@ -187,16 +187,19 @@ function openApiSchemaToZod(schema: Record<string, unknown>): z.ZodTypeAny {
shape[propName] = openApiSchemaToZod(propSchema as Record<string, unknown>); shape[propName] = openApiSchemaToZod(propSchema as Record<string, unknown>);
} }
// Make optional properties optional // Make optional properties optional based on required array
if (schema.required && Array.isArray(schema.required)) {
const optionalShape: Record<string, z.ZodTypeAny> = {}; const optionalShape: Record<string, z.ZodTypeAny> = {};
const requiredFields =
schema.required && Array.isArray(schema.required) ? schema.required : [];
for (const [propName, zodSchema] of Object.entries(shape)) { for (const [propName, zodSchema] of Object.entries(shape)) {
if (schema.required.includes(propName)) { if (requiredFields.includes(propName)) {
optionalShape[propName] = zodSchema; optionalShape[propName] = zodSchema;
} else { } else {
optionalShape[propName] = zodSchema.optional(); optionalShape[propName] = zodSchema.optional();
} }
} }
let objectSchema = z.object(optionalShape); let objectSchema = z.object(optionalShape);
if (schema.additionalProperties === true) { if (schema.additionalProperties === true) {
@@ -208,19 +211,6 @@ function openApiSchemaToZod(schema: Record<string, unknown>): z.ZodTypeAny {
} }
return schema.nullable ? objectSchema.nullable() : objectSchema; return schema.nullable ? objectSchema.nullable() : objectSchema;
} else {
let objectSchema = z.object(shape);
if (schema.additionalProperties === true) {
return schema.nullable
? objectSchema.passthrough().nullable()
: objectSchema.passthrough();
} else if (schema.additionalProperties === false) {
return schema.nullable ? objectSchema.strict().nullable() : objectSchema.strict();
}
return schema.nullable ? objectSchema.nullable() : objectSchema;
}
} }
return schema.nullable ? z.record(z.any()).nullable() : z.record(z.any()); return schema.nullable ? z.record(z.any()).nullable() : z.record(z.any());