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
@@ -47,16 +47,14 @@ test("type error with custom error map", () => {
47
47
  const result = z.string().safeParse(234, { error: errorMap });
48
48
  expect(result.success).toBe(false);
49
49
  expect(result.error).toMatchInlineSnapshot(`
50
- ZodError {
51
- "issues": [
52
- {
53
- "code": "invalid_type",
54
- "expected": "string",
55
- "message": "bad type!",
56
- "path": [],
57
- },
58
- ],
59
- }
50
+ [ZodError: [
51
+ {
52
+ "expected": "string",
53
+ "code": "invalid_type",
54
+ "path": [],
55
+ "message": "bad type!"
56
+ }
57
+ ]]
60
58
  `);
61
59
  });
62
60
 
@@ -69,18 +67,16 @@ test("refinement fail with params", () => {
69
67
  .safeParse(2, { error: errorMap });
70
68
  expect(result.success).toBe(false);
71
69
  expect(result.error).toMatchInlineSnapshot(`
72
- ZodError {
73
- "issues": [
74
- {
75
- "code": "custom",
76
- "message": "less-than-3",
77
- "params": {
78
- "minimum": 3,
79
- },
80
- "path": [],
70
+ [ZodError: [
71
+ {
72
+ "code": "custom",
73
+ "path": [],
74
+ "params": {
75
+ "minimum": 3
81
76
  },
82
- ],
83
- }
77
+ "message": "less-than-3"
78
+ }
79
+ ]]
84
80
  `);
85
81
  });
86
82
 
@@ -95,18 +91,16 @@ test("hard coded error with custom errormap", () => {
95
91
 
96
92
  expect(result.success).toBe(false);
97
93
  expect(result.error).toMatchInlineSnapshot(`
98
- ZodError {
99
- "issues": [
100
- {
101
- "code": "custom",
102
- "message": "override",
103
- "params": {
104
- "minimum": 13,
105
- },
106
- "path": [],
94
+ [ZodError: [
95
+ {
96
+ "code": "custom",
97
+ "path": [],
98
+ "params": {
99
+ "minimum": 13
107
100
  },
108
- ],
109
- }
101
+ "message": "override"
102
+ }
103
+ ]]
110
104
  `);
111
105
  });
112
106
 
@@ -118,15 +112,13 @@ test("default error message", () => {
118
112
 
119
113
  expect(result.success).toBe(false);
120
114
  expect(result.error).toMatchInlineSnapshot(`
121
- ZodError {
122
- "issues": [
123
- {
124
- "code": "custom",
125
- "message": "Invalid input",
126
- "path": [],
127
- },
128
- ],
129
- }
115
+ [ZodError: [
116
+ {
117
+ "code": "custom",
118
+ "path": [],
119
+ "message": "Invalid input"
120
+ }
121
+ ]]
130
122
  `);
131
123
  });
132
124
 
@@ -138,15 +130,13 @@ test("override error in refine", () => {
138
130
  expect(result.success).toBe(false);
139
131
  expect(result.error!.issues.length).toEqual(1);
140
132
  expect(result.error).toMatchInlineSnapshot(`
141
- ZodError {
142
- "issues": [
143
- {
144
- "code": "custom",
145
- "message": "override",
146
- "path": [],
147
- },
148
- ],
149
- }
133
+ [ZodError: [
134
+ {
135
+ "code": "custom",
136
+ "path": [],
137
+ "message": "override"
138
+ }
139
+ ]]
150
140
  `);
151
141
  });
152
142
 
@@ -160,15 +150,13 @@ test("override error in refinement", () => {
160
150
  expect(result.success).toBe(false);
161
151
  expect(result.error!.issues.length).toEqual(1);
162
152
  expect(result.error).toMatchInlineSnapshot(`
163
- ZodError {
164
- "issues": [
165
- {
166
- "code": "custom",
167
- "message": "override",
168
- "path": [],
169
- },
170
- ],
171
- }
153
+ [ZodError: [
154
+ {
155
+ "code": "custom",
156
+ "path": [],
157
+ "message": "override"
158
+ }
159
+ ]]
172
160
  `);
173
161
  });
174
162
 
@@ -182,17 +170,15 @@ test("array minimum", () => {
182
170
  expect(result.success).toBe(false);
183
171
  expect(result.error!.issues[0].code).toEqual("too_small");
184
172
  expect(result.error).toMatchInlineSnapshot(`
185
- ZodError {
186
- "issues": [
187
- {
188
- "code": "too_small",
189
- "message": "Too small: expected array to have >3 items",
190
- "minimum": 3,
191
- "origin": "array",
192
- "path": [],
193
- },
194
- ],
195
- }
173
+ [ZodError: [
174
+ {
175
+ "origin": "array",
176
+ "code": "too_small",
177
+ "minimum": 3,
178
+ "path": [],
179
+ "message": "Too small: expected array to have >3 items"
180
+ }
181
+ ]]
196
182
  `);
197
183
  });
198
184
 
@@ -201,18 +187,16 @@ test("literal bigint default error message", () => {
201
187
  expect(result.success).toBe(false);
202
188
  expect(result.error!.issues.length).toEqual(1);
203
189
  expect(result.error).toMatchInlineSnapshot(`
204
- ZodError {
205
- "issues": [
206
- {
207
- "code": "invalid_value",
208
- "message": "Invalid input: expected 12n",
209
- "path": [],
210
- "values": [
211
- 12n,
212
- ],
213
- },
214
- ],
215
- }
190
+ [ZodError: [
191
+ {
192
+ "code": "invalid_value",
193
+ "values": [
194
+ "12"
195
+ ],
196
+ "path": [],
197
+ "message": "Invalid input: expected 12n"
198
+ }
199
+ ]]
216
200
  `);
217
201
  });
218
202
 
@@ -230,18 +214,16 @@ test("custom path in custom error map", () => {
230
214
  const result = schema.safeParse({ items: ["first"] }, { error: errorMap });
231
215
  expect(result.success).toBe(false);
232
216
  expect(result.error).toMatchInlineSnapshot(`
233
- ZodError {
234
- "issues": [
235
- {
236
- "code": "custom",
237
- "message": "doesnt matter",
238
- "path": [
239
- "items",
240
- "items-too-few",
241
- ],
242
- },
243
- ],
244
- }
217
+ [ZodError: [
218
+ {
219
+ "code": "custom",
220
+ "path": [
221
+ "items",
222
+ "items-too-few"
223
+ ],
224
+ "message": "doesnt matter"
225
+ }
226
+ ]]
245
227
  `);
246
228
  });
247
229
 
@@ -542,17 +524,15 @@ test("z.config customError ", () => {
542
524
  const result = stringWithCustomError.min(10).safeParse("tooshort");
543
525
  expect(result.success).toBe(false);
544
526
  expect(result.error).toMatchInlineSnapshot(`
545
- ZodError {
546
- "issues": [
547
- {
548
- "code": "too_small",
549
- "message": "override",
550
- "minimum": 10,
551
- "origin": "string",
552
- "path": [],
553
- },
554
- ],
555
- }
527
+ [ZodError: [
528
+ {
529
+ "origin": "string",
530
+ "code": "too_small",
531
+ "minimum": 10,
532
+ "path": [],
533
+ "message": "override"
534
+ }
535
+ ]]
556
536
  `);
557
537
  expect(result.error!.issues[0].message).toEqual("override");
558
538
  z.config({ customError: undefined });
@@ -628,26 +608,24 @@ test("dont short circuit on continuable errors", () => {
628
608
  const result = user.safeParse({ password: "asdf", confirm: "qwer" });
629
609
  expect(result.success).toBe(false);
630
610
  expect(result.error).toMatchInlineSnapshot(`
631
- ZodError {
632
- "issues": [
633
- {
634
- "code": "too_small",
635
- "message": "Too small: expected string to have >6 characters",
636
- "minimum": 6,
637
- "origin": "string",
638
- "path": [
639
- "password",
640
- ],
641
- },
642
- {
643
- "code": "custom",
644
- "message": "Passwords don't match",
645
- "path": [
646
- "confirm",
647
- ],
648
- },
649
- ],
650
- }
611
+ [ZodError: [
612
+ {
613
+ "origin": "string",
614
+ "code": "too_small",
615
+ "minimum": 6,
616
+ "path": [
617
+ "password"
618
+ ],
619
+ "message": "Too small: expected string to have >6 characters"
620
+ },
621
+ {
622
+ "code": "custom",
623
+ "path": [
624
+ "confirm"
625
+ ],
626
+ "message": "Passwords don't match"
627
+ }
628
+ ]]
651
629
  `);
652
630
  // expect(result.error!.issues.length).toEqual(2);
653
631
  });
@@ -689,7 +667,7 @@ test("error inheritance", () => {
689
667
  expect(e1).toBeInstanceOf(z.core.$ZodError);
690
668
  expect(e1).toBeInstanceOf(z.ZodError);
691
669
  expect(e1).toBeInstanceOf(z.ZodRealError);
692
- expect(e1).not.toBeInstanceOf(Error);
670
+ // expect(e1).not.toBeInstanceOf(Error);
693
671
 
694
672
  try {
695
673
  z.string().parse(123);
@@ -697,7 +675,7 @@ test("error inheritance", () => {
697
675
  expect(e1).toBeInstanceOf(z.core.$ZodError);
698
676
  expect(e2).toBeInstanceOf(z.ZodError);
699
677
  expect(e2).toBeInstanceOf(z.ZodRealError);
700
- expect(e2).toBeInstanceOf(Error);
678
+ // expect(e2).toBeInstanceOf(Error);
701
679
  }
702
680
  });
703
681
 
@@ -706,6 +684,15 @@ test("error serialization", () => {
706
684
  z.string().parse(123);
707
685
  } catch (e) {
708
686
  console.dir(e, { depth: null });
709
- expect(e).toMatchInlineSnapshot(`[Error]`);
687
+ expect(e).toMatchInlineSnapshot(`
688
+ [ZodError: [
689
+ {
690
+ "expected": "string",
691
+ "code": "invalid_type",
692
+ "path": [],
693
+ "message": "Invalid input: expected string, received number"
694
+ }
695
+ ]]
696
+ `);
710
697
  }
711
698
  });
@@ -60,18 +60,16 @@ test("literal default error message", () => {
60
60
  expect(result.success).toEqual(false);
61
61
  expect(result.error!.issues.length).toEqual(1);
62
62
  expect(result.error).toMatchInlineSnapshot(`
63
- ZodError {
64
- "issues": [
65
- {
66
- "code": "invalid_value",
67
- "message": "Invalid input: expected "Tuna"",
68
- "path": [],
69
- "values": [
70
- "Tuna",
71
- ],
72
- },
73
- ],
74
- }
63
+ [ZodError: [
64
+ {
65
+ "code": "invalid_value",
66
+ "values": [
67
+ "Tuna"
68
+ ],
69
+ "path": [],
70
+ "message": "Invalid input: expected \\"Tuna\\""
71
+ }
72
+ ]]
75
73
  `);
76
74
  });
77
75
 
@@ -32,24 +32,22 @@ test("valid parse async", async () => {
32
32
  const result = await asyncMap.safeParseAsync(new Map([["first", "foo"]]));
33
33
  expect(result.success).toEqual(false);
34
34
  expect(result.error).toMatchInlineSnapshot(`
35
- ZodError {
36
- "issues": [
37
- {
38
- "code": "custom",
39
- "message": "bad key",
40
- "path": [
41
- "first",
42
- ],
43
- },
44
- {
45
- "code": "custom",
46
- "message": "bad value",
47
- "path": [
48
- "first",
49
- ],
50
- },
51
- ],
52
- }
35
+ [ZodError: [
36
+ {
37
+ "code": "custom",
38
+ "path": [
39
+ "first"
40
+ ],
41
+ "message": "bad key"
42
+ },
43
+ {
44
+ "code": "custom",
45
+ "path": [
46
+ "first"
47
+ ],
48
+ "message": "bad value"
49
+ }
50
+ ]]
53
51
  `);
54
52
  });
55
53
 
@@ -68,26 +66,24 @@ test("throws when the given map has invalid key and invalid input", () => {
68
66
  if (result.success === false) {
69
67
  expect(result.error.issues.length).toEqual(2);
70
68
  expect(result.error).toMatchInlineSnapshot(`
71
- ZodError {
72
- "issues": [
73
- {
74
- "code": "invalid_type",
75
- "expected": "string",
76
- "message": "Invalid input: expected string, received number",
77
- "path": [
78
- 42,
79
- ],
80
- },
81
- {
82
- "code": "invalid_type",
83
- "expected": "string",
84
- "message": "Invalid input: expected string, received symbol",
85
- "path": [
86
- 42,
87
- ],
88
- },
89
- ],
90
- }
69
+ [ZodError: [
70
+ {
71
+ "expected": "string",
72
+ "code": "invalid_type",
73
+ "path": [
74
+ 42
75
+ ],
76
+ "message": "Invalid input: expected string, received number"
77
+ },
78
+ {
79
+ "expected": "string",
80
+ "code": "invalid_type",
81
+ "path": [
82
+ 42
83
+ ],
84
+ "message": "Invalid input: expected string, received symbol"
85
+ }
86
+ ]]
91
87
  `);
92
88
  }
93
89
  });
@@ -146,24 +142,22 @@ test("dirty", async () => {
146
142
  if (!result.success) {
147
143
  expect(result.error.issues.length).toEqual(2);
148
144
  expect(result.error).toMatchInlineSnapshot(`
149
- ZodError {
150
- "issues": [
151
- {
152
- "code": "custom",
153
- "message": "Keys must be uppercase",
154
- "path": [
155
- "first",
156
- ],
157
- },
158
- {
159
- "code": "custom",
160
- "message": "Keys must be uppercase",
161
- "path": [
162
- "second",
163
- ],
164
- },
165
- ],
166
- }
145
+ [ZodError: [
146
+ {
147
+ "code": "custom",
148
+ "path": [
149
+ "first"
150
+ ],
151
+ "message": "Keys must be uppercase"
152
+ },
153
+ {
154
+ "code": "custom",
155
+ "path": [
156
+ "second"
157
+ ],
158
+ "message": "Keys must be uppercase"
159
+ }
160
+ ]]
167
161
  `);
168
162
  }
169
163
  });
@@ -188,17 +182,15 @@ test("map with object keys", () => {
188
182
  const badResult = map.safeParse(badData);
189
183
  expect(badResult.success).toEqual(false);
190
184
  expect(badResult.error).toMatchInlineSnapshot(`
191
- ZodError {
192
- "issues": [
193
- {
194
- "code": "invalid_type",
195
- "expected": "object",
196
- "message": "Invalid input: expected object, received string",
197
- "path": [
198
- "bad",
199
- ],
200
- },
201
- ],
202
- }
185
+ [ZodError: [
186
+ {
187
+ "expected": "object",
188
+ "code": "invalid_type",
189
+ "path": [
190
+ "bad"
191
+ ],
192
+ "message": "Invalid input: expected object, received string"
193
+ }
194
+ ]]
203
195
  `);
204
196
  });
@@ -40,88 +40,84 @@ test("nested refinements", () => {
40
40
  };
41
41
  expect(zodSchema.safeParse(DATA)).toMatchInlineSnapshot(`
42
42
  {
43
- "error": ZodError {
44
- "issues": [
45
- {
46
- "code": "too_small",
47
- "message": "Too small: expected string to have >1 characters",
48
- "minimum": 1,
49
- "origin": "string",
50
- "path": [
51
- "nested",
52
- "confirm",
53
- ],
54
- },
55
- {
56
- "code": "custom",
57
- "message": "Confirm length should be > 2",
58
- "path": [
59
- "nested",
60
- "confirm",
61
- ],
62
- },
63
- {
64
- "code": "custom",
65
- "message": "Value must be "bar"",
66
- "path": [
67
- "nested",
68
- "confirm",
69
- ],
70
- },
71
- {
72
- "code": "custom",
73
- "message": "Password and confirm must match",
74
- "path": [
75
- "nested",
76
- "confirm",
77
- ],
78
- },
43
+ "error": [ZodError: [
44
+ {
45
+ "origin": "string",
46
+ "code": "too_small",
47
+ "minimum": 1,
48
+ "path": [
49
+ "nested",
50
+ "confirm"
79
51
  ],
52
+ "message": "Too small: expected string to have >1 characters"
80
53
  },
54
+ {
55
+ "code": "custom",
56
+ "path": [
57
+ "nested",
58
+ "confirm"
59
+ ],
60
+ "message": "Confirm length should be > 2"
61
+ },
62
+ {
63
+ "code": "custom",
64
+ "path": [
65
+ "nested",
66
+ "confirm"
67
+ ],
68
+ "message": "Value must be \\"bar\\""
69
+ },
70
+ {
71
+ "code": "custom",
72
+ "path": [
73
+ "nested",
74
+ "confirm"
75
+ ],
76
+ "message": "Password and confirm must match"
77
+ }
78
+ ]],
81
79
  "success": false,
82
80
  }
83
81
  `);
84
82
 
85
83
  expect(zodSchema.safeParse(DATA, { jitless: true })).toMatchInlineSnapshot(`
86
84
  {
87
- "error": ZodError {
88
- "issues": [
89
- {
90
- "code": "too_small",
91
- "message": "Too small: expected string to have >1 characters",
92
- "minimum": 1,
93
- "origin": "string",
94
- "path": [
95
- "nested",
96
- "confirm",
97
- ],
98
- },
99
- {
100
- "code": "custom",
101
- "message": "Confirm length should be > 2",
102
- "path": [
103
- "nested",
104
- "confirm",
105
- ],
106
- },
107
- {
108
- "code": "custom",
109
- "message": "Value must be "bar"",
110
- "path": [
111
- "nested",
112
- "confirm",
113
- ],
114
- },
115
- {
116
- "code": "custom",
117
- "message": "Password and confirm must match",
118
- "path": [
119
- "nested",
120
- "confirm",
121
- ],
122
- },
85
+ "error": [ZodError: [
86
+ {
87
+ "origin": "string",
88
+ "code": "too_small",
89
+ "minimum": 1,
90
+ "path": [
91
+ "nested",
92
+ "confirm"
123
93
  ],
94
+ "message": "Too small: expected string to have >1 characters"
124
95
  },
96
+ {
97
+ "code": "custom",
98
+ "path": [
99
+ "nested",
100
+ "confirm"
101
+ ],
102
+ "message": "Confirm length should be > 2"
103
+ },
104
+ {
105
+ "code": "custom",
106
+ "path": [
107
+ "nested",
108
+ "confirm"
109
+ ],
110
+ "message": "Value must be \\"bar\\""
111
+ },
112
+ {
113
+ "code": "custom",
114
+ "path": [
115
+ "nested",
116
+ "confirm"
117
+ ],
118
+ "message": "Password and confirm must match"
119
+ }
120
+ ]],
125
121
  "success": false,
126
122
  }
127
123
  `);