Skip to content

Commit 6707ebb

Browse files
v4: Preserve function types in .meta() (#4636)
* Preserve function types * preserve function types * Support function types in replacer * Add additional test --------- Co-authored-by: Colin McDonnell <[email protected]>
1 parent 21ee3f6 commit 6707ebb

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

packages/zod/src/v4/classic/tests/registries.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,3 +163,33 @@ test("loose examples", () => {
163163
examples: ["example"],
164164
});
165165
});
166+
167+
test("function meta witout replacement", () => {
168+
const myReg = z.registry<{
169+
defaulter: (arg: string, test: boolean) => number;
170+
}>();
171+
172+
const mySchema = z.date();
173+
myReg.add(mySchema, {
174+
defaulter: (arg, _test) => {
175+
return arg.length;
176+
},
177+
});
178+
179+
expect(myReg.get(mySchema)!.defaulter("hello", true)).toEqual(5);
180+
});
181+
182+
test("function meta with replacement", () => {
183+
const myReg = z.registry<{
184+
defaulter: (arg: z.$input, test: boolean) => z.$output;
185+
}>();
186+
187+
const mySchema = z.string().transform((val) => val.length);
188+
myReg.add(mySchema, {
189+
defaulter: (arg, _test) => {
190+
return arg.length;
191+
},
192+
});
193+
194+
expect(myReg.get(mySchema)!.defaulter("hello", true)).toEqual(5);
195+
});

packages/zod/src/v4/core/registries.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,16 @@ export type $replace<Meta, S extends $ZodType> = Meta extends $output
1212
? core.input<S>
1313
: Meta extends (infer M)[]
1414
? $replace<M, S>[]
15-
: // handle objecs
16-
Meta extends object
17-
? { [K in keyof Meta]: $replace<Meta[K], S> }
18-
: Meta;
15+
: Meta extends (...args: infer P) => infer R
16+
? (
17+
...args: {
18+
[K in keyof P]: $replace<P[K], S>; // tuple
19+
}
20+
) => $replace<R, S>
21+
: // handle objects
22+
Meta extends object
23+
? { [K in keyof Meta]: $replace<Meta[K], S> }
24+
: Meta;
1925

2026
type MetadataType = Record<string, unknown> | undefined;
2127
export class $ZodRegistry<Meta extends MetadataType = MetadataType, Schema extends $ZodType = $ZodType> {

0 commit comments

Comments
 (0)