Skip to content

Commit 25d2c41

Browse files
authored
fix(zod): add preprocess properly everywhere (#1940)
1 parent a809011 commit 25d2c41

File tree

2 files changed

+65
-5
lines changed

2 files changed

+65
-5
lines changed

packages/zod/src/index.ts

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
GeneratorMutator,
1010
GeneratorOptions,
1111
GeneratorVerbOptions,
12-
getFileInfo,
1312
getNumberWord,
1413
getRefInfo,
1514
isBoolean,
@@ -454,7 +453,7 @@ export const parseZodValidationSchemaDefinition = (
454453
input: ZodValidationSchemaDefinition,
455454
context: ContextSpecs,
456455
coerceTypes: boolean | ZodCoerceType[] = false,
457-
preprocessResponse?: GeneratorMutator,
456+
preprocess?: GeneratorMutator,
458457
): { zod: string; consts: string } => {
459458
if (!input.functions.length) {
460459
return { zod: '', consts: '' };
@@ -592,8 +591,8 @@ ${Object.entries(args)
592591
consts += input.consts.join('\n');
593592

594593
const schema = input.functions.map(parseProperty).join('');
595-
const value = preprocessResponse
596-
? `.preprocess(${preprocessResponse.name}, ${
594+
const value = preprocess
595+
? `.preprocess(${preprocess.name}, ${
597596
schema.startsWith('.') ? 'zod' : ''
598597
}${schema})`
599598
: schema;
@@ -946,10 +945,21 @@ const generateZodRoute = async (
946945
}),
947946
);
948947

948+
const preprocessParams = override.zod.preprocess?.param
949+
? await generateMutator({
950+
output,
951+
mutator: override.zod.preprocess.response,
952+
name: `${operationName}PreprocessParams`,
953+
workspace: context.workspace,
954+
tsconfig: context.output.tsconfig,
955+
})
956+
: undefined;
957+
949958
const inputParams = parseZodValidationSchemaDefinition(
950959
parsedParameters.params,
951960
context,
952961
override.zod.coerce.param,
962+
preprocessParams,
953963
);
954964

955965
if (override.coerceTypes) {
@@ -958,21 +968,55 @@ const generateZodRoute = async (
958968
);
959969
}
960970

971+
const preprocessQueryParams = override.zod.preprocess?.query
972+
? await generateMutator({
973+
output,
974+
mutator: override.zod.preprocess.response,
975+
name: `${operationName}PreprocessQueryParams`,
976+
workspace: context.workspace,
977+
tsconfig: context.output.tsconfig,
978+
})
979+
: undefined;
980+
961981
const inputQueryParams = parseZodValidationSchemaDefinition(
962982
parsedParameters.queryParams,
963983
context,
964984
override.zod.coerce.query ?? override.coerceTypes,
985+
preprocessQueryParams,
965986
);
987+
988+
const preprocessHeader = override.zod.preprocess?.header
989+
? await generateMutator({
990+
output,
991+
mutator: override.zod.preprocess.response,
992+
name: `${operationName}PreprocessHeader`,
993+
workspace: context.workspace,
994+
tsconfig: context.output.tsconfig,
995+
})
996+
: undefined;
997+
966998
const inputHeaders = parseZodValidationSchemaDefinition(
967999
parsedParameters.headers,
9681000
context,
9691001
override.zod.coerce.header,
1002+
preprocessHeader,
9701003
);
9711004

1005+
const preprocessBody = override.zod.preprocess?.body
1006+
? await generateMutator({
1007+
output,
1008+
mutator: override.zod.preprocess.response,
1009+
name: `${operationName}PreprocessBody`,
1010+
workspace: context.workspace,
1011+
tsconfig: context.output.tsconfig,
1012+
})
1013+
: undefined;
1014+
9721015
const inputBody = parseZodValidationSchemaDefinition(
9731016
parsedBody.input,
9741017
context,
9751018
override.zod.coerce.body,
1019+
preprocessBody,
9761020
);
9771021

9781022
const preprocessResponse = override.zod.preprocess?.response

tests/configs/zod.config.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,28 @@ export default defineConfig({
120120
name: 'stripNill',
121121
path: '../mutators/zod-preprocess.ts',
122122
},
123+
query: {
124+
name: 'stripNill',
125+
path: '../mutators/zod-preprocess.ts',
126+
},
127+
param: {
128+
name: 'stripNill',
129+
path: '../mutators/zod-preprocess.ts',
130+
},
131+
header: {
132+
name: 'stripNill',
133+
path: '../mutators/zod-preprocess.ts',
134+
},
135+
body: {
136+
name: 'stripNill',
137+
path: '../mutators/zod-preprocess.ts',
138+
},
123139
},
124140
},
125141
},
126142
},
127143
input: {
128-
target: '../specifications/circular.yaml',
144+
target: '../specifications/petstore.yaml',
129145
},
130146
},
131147
additionalProperties: {

0 commit comments

Comments
 (0)