Skip to content

Commit 6a8ebbd

Browse files
authored
Merge pull request #1811 from colinhacks/zod4
Add Zod v4 (beta)
2 parents 51894da + e9554c7 commit 6a8ebbd

6 files changed

Lines changed: 140 additions & 9 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@
6868
* [valita](https://github.com/badrap/valita)
6969
* [Vality](https://github.com/jeengbe/vality)
7070
* [yup](https://github.com/jquense/yup)
71-
* [zod](https://github.com/vriad/zod)
71+
* [zod](https://github.com/colinhacks/zod)
72+
* [zod (v4)](https://github.com/colinhacks/zod/tree/v4)
7273

7374
## Criteria
7475

cases/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export const cases = [
5454
'vality',
5555
'yup',
5656
'zod',
57+
'zod4',
5758
'deepkit',
5859
'effect-schema',
5960
'ts-auto-guard',

cases/zod4.ts

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import * as z from 'zod4';
2+
import { createCase } from '../benchmarks';
3+
4+
createCase('zod4', 'parseSafe', () => {
5+
const dataType = z.interface({
6+
number: z.number(),
7+
negNumber: z.number(),
8+
maxNumber: z.number(),
9+
string: z.string(),
10+
longString: z.string(),
11+
boolean: z.boolean(),
12+
deeplyNested: z.interface({
13+
foo: z.string(),
14+
num: z.number(),
15+
bool: z.boolean(),
16+
}),
17+
});
18+
19+
return data => {
20+
return dataType.parse(data);
21+
};
22+
});
23+
24+
createCase('zod4', 'parseStrict', () => {
25+
const dataType = z
26+
.interface({
27+
number: z.number(),
28+
negNumber: z.number(),
29+
maxNumber: z.number(),
30+
string: z.string(),
31+
longString: z.string(),
32+
boolean: z.boolean(),
33+
deeplyNested: z
34+
.interface({
35+
foo: z.string(),
36+
num: z.number(),
37+
bool: z.boolean(),
38+
})
39+
.strict(),
40+
})
41+
.strict();
42+
43+
return data => {
44+
return dataType.parse(data);
45+
};
46+
});
47+
48+
createCase('zod4', 'assertLoose', () => {
49+
const dataType = z.looseInterface({
50+
number: z.number(),
51+
negNumber: z.number(),
52+
maxNumber: z.number(),
53+
string: z.string(),
54+
longString: z.string(),
55+
boolean: z.boolean(),
56+
deeplyNested: z.looseInterface({
57+
foo: z.string(),
58+
num: z.number(),
59+
bool: z.boolean(),
60+
}),
61+
});
62+
63+
return data => {
64+
dataType.parse(data);
65+
66+
return true;
67+
};
68+
});
69+
70+
createCase('zod4', 'assertStrict', () => {
71+
const dataType = z.strictInterface({
72+
number: z.number(),
73+
negNumber: z.number(),
74+
maxNumber: z.number(),
75+
string: z.string(),
76+
longString: z.string(),
77+
boolean: z.boolean(),
78+
deeplyNested: z.strictInterface({
79+
foo: z.string(),
80+
num: z.number(),
81+
bool: z.boolean(),
82+
}),
83+
});
84+
85+
return data => {
86+
dataType.parse(data);
87+
88+
return true;
89+
};
90+
});

package-lock.json

Lines changed: 44 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@
106106
"vega": "5.33.0",
107107
"vega-lite": "5.11.0",
108108
"yup": "1.6.1",
109-
"zod": "3.24.2"
109+
"zod": "3.24.2",
110+
"zod4": "npm:zod@next"
110111
},
111112
"devDependencies": {
112113
"@babel/cli": "7.27.0",

test/benchmarks.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import '../cases/valita';
5858
import '../cases/vality';
5959
import '../cases/yup';
6060
import '../cases/zod';
61+
import '../cases/zod4';
6162
import '../cases/deepkit';
6263
import '../cases/effect-schema';
6364
import '../cases/ts-auto-guard';

0 commit comments

Comments
 (0)