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,176 @@
1
+ // @ts-ignore TS6133
2
+ import { expect, test } from "vitest";
3
+
4
+ import * as z from "zod/v3";
5
+
6
+ const gtFive = z.number().gt(5);
7
+ const gteFive = z.number().gte(-5).gte(5);
8
+ const minFive = z.number().min(0).min(5);
9
+ const ltFive = z.number().lte(10).lt(5);
10
+ const lteFive = z.number().lte(5);
11
+ const maxFive = z.number().max(10).max(5);
12
+ const intNum = z.number().int();
13
+ const positive = z.number().positive();
14
+ const negative = z.number().negative();
15
+ const nonpositive = z.number().nonpositive();
16
+ const nonnegative = z.number().nonnegative();
17
+ const multipleOfFive = z.number().multipleOf(5);
18
+ const multipleOfNegativeFive = z.number().multipleOf(-5);
19
+ const finite = z.number().finite();
20
+ const safe = z.number().safe();
21
+ const stepPointOne = z.number().step(0.1);
22
+ const stepPointZeroZeroZeroOne = z.number().step(0.0001);
23
+ const stepSixPointFour = z.number().step(6.4);
24
+
25
+ test("passing validations", () => {
26
+ z.number().parse(1);
27
+ z.number().parse(1.5);
28
+ z.number().parse(0);
29
+ z.number().parse(-1.5);
30
+ z.number().parse(-1);
31
+ z.number().parse(Number.POSITIVE_INFINITY);
32
+ z.number().parse(Number.NEGATIVE_INFINITY);
33
+ gtFive.parse(6);
34
+ gtFive.parse(Number.POSITIVE_INFINITY);
35
+ gteFive.parse(5);
36
+ gteFive.parse(Number.POSITIVE_INFINITY);
37
+ minFive.parse(5);
38
+ minFive.parse(Number.POSITIVE_INFINITY);
39
+ ltFive.parse(4);
40
+ ltFive.parse(Number.NEGATIVE_INFINITY);
41
+ lteFive.parse(5);
42
+ lteFive.parse(Number.NEGATIVE_INFINITY);
43
+ maxFive.parse(5);
44
+ maxFive.parse(Number.NEGATIVE_INFINITY);
45
+ intNum.parse(4);
46
+ positive.parse(1);
47
+ positive.parse(Number.POSITIVE_INFINITY);
48
+ negative.parse(-1);
49
+ negative.parse(Number.NEGATIVE_INFINITY);
50
+ nonpositive.parse(0);
51
+ nonpositive.parse(-1);
52
+ nonpositive.parse(Number.NEGATIVE_INFINITY);
53
+ nonnegative.parse(0);
54
+ nonnegative.parse(1);
55
+ nonnegative.parse(Number.POSITIVE_INFINITY);
56
+ multipleOfFive.parse(15);
57
+ multipleOfFive.parse(-15);
58
+ multipleOfNegativeFive.parse(-15);
59
+ multipleOfNegativeFive.parse(15);
60
+ finite.parse(123);
61
+ safe.parse(Number.MIN_SAFE_INTEGER);
62
+ safe.parse(Number.MAX_SAFE_INTEGER);
63
+ stepPointOne.parse(6);
64
+ stepPointOne.parse(6.1);
65
+ stepPointOne.parse(6.1);
66
+ stepSixPointFour.parse(12.8);
67
+ stepPointZeroZeroZeroOne.parse(3.01);
68
+ });
69
+
70
+ test("failing validations", () => {
71
+ expect(() => ltFive.parse(5)).toThrow();
72
+ expect(() => lteFive.parse(6)).toThrow();
73
+ expect(() => maxFive.parse(6)).toThrow();
74
+ expect(() => gtFive.parse(5)).toThrow();
75
+ expect(() => gteFive.parse(4)).toThrow();
76
+ expect(() => minFive.parse(4)).toThrow();
77
+ expect(() => intNum.parse(3.14)).toThrow();
78
+ expect(() => positive.parse(0)).toThrow();
79
+ expect(() => positive.parse(-1)).toThrow();
80
+ expect(() => negative.parse(0)).toThrow();
81
+ expect(() => negative.parse(1)).toThrow();
82
+ expect(() => nonpositive.parse(1)).toThrow();
83
+ expect(() => nonnegative.parse(-1)).toThrow();
84
+ expect(() => multipleOfFive.parse(7.5)).toThrow();
85
+ expect(() => multipleOfFive.parse(-7.5)).toThrow();
86
+ expect(() => multipleOfNegativeFive.parse(-7.5)).toThrow();
87
+ expect(() => multipleOfNegativeFive.parse(7.5)).toThrow();
88
+ expect(() => finite.parse(Number.POSITIVE_INFINITY)).toThrow();
89
+ expect(() => finite.parse(Number.NEGATIVE_INFINITY)).toThrow();
90
+ expect(() => safe.parse(Number.MIN_SAFE_INTEGER - 1)).toThrow();
91
+ expect(() => safe.parse(Number.MAX_SAFE_INTEGER + 1)).toThrow();
92
+
93
+ expect(() => stepPointOne.parse(6.11)).toThrow();
94
+ expect(() => stepPointOne.parse(6.1000000001)).toThrow();
95
+ expect(() => stepSixPointFour.parse(6.41)).toThrow();
96
+ });
97
+
98
+ test("parse NaN", () => {
99
+ expect(() => z.number().parse(Number.NaN)).toThrow();
100
+ });
101
+
102
+ test("min max getters", () => {
103
+ expect(z.number().minValue).toBeNull;
104
+ expect(ltFive.minValue).toBeNull;
105
+ expect(lteFive.minValue).toBeNull;
106
+ expect(maxFive.minValue).toBeNull;
107
+ expect(negative.minValue).toBeNull;
108
+ expect(nonpositive.minValue).toBeNull;
109
+ expect(intNum.minValue).toBeNull;
110
+ expect(multipleOfFive.minValue).toBeNull;
111
+ expect(finite.minValue).toBeNull;
112
+ expect(gtFive.minValue).toEqual(5);
113
+ expect(gteFive.minValue).toEqual(5);
114
+ expect(minFive.minValue).toEqual(5);
115
+ expect(minFive.min(10).minValue).toEqual(10);
116
+ expect(positive.minValue).toEqual(0);
117
+ expect(nonnegative.minValue).toEqual(0);
118
+ expect(safe.minValue).toEqual(Number.MIN_SAFE_INTEGER);
119
+
120
+ expect(z.number().maxValue).toBeNull;
121
+ expect(gtFive.maxValue).toBeNull;
122
+ expect(gteFive.maxValue).toBeNull;
123
+ expect(minFive.maxValue).toBeNull;
124
+ expect(positive.maxValue).toBeNull;
125
+ expect(nonnegative.maxValue).toBeNull;
126
+ expect(intNum.minValue).toBeNull;
127
+ expect(multipleOfFive.minValue).toBeNull;
128
+ expect(finite.minValue).toBeNull;
129
+ expect(ltFive.maxValue).toEqual(5);
130
+ expect(lteFive.maxValue).toEqual(5);
131
+ expect(maxFive.maxValue).toEqual(5);
132
+ expect(maxFive.max(1).maxValue).toEqual(1);
133
+ expect(negative.maxValue).toEqual(0);
134
+ expect(nonpositive.maxValue).toEqual(0);
135
+ expect(safe.maxValue).toEqual(Number.MAX_SAFE_INTEGER);
136
+ });
137
+
138
+ test("int getter", () => {
139
+ expect(z.number().isInt).toEqual(false);
140
+ expect(z.number().multipleOf(1.5).isInt).toEqual(false);
141
+ expect(gtFive.isInt).toEqual(false);
142
+ expect(gteFive.isInt).toEqual(false);
143
+ expect(minFive.isInt).toEqual(false);
144
+ expect(positive.isInt).toEqual(false);
145
+ expect(nonnegative.isInt).toEqual(false);
146
+ expect(finite.isInt).toEqual(false);
147
+ expect(ltFive.isInt).toEqual(false);
148
+ expect(lteFive.isInt).toEqual(false);
149
+ expect(maxFive.isInt).toEqual(false);
150
+ expect(negative.isInt).toEqual(false);
151
+ expect(nonpositive.isInt).toEqual(false);
152
+ expect(safe.isInt).toEqual(false);
153
+
154
+ expect(intNum.isInt).toEqual(true);
155
+ expect(multipleOfFive.isInt).toEqual(true);
156
+ });
157
+
158
+ test("finite getter", () => {
159
+ expect(z.number().isFinite).toEqual(false);
160
+ expect(gtFive.isFinite).toEqual(false);
161
+ expect(gteFive.isFinite).toEqual(false);
162
+ expect(minFive.isFinite).toEqual(false);
163
+ expect(positive.isFinite).toEqual(false);
164
+ expect(nonnegative.isFinite).toEqual(false);
165
+ expect(ltFive.isFinite).toEqual(false);
166
+ expect(lteFive.isFinite).toEqual(false);
167
+ expect(maxFive.isFinite).toEqual(false);
168
+ expect(negative.isFinite).toEqual(false);
169
+ expect(nonpositive.isFinite).toEqual(false);
170
+
171
+ expect(finite.isFinite).toEqual(true);
172
+ expect(intNum.isFinite).toEqual(true);
173
+ expect(multipleOfFive.isFinite).toEqual(true);
174
+ expect(z.number().min(5).max(10).isFinite).toEqual(true);
175
+ expect(safe.isFinite).toEqual(true);
176
+ });
@@ -0,0 +1,29 @@
1
+ // @ts-ignore TS6133
2
+ import { expect, test } from "vitest";
3
+
4
+ import * as z from "zod/v3";
5
+
6
+ test("object augmentation", () => {
7
+ const Animal = z
8
+ .object({
9
+ species: z.string(),
10
+ })
11
+ .augment({
12
+ population: z.number(),
13
+ });
14
+ // overwrites `species`
15
+ const ModifiedAnimal = Animal.augment({
16
+ species: z.array(z.string()),
17
+ });
18
+ ModifiedAnimal.parse({
19
+ species: ["asd"],
20
+ population: 1324,
21
+ });
22
+
23
+ const bad = () =>
24
+ ModifiedAnimal.parse({
25
+ species: "asdf",
26
+ population: 1324,
27
+ } as any);
28
+ expect(bad).toThrow();
29
+ });
@@ -0,0 +1,29 @@
1
+ // @ts-ignore TS6133
2
+ import { expect, test } from "vitest";
3
+
4
+ import * as z from "zod/v3";
5
+
6
+ const RealSet = Set;
7
+ const RealMap = Map;
8
+ const RealDate = Date;
9
+
10
+ test("doesn’t throw when Date is undefined", () => {
11
+ delete (globalThis as any).Date;
12
+ const result = z.object({}).safeParse({});
13
+ expect(result.success).toEqual(true);
14
+ globalThis.Date = RealDate;
15
+ });
16
+
17
+ test("doesn’t throw when Set is undefined", () => {
18
+ delete (globalThis as any).Set;
19
+ const result = z.object({}).safeParse({});
20
+ expect(result.success).toEqual(true);
21
+ globalThis.Set = RealSet;
22
+ });
23
+
24
+ test("doesn’t throw when Map is undefined", () => {
25
+ delete (globalThis as any).Map;
26
+ const result = z.object({}).safeParse({});
27
+ expect(result.success).toEqual(true);
28
+ globalThis.Map = RealMap;
29
+ });
@@ -0,0 +1,434 @@
1
+ // @ts-ignore TS6133
2
+ import { expect, test } from "vitest";
3
+
4
+ import * as z from "zod/v3";
5
+ import { util } from "../helpers/util.js";
6
+
7
+ const Test = z.object({
8
+ f1: z.number(),
9
+ f2: z.string().optional(),
10
+ f3: z.string().nullable(),
11
+ f4: z.array(z.object({ t: z.union([z.string(), z.boolean()]) })),
12
+ });
13
+
14
+ test("object type inference", () => {
15
+ type TestType = {
16
+ f1: number;
17
+ f2?: string | undefined;
18
+ f3: string | null;
19
+ f4: { t: string | boolean }[];
20
+ };
21
+
22
+ util.assertEqual<z.TypeOf<typeof Test>, TestType>(true);
23
+ });
24
+
25
+ test("unknown throw", () => {
26
+ const asdf: unknown = 35;
27
+ expect(() => Test.parse(asdf)).toThrow();
28
+ });
29
+
30
+ test("shape() should return schema of particular key", () => {
31
+ const f1Schema = Test.shape.f1;
32
+ const f2Schema = Test.shape.f2;
33
+ const f3Schema = Test.shape.f3;
34
+ const f4Schema = Test.shape.f4;
35
+
36
+ expect(f1Schema).toBeInstanceOf(z.ZodNumber);
37
+ expect(f2Schema).toBeInstanceOf(z.ZodOptional);
38
+ expect(f3Schema).toBeInstanceOf(z.ZodNullable);
39
+ expect(f4Schema).toBeInstanceOf(z.ZodArray);
40
+ });
41
+
42
+ test("correct parsing", () => {
43
+ Test.parse({
44
+ f1: 12,
45
+ f2: "string",
46
+ f3: "string",
47
+ f4: [
48
+ {
49
+ t: "string",
50
+ },
51
+ ],
52
+ });
53
+
54
+ Test.parse({
55
+ f1: 12,
56
+ f3: null,
57
+ f4: [
58
+ {
59
+ t: false,
60
+ },
61
+ ],
62
+ });
63
+ });
64
+
65
+ test("incorrect #1", () => {
66
+ expect(() => Test.parse({} as any)).toThrow();
67
+ });
68
+
69
+ test("nonstrict by default", () => {
70
+ z.object({ points: z.number() }).parse({
71
+ points: 2314,
72
+ unknown: "asdf",
73
+ });
74
+ });
75
+
76
+ const data = {
77
+ points: 2314,
78
+ unknown: "asdf",
79
+ };
80
+
81
+ test("strip by default", () => {
82
+ const val = z.object({ points: z.number() }).parse(data);
83
+ expect(val).toEqual({ points: 2314 });
84
+ });
85
+
86
+ test("unknownkeys override", () => {
87
+ const val = z.object({ points: z.number() }).strict().passthrough().strip().nonstrict().parse(data);
88
+
89
+ expect(val).toEqual(data);
90
+ });
91
+
92
+ test("passthrough unknown", () => {
93
+ const val = z.object({ points: z.number() }).passthrough().parse(data);
94
+
95
+ expect(val).toEqual(data);
96
+ });
97
+
98
+ test("strip unknown", () => {
99
+ const val = z.object({ points: z.number() }).strip().parse(data);
100
+
101
+ expect(val).toEqual({ points: 2314 });
102
+ });
103
+
104
+ test("strict", () => {
105
+ const val = z.object({ points: z.number() }).strict().safeParse(data);
106
+
107
+ expect(val.success).toEqual(false);
108
+ });
109
+
110
+ test("catchall inference", () => {
111
+ const o1 = z
112
+ .object({
113
+ first: z.string(),
114
+ })
115
+ .catchall(z.number());
116
+
117
+ const d1 = o1.parse({ first: "asdf", num: 1243 });
118
+ util.assertEqual<number, (typeof d1)["asdf"]>(true);
119
+ util.assertEqual<string, (typeof d1)["first"]>(true);
120
+ });
121
+
122
+ test("catchall overrides strict", () => {
123
+ const o1 = z.object({ first: z.string().optional() }).strict().catchall(z.number());
124
+
125
+ // should run fine
126
+ // setting a catchall overrides the unknownKeys behavior
127
+ o1.parse({
128
+ asdf: 1234,
129
+ });
130
+
131
+ // should only run catchall validation
132
+ // against unknown keys
133
+ o1.parse({
134
+ first: "asdf",
135
+ asdf: 1234,
136
+ });
137
+ });
138
+
139
+ test("catchall overrides strict", () => {
140
+ const o1 = z
141
+ .object({
142
+ first: z.string(),
143
+ })
144
+ .strict()
145
+ .catchall(z.number());
146
+
147
+ // should run fine
148
+ // setting a catchall overrides the unknownKeys behavior
149
+ o1.parse({
150
+ first: "asdf",
151
+ asdf: 1234,
152
+ });
153
+ });
154
+
155
+ test("test that optional keys are unset", async () => {
156
+ const SNamedEntity = z.object({
157
+ id: z.string(),
158
+ set: z.string().optional(),
159
+ unset: z.string().optional(),
160
+ });
161
+ const result = await SNamedEntity.parse({
162
+ id: "asdf",
163
+ set: undefined,
164
+ });
165
+ // eslint-disable-next-line ban/ban
166
+ expect(Object.keys(result)).toEqual(["id", "set"]);
167
+ });
168
+
169
+ test("test catchall parsing", async () => {
170
+ const result = z.object({ name: z.string() }).catchall(z.number()).parse({ name: "Foo", validExtraKey: 61 });
171
+
172
+ expect(result).toEqual({ name: "Foo", validExtraKey: 61 });
173
+
174
+ const result2 = z
175
+ .object({ name: z.string() })
176
+ .catchall(z.number())
177
+ .safeParse({ name: "Foo", validExtraKey: 61, invalid: "asdf" });
178
+
179
+ expect(result2.success).toEqual(false);
180
+ });
181
+
182
+ test("test nonexistent keys", async () => {
183
+ const Schema = z.union([z.object({ a: z.string() }), z.object({ b: z.number() })]);
184
+ const obj = { a: "A" };
185
+ const result = await Schema.spa(obj); // Works with 1.11.10, breaks with 2.0.0-beta.21
186
+ expect(result.success).toBe(true);
187
+ });
188
+
189
+ test("test async union", async () => {
190
+ const Schema2 = z.union([
191
+ z.object({
192
+ ty: z.string(),
193
+ }),
194
+ z.object({
195
+ ty: z.number(),
196
+ }),
197
+ ]);
198
+
199
+ const obj = { ty: "A" };
200
+ const result = await Schema2.spa(obj); // Works with 1.11.10, breaks with 2.0.0-beta.21
201
+ expect(result.success).toEqual(true);
202
+ });
203
+
204
+ test("test inferred merged type", async () => {
205
+ const asdf = z.object({ a: z.string() }).merge(z.object({ a: z.number() }));
206
+ type asdf = z.infer<typeof asdf>;
207
+ util.assertEqual<asdf, { a: number }>(true);
208
+ });
209
+
210
+ test("inferred merged object type with optional properties", async () => {
211
+ const Merged = z
212
+ .object({ a: z.string(), b: z.string().optional() })
213
+ .merge(z.object({ a: z.string().optional(), b: z.string() }));
214
+ type Merged = z.infer<typeof Merged>;
215
+ util.assertEqual<Merged, { a?: string; b: string }>(true);
216
+ // todo
217
+ // util.assertEqual<Merged, { a?: string; b: string }>(true);
218
+ });
219
+
220
+ test("inferred unioned object type with optional properties", async () => {
221
+ const Unioned = z.union([
222
+ z.object({ a: z.string(), b: z.string().optional() }),
223
+ z.object({ a: z.string().optional(), b: z.string() }),
224
+ ]);
225
+ type Unioned = z.infer<typeof Unioned>;
226
+ util.assertEqual<Unioned, { a: string; b?: string } | { a?: string; b: string }>(true);
227
+ });
228
+
229
+ test("inferred enum type", async () => {
230
+ const Enum = z.object({ a: z.string(), b: z.string().optional() }).keyof();
231
+
232
+ expect(Enum.Values).toEqual({
233
+ a: "a",
234
+ b: "b",
235
+ });
236
+ expect(Enum.enum).toEqual({
237
+ a: "a",
238
+ b: "b",
239
+ });
240
+ expect(Enum._def.values).toEqual(["a", "b"]);
241
+ type Enum = z.infer<typeof Enum>;
242
+ util.assertEqual<Enum, "a" | "b">(true);
243
+ });
244
+
245
+ test("inferred partial object type with optional properties", async () => {
246
+ const Partial = z.object({ a: z.string(), b: z.string().optional() }).partial();
247
+ type Partial = z.infer<typeof Partial>;
248
+ util.assertEqual<Partial, { a?: string; b?: string }>(true);
249
+ });
250
+
251
+ test("inferred picked object type with optional properties", async () => {
252
+ const Picked = z.object({ a: z.string(), b: z.string().optional() }).pick({ b: true });
253
+ type Picked = z.infer<typeof Picked>;
254
+ util.assertEqual<Picked, { b?: string }>(true);
255
+ });
256
+
257
+ test("inferred type for unknown/any keys", () => {
258
+ const myType = z.object({
259
+ anyOptional: z.any().optional(),
260
+ anyRequired: z.any(),
261
+ unknownOptional: z.unknown().optional(),
262
+ unknownRequired: z.unknown(),
263
+ });
264
+ type myType = z.infer<typeof myType>;
265
+ util.assertEqual<
266
+ myType,
267
+ {
268
+ anyOptional?: any;
269
+ anyRequired?: any;
270
+ unknownOptional?: unknown;
271
+ unknownRequired?: unknown;
272
+ }
273
+ >(true);
274
+ });
275
+
276
+ test("setKey", () => {
277
+ const base = z.object({ name: z.string() });
278
+ const withNewKey = base.setKey("age", z.number());
279
+
280
+ type withNewKey = z.infer<typeof withNewKey>;
281
+ util.assertEqual<withNewKey, { name: string; age: number }>(true);
282
+ withNewKey.parse({ name: "asdf", age: 1234 });
283
+ });
284
+
285
+ test("strictcreate", async () => {
286
+ const strictObj = z.strictObject({
287
+ name: z.string(),
288
+ });
289
+
290
+ const syncResult = strictObj.safeParse({ name: "asdf", unexpected: 13 });
291
+ expect(syncResult.success).toEqual(false);
292
+
293
+ const asyncResult = await strictObj.spa({ name: "asdf", unexpected: 13 });
294
+ expect(asyncResult.success).toEqual(false);
295
+ });
296
+
297
+ test("object with refine", async () => {
298
+ const schema = z
299
+ .object({
300
+ a: z.string().default("foo"),
301
+ b: z.number(),
302
+ })
303
+ .refine(() => true);
304
+ expect(schema.parse({ b: 5 })).toEqual({ b: 5, a: "foo" });
305
+ const result = await schema.parseAsync({ b: 5 });
306
+ expect(result).toEqual({ b: 5, a: "foo" });
307
+ });
308
+
309
+ test("intersection of object with date", async () => {
310
+ const schema = z.object({
311
+ a: z.date(),
312
+ });
313
+ expect(schema.and(schema).parse({ a: new Date(1637353595983) })).toEqual({
314
+ a: new Date(1637353595983),
315
+ });
316
+ const result = await schema.parseAsync({ a: new Date(1637353595983) });
317
+ expect(result).toEqual({ a: new Date(1637353595983) });
318
+ });
319
+
320
+ test("intersection of object with refine with date", async () => {
321
+ const schema = z
322
+ .object({
323
+ a: z.date(),
324
+ })
325
+ .refine(() => true);
326
+ expect(schema.and(schema).parse({ a: new Date(1637353595983) })).toEqual({
327
+ a: new Date(1637353595983),
328
+ });
329
+ const result = await schema.parseAsync({ a: new Date(1637353595983) });
330
+ expect(result).toEqual({ a: new Date(1637353595983) });
331
+ });
332
+
333
+ test("constructor key", () => {
334
+ const person = z
335
+ .object({
336
+ name: z.string(),
337
+ })
338
+ .strict();
339
+
340
+ expect(() =>
341
+ person.parse({
342
+ name: "bob dylan",
343
+ constructor: 61,
344
+ })
345
+ ).toThrow();
346
+ });
347
+
348
+ test("constructor key", () => {
349
+ const Example = z.object({
350
+ prop: z.string(),
351
+ opt: z.number().optional(),
352
+ arr: z.string().array(),
353
+ });
354
+
355
+ type Example = z.infer<typeof Example>;
356
+ util.assertEqual<keyof Example, "prop" | "opt" | "arr">(true);
357
+ });
358
+
359
+ test("unknownkeys merging", () => {
360
+ // This one is "strict"
361
+ const schemaA = z
362
+ .object({
363
+ a: z.string(),
364
+ })
365
+ .strict();
366
+
367
+ // This one is "strip"
368
+ const schemaB = z
369
+ .object({
370
+ b: z.string(),
371
+ })
372
+ .catchall(z.string());
373
+
374
+ const mergedSchema = schemaA.merge(schemaB);
375
+ type mergedSchema = typeof mergedSchema;
376
+ util.assertEqual<mergedSchema["_def"]["unknownKeys"], "strip">(true);
377
+ expect(mergedSchema._def.unknownKeys).toEqual("strip");
378
+
379
+ util.assertEqual<mergedSchema["_def"]["catchall"], z.ZodString>(true);
380
+ expect(mergedSchema._def.catchall instanceof z.ZodString).toEqual(true);
381
+ });
382
+
383
+ const personToExtend = z.object({
384
+ firstName: z.string(),
385
+ lastName: z.string(),
386
+ });
387
+
388
+ test("extend() should return schema with new key", () => {
389
+ const PersonWithNickname = personToExtend.extend({ nickName: z.string() });
390
+ type PersonWithNickname = z.infer<typeof PersonWithNickname>;
391
+
392
+ const expected = { firstName: "f", nickName: "n", lastName: "l" };
393
+ const actual = PersonWithNickname.parse(expected);
394
+
395
+ expect(actual).toEqual(expected);
396
+ util.assertEqual<keyof PersonWithNickname, "firstName" | "lastName" | "nickName">(true);
397
+ util.assertEqual<PersonWithNickname, { firstName: string; lastName: string; nickName: string }>(true);
398
+ });
399
+
400
+ test("extend() should have power to override existing key", () => {
401
+ const PersonWithNumberAsLastName = personToExtend.extend({
402
+ lastName: z.number(),
403
+ });
404
+ type PersonWithNumberAsLastName = z.infer<typeof PersonWithNumberAsLastName>;
405
+
406
+ const expected = { firstName: "f", lastName: 42 };
407
+ const actual = PersonWithNumberAsLastName.parse(expected);
408
+
409
+ expect(actual).toEqual(expected);
410
+ util.assertEqual<PersonWithNumberAsLastName, { firstName: string; lastName: number }>(true);
411
+ });
412
+
413
+ test("passthrough index signature", () => {
414
+ const a = z.object({ a: z.string() });
415
+ type a = z.infer<typeof a>;
416
+ util.assertEqual<{ a: string }, a>(true);
417
+ const b = a.passthrough();
418
+ type b = z.infer<typeof b>;
419
+ util.assertEqual<{ a: string } & { [k: string]: unknown }, b>(true);
420
+ });
421
+
422
+ test("xor", () => {
423
+ type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };
424
+ type XOR<T, U> = T extends object ? (U extends object ? (Without<T, U> & U) | (Without<U, T> & T) : U) : T;
425
+
426
+ type A = { name: string; a: number };
427
+ type B = { name: string; b: number };
428
+ type C = XOR<A, B>;
429
+ type Outer = { data: C };
430
+
431
+ const _Outer: z.ZodType<Outer> = z.object({
432
+ data: z.union([z.object({ name: z.string(), a: z.number() }), z.object({ name: z.string(), b: z.number() })]),
433
+ });
434
+ });
@@ -0,0 +1,42 @@
1
+ // @ts-ignore TS6133
2
+ import { expect, test } from "vitest";
3
+
4
+ import * as z from "zod/v3";
5
+
6
+ function checkErrors(a: z.ZodTypeAny, bad: any) {
7
+ let expected: any;
8
+ try {
9
+ a.parse(bad);
10
+ } catch (error) {
11
+ expected = (error as z.ZodError).formErrors;
12
+ }
13
+ try {
14
+ a.optional().parse(bad);
15
+ } catch (error) {
16
+ expect((error as z.ZodError).formErrors).toEqual(expected);
17
+ }
18
+ }
19
+
20
+ test("Should have error messages appropriate for the underlying type", () => {
21
+ checkErrors(z.string().min(2), 1);
22
+ z.string().min(2).optional().parse(undefined);
23
+ checkErrors(z.number().gte(2), 1);
24
+ z.number().gte(2).optional().parse(undefined);
25
+ checkErrors(z.boolean(), "");
26
+ z.boolean().optional().parse(undefined);
27
+ checkErrors(z.undefined(), null);
28
+ z.undefined().optional().parse(undefined);
29
+ checkErrors(z.null(), {});
30
+ z.null().optional().parse(undefined);
31
+ checkErrors(z.object({}), 1);
32
+ z.object({}).optional().parse(undefined);
33
+ checkErrors(z.tuple([]), 1);
34
+ z.tuple([]).optional().parse(undefined);
35
+ checkErrors(z.unknown(), 1);
36
+ z.unknown().optional().parse(undefined);
37
+ });
38
+
39
+ test("unwrap", () => {
40
+ const unwrapped = z.string().optional().unwrap();
41
+ expect(unwrapped).toBeInstanceOf(z.ZodString);
42
+ });