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

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 (269) 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/es.ts +125 -0
  191. package/src/v4/locales/fa.ts +134 -0
  192. package/src/v4/locales/fi.ts +131 -0
  193. package/src/v4/locales/fr-CA.ts +126 -0
  194. package/src/v4/locales/fr.ts +124 -0
  195. package/src/v4/locales/he.ts +125 -0
  196. package/src/v4/locales/hu.ts +126 -0
  197. package/src/v4/locales/id.ts +125 -0
  198. package/src/v4/locales/index.ts +38 -0
  199. package/src/v4/locales/it.ts +125 -0
  200. package/src/v4/locales/ja.ts +122 -0
  201. package/src/v4/locales/kh.ts +126 -0
  202. package/src/v4/locales/ko.ts +131 -0
  203. package/src/v4/locales/mk.ts +127 -0
  204. package/src/v4/locales/ms.ts +124 -0
  205. package/src/v4/locales/nl.ts +126 -0
  206. package/src/v4/locales/no.ts +124 -0
  207. package/src/v4/locales/ota.ts +125 -0
  208. package/src/v4/locales/pl.ts +126 -0
  209. package/src/v4/locales/ps.ts +133 -0
  210. package/src/v4/locales/pt.ts +123 -0
  211. package/src/v4/locales/ru.ts +184 -0
  212. package/src/v4/locales/sl.ts +126 -0
  213. package/src/v4/locales/sv.ts +127 -0
  214. package/src/v4/locales/ta.ts +125 -0
  215. package/src/v4/locales/th.ts +126 -0
  216. package/src/v4/locales/tr.ts +121 -0
  217. package/src/v4/locales/ua.ts +126 -0
  218. package/src/v4/locales/ur.ts +126 -0
  219. package/src/v4/locales/vi.ts +125 -0
  220. package/src/v4/locales/zh-CN.ts +123 -0
  221. package/src/v4/locales/zh-TW.ts +125 -0
  222. package/src/v4/mini/checks.ts +32 -0
  223. package/src/v4/mini/coerce.ts +22 -0
  224. package/src/v4/mini/external.ts +40 -0
  225. package/src/v4/mini/index.ts +3 -0
  226. package/src/v4/mini/iso.ts +62 -0
  227. package/src/v4/mini/parse.ts +1 -0
  228. package/src/v4/mini/schemas.ts +1579 -0
  229. package/src/v4/mini/tests/assignability.test.ts +129 -0
  230. package/src/v4/mini/tests/brand.test.ts +51 -0
  231. package/src/v4/mini/tests/checks.test.ts +144 -0
  232. package/src/v4/mini/tests/computed.test.ts +36 -0
  233. package/src/v4/mini/tests/error.test.ts +22 -0
  234. package/src/v4/mini/tests/functions.test.ts +43 -0
  235. package/src/v4/mini/tests/index.test.ts +871 -0
  236. package/src/v4/mini/tests/number.test.ts +95 -0
  237. package/src/v4/mini/tests/object.test.ts +185 -0
  238. package/src/v4/mini/tests/prototypes.test.ts +43 -0
  239. package/src/v4/mini/tests/recursive-types.test.ts +275 -0
  240. package/src/v4/mini/tests/string.test.ts +293 -0
  241. package/src/v4-mini/index.ts +1 -0
  242. package/v4/classic/compat.cjs +1 -7
  243. package/v4/classic/compat.d.cts +0 -2
  244. package/v4/classic/compat.d.ts +0 -2
  245. package/v4/classic/compat.js +0 -6
  246. package/v4/classic/external.cjs +2 -1
  247. package/v4/classic/external.d.cts +1 -1
  248. package/v4/classic/external.d.ts +1 -1
  249. package/v4/classic/external.js +1 -1
  250. package/v4/classic/schemas.d.cts +4 -4
  251. package/v4/classic/schemas.d.ts +4 -4
  252. package/v4/core/api.cjs +11 -10
  253. package/v4/core/api.js +11 -10
  254. package/v4/core/checks.cjs +6 -4
  255. package/v4/core/checks.js +6 -4
  256. package/v4/core/core.cjs +5 -1
  257. package/v4/core/core.d.cts +2 -0
  258. package/v4/core/core.d.ts +2 -0
  259. package/v4/core/core.js +4 -0
  260. package/v4/core/schemas.cjs +12 -13
  261. package/v4/core/schemas.js +12 -13
  262. package/v4/core/util.cjs +3 -0
  263. package/v4/core/util.d.cts +1 -1
  264. package/v4/core/util.d.ts +1 -1
  265. package/v4/core/util.js +3 -0
  266. package/v4/mini/external.cjs +2 -1
  267. package/v4/mini/external.d.cts +1 -1
  268. package/v4/mini/external.d.ts +1 -1
  269. package/v4/mini/external.js +1 -1
@@ -0,0 +1,69 @@
1
+ import Benchmark from "benchmark";
2
+
3
+ import { z } from "zod/v3";
4
+
5
+ const emptySuite = new Benchmark.Suite("z.object: empty");
6
+ const shortSuite = new Benchmark.Suite("z.object: short");
7
+ const longSuite = new Benchmark.Suite("z.object: long");
8
+
9
+ const empty = z.object({});
10
+ const short = z.object({
11
+ string: z.string(),
12
+ });
13
+ const long = z.object({
14
+ string: z.string(),
15
+ number: z.number(),
16
+ boolean: z.boolean(),
17
+ });
18
+
19
+ emptySuite
20
+ .add("valid", () => {
21
+ empty.parse({});
22
+ })
23
+ .add("valid: extra keys", () => {
24
+ empty.parse({ string: "string" });
25
+ })
26
+ .add("invalid: null", () => {
27
+ try {
28
+ empty.parse(null);
29
+ } catch (_err) {}
30
+ })
31
+ .on("cycle", (e: Benchmark.Event) => {
32
+ console.log(`${(emptySuite as any).name}: ${e.target}`);
33
+ });
34
+
35
+ shortSuite
36
+ .add("valid", () => {
37
+ short.parse({ string: "string" });
38
+ })
39
+ .add("valid: extra keys", () => {
40
+ short.parse({ string: "string", number: 42 });
41
+ })
42
+ .add("invalid: null", () => {
43
+ try {
44
+ short.parse(null);
45
+ } catch (_err) {}
46
+ })
47
+ .on("cycle", (e: Benchmark.Event) => {
48
+ console.log(`${(shortSuite as any).name}: ${e.target}`);
49
+ });
50
+
51
+ longSuite
52
+ .add("valid", () => {
53
+ long.parse({ string: "string", number: 42, boolean: true });
54
+ })
55
+ .add("valid: extra keys", () => {
56
+ long.parse({ string: "string", number: 42, boolean: true, list: [] });
57
+ })
58
+ .add("invalid: null", () => {
59
+ try {
60
+ long.parse(null);
61
+ } catch (_err) {}
62
+ })
63
+ .on("cycle", (e: Benchmark.Event) => {
64
+ console.log(`${(longSuite as any).name}: ${e.target}`);
65
+ });
66
+
67
+ export default {
68
+ suites: [emptySuite, shortSuite, longSuite],
69
+ };
@@ -0,0 +1,162 @@
1
+ import Benchmark from "benchmark";
2
+
3
+ import { z } from "zod/v3";
4
+ import { Mocker } from "../tests/Mocker.js";
5
+
6
+ const val = new Mocker();
7
+
8
+ const enumSuite = new Benchmark.Suite("z.enum");
9
+ const enumSchema = z.enum(["a", "b", "c"]);
10
+
11
+ enumSuite
12
+ .add("valid", () => {
13
+ enumSchema.parse("a");
14
+ })
15
+ .add("invalid", () => {
16
+ try {
17
+ enumSchema.parse("x");
18
+ } catch (_e: any) {}
19
+ })
20
+ .on("cycle", (e: Benchmark.Event) => {
21
+ console.log(`z.enum: ${e.target}`);
22
+ });
23
+
24
+ const longEnumSuite = new Benchmark.Suite("long z.enum");
25
+ const longEnumSchema = z.enum([
26
+ "one",
27
+ "two",
28
+ "three",
29
+ "four",
30
+ "five",
31
+ "six",
32
+ "seven",
33
+ "eight",
34
+ "nine",
35
+ "ten",
36
+ "eleven",
37
+ "twelve",
38
+ "thirteen",
39
+ "fourteen",
40
+ "fifteen",
41
+ "sixteen",
42
+ "seventeen",
43
+ ]);
44
+
45
+ longEnumSuite
46
+ .add("valid", () => {
47
+ longEnumSchema.parse("five");
48
+ })
49
+ .add("invalid", () => {
50
+ try {
51
+ longEnumSchema.parse("invalid");
52
+ } catch (_e: any) {}
53
+ })
54
+ .on("cycle", (e: Benchmark.Event) => {
55
+ console.log(`long z.enum: ${e.target}`);
56
+ });
57
+
58
+ const undefinedSuite = new Benchmark.Suite("z.undefined");
59
+ const undefinedSchema = z.undefined();
60
+
61
+ undefinedSuite
62
+ .add("valid", () => {
63
+ undefinedSchema.parse(undefined);
64
+ })
65
+ .add("invalid", () => {
66
+ try {
67
+ undefinedSchema.parse(1);
68
+ } catch (_e: any) {}
69
+ })
70
+ .on("cycle", (e: Benchmark.Event) => {
71
+ console.log(`z.undefined: ${e.target}`);
72
+ });
73
+
74
+ const literalSuite = new Benchmark.Suite("z.literal");
75
+ const short = "short";
76
+ const bad = "bad";
77
+ const literalSchema = z.literal("short");
78
+
79
+ literalSuite
80
+ .add("valid", () => {
81
+ literalSchema.parse(short);
82
+ })
83
+ .add("invalid", () => {
84
+ try {
85
+ literalSchema.parse(bad);
86
+ } catch (_e: any) {}
87
+ })
88
+ .on("cycle", (e: Benchmark.Event) => {
89
+ console.log(`z.literal: ${e.target}`);
90
+ });
91
+
92
+ const numberSuite = new Benchmark.Suite("z.number");
93
+ const numberSchema = z.number().int();
94
+
95
+ numberSuite
96
+ .add("valid", () => {
97
+ numberSchema.parse(1);
98
+ })
99
+ .add("invalid type", () => {
100
+ try {
101
+ numberSchema.parse("bad");
102
+ } catch (_e: any) {}
103
+ })
104
+ .add("invalid number", () => {
105
+ try {
106
+ numberSchema.parse(0.5);
107
+ } catch (_e: any) {}
108
+ })
109
+ .on("cycle", (e: Benchmark.Event) => {
110
+ console.log(`z.number: ${e.target}`);
111
+ });
112
+
113
+ const dateSuite = new Benchmark.Suite("z.date");
114
+
115
+ const plainDate = z.date();
116
+ const minMaxDate = z.date().min(new Date("2021-01-01")).max(new Date("2030-01-01"));
117
+
118
+ dateSuite
119
+ .add("valid", () => {
120
+ plainDate.parse(new Date());
121
+ })
122
+ .add("invalid", () => {
123
+ try {
124
+ plainDate.parse(1);
125
+ } catch (_e: any) {}
126
+ })
127
+ .add("valid min and max", () => {
128
+ minMaxDate.parse(new Date("2023-01-01"));
129
+ })
130
+ .add("invalid min", () => {
131
+ try {
132
+ minMaxDate.parse(new Date("2019-01-01"));
133
+ } catch (_e: any) {}
134
+ })
135
+ .add("invalid max", () => {
136
+ try {
137
+ minMaxDate.parse(new Date("2031-01-01"));
138
+ } catch (_e: any) {}
139
+ })
140
+ .on("cycle", (e: Benchmark.Event) => {
141
+ console.log(`z.date: ${e.target}`);
142
+ });
143
+
144
+ const symbolSuite = new Benchmark.Suite("z.symbol");
145
+ const symbolSchema = z.symbol();
146
+
147
+ symbolSuite
148
+ .add("valid", () => {
149
+ symbolSchema.parse(val.symbol);
150
+ })
151
+ .add("invalid", () => {
152
+ try {
153
+ symbolSchema.parse(1);
154
+ } catch (_e: any) {}
155
+ })
156
+ .on("cycle", (e: Benchmark.Event) => {
157
+ console.log(`z.symbol: ${e.target}`);
158
+ });
159
+
160
+ export default {
161
+ suites: [enumSuite, longEnumSuite, undefinedSuite, literalSuite, numberSuite, dateSuite, symbolSuite],
162
+ };
@@ -0,0 +1,63 @@
1
+ import Benchmark from "benchmark";
2
+
3
+ import { z } from "zod/v3";
4
+
5
+ const shortSuite = new Benchmark.Suite("realworld");
6
+
7
+ const People = z.array(
8
+ z.object({
9
+ type: z.literal("person"),
10
+ hair: z.enum(["blue", "brown"]),
11
+ active: z.boolean(),
12
+ name: z.string(),
13
+ age: z.number().int(),
14
+ hobbies: z.array(z.string()),
15
+ address: z.object({
16
+ street: z.string(),
17
+ zip: z.string(),
18
+ country: z.string(),
19
+ }),
20
+ })
21
+ );
22
+
23
+ let i = 0;
24
+
25
+ function num() {
26
+ return ++i;
27
+ }
28
+
29
+ function str() {
30
+ return (++i % 100).toString(16);
31
+ }
32
+
33
+ function array<T>(fn: () => T): T[] {
34
+ return Array.from({ length: ++i % 10 }, () => fn());
35
+ }
36
+
37
+ const people = Array.from({ length: 100 }, () => {
38
+ return {
39
+ type: "person",
40
+ hair: i % 2 ? "blue" : "brown",
41
+ active: !!(i % 2),
42
+ name: str(),
43
+ age: num(),
44
+ hobbies: array(str),
45
+ address: {
46
+ street: str(),
47
+ zip: str(),
48
+ country: str(),
49
+ },
50
+ };
51
+ });
52
+
53
+ shortSuite
54
+ .add("valid", () => {
55
+ People.parse(people);
56
+ })
57
+ .on("cycle", (e: Benchmark.Event) => {
58
+ console.log(`${(shortSuite as any).name}: ${e.target}`);
59
+ });
60
+
61
+ export default {
62
+ suites: [shortSuite],
63
+ };
@@ -0,0 +1,55 @@
1
+ import Benchmark from "benchmark";
2
+
3
+ import { z } from "zod/v3";
4
+
5
+ const SUITE_NAME = "z.string";
6
+ const suite = new Benchmark.Suite(SUITE_NAME);
7
+
8
+ const empty = "";
9
+ const short = "short";
10
+ const long = "long".repeat(256);
11
+ const manual = (str: unknown) => {
12
+ if (typeof str !== "string") {
13
+ throw new Error("Not a string");
14
+ }
15
+
16
+ return str;
17
+ };
18
+ const stringSchema = z.string();
19
+ const optionalStringSchema = z.string().optional();
20
+ const optionalNullableStringSchema = z.string().optional().nullable();
21
+
22
+ suite
23
+ .add("empty string", () => {
24
+ stringSchema.parse(empty);
25
+ })
26
+ .add("short string", () => {
27
+ stringSchema.parse(short);
28
+ })
29
+ .add("long string", () => {
30
+ stringSchema.parse(long);
31
+ })
32
+ .add("optional string", () => {
33
+ optionalStringSchema.parse(long);
34
+ })
35
+ .add("nullable string", () => {
36
+ optionalNullableStringSchema.parse(long);
37
+ })
38
+ .add("nullable (null) string", () => {
39
+ optionalNullableStringSchema.parse(null);
40
+ })
41
+ .add("invalid: null", () => {
42
+ try {
43
+ stringSchema.parse(null);
44
+ } catch (_err) {}
45
+ })
46
+ .add("manual parser: long", () => {
47
+ manual(long);
48
+ })
49
+ .on("cycle", (e: Benchmark.Event) => {
50
+ console.log(`${SUITE_NAME}: ${e.target}`);
51
+ });
52
+
53
+ export default {
54
+ suites: [suite],
55
+ };
@@ -0,0 +1,80 @@
1
+ import Benchmark from "benchmark";
2
+
3
+ import { z } from "zod/v3";
4
+
5
+ const doubleSuite = new Benchmark.Suite("z.union: double");
6
+ const manySuite = new Benchmark.Suite("z.union: many");
7
+
8
+ const aSchema = z.object({
9
+ type: z.literal("a"),
10
+ });
11
+ const objA = {
12
+ type: "a",
13
+ };
14
+
15
+ const bSchema = z.object({
16
+ type: z.literal("b"),
17
+ });
18
+ const objB = {
19
+ type: "b",
20
+ };
21
+
22
+ const cSchema = z.object({
23
+ type: z.literal("c"),
24
+ });
25
+ const objC = {
26
+ type: "c",
27
+ };
28
+
29
+ const dSchema = z.object({
30
+ type: z.literal("d"),
31
+ });
32
+
33
+ const double = z.union([aSchema, bSchema]);
34
+ const many = z.union([aSchema, bSchema, cSchema, dSchema]);
35
+
36
+ doubleSuite
37
+ .add("valid: a", () => {
38
+ double.parse(objA);
39
+ })
40
+ .add("valid: b", () => {
41
+ double.parse(objB);
42
+ })
43
+ .add("invalid: null", () => {
44
+ try {
45
+ double.parse(null);
46
+ } catch (_err) {}
47
+ })
48
+ .add("invalid: wrong shape", () => {
49
+ try {
50
+ double.parse(objC);
51
+ } catch (_err) {}
52
+ })
53
+ .on("cycle", (e: Benchmark.Event) => {
54
+ console.log(`${(doubleSuite as any).name}: ${e.target}`);
55
+ });
56
+
57
+ manySuite
58
+ .add("valid: a", () => {
59
+ many.parse(objA);
60
+ })
61
+ .add("valid: c", () => {
62
+ many.parse(objC);
63
+ })
64
+ .add("invalid: null", () => {
65
+ try {
66
+ many.parse(null);
67
+ } catch (_err) {}
68
+ })
69
+ .add("invalid: wrong shape", () => {
70
+ try {
71
+ many.parse({ type: "unknown" });
72
+ } catch (_err) {}
73
+ })
74
+ .on("cycle", (e: Benchmark.Event) => {
75
+ console.log(`${(manySuite as any).name}: ${e.target}`);
76
+ });
77
+
78
+ export default {
79
+ suites: [doubleSuite, manySuite],
80
+ };
@@ -0,0 +1,13 @@
1
+ import type { ZodErrorMap } from "./ZodError.js";
2
+ import defaultErrorMap from "./locales/en.js";
3
+
4
+ let overrideErrorMap = defaultErrorMap;
5
+ export { defaultErrorMap };
6
+
7
+ export function setErrorMap(map: ZodErrorMap) {
8
+ overrideErrorMap = map;
9
+ }
10
+
11
+ export function getErrorMap() {
12
+ return overrideErrorMap;
13
+ }
@@ -0,0 +1,6 @@
1
+ export * from "./errors.js";
2
+ export * from "./helpers/parseUtil.js";
3
+ export * from "./helpers/typeAliases.js";
4
+ export * from "./helpers/util.js";
5
+ export * from "./types.js";
6
+ export * from "./ZodError.js";
@@ -0,0 +1,17 @@
1
+ export namespace enumUtil {
2
+ type UnionToIntersectionFn<T> = (T extends unknown ? (k: () => T) => void : never) extends (
3
+ k: infer Intersection
4
+ ) => void
5
+ ? Intersection
6
+ : never;
7
+
8
+ type GetUnionLast<T> = UnionToIntersectionFn<T> extends () => infer Last ? Last : never;
9
+
10
+ type UnionToTuple<T, Tuple extends unknown[] = []> = [T] extends [never]
11
+ ? Tuple
12
+ : UnionToTuple<Exclude<T, GetUnionLast<T>>, [GetUnionLast<T>, ...Tuple]>;
13
+
14
+ type CastToStringTuple<T> = T extends [string, ...string[]] ? T : never;
15
+
16
+ export type UnionToTupleString<T> = CastToStringTuple<UnionToTuple<T>>;
17
+ }
@@ -0,0 +1,8 @@
1
+ export namespace errorUtil {
2
+ export type ErrMessage = string | { message?: string | undefined };
3
+ export const errToObj = (message?: ErrMessage): { message?: string | undefined } =>
4
+ typeof message === "string" ? { message } : message || {};
5
+ // biome-ignore lint:
6
+ export const toString = (message?: ErrMessage): string | undefined =>
7
+ typeof message === "string" ? message : message?.message;
8
+ }
@@ -0,0 +1,176 @@
1
+ import type { IssueData, ZodErrorMap, ZodIssue } from "../ZodError.js";
2
+ import { getErrorMap } from "../errors.js";
3
+ import defaultErrorMap from "../locales/en.js";
4
+ import type { ZodParsedType } from "./util.js";
5
+
6
+ export const makeIssue = (params: {
7
+ data: any;
8
+ path: (string | number)[];
9
+ errorMaps: ZodErrorMap[];
10
+ issueData: IssueData;
11
+ }): ZodIssue => {
12
+ const { data, path, errorMaps, issueData } = params;
13
+ const fullPath = [...path, ...(issueData.path || [])];
14
+ const fullIssue = {
15
+ ...issueData,
16
+ path: fullPath,
17
+ };
18
+
19
+ if (issueData.message !== undefined) {
20
+ return {
21
+ ...issueData,
22
+ path: fullPath,
23
+ message: issueData.message,
24
+ };
25
+ }
26
+
27
+ let errorMessage = "";
28
+ const maps = errorMaps
29
+ .filter((m) => !!m)
30
+ .slice()
31
+ .reverse();
32
+ for (const map of maps) {
33
+ errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;
34
+ }
35
+
36
+ return {
37
+ ...issueData,
38
+ path: fullPath,
39
+ message: errorMessage,
40
+ };
41
+ };
42
+
43
+ export type ParseParams = {
44
+ path: (string | number)[];
45
+ errorMap: ZodErrorMap;
46
+ async: boolean;
47
+ };
48
+
49
+ export type ParsePathComponent = string | number;
50
+ export type ParsePath = ParsePathComponent[];
51
+ export const EMPTY_PATH: ParsePath = [];
52
+
53
+ export interface ParseContext {
54
+ readonly common: {
55
+ readonly issues: ZodIssue[];
56
+ readonly contextualErrorMap?: ZodErrorMap | undefined;
57
+ readonly async: boolean;
58
+ };
59
+ readonly path: ParsePath;
60
+ readonly schemaErrorMap?: ZodErrorMap | undefined;
61
+ readonly parent: ParseContext | null;
62
+ readonly data: any;
63
+ readonly parsedType: ZodParsedType;
64
+ }
65
+
66
+ export type ParseInput = {
67
+ data: any;
68
+ path: (string | number)[];
69
+ parent: ParseContext;
70
+ };
71
+
72
+ export function addIssueToContext(ctx: ParseContext, issueData: IssueData): void {
73
+ const overrideMap = getErrorMap();
74
+ const issue = makeIssue({
75
+ issueData: issueData,
76
+ data: ctx.data,
77
+ path: ctx.path,
78
+ errorMaps: [
79
+ ctx.common.contextualErrorMap, // contextual error map is first priority
80
+ ctx.schemaErrorMap, // then schema-bound map if available
81
+ overrideMap, // then global override map
82
+ overrideMap === defaultErrorMap ? undefined : defaultErrorMap, // then global default map
83
+ ].filter((x) => !!x),
84
+ });
85
+ ctx.common.issues.push(issue);
86
+ }
87
+
88
+ export type ObjectPair = {
89
+ key: SyncParseReturnType<any>;
90
+ value: SyncParseReturnType<any>;
91
+ };
92
+ export class ParseStatus {
93
+ value: "aborted" | "dirty" | "valid" = "valid";
94
+ dirty(): void {
95
+ if (this.value === "valid") this.value = "dirty";
96
+ }
97
+ abort(): void {
98
+ if (this.value !== "aborted") this.value = "aborted";
99
+ }
100
+
101
+ static mergeArray(status: ParseStatus, results: SyncParseReturnType<any>[]): SyncParseReturnType {
102
+ const arrayValue: any[] = [];
103
+ for (const s of results) {
104
+ if (s.status === "aborted") return INVALID;
105
+ if (s.status === "dirty") status.dirty();
106
+ arrayValue.push(s.value);
107
+ }
108
+
109
+ return { status: status.value, value: arrayValue };
110
+ }
111
+
112
+ static async mergeObjectAsync(
113
+ status: ParseStatus,
114
+ pairs: { key: ParseReturnType<any>; value: ParseReturnType<any> }[]
115
+ ): Promise<SyncParseReturnType<any>> {
116
+ const syncPairs: ObjectPair[] = [];
117
+ for (const pair of pairs) {
118
+ const key = await pair.key;
119
+ const value = await pair.value;
120
+ syncPairs.push({
121
+ key,
122
+ value,
123
+ });
124
+ }
125
+ return ParseStatus.mergeObjectSync(status, syncPairs);
126
+ }
127
+
128
+ static mergeObjectSync(
129
+ status: ParseStatus,
130
+ pairs: {
131
+ key: SyncParseReturnType<any>;
132
+ value: SyncParseReturnType<any>;
133
+ alwaysSet?: boolean;
134
+ }[]
135
+ ): SyncParseReturnType {
136
+ const finalObject: any = {};
137
+ for (const pair of pairs) {
138
+ const { key, value } = pair;
139
+ if (key.status === "aborted") return INVALID;
140
+ if (value.status === "aborted") return INVALID;
141
+ if (key.status === "dirty") status.dirty();
142
+ if (value.status === "dirty") status.dirty();
143
+
144
+ if (key.value !== "__proto__" && (typeof value.value !== "undefined" || pair.alwaysSet)) {
145
+ finalObject[key.value] = value.value;
146
+ }
147
+ }
148
+
149
+ return { status: status.value, value: finalObject };
150
+ }
151
+ }
152
+ export interface ParseResult {
153
+ status: "aborted" | "dirty" | "valid";
154
+ data: any;
155
+ }
156
+
157
+ export type INVALID = { status: "aborted" };
158
+ export const INVALID: INVALID = Object.freeze({
159
+ status: "aborted",
160
+ });
161
+
162
+ export type DIRTY<T> = { status: "dirty"; value: T };
163
+ export const DIRTY = <T>(value: T): DIRTY<T> => ({ status: "dirty", value });
164
+
165
+ export type OK<T> = { status: "valid"; value: T };
166
+ export const OK = <T>(value: T): OK<T> => ({ status: "valid", value });
167
+
168
+ export type SyncParseReturnType<T = any> = OK<T> | DIRTY<T> | INVALID;
169
+ export type AsyncParseReturnType<T> = Promise<SyncParseReturnType<T>>;
170
+ export type ParseReturnType<T> = SyncParseReturnType<T> | AsyncParseReturnType<T>;
171
+
172
+ export const isAborted = (x: ParseReturnType<any>): x is INVALID => (x as any).status === "aborted";
173
+ export const isDirty = <T>(x: ParseReturnType<T>): x is OK<T> | DIRTY<T> => (x as any).status === "dirty";
174
+ export const isValid = <T>(x: ParseReturnType<T>): x is OK<T> => (x as any).status === "valid";
175
+ export const isAsync = <T>(x: ParseReturnType<T>): x is AsyncParseReturnType<T> =>
176
+ typeof Promise !== "undefined" && x instanceof Promise;
@@ -0,0 +1,34 @@
1
+ import type {
2
+ ZodArray,
3
+ ZodNullable,
4
+ ZodObject,
5
+ ZodOptional,
6
+ ZodRawShape,
7
+ ZodTuple,
8
+ ZodTupleItems,
9
+ ZodTypeAny,
10
+ } from "../types.js";
11
+
12
+ export namespace partialUtil {
13
+ export type DeepPartial<T extends ZodTypeAny> = T extends ZodObject<ZodRawShape>
14
+ ? ZodObject<
15
+ { [k in keyof T["shape"]]: ZodOptional<DeepPartial<T["shape"][k]>> },
16
+ T["_def"]["unknownKeys"],
17
+ T["_def"]["catchall"]
18
+ >
19
+ : T extends ZodArray<infer Type, infer Card>
20
+ ? ZodArray<DeepPartial<Type>, Card>
21
+ : T extends ZodOptional<infer Type>
22
+ ? ZodOptional<DeepPartial<Type>>
23
+ : T extends ZodNullable<infer Type>
24
+ ? ZodNullable<DeepPartial<Type>>
25
+ : T extends ZodTuple<infer Items>
26
+ ? {
27
+ [k in keyof Items]: Items[k] extends ZodTypeAny ? DeepPartial<Items[k]> : never;
28
+ } extends infer PI
29
+ ? PI extends ZodTupleItems
30
+ ? ZodTuple<PI>
31
+ : never
32
+ : never
33
+ : T;
34
+ }
@@ -0,0 +1,2 @@
1
+ export type Primitive = string | number | symbol | bigint | boolean | null | undefined;
2
+ export type Scalars = Primitive | Primitive[];