zod 3.26.0-canary.20250703T013930 → 3.26.0-canary.20250703T214020

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 (278) hide show
  1. package/package.json +20 -20
  2. package/src/index.ts +4 -0
  3. package/src/v3/ZodError.ts +330 -0
  4. package/src/v3/benchmarks/datetime.ts +58 -0
  5. package/src/v3/benchmarks/discriminatedUnion.ts +80 -0
  6. package/src/v3/benchmarks/index.ts +59 -0
  7. package/src/v3/benchmarks/ipv4.ts +57 -0
  8. package/src/v3/benchmarks/object.ts +69 -0
  9. package/src/v3/benchmarks/primitives.ts +162 -0
  10. package/src/v3/benchmarks/realworld.ts +63 -0
  11. package/src/v3/benchmarks/string.ts +55 -0
  12. package/src/v3/benchmarks/union.ts +80 -0
  13. package/src/v3/errors.ts +13 -0
  14. package/src/v3/external.ts +6 -0
  15. package/src/v3/helpers/enumUtil.ts +17 -0
  16. package/src/v3/helpers/errorUtil.ts +8 -0
  17. package/src/v3/helpers/parseUtil.ts +176 -0
  18. package/src/v3/helpers/partialUtil.ts +34 -0
  19. package/src/v3/helpers/typeAliases.ts +2 -0
  20. package/src/v3/helpers/util.ts +224 -0
  21. package/src/v3/index.ts +4 -0
  22. package/src/v3/locales/en.ts +124 -0
  23. package/src/v3/standard-schema.ts +113 -0
  24. package/src/v3/tests/Mocker.ts +54 -0
  25. package/src/v3/tests/all-errors.test.ts +157 -0
  26. package/src/v3/tests/anyunknown.test.ts +28 -0
  27. package/src/v3/tests/array.test.ts +71 -0
  28. package/src/v3/tests/async-parsing.test.ts +388 -0
  29. package/src/v3/tests/async-refinements.test.ts +46 -0
  30. package/src/v3/tests/base.test.ts +29 -0
  31. package/src/v3/tests/bigint.test.ts +55 -0
  32. package/src/v3/tests/branded.test.ts +53 -0
  33. package/src/v3/tests/catch.test.ts +220 -0
  34. package/src/v3/tests/coerce.test.ts +133 -0
  35. package/src/v3/tests/complex.test.ts +56 -0
  36. package/src/v3/tests/custom.test.ts +31 -0
  37. package/src/v3/tests/date.test.ts +32 -0
  38. package/src/v3/tests/deepmasking.test.ts +186 -0
  39. package/src/v3/tests/default.test.ts +112 -0
  40. package/src/v3/tests/description.test.ts +33 -0
  41. package/src/v3/tests/discriminated-unions.test.ts +315 -0
  42. package/src/v3/tests/enum.test.ts +80 -0
  43. package/src/v3/tests/error.test.ts +551 -0
  44. package/src/v3/tests/firstparty.test.ts +87 -0
  45. package/src/v3/tests/firstpartyschematypes.test.ts +21 -0
  46. package/src/v3/tests/function.test.ts +257 -0
  47. package/src/v3/tests/generics.test.ts +48 -0
  48. package/src/v3/tests/instanceof.test.ts +37 -0
  49. package/src/v3/tests/intersection.test.ts +110 -0
  50. package/src/v3/tests/language-server.source.ts +76 -0
  51. package/src/v3/tests/language-server.test.ts +207 -0
  52. package/src/v3/tests/literal.test.ts +36 -0
  53. package/src/v3/tests/map.test.ts +110 -0
  54. package/src/v3/tests/masking.test.ts +4 -0
  55. package/src/v3/tests/mocker.test.ts +19 -0
  56. package/src/v3/tests/nan.test.ts +21 -0
  57. package/src/v3/tests/nativeEnum.test.ts +87 -0
  58. package/src/v3/tests/nullable.test.ts +42 -0
  59. package/src/v3/tests/number.test.ts +176 -0
  60. package/src/v3/tests/object-augmentation.test.ts +29 -0
  61. package/src/v3/tests/object-in-es5-env.test.ts +29 -0
  62. package/src/v3/tests/object.test.ts +434 -0
  63. package/src/v3/tests/optional.test.ts +42 -0
  64. package/src/v3/tests/parseUtil.test.ts +23 -0
  65. package/src/v3/tests/parser.test.ts +41 -0
  66. package/src/v3/tests/partials.test.ts +243 -0
  67. package/src/v3/tests/pickomit.test.ts +111 -0
  68. package/src/v3/tests/pipeline.test.ts +29 -0
  69. package/src/v3/tests/preprocess.test.ts +186 -0
  70. package/src/v3/tests/primitive.test.ts +440 -0
  71. package/src/v3/tests/promise.test.ts +90 -0
  72. package/src/v3/tests/readonly.test.ts +194 -0
  73. package/src/v3/tests/record.test.ts +171 -0
  74. package/src/v3/tests/recursive.test.ts +197 -0
  75. package/src/v3/tests/refine.test.ts +313 -0
  76. package/src/v3/tests/safeparse.test.ts +27 -0
  77. package/src/v3/tests/set.test.ts +142 -0
  78. package/src/v3/tests/standard-schema.test.ts +83 -0
  79. package/src/v3/tests/string.test.ts +916 -0
  80. package/src/v3/tests/transformer.test.ts +233 -0
  81. package/src/v3/tests/tuple.test.ts +90 -0
  82. package/src/v3/tests/unions.test.ts +57 -0
  83. package/src/v3/tests/validations.test.ts +133 -0
  84. package/src/v3/tests/void.test.ts +15 -0
  85. package/src/v3/types.ts +5136 -0
  86. package/src/v4/classic/checks.ts +30 -0
  87. package/src/v4/classic/coerce.ts +27 -0
  88. package/src/v4/classic/compat.ts +66 -0
  89. package/src/v4/classic/errors.ts +75 -0
  90. package/src/v4/classic/external.ts +50 -0
  91. package/src/v4/classic/index.ts +5 -0
  92. package/src/v4/classic/iso.ts +90 -0
  93. package/src/v4/classic/parse.ts +33 -0
  94. package/src/v4/classic/schemas.ts +2055 -0
  95. package/src/v4/classic/tests/anyunknown.test.ts +26 -0
  96. package/src/v4/classic/tests/array.test.ts +264 -0
  97. package/src/v4/classic/tests/assignability.test.ts +210 -0
  98. package/src/v4/classic/tests/async-parsing.test.ts +381 -0
  99. package/src/v4/classic/tests/async-refinements.test.ts +68 -0
  100. package/src/v4/classic/tests/base.test.ts +7 -0
  101. package/src/v4/classic/tests/bigint.test.ts +54 -0
  102. package/src/v4/classic/tests/brand.test.ts +65 -0
  103. package/src/v4/classic/tests/catch.test.ts +252 -0
  104. package/src/v4/classic/tests/coalesce.test.ts +20 -0
  105. package/src/v4/classic/tests/coerce.test.ts +160 -0
  106. package/src/v4/classic/tests/continuability.test.ts +352 -0
  107. package/src/v4/classic/tests/custom.test.ts +40 -0
  108. package/src/v4/classic/tests/date.test.ts +31 -0
  109. package/src/v4/classic/tests/datetime.test.ts +296 -0
  110. package/src/v4/classic/tests/default.test.ts +313 -0
  111. package/src/v4/classic/tests/description.test.ts +32 -0
  112. package/src/v4/classic/tests/discriminated-unions.test.ts +592 -0
  113. package/src/v4/classic/tests/enum.test.ts +285 -0
  114. package/src/v4/classic/tests/error-utils.test.ts +527 -0
  115. package/src/v4/classic/tests/error.test.ts +711 -0
  116. package/src/v4/classic/tests/file.test.ts +91 -0
  117. package/src/v4/classic/tests/firstparty.test.ts +175 -0
  118. package/src/v4/classic/tests/function.test.ts +268 -0
  119. package/src/v4/classic/tests/generics.test.ts +72 -0
  120. package/src/v4/classic/tests/index.test.ts +829 -0
  121. package/src/v4/classic/tests/instanceof.test.ts +34 -0
  122. package/src/v4/classic/tests/intersection.test.ts +171 -0
  123. package/src/v4/classic/tests/json.test.ts +108 -0
  124. package/src/v4/classic/tests/lazy.test.ts +227 -0
  125. package/src/v4/classic/tests/literal.test.ts +92 -0
  126. package/src/v4/classic/tests/map.test.ts +196 -0
  127. package/src/v4/classic/tests/nan.test.ts +21 -0
  128. package/src/v4/classic/tests/nested-refine.test.ts +168 -0
  129. package/src/v4/classic/tests/nonoptional.test.ts +86 -0
  130. package/src/v4/classic/tests/nullable.test.ts +22 -0
  131. package/src/v4/classic/tests/number.test.ts +247 -0
  132. package/src/v4/classic/tests/object.test.ts +553 -0
  133. package/src/v4/classic/tests/optional.test.ts +103 -0
  134. package/src/v4/classic/tests/partial.test.ts +147 -0
  135. package/src/v4/classic/tests/pickomit.test.ts +127 -0
  136. package/src/v4/classic/tests/pipe.test.ts +81 -0
  137. package/src/v4/classic/tests/prefault.test.ts +37 -0
  138. package/src/v4/classic/tests/preprocess.test.ts +298 -0
  139. package/src/v4/classic/tests/primitive.test.ts +175 -0
  140. package/src/v4/classic/tests/promise.test.ts +81 -0
  141. package/src/v4/classic/tests/prototypes.test.ts +23 -0
  142. package/src/v4/classic/tests/readonly.test.ts +252 -0
  143. package/src/v4/classic/tests/record.test.ts +332 -0
  144. package/src/v4/classic/tests/recursive-types.test.ts +325 -0
  145. package/src/v4/classic/tests/refine.test.ts +423 -0
  146. package/src/v4/classic/tests/registries.test.ts +195 -0
  147. package/src/v4/classic/tests/set.test.ts +179 -0
  148. package/src/v4/classic/tests/standard-schema.test.ts +57 -0
  149. package/src/v4/classic/tests/string-formats.test.ts +109 -0
  150. package/src/v4/classic/tests/string.test.ts +881 -0
  151. package/src/v4/classic/tests/stringbool.test.ts +66 -0
  152. package/src/v4/classic/tests/template-literal.test.ts +758 -0
  153. package/src/v4/classic/tests/to-json-schema.test.ts +2182 -0
  154. package/src/v4/classic/tests/transform.test.ts +250 -0
  155. package/src/v4/classic/tests/tuple.test.ts +163 -0
  156. package/src/v4/classic/tests/union.test.ts +94 -0
  157. package/src/v4/classic/tests/validations.test.ts +283 -0
  158. package/src/v4/classic/tests/void.test.ts +12 -0
  159. package/src/v4/core/api.ts +1592 -0
  160. package/src/v4/core/checks.ts +1285 -0
  161. package/src/v4/core/config.ts +15 -0
  162. package/src/v4/core/core.ts +134 -0
  163. package/src/v4/core/doc.ts +44 -0
  164. package/src/v4/core/errors.ts +420 -0
  165. package/src/v4/core/function.ts +176 -0
  166. package/src/v4/core/index.ts +15 -0
  167. package/src/v4/core/json-schema.ts +143 -0
  168. package/src/v4/core/parse.ts +94 -0
  169. package/src/v4/core/regexes.ts +135 -0
  170. package/src/v4/core/registries.ts +86 -0
  171. package/src/v4/core/schemas.ts +3781 -0
  172. package/src/v4/core/standard-schema.ts +64 -0
  173. package/src/v4/core/tests/index.test.ts +46 -0
  174. package/src/v4/core/tests/locales/be.test.ts +124 -0
  175. package/src/v4/core/tests/locales/en.test.ts +22 -0
  176. package/src/v4/core/tests/locales/ru.test.ts +128 -0
  177. package/src/v4/core/tests/locales/tr.test.ts +69 -0
  178. package/src/v4/core/to-json-schema.ts +944 -0
  179. package/src/v4/core/util.ts +775 -0
  180. package/src/v4/core/versions.ts +5 -0
  181. package/src/v4/core/zsf.ts +323 -0
  182. package/src/v4/index.ts +4 -0
  183. package/src/v4/locales/ar.ts +125 -0
  184. package/src/v4/locales/az.ts +121 -0
  185. package/src/v4/locales/be.ts +184 -0
  186. package/src/v4/locales/ca.ts +127 -0
  187. package/src/v4/locales/cs.ts +142 -0
  188. package/src/v4/locales/de.ts +124 -0
  189. package/src/v4/locales/en.ts +127 -0
  190. package/src/v4/locales/eo.ts +125 -0
  191. package/src/v4/locales/es.ts +125 -0
  192. package/src/v4/locales/fa.ts +134 -0
  193. package/src/v4/locales/fi.ts +131 -0
  194. package/src/v4/locales/fr-CA.ts +126 -0
  195. package/src/v4/locales/fr.ts +124 -0
  196. package/src/v4/locales/he.ts +125 -0
  197. package/src/v4/locales/hu.ts +126 -0
  198. package/src/v4/locales/id.ts +125 -0
  199. package/src/v4/locales/index.ts +39 -0
  200. package/src/v4/locales/it.ts +125 -0
  201. package/src/v4/locales/ja.ts +122 -0
  202. package/src/v4/locales/kh.ts +126 -0
  203. package/src/v4/locales/ko.ts +131 -0
  204. package/src/v4/locales/mk.ts +127 -0
  205. package/src/v4/locales/ms.ts +124 -0
  206. package/src/v4/locales/nl.ts +126 -0
  207. package/src/v4/locales/no.ts +124 -0
  208. package/src/v4/locales/ota.ts +125 -0
  209. package/src/v4/locales/pl.ts +126 -0
  210. package/src/v4/locales/ps.ts +133 -0
  211. package/src/v4/locales/pt.ts +123 -0
  212. package/src/v4/locales/ru.ts +184 -0
  213. package/src/v4/locales/sl.ts +126 -0
  214. package/src/v4/locales/sv.ts +127 -0
  215. package/src/v4/locales/ta.ts +125 -0
  216. package/src/v4/locales/th.ts +126 -0
  217. package/src/v4/locales/tr.ts +121 -0
  218. package/src/v4/locales/ua.ts +126 -0
  219. package/src/v4/locales/ur.ts +126 -0
  220. package/src/v4/locales/vi.ts +125 -0
  221. package/src/v4/locales/zh-CN.ts +123 -0
  222. package/src/v4/locales/zh-TW.ts +125 -0
  223. package/src/v4/mini/checks.ts +32 -0
  224. package/src/v4/mini/coerce.ts +22 -0
  225. package/src/v4/mini/external.ts +40 -0
  226. package/src/v4/mini/index.ts +3 -0
  227. package/src/v4/mini/iso.ts +62 -0
  228. package/src/v4/mini/parse.ts +1 -0
  229. package/src/v4/mini/schemas.ts +1579 -0
  230. package/src/v4/mini/tests/assignability.test.ts +129 -0
  231. package/src/v4/mini/tests/brand.test.ts +51 -0
  232. package/src/v4/mini/tests/checks.test.ts +144 -0
  233. package/src/v4/mini/tests/computed.test.ts +36 -0
  234. package/src/v4/mini/tests/error.test.ts +22 -0
  235. package/src/v4/mini/tests/functions.test.ts +43 -0
  236. package/src/v4/mini/tests/index.test.ts +871 -0
  237. package/src/v4/mini/tests/number.test.ts +95 -0
  238. package/src/v4/mini/tests/object.test.ts +185 -0
  239. package/src/v4/mini/tests/prototypes.test.ts +43 -0
  240. package/src/v4/mini/tests/recursive-types.test.ts +275 -0
  241. package/src/v4/mini/tests/string.test.ts +293 -0
  242. package/src/v4-mini/index.ts +1 -0
  243. package/v4/classic/compat.cjs +1 -7
  244. package/v4/classic/compat.d.cts +0 -2
  245. package/v4/classic/compat.d.ts +0 -2
  246. package/v4/classic/compat.js +0 -6
  247. package/v4/classic/external.cjs +2 -1
  248. package/v4/classic/external.d.cts +1 -1
  249. package/v4/classic/external.d.ts +1 -1
  250. package/v4/classic/external.js +1 -1
  251. package/v4/classic/schemas.d.cts +4 -4
  252. package/v4/classic/schemas.d.ts +4 -4
  253. package/v4/core/api.cjs +11 -10
  254. package/v4/core/api.js +11 -10
  255. package/v4/core/checks.cjs +6 -4
  256. package/v4/core/checks.js +6 -4
  257. package/v4/core/core.cjs +5 -1
  258. package/v4/core/core.d.cts +2 -0
  259. package/v4/core/core.d.ts +2 -0
  260. package/v4/core/core.js +4 -0
  261. package/v4/core/schemas.cjs +12 -13
  262. package/v4/core/schemas.js +12 -13
  263. package/v4/core/util.cjs +3 -0
  264. package/v4/core/util.d.cts +1 -1
  265. package/v4/core/util.d.ts +1 -1
  266. package/v4/core/util.js +3 -0
  267. package/v4/locales/eo.cjs +144 -0
  268. package/v4/locales/eo.d.cts +5 -0
  269. package/v4/locales/eo.d.ts +5 -0
  270. package/v4/locales/eo.js +116 -0
  271. package/v4/locales/index.cjs +3 -1
  272. package/v4/locales/index.d.cts +1 -0
  273. package/v4/locales/index.d.ts +1 -0
  274. package/v4/locales/index.js +1 -0
  275. package/v4/mini/external.cjs +2 -1
  276. package/v4/mini/external.d.cts +1 -1
  277. package/v4/mini/external.d.ts +1 -1
  278. package/v4/mini/external.js +1 -1
@@ -0,0 +1,527 @@
1
+ import { expect, expectTypeOf, test } from "vitest";
2
+ import * as z from "zod/v4";
3
+
4
+ declare const iss: z.core.$ZodIssueCode;
5
+
6
+ const Test = z.object({
7
+ f1: z.number(),
8
+ f2: z.string().optional(),
9
+ f3: z.string().nullable(),
10
+ f4: z.array(z.object({ t: z.union([z.string(), z.boolean()]) })),
11
+ });
12
+ // type TestFlattenedErrors = core.inferFlattenedErrors<typeof Test, { message: string; code: number }>;
13
+ // type TestFormErrors = core.inferFlattenedErrors<typeof Test>;
14
+ const parsed = Test.safeParse({});
15
+
16
+ test("regular error", () => {
17
+ expect(parsed).toMatchInlineSnapshot(`
18
+ {
19
+ "error": [ZodError: [
20
+ {
21
+ "expected": "number",
22
+ "code": "invalid_type",
23
+ "path": [
24
+ "f1"
25
+ ],
26
+ "message": "Invalid input: expected number, received undefined"
27
+ },
28
+ {
29
+ "expected": "string",
30
+ "code": "invalid_type",
31
+ "path": [
32
+ "f3"
33
+ ],
34
+ "message": "Invalid input: expected string, received undefined"
35
+ },
36
+ {
37
+ "expected": "array",
38
+ "code": "invalid_type",
39
+ "path": [
40
+ "f4"
41
+ ],
42
+ "message": "Invalid input: expected array, received undefined"
43
+ }
44
+ ]],
45
+ "success": false,
46
+ }
47
+ `);
48
+ });
49
+
50
+ test(".flatten()", () => {
51
+ const flattened = parsed.error!.flatten();
52
+ // flattened.
53
+ expectTypeOf(flattened).toMatchTypeOf<{
54
+ formErrors: string[];
55
+ fieldErrors: {
56
+ f2?: string[];
57
+ f1?: string[];
58
+ f3?: string[];
59
+ f4?: string[];
60
+ };
61
+ }>();
62
+
63
+ expect(flattened).toMatchInlineSnapshot(`
64
+ {
65
+ "fieldErrors": {
66
+ "f1": [
67
+ "Invalid input: expected number, received undefined",
68
+ ],
69
+ "f3": [
70
+ "Invalid input: expected string, received undefined",
71
+ ],
72
+ "f4": [
73
+ "Invalid input: expected array, received undefined",
74
+ ],
75
+ },
76
+ "formErrors": [],
77
+ }
78
+ `);
79
+ });
80
+
81
+ test("custom .flatten()", () => {
82
+ type ErrorType = { message: string; code: number };
83
+ const flattened = parsed.error!.flatten((iss) => ({ message: iss.message, code: 1234 }));
84
+ expectTypeOf(flattened).toMatchTypeOf<{
85
+ formErrors: ErrorType[];
86
+ fieldErrors: {
87
+ f2?: ErrorType[];
88
+ f1?: ErrorType[];
89
+ f3?: ErrorType[];
90
+ f4?: ErrorType[];
91
+ };
92
+ }>();
93
+
94
+ expect(flattened).toMatchInlineSnapshot(`
95
+ {
96
+ "fieldErrors": {
97
+ "f1": [
98
+ {
99
+ "code": 1234,
100
+ "message": "Invalid input: expected number, received undefined",
101
+ },
102
+ ],
103
+ "f3": [
104
+ {
105
+ "code": 1234,
106
+ "message": "Invalid input: expected string, received undefined",
107
+ },
108
+ ],
109
+ "f4": [
110
+ {
111
+ "code": 1234,
112
+ "message": "Invalid input: expected array, received undefined",
113
+ },
114
+ ],
115
+ },
116
+ "formErrors": [],
117
+ }
118
+ `);
119
+ });
120
+
121
+ test(".format()", () => {
122
+ const formatted = parsed.error!.format();
123
+ expectTypeOf(formatted).toMatchTypeOf<{
124
+ _errors: string[];
125
+ f2?: { _errors: string[] };
126
+ f1?: { _errors: string[] };
127
+ f3?: { _errors: string[] };
128
+ f4?: {
129
+ [x: number]: {
130
+ _errors: string[];
131
+ t?: {
132
+ _errors: string[];
133
+ };
134
+ };
135
+ _errors: string[];
136
+ };
137
+ }>();
138
+
139
+ expect(formatted).toMatchInlineSnapshot(`
140
+ {
141
+ "_errors": [],
142
+ "f1": {
143
+ "_errors": [
144
+ "Invalid input: expected number, received undefined",
145
+ ],
146
+ },
147
+ "f3": {
148
+ "_errors": [
149
+ "Invalid input: expected string, received undefined",
150
+ ],
151
+ },
152
+ "f4": {
153
+ "_errors": [
154
+ "Invalid input: expected array, received undefined",
155
+ ],
156
+ },
157
+ }
158
+ `);
159
+ });
160
+
161
+ test("custom .format()", () => {
162
+ type ErrorType = { message: string; code: number };
163
+ const formatted = parsed.error!.format((iss) => ({ message: iss.message, code: 1234 }));
164
+ expectTypeOf(formatted).toMatchTypeOf<{
165
+ _errors: ErrorType[];
166
+ f2?: { _errors: ErrorType[] };
167
+ f1?: { _errors: ErrorType[] };
168
+ f3?: { _errors: ErrorType[] };
169
+ f4?: {
170
+ [x: number]: {
171
+ _errors: ErrorType[];
172
+ t?: {
173
+ _errors: ErrorType[];
174
+ };
175
+ };
176
+ _errors: ErrorType[];
177
+ };
178
+ }>();
179
+
180
+ expect(formatted).toMatchInlineSnapshot(`
181
+ {
182
+ "_errors": [],
183
+ "f1": {
184
+ "_errors": [
185
+ {
186
+ "code": 1234,
187
+ "message": "Invalid input: expected number, received undefined",
188
+ },
189
+ ],
190
+ },
191
+ "f3": {
192
+ "_errors": [
193
+ {
194
+ "code": 1234,
195
+ "message": "Invalid input: expected string, received undefined",
196
+ },
197
+ ],
198
+ },
199
+ "f4": {
200
+ "_errors": [
201
+ {
202
+ "code": 1234,
203
+ "message": "Invalid input: expected array, received undefined",
204
+ },
205
+ ],
206
+ },
207
+ }
208
+ `);
209
+ });
210
+
211
+ test("all errors", () => {
212
+ const propertySchema = z.string();
213
+ const schema = z
214
+ .object({
215
+ a: propertySchema,
216
+ b: propertySchema,
217
+ })
218
+ .refine(
219
+ (val) => {
220
+ return val.a === val.b;
221
+ },
222
+ { message: "Must be equal" }
223
+ );
224
+
225
+ const r1 = schema.safeParse({
226
+ a: "asdf",
227
+ b: "qwer",
228
+ });
229
+
230
+ expect(z.core.flattenError(r1.error!)).toEqual({
231
+ formErrors: ["Must be equal"],
232
+ fieldErrors: {},
233
+ });
234
+
235
+ const r2 = schema.safeParse({
236
+ a: null,
237
+ b: null,
238
+ });
239
+
240
+ // const error = _error as z.ZodError;
241
+ expect(z.core.flattenError(r2.error!)).toMatchInlineSnapshot(`
242
+ {
243
+ "fieldErrors": {
244
+ "a": [
245
+ "Invalid input: expected string, received null",
246
+ ],
247
+ "b": [
248
+ "Invalid input: expected string, received null",
249
+ ],
250
+ },
251
+ "formErrors": [],
252
+ }
253
+ `);
254
+
255
+ expect(z.core.flattenError(r2.error!, (iss) => iss.message.toUpperCase())).toMatchInlineSnapshot(`
256
+ {
257
+ "fieldErrors": {
258
+ "a": [
259
+ "INVALID INPUT: EXPECTED STRING, RECEIVED NULL",
260
+ ],
261
+ "b": [
262
+ "INVALID INPUT: EXPECTED STRING, RECEIVED NULL",
263
+ ],
264
+ },
265
+ "formErrors": [],
266
+ }
267
+ `);
268
+ // Test identity
269
+
270
+ expect(z.core.flattenError(r2.error!, (i: z.ZodIssue) => i)).toMatchInlineSnapshot(`
271
+ {
272
+ "fieldErrors": {
273
+ "a": [
274
+ {
275
+ "code": "invalid_type",
276
+ "expected": "string",
277
+ "message": "Invalid input: expected string, received null",
278
+ "path": [
279
+ "a",
280
+ ],
281
+ },
282
+ ],
283
+ "b": [
284
+ {
285
+ "code": "invalid_type",
286
+ "expected": "string",
287
+ "message": "Invalid input: expected string, received null",
288
+ "path": [
289
+ "b",
290
+ ],
291
+ },
292
+ ],
293
+ },
294
+ "formErrors": [],
295
+ }
296
+ `);
297
+
298
+ // Test mapping
299
+ const f1 = z.core.flattenError(r2.error!, (i: z.ZodIssue) => i.message.length);
300
+ expect(f1).toMatchInlineSnapshot(`
301
+ {
302
+ "fieldErrors": {
303
+ "a": [
304
+ 45,
305
+ ],
306
+ "b": [
307
+ 45,
308
+ ],
309
+ },
310
+ "formErrors": [],
311
+ }
312
+ `);
313
+ // expect(f1.fieldErrors.a![0]).toEqual("Invalid input: expected string".length);
314
+ // expect(f1).toMatchObject({
315
+ // formErrors: [],
316
+ // fieldErrors: {
317
+ // a: ["Invalid input: expected string".length],
318
+ // b: ["Invalid input: expected string".length],
319
+ // },
320
+ // });
321
+ });
322
+
323
+ const schema = z.strictObject({
324
+ username: z.string(),
325
+ favoriteNumbers: z.array(z.number()),
326
+ nesting: z.object({
327
+ a: z.string(),
328
+ }),
329
+ });
330
+ const result = schema.safeParse({
331
+ username: 1234,
332
+ favoriteNumbers: [1234, "4567"],
333
+ nesting: {
334
+ a: 123,
335
+ },
336
+ extra: 1234,
337
+ });
338
+
339
+ test("z.treeifyError", () => {
340
+ expect(z.treeifyError(result.error!)).toMatchInlineSnapshot(`
341
+ {
342
+ "errors": [
343
+ "Unrecognized key: "extra"",
344
+ ],
345
+ "properties": {
346
+ "favoriteNumbers": {
347
+ "errors": [],
348
+ "items": [
349
+ ,
350
+ {
351
+ "errors": [
352
+ "Invalid input: expected number, received string",
353
+ ],
354
+ },
355
+ ],
356
+ },
357
+ "nesting": {
358
+ "errors": [],
359
+ "properties": {
360
+ "a": {
361
+ "errors": [
362
+ "Invalid input: expected string, received number",
363
+ ],
364
+ },
365
+ },
366
+ },
367
+ "username": {
368
+ "errors": [
369
+ "Invalid input: expected string, received number",
370
+ ],
371
+ },
372
+ },
373
+ }
374
+ `);
375
+ });
376
+
377
+ test("z.treeifyError 2", () => {
378
+ const schema = z.strictObject({
379
+ name: z.string(),
380
+ logLevel: z.union([z.string(), z.number()]),
381
+ env: z.literal(["production", "development"]),
382
+ });
383
+
384
+ const data = {
385
+ name: 1000,
386
+ logLevel: false,
387
+ extra: 1000,
388
+ };
389
+
390
+ const result = schema.safeParse(data);
391
+ const err = z.treeifyError(result.error!);
392
+ expect(err).toMatchInlineSnapshot(`
393
+ {
394
+ "errors": [
395
+ "Unrecognized key: "extra"",
396
+ ],
397
+ "properties": {
398
+ "env": {
399
+ "errors": [
400
+ "Invalid option: expected one of "production"|"development"",
401
+ ],
402
+ },
403
+ "logLevel": {
404
+ "errors": [
405
+ "Invalid input: expected string, received boolean",
406
+ "Invalid input: expected number, received boolean",
407
+ ],
408
+ },
409
+ "name": {
410
+ "errors": [
411
+ "Invalid input: expected string, received number",
412
+ ],
413
+ },
414
+ },
415
+ }
416
+ `);
417
+ });
418
+
419
+ test("z.prettifyError", () => {
420
+ expect(z.prettifyError(result.error!)).toMatchInlineSnapshot(`
421
+ "✖ Unrecognized key: "extra"
422
+ ✖ Invalid input: expected string, received number
423
+ → at username
424
+ ✖ Invalid input: expected number, received string
425
+ → at favoriteNumbers[1]
426
+ ✖ Invalid input: expected string, received number
427
+ → at nesting.a"
428
+ `);
429
+ });
430
+
431
+ test("z.toDotPath", () => {
432
+ expect(z.core.toDotPath(["a", "b", 0, "c"])).toMatchInlineSnapshot(`"a.b[0].c"`);
433
+
434
+ expect(z.core.toDotPath(["a", Symbol("b"), 0, "c"])).toMatchInlineSnapshot(`"a["Symbol(b)"][0].c"`);
435
+
436
+ // Test with periods in keys
437
+ expect(z.core.toDotPath(["user.name", "first.last"])).toMatchInlineSnapshot(`"["user.name"]["first.last"]"`);
438
+
439
+ // Test with special characters
440
+ expect(z.core.toDotPath(["user", "$special", Symbol("#symbol")])).toMatchInlineSnapshot(
441
+ `"user.$special["Symbol(#symbol)"]"`
442
+ );
443
+
444
+ // Test with dots and quotes
445
+ expect(z.core.toDotPath(["search", `query("foo.bar"="abc")`])).toMatchInlineSnapshot(
446
+ `"search["query(\\"foo.bar\\"=\\"abc\\")"]"`
447
+ );
448
+
449
+ // Test with newlines
450
+ expect(z.core.toDotPath(["search", `foo\nbar`])).toMatchInlineSnapshot(`"search["foo\\nbar"]"`);
451
+
452
+ // Test with empty strings
453
+ expect(z.core.toDotPath(["", "empty"])).toMatchInlineSnapshot(`".empty"`);
454
+
455
+ // Test with array indices
456
+ expect(z.core.toDotPath(["items", 0, 1, 2])).toMatchInlineSnapshot(`"items[0][1][2]"`);
457
+
458
+ // Test with mixed path elements
459
+ expect(z.core.toDotPath(["users", "user.config", 0, "settings.theme"])).toMatchInlineSnapshot(
460
+ `"users["user.config"][0]["settings.theme"]"`
461
+ );
462
+
463
+ // Test with square brackets in keys
464
+ expect(z.core.toDotPath(["data[0]", "value"])).toMatchInlineSnapshot(`"["data[0]"].value"`);
465
+
466
+ // Test with empty path
467
+ expect(z.core.toDotPath([])).toMatchInlineSnapshot(`""`);
468
+ });
469
+
470
+ test("inheritance", () => {
471
+ const e1 = new z.ZodError([]);
472
+ expect(e1).toBeInstanceOf(z.core.$ZodError);
473
+ expect(e1).toBeInstanceOf(z.ZodError);
474
+ // expect(e1).not.toBeInstanceOf(Error);
475
+
476
+ const e2 = new z.ZodRealError([]);
477
+ expect(e2).toBeInstanceOf(z.ZodError);
478
+ expect(e2).toBeInstanceOf(z.ZodRealError);
479
+ expect(e2).toBeInstanceOf(Error);
480
+ });
481
+
482
+ test("disc union treeify/format", () => {
483
+ const schema = z.discriminatedUnion(
484
+ "foo",
485
+ [
486
+ z.object({
487
+ foo: z.literal("x"),
488
+ x: z.string(),
489
+ }),
490
+ z.object({
491
+ foo: z.literal("y"),
492
+ y: z.string(),
493
+ }),
494
+ ],
495
+ {
496
+ error: "Invalid discriminator",
497
+ }
498
+ );
499
+
500
+ const error = schema.safeParse({ foo: "invalid" }).error;
501
+ expect(z.treeifyError(error!)).toMatchInlineSnapshot(`
502
+ {
503
+ "errors": [],
504
+ "properties": {
505
+ "foo": {
506
+ "errors": [
507
+ "Invalid discriminator",
508
+ ],
509
+ },
510
+ },
511
+ }
512
+ `);
513
+ expect(z.prettifyError(error!)).toMatchInlineSnapshot(`
514
+ "✖ Invalid discriminator
515
+ → at foo"
516
+ `);
517
+ expect(z.formatError(error!)).toMatchInlineSnapshot(`
518
+ {
519
+ "_errors": [],
520
+ "foo": {
521
+ "_errors": [
522
+ "Invalid discriminator",
523
+ ],
524
+ },
525
+ }
526
+ `);
527
+ });