zod 3.25.4 → 3.25.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/commonjs/v3/types.d.ts +1 -1
  2. package/dist/commonjs/v4/classic/errors.d.ts +1 -1
  3. package/dist/commonjs/v4/classic/errors.js +1 -0
  4. package/dist/commonjs/v4/classic/parse.d.ts +1 -1
  5. package/dist/commonjs/v4/classic/parse.js +2 -2
  6. package/dist/commonjs/v4/core/errors.d.ts +1 -1
  7. package/dist/commonjs/v4/core/errors.js +44 -0
  8. package/dist/commonjs/v4/core/parse.js +2 -2
  9. package/dist/esm/v3/types.d.ts +1 -1
  10. package/dist/esm/v4/classic/errors.d.ts +1 -1
  11. package/dist/esm/v4/classic/errors.js +1 -0
  12. package/dist/esm/v4/classic/parse.d.ts +1 -1
  13. package/dist/esm/v4/classic/parse.js +3 -3
  14. package/dist/esm/v4/core/errors.d.ts +1 -1
  15. package/dist/esm/v4/core/errors.js +11 -0
  16. package/dist/esm/v4/core/parse.js +2 -2
  17. package/package.json +1 -1
  18. package/src/v3/types.ts +1 -1
  19. package/src/v4/classic/errors.ts +2 -1
  20. package/src/v4/classic/parse.ts +3 -3
  21. package/src/v4/classic/tests/array.test.ts +42 -46
  22. package/src/v4/classic/tests/async-refinements.test.ts +14 -18
  23. package/src/v4/classic/tests/catch.test.ts +10 -12
  24. package/src/v4/classic/tests/discriminated-unions.test.ts +77 -87
  25. package/src/v4/classic/tests/enum.test.ts +33 -39
  26. package/src/v4/classic/tests/error-utils.test.ts +25 -27
  27. package/src/v4/classic/tests/error.test.ts +115 -128
  28. package/src/v4/classic/tests/literal.test.ts +10 -12
  29. package/src/v4/classic/tests/map.test.ts +60 -68
  30. package/src/v4/classic/tests/nested-refine.test.ts +68 -72
  31. package/src/v4/classic/tests/nonoptional.test.ts +36 -44
  32. package/src/v4/classic/tests/number.test.ts +36 -44
  33. package/src/v4/classic/tests/pipe.test.ts +18 -22
  34. package/src/v4/classic/tests/preprocess.test.ts +91 -107
  35. package/src/v4/classic/tests/primitive.test.ts +9 -11
  36. package/src/v4/classic/tests/record.test.ts +101 -121
  37. package/src/v4/classic/tests/set.test.ts +30 -36
  38. package/src/v4/classic/tests/string.test.ts +50 -60
  39. package/src/v4/classic/tests/template-literal.test.ts +45 -55
  40. package/src/v4/classic/tests/transform.test.ts +36 -46
  41. package/src/v4/classic/tests/tuple.test.ts +54 -66
  42. package/src/v4/core/errors.ts +12 -1
  43. package/src/v4/core/parse.ts +2 -2
  44. package/src/v4/core/tests/index.test.ts +42 -1
  45. package/src/v4/mini/tests/error.test.ts +1 -1
@@ -10,16 +10,14 @@ test("nonoptional", () => {
10
10
  expect(result.success).toBe(false);
11
11
  expect(result).toMatchInlineSnapshot(`
12
12
  {
13
- "error": ZodError {
14
- "issues": [
15
- {
16
- "code": "invalid_type",
17
- "expected": "string",
18
- "message": "Invalid input: expected string, received undefined",
19
- "path": [],
20
- },
21
- ],
22
- },
13
+ "error": [ZodError: [
14
+ {
15
+ "expected": "string",
16
+ "code": "invalid_type",
17
+ "path": [],
18
+ "message": "Invalid input: expected string, received undefined"
19
+ }
20
+ ]],
23
21
  "success": false,
24
22
  }
25
23
  `);
@@ -34,16 +32,14 @@ test("nonoptional with default", () => {
34
32
  expect(result.success).toBe(false);
35
33
  expect(result).toMatchInlineSnapshot(`
36
34
  {
37
- "error": ZodError {
38
- "issues": [
39
- {
40
- "code": "invalid_type",
41
- "expected": "nonoptional",
42
- "message": "Invalid input: expected nonoptional, received undefined",
43
- "path": [],
44
- },
45
- ],
46
- },
35
+ "error": [ZodError: [
36
+ {
37
+ "code": "invalid_type",
38
+ "expected": "nonoptional",
39
+ "path": [],
40
+ "message": "Invalid input: expected nonoptional, received undefined"
41
+ }
42
+ ]],
47
43
  "success": false,
48
44
  }
49
45
  `);
@@ -61,34 +57,30 @@ test("nonoptional in object", () => {
61
57
  // expect(schema.safeParse({ hi: undefined }).success).toEqual(false);
62
58
  expect(r2.success).toEqual(false);
63
59
  expect(r2.error).toMatchInlineSnapshot(`
64
- ZodError {
65
- "issues": [
66
- {
67
- "code": "invalid_type",
68
- "expected": "nonoptional",
69
- "message": "Invalid input: expected nonoptional, received undefined",
70
- "path": [
71
- "hi",
72
- ],
73
- },
74
- ],
75
- }
60
+ [ZodError: [
61
+ {
62
+ "code": "invalid_type",
63
+ "expected": "nonoptional",
64
+ "path": [
65
+ "hi"
66
+ ],
67
+ "message": "Invalid input: expected nonoptional, received undefined"
68
+ }
69
+ ]]
76
70
  `);
77
71
 
78
72
  const r3 = schema.safeParse({});
79
73
  expect(r3.success).toEqual(false);
80
74
  expect(r3.error).toMatchInlineSnapshot(`
81
- ZodError {
82
- "issues": [
83
- {
84
- "code": "invalid_type",
85
- "expected": "nonoptional",
86
- "message": "Invalid input: expected nonoptional, received undefined",
87
- "path": [
88
- "hi",
89
- ],
90
- },
91
- ],
92
- }
75
+ [ZodError: [
76
+ {
77
+ "code": "invalid_type",
78
+ "expected": "nonoptional",
79
+ "path": [
80
+ "hi"
81
+ ],
82
+ "message": "Invalid input: expected nonoptional, received undefined"
83
+ }
84
+ ]]
93
85
  `);
94
86
  });
@@ -16,33 +16,29 @@ test("Infinity validation", () => {
16
16
  const schema = z.number();
17
17
  expect(schema.safeParse(Number.POSITIVE_INFINITY)).toMatchInlineSnapshot(`
18
18
  {
19
- "error": ZodError {
20
- "issues": [
21
- {
22
- "code": "invalid_type",
23
- "expected": "number",
24
- "message": "Invalid input: expected number, received number",
25
- "path": [],
26
- "received": "Infinity",
27
- },
28
- ],
29
- },
19
+ "error": [ZodError: [
20
+ {
21
+ "expected": "number",
22
+ "code": "invalid_type",
23
+ "received": "Infinity",
24
+ "path": [],
25
+ "message": "Invalid input: expected number, received number"
26
+ }
27
+ ]],
30
28
  "success": false,
31
29
  }
32
30
  `);
33
31
  expect(schema.safeParse(Number.NEGATIVE_INFINITY)).toMatchInlineSnapshot(`
34
32
  {
35
- "error": ZodError {
36
- "issues": [
37
- {
38
- "code": "invalid_type",
39
- "expected": "number",
40
- "message": "Invalid input: expected number, received number",
41
- "path": [],
42
- "received": "Infinity",
43
- },
44
- ],
45
- },
33
+ "error": [ZodError: [
34
+ {
35
+ "expected": "number",
36
+ "code": "invalid_type",
37
+ "received": "Infinity",
38
+ "path": [],
39
+ "message": "Invalid input: expected number, received number"
40
+ }
41
+ ]],
46
42
  "success": false,
47
43
  }
48
44
  `);
@@ -153,33 +149,29 @@ test(".finite() validation", () => {
153
149
  expect(schema.parse(123)).toEqual(123);
154
150
  expect(schema.safeParse(Number.POSITIVE_INFINITY)).toMatchInlineSnapshot(`
155
151
  {
156
- "error": ZodError {
157
- "issues": [
158
- {
159
- "code": "invalid_type",
160
- "expected": "number",
161
- "message": "Invalid input: expected number, received number",
162
- "path": [],
163
- "received": "Infinity",
164
- },
165
- ],
166
- },
152
+ "error": [ZodError: [
153
+ {
154
+ "expected": "number",
155
+ "code": "invalid_type",
156
+ "received": "Infinity",
157
+ "path": [],
158
+ "message": "Invalid input: expected number, received number"
159
+ }
160
+ ]],
167
161
  "success": false,
168
162
  }
169
163
  `);
170
164
  expect(schema.safeParse(Number.NEGATIVE_INFINITY)).toMatchInlineSnapshot(`
171
165
  {
172
- "error": ZodError {
173
- "issues": [
174
- {
175
- "code": "invalid_type",
176
- "expected": "number",
177
- "message": "Invalid input: expected number, received number",
178
- "path": [],
179
- "received": "Infinity",
180
- },
181
- ],
182
- },
166
+ "error": [ZodError: [
167
+ {
168
+ "expected": "number",
169
+ "code": "invalid_type",
170
+ "received": "Infinity",
171
+ "path": [],
172
+ "message": "Invalid input: expected number, received number"
173
+ }
174
+ ]],
183
175
  "success": false,
184
176
  }
185
177
  `);
@@ -40,20 +40,18 @@ test("continue on non-fatal errors", () => {
40
40
 
41
41
  expect(schema.safeParse("4321")).toMatchInlineSnapshot(`
42
42
  {
43
- "error": ZodError {
44
- "issues": [
45
- {
46
- "code": "custom",
47
- "message": "A",
48
- "path": [],
49
- },
50
- {
51
- "code": "custom",
52
- "message": "B",
53
- "path": [],
54
- },
55
- ],
43
+ "error": [ZodError: [
44
+ {
45
+ "code": "custom",
46
+ "path": [],
47
+ "message": "A"
56
48
  },
49
+ {
50
+ "code": "custom",
51
+ "path": [],
52
+ "message": "B"
53
+ }
54
+ ]],
57
55
  "success": false,
58
56
  }
59
57
  `);
@@ -70,15 +68,13 @@ test("break on fatal errors", () => {
70
68
 
71
69
  expect(schema.safeParse("4321")).toMatchInlineSnapshot(`
72
70
  {
73
- "error": ZodError {
74
- "issues": [
75
- {
76
- "code": "custom",
77
- "message": "A",
78
- "path": [],
79
- },
80
- ],
81
- },
71
+ "error": [ZodError: [
72
+ {
73
+ "code": "custom",
74
+ "path": [],
75
+ "message": "A"
76
+ }
77
+ ]],
82
78
  "success": false,
83
79
  }
84
80
  `);
@@ -32,15 +32,13 @@ test("ctx.addIssue accepts string", () => {
32
32
  expect(result.error!.issues).toHaveLength(1);
33
33
  expect(result).toMatchInlineSnapshot(`
34
34
  {
35
- "error": ZodError {
36
- "issues": [
37
- {
38
- "code": "custom",
39
- "message": "bad stuff",
40
- "path": [],
41
- },
42
- ],
43
- },
35
+ "error": [ZodError: [
36
+ {
37
+ "message": "bad stuff",
38
+ "code": "custom",
39
+ "path": []
40
+ }
41
+ ]],
44
42
  "success": false,
45
43
  }
46
44
  `);
@@ -63,15 +61,13 @@ test("preprocess ctx.addIssue with parse", () => {
63
61
  expect(result.error!.issues).toHaveLength(1);
64
62
  expect(result).toMatchInlineSnapshot(`
65
63
  {
66
- "error": ZodError {
67
- "issues": [
68
- {
69
- "code": "custom",
70
- "message": "asdf is not one of our allowed strings",
71
- "path": [],
72
- },
73
- ],
74
- },
64
+ "error": [ZodError: [
65
+ {
66
+ "code": "custom",
67
+ "message": "asdf is not one of our allowed strings",
68
+ "path": []
69
+ }
70
+ ]],
75
71
  "success": false,
76
72
  }
77
73
  `);
@@ -90,21 +86,19 @@ test("preprocess ctx.addIssue non-fatal by default", () => {
90
86
  expect(result.error!.issues).toHaveLength(2);
91
87
  expect(result).toMatchInlineSnapshot(`
92
88
  {
93
- "error": ZodError {
94
- "issues": [
95
- {
96
- "code": "custom",
97
- "message": "custom error",
98
- "path": [],
99
- },
100
- {
101
- "code": "invalid_type",
102
- "expected": "string",
103
- "message": "Invalid input: expected string, received number",
104
- "path": [],
105
- },
106
- ],
89
+ "error": [ZodError: [
90
+ {
91
+ "code": "custom",
92
+ "message": "custom error",
93
+ "path": []
107
94
  },
95
+ {
96
+ "expected": "string",
97
+ "code": "invalid_type",
98
+ "path": [],
99
+ "message": "Invalid input: expected string, received number"
100
+ }
101
+ ]],
108
102
  "success": false,
109
103
  }
110
104
  `);
@@ -127,17 +121,15 @@ test("preprocess ctx.addIssue fatal true", () => {
127
121
  expect(result.error!.issues).toHaveLength(1);
128
122
  expect(result).toMatchInlineSnapshot(`
129
123
  {
130
- "error": ZodError {
131
- "issues": [
132
- {
133
- "code": "custom",
134
- "fatal": true,
135
- "message": "custom error",
136
- "origin": "custom",
137
- "path": [],
138
- },
139
- ],
140
- },
124
+ "error": [ZodError: [
125
+ {
126
+ "code": "custom",
127
+ "origin": "custom",
128
+ "message": "custom error",
129
+ "fatal": true,
130
+ "path": []
131
+ }
132
+ ]],
141
133
  "success": false,
142
134
  }
143
135
  `);
@@ -158,15 +150,13 @@ test("async preprocess ctx.addIssue with parseAsync", async () => {
158
150
  expect(result.error!.issues).toHaveLength(1);
159
151
  expect(result).toMatchInlineSnapshot(`
160
152
  {
161
- "error": ZodError {
162
- "issues": [
163
- {
164
- "code": "custom",
165
- "message": "asdf is not one of our allowed strings",
166
- "path": [],
167
- },
168
- ],
169
- },
153
+ "error": [ZodError: [
154
+ {
155
+ "code": "custom",
156
+ "message": "asdf is not one of our allowed strings",
157
+ "path": []
158
+ }
159
+ ]],
170
160
  "success": false,
171
161
  }
172
162
  `);
@@ -188,21 +178,19 @@ test("z.NEVER in preprocess", () => {
188
178
  expect(result.error!.issues).toHaveLength(2);
189
179
  expect(result).toMatchInlineSnapshot(`
190
180
  {
191
- "error": ZodError {
192
- "issues": [
193
- {
194
- "code": "custom",
195
- "message": "bad",
196
- "path": [],
197
- },
198
- {
199
- "code": "invalid_type",
200
- "expected": "number",
201
- "message": "Invalid input: expected number, received object",
202
- "path": [],
203
- },
204
- ],
181
+ "error": [ZodError: [
182
+ {
183
+ "code": "custom",
184
+ "message": "bad",
185
+ "path": []
205
186
  },
187
+ {
188
+ "expected": "number",
189
+ "code": "invalid_type",
190
+ "path": [],
191
+ "message": "Invalid input: expected number, received object"
192
+ }
193
+ ]],
206
194
  "success": false,
207
195
  }
208
196
  `);
@@ -221,29 +209,27 @@ test("preprocess as the second property of object", () => {
221
209
  expect(result.error!.issues).toHaveLength(2);
222
210
  expect(result).toMatchInlineSnapshot(`
223
211
  {
224
- "error": ZodError {
225
- "issues": [
226
- {
227
- "code": "too_small",
228
- "message": "Too small: expected string to have >1 characters",
229
- "minimum": 1,
230
- "origin": "string",
231
- "path": [
232
- "nonEmptyStr",
233
- ],
234
- },
235
- {
236
- "code": "too_small",
237
- "inclusive": false,
238
- "message": "Too small: expected number to be >0",
239
- "minimum": 0,
240
- "origin": "number",
241
- "path": [
242
- "positiveNum",
243
- ],
244
- },
212
+ "error": [ZodError: [
213
+ {
214
+ "origin": "string",
215
+ "code": "too_small",
216
+ "minimum": 1,
217
+ "path": [
218
+ "nonEmptyStr"
245
219
  ],
220
+ "message": "Too small: expected string to have >1 characters"
246
221
  },
222
+ {
223
+ "origin": "number",
224
+ "code": "too_small",
225
+ "minimum": 0,
226
+ "inclusive": false,
227
+ "path": [
228
+ "positiveNum"
229
+ ],
230
+ "message": "Too small: expected number to be >0"
231
+ }
232
+ ]],
247
233
  "success": false,
248
234
  }
249
235
  `);
@@ -260,28 +246,26 @@ test("preprocess validates with sibling errors", () => {
260
246
  expect(result.error!.issues).toHaveLength(2);
261
247
  expect(result).toMatchInlineSnapshot(`
262
248
  {
263
- "error": ZodError {
264
- "issues": [
265
- {
266
- "code": "invalid_type",
267
- "expected": "string",
268
- "message": "Invalid input: expected string, received undefined",
269
- "path": [
270
- "missing",
271
- ],
272
- },
273
- {
274
- "code": "invalid_format",
275
- "format": "regex",
276
- "message": "Invalid string: must match pattern / asdf/",
277
- "origin": "string",
278
- "path": [
279
- "preprocess",
280
- ],
281
- "pattern": "/ asdf/",
282
- },
249
+ "error": [ZodError: [
250
+ {
251
+ "expected": "string",
252
+ "code": "invalid_type",
253
+ "path": [
254
+ "missing"
283
255
  ],
256
+ "message": "Invalid input: expected string, received undefined"
284
257
  },
258
+ {
259
+ "origin": "string",
260
+ "code": "invalid_format",
261
+ "format": "regex",
262
+ "pattern": "/ asdf/",
263
+ "path": [
264
+ "preprocess"
265
+ ],
266
+ "message": "Invalid string: must match pattern / asdf/"
267
+ }
268
+ ]],
285
269
  "success": false,
286
270
  }
287
271
  `);
@@ -102,17 +102,15 @@ test("date schema", async () => {
102
102
  expect(() => dateSchema.parse(null)).toThrow();
103
103
  expect(await dateSchema.safeParseAsync(new Date("invalid"))).toMatchInlineSnapshot(`
104
104
  {
105
- "error": ZodError {
106
- "issues": [
107
- {
108
- "code": "invalid_type",
109
- "expected": "date",
110
- "message": "Invalid input: expected date, received Date",
111
- "path": [],
112
- "received": "Invalid Date",
113
- },
114
- ],
115
- },
105
+ "error": [ZodError: [
106
+ {
107
+ "expected": "date",
108
+ "code": "invalid_type",
109
+ "received": "Invalid Date",
110
+ "path": [],
111
+ "message": "Invalid input: expected date, received Date"
112
+ }
113
+ ]],
116
114
  "success": false,
117
115
  }
118
116
  `);