From 691e0b3eca155d83e32f0b8520adc2cdb3339c07 Mon Sep 17 00:00:00 2001 From: unnoq Date: Mon, 29 Dec 2025 16:10:15 +0700 Subject: [PATCH] feat(zod): enhance schema conversion logic for zod4 preprocess Fixes #1317 --- packages/zod/src/zod4/converter.processed.test.ts | 6 ++++++ packages/zod/src/zod4/converter.ts | 10 +++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/zod/src/zod4/converter.processed.test.ts b/packages/zod/src/zod4/converter.processed.test.ts index 8feee8522..fc6d8032e 100644 --- a/packages/zod/src/zod4/converter.processed.test.ts +++ b/packages/zod/src/zod4/converter.processed.test.ts @@ -18,4 +18,10 @@ testSchemaConverter([ input: [true, { type: 'string' }], output: [false, {}], }, + { + name: 'preprocess(x => x, z.string())', + schema: z.preprocess(x => x, z.string()), + input: [true, { type: 'string' }], + output: [true, { type: 'string' }], + }, ]) diff --git a/packages/zod/src/zod4/converter.ts b/packages/zod/src/zod4/converter.ts index d25852a7f..9347b6242 100644 --- a/packages/zod/src/zod4/converter.ts +++ b/packages/zod/src/zod4/converter.ts @@ -519,7 +519,15 @@ export class ZodToJsonSchemaConverter implements ConditionalSchemaConverter { case 'pipe': { const pipe = schema as $ZodPipe - return this.#convert(options.strategy === 'input' ? pipe._zod.def.in : pipe._zod.def.out, options, lazyDepth, structureDepth) + return this.#convert( + // prefer out schema when in schema is preprocess/transform + options.strategy === 'input' && pipe._zod.def.in._zod.def.type !== 'transform' + ? pipe._zod.def.in + : pipe._zod.def.out, + options, + lazyDepth, + structureDepth, + ) } case 'readonly': {