@willaimg/yatsp 4.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (830) hide show
  1. package/README.md +22 -0
  2. package/compile.cjs +96 -0
  3. package/compile.d.cts +1 -0
  4. package/compile.d.ts +1 -0
  5. package/compile.js +52 -0
  6. package/index.cjs +52 -0
  7. package/index.d.cts +3 -0
  8. package/index.d.ts +3 -0
  9. package/index.js +7 -0
  10. package/locales/index.cjs +36 -0
  11. package/locales/index.d.cts +1 -0
  12. package/locales/index.d.ts +1 -0
  13. package/locales/index.js +1 -0
  14. package/mini/index.cjs +51 -0
  15. package/mini/index.d.cts +3 -0
  16. package/mini/index.d.ts +3 -0
  17. package/mini/index.js +3 -0
  18. package/package.json +142 -0
  19. package/src/compile.ts +56 -0
  20. package/src/index.ts +7 -0
  21. package/src/locales/index.ts +1 -0
  22. package/src/mini/index.ts +3 -0
  23. package/src/v3/YatspError.ts +340 -0
  24. package/src/v3/benchmarks/datetime.ts +58 -0
  25. package/src/v3/benchmarks/discriminatedUnion.ts +80 -0
  26. package/src/v3/benchmarks/index.ts +59 -0
  27. package/src/v3/benchmarks/ipv4.ts +57 -0
  28. package/src/v3/benchmarks/object.ts +69 -0
  29. package/src/v3/benchmarks/primitives.ts +162 -0
  30. package/src/v3/benchmarks/realworld.ts +63 -0
  31. package/src/v3/benchmarks/string.ts +55 -0
  32. package/src/v3/benchmarks/union.ts +80 -0
  33. package/src/v3/errors.ts +13 -0
  34. package/src/v3/external.ts +6 -0
  35. package/src/v3/helpers/enumUtil.ts +17 -0
  36. package/src/v3/helpers/errorUtil.ts +8 -0
  37. package/src/v3/helpers/parseUtil.ts +176 -0
  38. package/src/v3/helpers/partialUtil.ts +34 -0
  39. package/src/v3/helpers/typeAliases.ts +2 -0
  40. package/src/v3/helpers/util.ts +224 -0
  41. package/src/v3/index.ts +4 -0
  42. package/src/v3/locales/en.ts +124 -0
  43. package/src/v3/standard-schema.ts +113 -0
  44. package/src/v3/tests/Mocker.ts +54 -0
  45. package/src/v3/tests/all-errors.test.ts +157 -0
  46. package/src/v3/tests/anyunknown.test.ts +28 -0
  47. package/src/v3/tests/array.test.ts +71 -0
  48. package/src/v3/tests/async-parsing.test.ts +388 -0
  49. package/src/v3/tests/async-refinements.test.ts +46 -0
  50. package/src/v3/tests/base.test.ts +29 -0
  51. package/src/v3/tests/bigint.test.ts +55 -0
  52. package/src/v3/tests/branded.test.ts +53 -0
  53. package/src/v3/tests/catch.test.ts +220 -0
  54. package/src/v3/tests/coerce.test.ts +133 -0
  55. package/src/v3/tests/complex.test.ts +70 -0
  56. package/src/v3/tests/custom.test.ts +31 -0
  57. package/src/v3/tests/date.test.ts +32 -0
  58. package/src/v3/tests/deepmasking.test.ts +186 -0
  59. package/src/v3/tests/default.test.ts +112 -0
  60. package/src/v3/tests/description.test.ts +33 -0
  61. package/src/v3/tests/discriminated-unions.test.ts +315 -0
  62. package/src/v3/tests/enum.test.ts +80 -0
  63. package/src/v3/tests/error.test.ts +586 -0
  64. package/src/v3/tests/firstparty.test.ts +87 -0
  65. package/src/v3/tests/firstpartyschematypes.test.ts +21 -0
  66. package/src/v3/tests/function.test.ts +261 -0
  67. package/src/v3/tests/generics.test.ts +48 -0
  68. package/src/v3/tests/instanceof.test.ts +37 -0
  69. package/src/v3/tests/intersection.test.ts +128 -0
  70. package/src/v3/tests/language-server.source.ts +76 -0
  71. package/src/v3/tests/language-server.test.ts +206 -0
  72. package/src/v3/tests/literal.test.ts +36 -0
  73. package/src/v3/tests/map.test.ts +110 -0
  74. package/src/v3/tests/masking.test.ts +4 -0
  75. package/src/v3/tests/mocker.test.ts +19 -0
  76. package/src/v3/tests/nan.test.ts +24 -0
  77. package/src/v3/tests/nativeEnum.test.ts +87 -0
  78. package/src/v3/tests/nullable.test.ts +42 -0
  79. package/src/v3/tests/number.test.ts +176 -0
  80. package/src/v3/tests/object-augmentation.test.ts +29 -0
  81. package/src/v3/tests/object-in-es5-env.test.ts +29 -0
  82. package/src/v3/tests/object.test.ts +431 -0
  83. package/src/v3/tests/optional.test.ts +42 -0
  84. package/src/v3/tests/parseUtil.test.ts +23 -0
  85. package/src/v3/tests/parser.test.ts +41 -0
  86. package/src/v3/tests/partials.test.ts +243 -0
  87. package/src/v3/tests/pickomit.test.ts +111 -0
  88. package/src/v3/tests/pipeline.test.ts +29 -0
  89. package/src/v3/tests/preprocess.test.ts +186 -0
  90. package/src/v3/tests/primitive.test.ts +440 -0
  91. package/src/v3/tests/promise.test.ts +90 -0
  92. package/src/v3/tests/readonly.test.ts +114 -0
  93. package/src/v3/tests/record.test.ts +171 -0
  94. package/src/v3/tests/recursive.test.ts +197 -0
  95. package/src/v3/tests/refine.test.ts +313 -0
  96. package/src/v3/tests/safeparse.test.ts +27 -0
  97. package/src/v3/tests/set.test.ts +142 -0
  98. package/src/v3/tests/standard-schema.test.ts +83 -0
  99. package/src/v3/tests/string.test.ts +922 -0
  100. package/src/v3/tests/transformer.test.ts +233 -0
  101. package/src/v3/tests/tuple.test.ts +90 -0
  102. package/src/v3/tests/unions.test.ts +57 -0
  103. package/src/v3/tests/validations.test.ts +133 -0
  104. package/src/v3/tests/void.test.ts +15 -0
  105. package/src/v3/types.ts +5162 -0
  106. package/src/v4/classic/checks.ts +33 -0
  107. package/src/v4/classic/coerce.ts +27 -0
  108. package/src/v4/classic/compat.ts +78 -0
  109. package/src/v4/classic/deep-partial.ts +76 -0
  110. package/src/v4/classic/errors.ts +97 -0
  111. package/src/v4/classic/external.ts +57 -0
  112. package/src/v4/classic/from-json-schema.ts +944 -0
  113. package/src/v4/classic/in-out.ts +45 -0
  114. package/src/v4/classic/index.ts +5 -0
  115. package/src/v4/classic/iso.ts +20 -0
  116. package/src/v4/classic/parse.ts +88 -0
  117. package/src/v4/classic/schemas.ts +2994 -0
  118. package/src/v4/classic/tests/anyunknown.test.ts +26 -0
  119. package/src/v4/classic/tests/apply.test.ts +86 -0
  120. package/src/v4/classic/tests/array.test.ts +264 -0
  121. package/src/v4/classic/tests/assignability.test.ts +402 -0
  122. package/src/v4/classic/tests/async-parsing.test.ts +381 -0
  123. package/src/v4/classic/tests/async-refinements.test.ts +68 -0
  124. package/src/v4/classic/tests/base.test.ts +7 -0
  125. package/src/v4/classic/tests/bigint.test.ts +89 -0
  126. package/src/v4/classic/tests/brand.test.ts +106 -0
  127. package/src/v4/classic/tests/catch.test.ts +604 -0
  128. package/src/v4/classic/tests/coalesce.test.ts +20 -0
  129. package/src/v4/classic/tests/codec-examples.test.ts +572 -0
  130. package/src/v4/classic/tests/codec.test.ts +704 -0
  131. package/src/v4/classic/tests/coerce.test.ts +160 -0
  132. package/src/v4/classic/tests/continuability.test.ts +374 -0
  133. package/src/v4/classic/tests/credit-card.test.ts +76 -0
  134. package/src/v4/classic/tests/custom.test.ts +40 -0
  135. package/src/v4/classic/tests/cyclic-data.test.ts +985 -0
  136. package/src/v4/classic/tests/date.test.ts +92 -0
  137. package/src/v4/classic/tests/datetime.test.ts +316 -0
  138. package/src/v4/classic/tests/deep-partial.test.ts +380 -0
  139. package/src/v4/classic/tests/default-locale.test.ts +32 -0
  140. package/src/v4/classic/tests/default.test.ts +455 -0
  141. package/src/v4/classic/tests/describe-meta-checks.test.ts +27 -0
  142. package/src/v4/classic/tests/description.test.ts +32 -0
  143. package/src/v4/classic/tests/detached-methods.test.ts +226 -0
  144. package/src/v4/classic/tests/discriminated-unions.test.ts +942 -0
  145. package/src/v4/classic/tests/enum.test.ts +305 -0
  146. package/src/v4/classic/tests/error-utils.test.ts +917 -0
  147. package/src/v4/classic/tests/error.test.ts +1108 -0
  148. package/src/v4/classic/tests/file.test.ts +96 -0
  149. package/src/v4/classic/tests/firstparty.test.ts +179 -0
  150. package/src/v4/classic/tests/fix-json-issue.test.ts +26 -0
  151. package/src/v4/classic/tests/from-json-schema.test.ts +1467 -0
  152. package/src/v4/classic/tests/function.test.ts +391 -0
  153. package/src/v4/classic/tests/generics.test.ts +72 -0
  154. package/src/v4/classic/tests/global-config.test.ts +32 -0
  155. package/src/v4/classic/tests/hash.test.ts +67 -0
  156. package/src/v4/classic/tests/iban.test.ts +81 -0
  157. package/src/v4/classic/tests/in-out.test.ts +159 -0
  158. package/src/v4/classic/tests/index.test.ts +958 -0
  159. package/src/v4/classic/tests/instance-footprint.test.ts +319 -0
  160. package/src/v4/classic/tests/instanceof.test.ts +127 -0
  161. package/src/v4/classic/tests/intersection.test.ts +334 -0
  162. package/src/v4/classic/tests/issue-schema.test.ts +215 -0
  163. package/src/v4/classic/tests/jitless-allows-eval.test.ts +39 -0
  164. package/src/v4/classic/tests/json.test.ts +109 -0
  165. package/src/v4/classic/tests/lazy.test.ts +262 -0
  166. package/src/v4/classic/tests/literal.test.ts +128 -0
  167. package/src/v4/classic/tests/locales_ka.test.ts +29 -0
  168. package/src/v4/classic/tests/locales_ro.test.ts +24 -0
  169. package/src/v4/classic/tests/map.test.ts +342 -0
  170. package/src/v4/classic/tests/nan.test.ts +21 -0
  171. package/src/v4/classic/tests/nested-refine.test.ts +168 -0
  172. package/src/v4/classic/tests/nonoptional.test.ts +101 -0
  173. package/src/v4/classic/tests/nullable.test.ts +22 -0
  174. package/src/v4/classic/tests/number.test.ts +401 -0
  175. package/src/v4/classic/tests/object.test.ts +1006 -0
  176. package/src/v4/classic/tests/optin-ladder.test.ts +235 -0
  177. package/src/v4/classic/tests/optional.test.ts +366 -0
  178. package/src/v4/classic/tests/partial.test.ts +497 -0
  179. package/src/v4/classic/tests/pickomit.test.ts +211 -0
  180. package/src/v4/classic/tests/pipe.test.ts +101 -0
  181. package/src/v4/classic/tests/prefault.test.ts +144 -0
  182. package/src/v4/classic/tests/preprocess-types.test.ts +44 -0
  183. package/src/v4/classic/tests/preprocess.test.ts +351 -0
  184. package/src/v4/classic/tests/primitive.test.ts +175 -0
  185. package/src/v4/classic/tests/promise.test.ts +81 -0
  186. package/src/v4/classic/tests/properties.test.ts +141 -0
  187. package/src/v4/classic/tests/prototypes.test.ts +23 -0
  188. package/src/v4/classic/tests/readonly.test.ts +184 -0
  189. package/src/v4/classic/tests/record.test.ts +885 -0
  190. package/src/v4/classic/tests/recursive-types.test.ts +707 -0
  191. package/src/v4/classic/tests/redos.test.ts +68 -0
  192. package/src/v4/classic/tests/refine.test.ts +693 -0
  193. package/src/v4/classic/tests/registries.test.ts +243 -0
  194. package/src/v4/classic/tests/set.test.ts +190 -0
  195. package/src/v4/classic/tests/standard-schema.test.ts +153 -0
  196. package/src/v4/classic/tests/string-formats.test.ts +125 -0
  197. package/src/v4/classic/tests/string.test.ts +1440 -0
  198. package/src/v4/classic/tests/stringbool.test.ts +124 -0
  199. package/src/v4/classic/tests/template-literal.test.ts +814 -0
  200. package/src/v4/classic/tests/to-json-schema-methods.test.ts +438 -0
  201. package/src/v4/classic/tests/to-json-schema.test.ts +4733 -0
  202. package/src/v4/classic/tests/transform.test.ts +378 -0
  203. package/src/v4/classic/tests/tuple.test.ts +511 -0
  204. package/src/v4/classic/tests/union.test.ts +310 -0
  205. package/src/v4/classic/tests/url.test.ts +13 -0
  206. package/src/v4/classic/tests/validate.test.ts +645 -0
  207. package/src/v4/classic/tests/validations.test.ts +283 -0
  208. package/src/v4/classic/tests/void.test.ts +12 -0
  209. package/src/v4/core/api.ts +1913 -0
  210. package/src/v4/core/checks.ts +1274 -0
  211. package/src/v4/core/compile.ts +2315 -0
  212. package/src/v4/core/core.ts +230 -0
  213. package/src/v4/core/doc.ts +52 -0
  214. package/src/v4/core/errors.ts +546 -0
  215. package/src/v4/core/index.ts +19 -0
  216. package/src/v4/core/json-schema-generator.ts +131 -0
  217. package/src/v4/core/json-schema-processors.ts +934 -0
  218. package/src/v4/core/json-schema.ts +148 -0
  219. package/src/v4/core/memoizer.ts +331 -0
  220. package/src/v4/core/parse.ts +309 -0
  221. package/src/v4/core/regexes.ts +217 -0
  222. package/src/v4/core/registries.ts +109 -0
  223. package/src/v4/core/schemas.ts +5295 -0
  224. package/src/v4/core/standard-schema.ts +159 -0
  225. package/src/v4/core/tests/cached.test.ts +54 -0
  226. package/src/v4/core/tests/compile-differential.test.ts +1004 -0
  227. package/src/v4/core/tests/compile-generative.test.ts +445 -0
  228. package/src/v4/core/tests/compile-global.test.ts +89 -0
  229. package/src/v4/core/tests/compile-off-by-default.test.ts +26 -0
  230. package/src/v4/core/tests/compile-stats.test.ts +34 -0
  231. package/src/v4/core/tests/compile.test.ts +2040 -0
  232. package/src/v4/core/tests/email-regex.test.ts +140 -0
  233. package/src/v4/core/tests/extend.test.ts +59 -0
  234. package/src/v4/core/tests/index.test.ts +46 -0
  235. package/src/v4/core/tests/locales/be.test.ts +124 -0
  236. package/src/v4/core/tests/locales/el.test.ts +214 -0
  237. package/src/v4/core/tests/locales/en.test.ts +22 -0
  238. package/src/v4/core/tests/locales/es.test.ts +180 -0
  239. package/src/v4/core/tests/locales/fr.test.ts +72 -0
  240. package/src/v4/core/tests/locales/he.test.ts +379 -0
  241. package/src/v4/core/tests/locales/hr.test.ts +163 -0
  242. package/src/v4/core/tests/locales/nl.test.ts +46 -0
  243. package/src/v4/core/tests/locales/parity.test.ts +42 -0
  244. package/src/v4/core/tests/locales/ru.test.ts +128 -0
  245. package/src/v4/core/tests/locales/tg.test.ts +85 -0
  246. package/src/v4/core/tests/locales/tk.test.ts +69 -0
  247. package/src/v4/core/tests/locales/tr.test.ts +69 -0
  248. package/src/v4/core/tests/locales/uz.test.ts +105 -0
  249. package/src/v4/core/tests/polyfill-collision.test.ts +46 -0
  250. package/src/v4/core/tests/record-constructor.test.ts +125 -0
  251. package/src/v4/core/tests/recursive-tuples.test.ts +45 -0
  252. package/src/v4/core/tests/treeshake.test.ts +51 -0
  253. package/src/v4/core/tests/url-no-canparse.test.ts +133 -0
  254. package/src/v4/core/to-json-schema.ts +857 -0
  255. package/src/v4/core/util.ts +1284 -0
  256. package/src/v4/core/versions.ts +5 -0
  257. package/src/v4/core/visit.ts +193 -0
  258. package/src/v4/core/zsf.ts +323 -0
  259. package/src/v4/index.ts +4 -0
  260. package/src/v4/locales/ar.ts +120 -0
  261. package/src/v4/locales/az.ts +116 -0
  262. package/src/v4/locales/be.ts +188 -0
  263. package/src/v4/locales/bg.ts +133 -0
  264. package/src/v4/locales/bn.ts +123 -0
  265. package/src/v4/locales/ca.ts +121 -0
  266. package/src/v4/locales/ckb.ts +140 -0
  267. package/src/v4/locales/cs.ts +123 -0
  268. package/src/v4/locales/da.ts +128 -0
  269. package/src/v4/locales/de.ts +121 -0
  270. package/src/v4/locales/el.ts +124 -0
  271. package/src/v4/locales/en.ts +136 -0
  272. package/src/v4/locales/eo.ts +123 -0
  273. package/src/v4/locales/es.ts +145 -0
  274. package/src/v4/locales/fa.ts +131 -0
  275. package/src/v4/locales/fi.ts +126 -0
  276. package/src/v4/locales/fr-CA.ts +121 -0
  277. package/src/v4/locales/fr.ts +139 -0
  278. package/src/v4/locales/gu.ts +123 -0
  279. package/src/v4/locales/he.ts +253 -0
  280. package/src/v4/locales/hi.ts +126 -0
  281. package/src/v4/locales/hr.ts +135 -0
  282. package/src/v4/locales/hu.ts +122 -0
  283. package/src/v4/locales/hy.ts +175 -0
  284. package/src/v4/locales/id.ts +120 -0
  285. package/src/v4/locales/index.ts +63 -0
  286. package/src/v4/locales/is.ts +124 -0
  287. package/src/v4/locales/it.ts +121 -0
  288. package/src/v4/locales/ja.ts +119 -0
  289. package/src/v4/locales/ka.ts +128 -0
  290. package/src/v4/locales/kh.ts +7 -0
  291. package/src/v4/locales/km.ts +124 -0
  292. package/src/v4/locales/kn.ts +126 -0
  293. package/src/v4/locales/ko.ts +126 -0
  294. package/src/v4/locales/lt.ts +243 -0
  295. package/src/v4/locales/mk.ts +123 -0
  296. package/src/v4/locales/ms.ts +120 -0
  297. package/src/v4/locales/ne.ts +128 -0
  298. package/src/v4/locales/nl.ts +126 -0
  299. package/src/v4/locales/nn.ts +121 -0
  300. package/src/v4/locales/no.ts +121 -0
  301. package/src/v4/locales/ota.ts +122 -0
  302. package/src/v4/locales/pl.ts +123 -0
  303. package/src/v4/locales/ps.ts +131 -0
  304. package/src/v4/locales/pt-BR.ts +161 -0
  305. package/src/v4/locales/pt.ts +159 -0
  306. package/src/v4/locales/ro.ts +132 -0
  307. package/src/v4/locales/ru.ts +188 -0
  308. package/src/v4/locales/sk.ts +123 -0
  309. package/src/v4/locales/sl.ts +123 -0
  310. package/src/v4/locales/sv.ts +124 -0
  311. package/src/v4/locales/ta.ts +123 -0
  312. package/src/v4/locales/tg.ts +135 -0
  313. package/src/v4/locales/th.ts +124 -0
  314. package/src/v4/locales/tk.ts +113 -0
  315. package/src/v4/locales/tr.ts +116 -0
  316. package/src/v4/locales/ua.ts +7 -0
  317. package/src/v4/locales/uk.ts +122 -0
  318. package/src/v4/locales/ur.ts +124 -0
  319. package/src/v4/locales/uz.ts +120 -0
  320. package/src/v4/locales/vi.ts +122 -0
  321. package/src/v4/locales/yo.ts +129 -0
  322. package/src/v4/locales/zh-CN.ts +121 -0
  323. package/src/v4/locales/zh-TW.ts +120 -0
  324. package/src/v4/mini/checks.ts +33 -0
  325. package/src/v4/mini/coerce.ts +27 -0
  326. package/src/v4/mini/deep-partial.ts +73 -0
  327. package/src/v4/mini/external.ts +52 -0
  328. package/src/v4/mini/in-out.ts +45 -0
  329. package/src/v4/mini/index.ts +3 -0
  330. package/src/v4/mini/iso.ts +66 -0
  331. package/src/v4/mini/parse.ts +16 -0
  332. package/src/v4/mini/schemas.ts +2093 -0
  333. package/src/v4/mini/tests/apply.test.ts +57 -0
  334. package/src/v4/mini/tests/assignability.test.ts +190 -0
  335. package/src/v4/mini/tests/brand.test.ts +94 -0
  336. package/src/v4/mini/tests/checks.test.ts +158 -0
  337. package/src/v4/mini/tests/codec.test.ts +582 -0
  338. package/src/v4/mini/tests/computed.test.ts +30 -0
  339. package/src/v4/mini/tests/cyclic-data.test.ts +84 -0
  340. package/src/v4/mini/tests/deep-partial.test.ts +54 -0
  341. package/src/v4/mini/tests/error.test.ts +41 -0
  342. package/src/v4/mini/tests/functions.test.ts +14 -0
  343. package/src/v4/mini/tests/index.test.ts +1148 -0
  344. package/src/v4/mini/tests/number.test.ts +109 -0
  345. package/src/v4/mini/tests/object.test.ts +292 -0
  346. package/src/v4/mini/tests/prototypes.test.ts +43 -0
  347. package/src/v4/mini/tests/recursive-types.test.ts +341 -0
  348. package/src/v4/mini/tests/standard-schema.test.ts +50 -0
  349. package/src/v4/mini/tests/string.test.ts +396 -0
  350. package/src/v4-mini/index.ts +3 -0
  351. package/v3/YatspError.cjs +167 -0
  352. package/v3/YatspError.d.cts +164 -0
  353. package/v3/YatspError.d.ts +164 -0
  354. package/v3/YatspError.js +143 -0
  355. package/v3/errors.cjs +36 -0
  356. package/v3/errors.d.cts +5 -0
  357. package/v3/errors.d.ts +5 -0
  358. package/v3/errors.js +9 -0
  359. package/v3/external.cjs +41 -0
  360. package/v3/external.d.cts +6 -0
  361. package/v3/external.d.ts +6 -0
  362. package/v3/external.js +6 -0
  363. package/v3/helpers/enumUtil.cjs +21 -0
  364. package/v3/helpers/enumUtil.d.cts +8 -0
  365. package/v3/helpers/enumUtil.d.ts +8 -0
  366. package/v3/helpers/enumUtil.js +1 -0
  367. package/v3/helpers/errorUtil.cjs +28 -0
  368. package/v3/helpers/errorUtil.d.cts +9 -0
  369. package/v3/helpers/errorUtil.d.ts +9 -0
  370. package/v3/helpers/errorUtil.js +6 -0
  371. package/v3/helpers/parseUtil.cjs +143 -0
  372. package/v3/helpers/parseUtil.d.cts +78 -0
  373. package/v3/helpers/parseUtil.d.ts +78 -0
  374. package/v3/helpers/parseUtil.js +109 -0
  375. package/v3/helpers/partialUtil.cjs +21 -0
  376. package/v3/helpers/partialUtil.d.cts +8 -0
  377. package/v3/helpers/partialUtil.d.ts +8 -0
  378. package/v3/helpers/partialUtil.js +1 -0
  379. package/v3/helpers/typeAliases.cjs +21 -0
  380. package/v3/helpers/typeAliases.d.cts +2 -0
  381. package/v3/helpers/typeAliases.d.ts +2 -0
  382. package/v3/helpers/typeAliases.js +1 -0
  383. package/v3/helpers/util.cjs +156 -0
  384. package/v3/helpers/util.d.cts +85 -0
  385. package/v3/helpers/util.d.ts +85 -0
  386. package/v3/helpers/util.js +133 -0
  387. package/v3/index.cjs +52 -0
  388. package/v3/index.d.cts +4 -0
  389. package/v3/index.d.ts +4 -0
  390. package/v3/index.js +4 -0
  391. package/v3/locales/en.cjs +112 -0
  392. package/v3/locales/en.d.cts +3 -0
  393. package/v3/locales/en.d.ts +3 -0
  394. package/v3/locales/en.js +109 -0
  395. package/v3/standard-schema.cjs +21 -0
  396. package/v3/standard-schema.d.cts +102 -0
  397. package/v3/standard-schema.d.ts +102 -0
  398. package/v3/standard-schema.js +1 -0
  399. package/v3/types.cjs +3798 -0
  400. package/v3/types.d.cts +1034 -0
  401. package/v3/types.d.ts +1034 -0
  402. package/v3/types.js +3697 -0
  403. package/v4/classic/checks.cjs +53 -0
  404. package/v4/classic/checks.d.cts +1 -0
  405. package/v4/classic/checks.d.ts +1 -0
  406. package/v4/classic/checks.js +1 -0
  407. package/v4/classic/coerce.cjs +66 -0
  408. package/v4/classic/coerce.d.cts +17 -0
  409. package/v4/classic/coerce.d.ts +17 -0
  410. package/v4/classic/coerce.js +17 -0
  411. package/v4/classic/compat.cjs +80 -0
  412. package/v4/classic/compat.d.cts +48 -0
  413. package/v4/classic/compat.d.ts +48 -0
  414. package/v4/classic/compat.js +31 -0
  415. package/v4/classic/deep-partial.cjs +58 -0
  416. package/v4/classic/deep-partial.d.cts +14 -0
  417. package/v4/classic/deep-partial.d.ts +14 -0
  418. package/v4/classic/deep-partial.js +13 -0
  419. package/v4/classic/errors.cjs +102 -0
  420. package/v4/classic/errors.d.cts +29 -0
  421. package/v4/classic/errors.d.ts +29 -0
  422. package/v4/classic/errors.js +57 -0
  423. package/v4/classic/external.cjs +97 -0
  424. package/v4/classic/external.d.cts +19 -0
  425. package/v4/classic/external.d.ts +19 -0
  426. package/v4/classic/external.js +17 -0
  427. package/v4/classic/from-json-schema.cjs +926 -0
  428. package/v4/classic/from-json-schema.d.cts +12 -0
  429. package/v4/classic/from-json-schema.d.ts +12 -0
  430. package/v4/classic/from-json-schema.js +881 -0
  431. package/v4/classic/in-out.cjs +82 -0
  432. package/v4/classic/in-out.d.cts +8 -0
  433. package/v4/classic/in-out.d.ts +8 -0
  434. package/v4/classic/in-out.js +36 -0
  435. package/v4/classic/index.cjs +52 -0
  436. package/v4/classic/index.d.cts +3 -0
  437. package/v4/classic/index.d.ts +3 -0
  438. package/v4/classic/index.js +4 -0
  439. package/v4/classic/iso.cjs +68 -0
  440. package/v4/classic/iso.d.cts +7 -0
  441. package/v4/classic/iso.d.ts +7 -0
  442. package/v4/classic/iso.js +15 -0
  443. package/v4/classic/parse.cjs +63 -0
  444. package/v4/classic/parse.d.cts +44 -0
  445. package/v4/classic/parse.d.ts +44 -0
  446. package/v4/classic/parse.js +16 -0
  447. package/v4/classic/schemas.cjs +1676 -0
  448. package/v4/classic/schemas.d.cts +816 -0
  449. package/v4/classic/schemas.d.ts +816 -0
  450. package/v4/classic/schemas.js +1535 -0
  451. package/v4/core/api.cjs +1269 -0
  452. package/v4/core/api.d.cts +335 -0
  453. package/v4/core/api.d.ts +335 -0
  454. package/v4/core/api.js +1107 -0
  455. package/v4/core/checks.cjs +561 -0
  456. package/v4/core/checks.d.cts +294 -0
  457. package/v4/core/checks.d.ts +294 -0
  458. package/v4/core/checks.js +516 -0
  459. package/v4/core/compile.cjs +1908 -0
  460. package/v4/core/compile.d.cts +65 -0
  461. package/v4/core/compile.d.ts +65 -0
  462. package/v4/core/compile.js +1858 -0
  463. package/v4/core/core.cjs +167 -0
  464. package/v4/core/core.d.cts +82 -0
  465. package/v4/core/core.d.ts +82 -0
  466. package/v4/core/core.js +141 -0
  467. package/v4/core/doc.cjs +61 -0
  468. package/v4/core/doc.d.cts +16 -0
  469. package/v4/core/doc.d.ts +16 -0
  470. package/v4/core/doc.js +38 -0
  471. package/v4/core/errors.cjs +317 -0
  472. package/v4/core/errors.d.cts +225 -0
  473. package/v4/core/errors.d.ts +225 -0
  474. package/v4/core/errors.js +267 -0
  475. package/v4/core/index.cjs +70 -0
  476. package/v4/core/index.d.cts +19 -0
  477. package/v4/core/index.d.ts +19 -0
  478. package/v4/core/index.js +19 -0
  479. package/v4/core/json-schema-generator.cjs +122 -0
  480. package/v4/core/json-schema-generator.d.cts +65 -0
  481. package/v4/core/json-schema-generator.d.ts +65 -0
  482. package/v4/core/json-schema-generator.js +99 -0
  483. package/v4/core/json-schema-processors.cjs +929 -0
  484. package/v4/core/json-schema-processors.d.cts +65 -0
  485. package/v4/core/json-schema-processors.d.ts +65 -0
  486. package/v4/core/json-schema-processors.js +843 -0
  487. package/v4/core/json-schema.cjs +21 -0
  488. package/v4/core/json-schema.d.cts +89 -0
  489. package/v4/core/json-schema.d.ts +89 -0
  490. package/v4/core/json-schema.js +1 -0
  491. package/v4/core/memoizer.cjs +360 -0
  492. package/v4/core/memoizer.d.cts +15 -0
  493. package/v4/core/memoizer.d.ts +15 -0
  494. package/v4/core/memoizer.js +311 -0
  495. package/v4/core/parse.cjs +233 -0
  496. package/v4/core/parse.d.cts +52 -0
  497. package/v4/core/parse.d.ts +52 -0
  498. package/v4/core/parse.js +175 -0
  499. package/v4/core/regexes.cjs +209 -0
  500. package/v4/core/regexes.d.cts +90 -0
  501. package/v4/core/regexes.d.ts +90 -0
  502. package/v4/core/regexes.js +156 -0
  503. package/v4/core/registries.cjs +76 -0
  504. package/v4/core/registries.d.cts +35 -0
  505. package/v4/core/registries.d.ts +35 -0
  506. package/v4/core/registries.js +52 -0
  507. package/v4/core/schemas.cjs +2669 -0
  508. package/v4/core/schemas.d.cts +1273 -0
  509. package/v4/core/schemas.d.ts +1273 -0
  510. package/v4/core/schemas.js +2606 -0
  511. package/v4/core/standard-schema.cjs +21 -0
  512. package/v4/core/standard-schema.d.cts +126 -0
  513. package/v4/core/standard-schema.d.ts +126 -0
  514. package/v4/core/standard-schema.js +1 -0
  515. package/v4/core/to-json-schema.cjs +681 -0
  516. package/v4/core/to-json-schema.d.cts +154 -0
  517. package/v4/core/to-json-schema.d.ts +154 -0
  518. package/v4/core/to-json-schema.js +651 -0
  519. package/v4/core/util.cjs +949 -0
  520. package/v4/core/util.d.cts +278 -0
  521. package/v4/core/util.d.ts +278 -0
  522. package/v4/core/util.js +859 -0
  523. package/v4/core/versions.cjs +27 -0
  524. package/v4/core/versions.d.cts +5 -0
  525. package/v4/core/versions.d.ts +5 -0
  526. package/v4/core/versions.js +5 -0
  527. package/v4/core/visit.cjs +214 -0
  528. package/v4/core/visit.d.cts +30 -0
  529. package/v4/core/visit.d.ts +30 -0
  530. package/v4/core/visit.js +169 -0
  531. package/v4/index.cjs +51 -0
  532. package/v4/index.d.cts +3 -0
  533. package/v4/index.d.ts +3 -0
  534. package/v4/index.js +4 -0
  535. package/v4/locales/ar.cjs +138 -0
  536. package/v4/locales/ar.d.cts +5 -0
  537. package/v4/locales/ar.d.ts +4 -0
  538. package/v4/locales/ar.js +111 -0
  539. package/v4/locales/az.cjs +137 -0
  540. package/v4/locales/az.d.cts +5 -0
  541. package/v4/locales/az.d.ts +4 -0
  542. package/v4/locales/az.js +110 -0
  543. package/v4/locales/be.cjs +195 -0
  544. package/v4/locales/be.d.cts +5 -0
  545. package/v4/locales/be.d.ts +4 -0
  546. package/v4/locales/be.js +168 -0
  547. package/v4/locales/bg.cjs +152 -0
  548. package/v4/locales/bg.d.cts +5 -0
  549. package/v4/locales/bg.d.ts +4 -0
  550. package/v4/locales/bg.js +125 -0
  551. package/v4/locales/bn.cjs +140 -0
  552. package/v4/locales/bn.d.cts +5 -0
  553. package/v4/locales/bn.d.ts +4 -0
  554. package/v4/locales/bn.js +113 -0
  555. package/v4/locales/ca.cjs +139 -0
  556. package/v4/locales/ca.d.cts +5 -0
  557. package/v4/locales/ca.d.ts +4 -0
  558. package/v4/locales/ca.js +112 -0
  559. package/v4/locales/ckb.cjs +160 -0
  560. package/v4/locales/ckb.d.cts +5 -0
  561. package/v4/locales/ckb.d.ts +4 -0
  562. package/v4/locales/ckb.js +133 -0
  563. package/v4/locales/cs.cjs +143 -0
  564. package/v4/locales/cs.d.cts +5 -0
  565. package/v4/locales/cs.d.ts +4 -0
  566. package/v4/locales/cs.js +116 -0
  567. package/v4/locales/da.cjs +147 -0
  568. package/v4/locales/da.d.cts +5 -0
  569. package/v4/locales/da.d.ts +4 -0
  570. package/v4/locales/da.js +120 -0
  571. package/v4/locales/de.cjs +140 -0
  572. package/v4/locales/de.d.cts +5 -0
  573. package/v4/locales/de.d.ts +4 -0
  574. package/v4/locales/de.js +113 -0
  575. package/v4/locales/el.cjs +139 -0
  576. package/v4/locales/el.d.cts +5 -0
  577. package/v4/locales/el.d.ts +4 -0
  578. package/v4/locales/el.js +112 -0
  579. package/v4/locales/en.cjs +152 -0
  580. package/v4/locales/en.d.cts +5 -0
  581. package/v4/locales/en.d.ts +4 -0
  582. package/v4/locales/en.js +125 -0
  583. package/v4/locales/eo.cjs +141 -0
  584. package/v4/locales/eo.d.cts +5 -0
  585. package/v4/locales/eo.d.ts +4 -0
  586. package/v4/locales/eo.js +114 -0
  587. package/v4/locales/es.cjs +163 -0
  588. package/v4/locales/es.d.cts +5 -0
  589. package/v4/locales/es.d.ts +4 -0
  590. package/v4/locales/es.js +136 -0
  591. package/v4/locales/fa.cjs +146 -0
  592. package/v4/locales/fa.d.cts +5 -0
  593. package/v4/locales/fa.d.ts +4 -0
  594. package/v4/locales/fa.js +119 -0
  595. package/v4/locales/fi.cjs +144 -0
  596. package/v4/locales/fi.d.cts +5 -0
  597. package/v4/locales/fi.d.ts +4 -0
  598. package/v4/locales/fi.js +117 -0
  599. package/v4/locales/fr-CA.cjs +139 -0
  600. package/v4/locales/fr-CA.d.cts +5 -0
  601. package/v4/locales/fr-CA.d.ts +4 -0
  602. package/v4/locales/fr-CA.js +112 -0
  603. package/v4/locales/fr.cjs +156 -0
  604. package/v4/locales/fr.d.cts +5 -0
  605. package/v4/locales/fr.d.ts +4 -0
  606. package/v4/locales/fr.js +129 -0
  607. package/v4/locales/gu.cjs +140 -0
  608. package/v4/locales/gu.d.cts +5 -0
  609. package/v4/locales/gu.d.ts +4 -0
  610. package/v4/locales/gu.js +113 -0
  611. package/v4/locales/he.cjs +248 -0
  612. package/v4/locales/he.d.cts +5 -0
  613. package/v4/locales/he.d.ts +4 -0
  614. package/v4/locales/he.js +221 -0
  615. package/v4/locales/hi.cjs +138 -0
  616. package/v4/locales/hi.d.cts +5 -0
  617. package/v4/locales/hi.d.ts +4 -0
  618. package/v4/locales/hi.js +111 -0
  619. package/v4/locales/hr.cjs +153 -0
  620. package/v4/locales/hr.d.cts +5 -0
  621. package/v4/locales/hr.d.ts +4 -0
  622. package/v4/locales/hr.js +126 -0
  623. package/v4/locales/hu.cjs +140 -0
  624. package/v4/locales/hu.d.cts +5 -0
  625. package/v4/locales/hu.d.ts +4 -0
  626. package/v4/locales/hu.js +113 -0
  627. package/v4/locales/hy.cjs +185 -0
  628. package/v4/locales/hy.d.cts +5 -0
  629. package/v4/locales/hy.d.ts +4 -0
  630. package/v4/locales/hy.js +158 -0
  631. package/v4/locales/id.cjs +138 -0
  632. package/v4/locales/id.d.cts +5 -0
  633. package/v4/locales/id.d.ts +4 -0
  634. package/v4/locales/id.js +111 -0
  635. package/v4/locales/index.cjs +152 -0
  636. package/v4/locales/index.d.cts +63 -0
  637. package/v4/locales/index.d.ts +63 -0
  638. package/v4/locales/index.js +63 -0
  639. package/v4/locales/is.cjs +141 -0
  640. package/v4/locales/is.d.cts +5 -0
  641. package/v4/locales/is.d.ts +4 -0
  642. package/v4/locales/is.js +114 -0
  643. package/v4/locales/it.cjs +140 -0
  644. package/v4/locales/it.d.cts +5 -0
  645. package/v4/locales/it.d.ts +4 -0
  646. package/v4/locales/it.js +113 -0
  647. package/v4/locales/ja.cjs +139 -0
  648. package/v4/locales/ja.d.cts +5 -0
  649. package/v4/locales/ja.d.ts +4 -0
  650. package/v4/locales/ja.js +112 -0
  651. package/v4/locales/ka.cjs +144 -0
  652. package/v4/locales/ka.d.cts +5 -0
  653. package/v4/locales/ka.d.ts +4 -0
  654. package/v4/locales/ka.js +117 -0
  655. package/v4/locales/kh.cjs +12 -0
  656. package/v4/locales/kh.d.cts +5 -0
  657. package/v4/locales/kh.d.ts +5 -0
  658. package/v4/locales/kh.js +5 -0
  659. package/v4/locales/km.cjs +142 -0
  660. package/v4/locales/km.d.cts +5 -0
  661. package/v4/locales/km.d.ts +4 -0
  662. package/v4/locales/km.js +115 -0
  663. package/v4/locales/kn.cjs +143 -0
  664. package/v4/locales/kn.d.cts +5 -0
  665. package/v4/locales/kn.d.ts +4 -0
  666. package/v4/locales/kn.js +116 -0
  667. package/v4/locales/ko.cjs +143 -0
  668. package/v4/locales/ko.d.cts +5 -0
  669. package/v4/locales/ko.d.ts +4 -0
  670. package/v4/locales/ko.js +116 -0
  671. package/v4/locales/lt.cjs +234 -0
  672. package/v4/locales/lt.d.cts +5 -0
  673. package/v4/locales/lt.d.ts +4 -0
  674. package/v4/locales/lt.js +207 -0
  675. package/v4/locales/mk.cjs +141 -0
  676. package/v4/locales/mk.d.cts +5 -0
  677. package/v4/locales/mk.d.ts +4 -0
  678. package/v4/locales/mk.js +114 -0
  679. package/v4/locales/ms.cjs +139 -0
  680. package/v4/locales/ms.d.cts +5 -0
  681. package/v4/locales/ms.d.ts +4 -0
  682. package/v4/locales/ms.js +112 -0
  683. package/v4/locales/ne.cjs +138 -0
  684. package/v4/locales/ne.d.cts +5 -0
  685. package/v4/locales/ne.d.ts +4 -0
  686. package/v4/locales/ne.js +111 -0
  687. package/v4/locales/nl.cjs +142 -0
  688. package/v4/locales/nl.d.cts +5 -0
  689. package/v4/locales/nl.d.ts +4 -0
  690. package/v4/locales/nl.js +115 -0
  691. package/v4/locales/nn.cjs +140 -0
  692. package/v4/locales/nn.d.cts +5 -0
  693. package/v4/locales/nn.d.ts +4 -0
  694. package/v4/locales/nn.js +113 -0
  695. package/v4/locales/no.cjs +140 -0
  696. package/v4/locales/no.d.cts +5 -0
  697. package/v4/locales/no.d.ts +4 -0
  698. package/v4/locales/no.js +113 -0
  699. package/v4/locales/ota.cjs +141 -0
  700. package/v4/locales/ota.d.cts +5 -0
  701. package/v4/locales/ota.d.ts +4 -0
  702. package/v4/locales/ota.js +114 -0
  703. package/v4/locales/pl.cjs +141 -0
  704. package/v4/locales/pl.d.cts +5 -0
  705. package/v4/locales/pl.d.ts +4 -0
  706. package/v4/locales/pl.js +114 -0
  707. package/v4/locales/ps.cjs +146 -0
  708. package/v4/locales/ps.d.cts +5 -0
  709. package/v4/locales/ps.d.ts +4 -0
  710. package/v4/locales/ps.js +119 -0
  711. package/v4/locales/pt-BR.cjs +170 -0
  712. package/v4/locales/pt-BR.d.cts +5 -0
  713. package/v4/locales/pt-BR.d.ts +4 -0
  714. package/v4/locales/pt-BR.js +143 -0
  715. package/v4/locales/pt.cjs +169 -0
  716. package/v4/locales/pt.d.cts +5 -0
  717. package/v4/locales/pt.d.ts +4 -0
  718. package/v4/locales/pt.js +142 -0
  719. package/v4/locales/ro.cjs +149 -0
  720. package/v4/locales/ro.d.cts +5 -0
  721. package/v4/locales/ro.d.ts +4 -0
  722. package/v4/locales/ro.js +122 -0
  723. package/v4/locales/ru.cjs +195 -0
  724. package/v4/locales/ru.d.cts +5 -0
  725. package/v4/locales/ru.d.ts +4 -0
  726. package/v4/locales/ru.js +168 -0
  727. package/v4/locales/sk.cjs +143 -0
  728. package/v4/locales/sk.d.cts +5 -0
  729. package/v4/locales/sk.d.ts +4 -0
  730. package/v4/locales/sk.js +116 -0
  731. package/v4/locales/sl.cjs +141 -0
  732. package/v4/locales/sl.d.cts +5 -0
  733. package/v4/locales/sl.d.ts +4 -0
  734. package/v4/locales/sl.js +114 -0
  735. package/v4/locales/sv.cjs +142 -0
  736. package/v4/locales/sv.d.cts +5 -0
  737. package/v4/locales/sv.d.ts +4 -0
  738. package/v4/locales/sv.js +115 -0
  739. package/v4/locales/ta.cjs +142 -0
  740. package/v4/locales/ta.d.cts +5 -0
  741. package/v4/locales/ta.d.ts +4 -0
  742. package/v4/locales/ta.js +115 -0
  743. package/v4/locales/tg.cjs +144 -0
  744. package/v4/locales/tg.d.cts +5 -0
  745. package/v4/locales/tg.d.ts +4 -0
  746. package/v4/locales/tg.js +117 -0
  747. package/v4/locales/th.cjs +142 -0
  748. package/v4/locales/th.d.cts +5 -0
  749. package/v4/locales/th.d.ts +4 -0
  750. package/v4/locales/th.js +115 -0
  751. package/v4/locales/tk.cjs +134 -0
  752. package/v4/locales/tk.d.cts +5 -0
  753. package/v4/locales/tk.d.ts +4 -0
  754. package/v4/locales/tk.js +107 -0
  755. package/v4/locales/tr.cjs +137 -0
  756. package/v4/locales/tr.d.cts +5 -0
  757. package/v4/locales/tr.d.ts +4 -0
  758. package/v4/locales/tr.js +110 -0
  759. package/v4/locales/ua.cjs +12 -0
  760. package/v4/locales/ua.d.cts +5 -0
  761. package/v4/locales/ua.d.ts +5 -0
  762. package/v4/locales/ua.js +5 -0
  763. package/v4/locales/uk.cjs +140 -0
  764. package/v4/locales/uk.d.cts +5 -0
  765. package/v4/locales/uk.d.ts +4 -0
  766. package/v4/locales/uk.js +113 -0
  767. package/v4/locales/ur.cjs +142 -0
  768. package/v4/locales/ur.d.cts +5 -0
  769. package/v4/locales/ur.d.ts +4 -0
  770. package/v4/locales/ur.js +115 -0
  771. package/v4/locales/uz.cjs +140 -0
  772. package/v4/locales/uz.d.cts +5 -0
  773. package/v4/locales/uz.d.ts +4 -0
  774. package/v4/locales/uz.js +113 -0
  775. package/v4/locales/vi.cjs +140 -0
  776. package/v4/locales/vi.d.cts +5 -0
  777. package/v4/locales/vi.d.ts +4 -0
  778. package/v4/locales/vi.js +113 -0
  779. package/v4/locales/yo.cjs +139 -0
  780. package/v4/locales/yo.d.cts +5 -0
  781. package/v4/locales/yo.d.ts +4 -0
  782. package/v4/locales/yo.js +112 -0
  783. package/v4/locales/zh-CN.cjs +141 -0
  784. package/v4/locales/zh-CN.d.cts +5 -0
  785. package/v4/locales/zh-CN.d.ts +4 -0
  786. package/v4/locales/zh-CN.js +114 -0
  787. package/v4/locales/zh-TW.cjs +139 -0
  788. package/v4/locales/zh-TW.d.cts +5 -0
  789. package/v4/locales/zh-TW.d.ts +4 -0
  790. package/v4/locales/zh-TW.js +112 -0
  791. package/v4/mini/checks.cjs +54 -0
  792. package/v4/mini/checks.d.cts +1 -0
  793. package/v4/mini/checks.d.ts +1 -0
  794. package/v4/mini/checks.js +1 -0
  795. package/v4/mini/coerce.cjs +71 -0
  796. package/v4/mini/coerce.d.cts +7 -0
  797. package/v4/mini/coerce.d.ts +7 -0
  798. package/v4/mini/coerce.js +22 -0
  799. package/v4/mini/deep-partial.cjs +58 -0
  800. package/v4/mini/deep-partial.d.cts +14 -0
  801. package/v4/mini/deep-partial.d.ts +14 -0
  802. package/v4/mini/deep-partial.js +13 -0
  803. package/v4/mini/external.cjs +95 -0
  804. package/v4/mini/external.d.cts +16 -0
  805. package/v4/mini/external.d.ts +16 -0
  806. package/v4/mini/external.js +16 -0
  807. package/v4/mini/in-out.cjs +82 -0
  808. package/v4/mini/in-out.d.cts +8 -0
  809. package/v4/mini/in-out.d.ts +8 -0
  810. package/v4/mini/in-out.js +36 -0
  811. package/v4/mini/index.cjs +51 -0
  812. package/v4/mini/index.d.cts +3 -0
  813. package/v4/mini/index.d.ts +3 -0
  814. package/v4/mini/index.js +3 -0
  815. package/v4/mini/iso.cjs +83 -0
  816. package/v4/mini/iso.d.cts +22 -0
  817. package/v4/mini/iso.d.ts +22 -0
  818. package/v4/mini/iso.js +34 -0
  819. package/v4/mini/parse.cjs +37 -0
  820. package/v4/mini/parse.d.cts +1 -0
  821. package/v4/mini/parse.d.ts +1 -0
  822. package/v4/mini/parse.js +1 -0
  823. package/v4/mini/schemas.cjs +1149 -0
  824. package/v4/mini/schemas.d.cts +480 -0
  825. package/v4/mini/schemas.d.ts +480 -0
  826. package/v4/mini/schemas.js +1004 -0
  827. package/v4-mini/index.cjs +51 -0
  828. package/v4-mini/index.d.cts +3 -0
  829. package/v4-mini/index.d.ts +3 -0
  830. package/v4-mini/index.js +3 -0
@@ -0,0 +1,1006 @@
1
+ import { describe, expect, expectTypeOf, test } from "vitest";
2
+ import * as z from "yatsp/v4";
3
+ import * as core from "yatsp/v4/core";
4
+
5
+ const Test = z.object({
6
+ f1: z.number(),
7
+ f2: z.string().optional(),
8
+ f3: z.string().nullable(),
9
+ f4: z.array(z.object({ t: z.union([z.string(), z.boolean()]) })),
10
+ });
11
+
12
+ test("object type inference", () => {
13
+ type TestType = {
14
+ f1: number;
15
+ f2?: string | undefined;
16
+ f3: string | null;
17
+ f4: { t: string | boolean }[];
18
+ };
19
+
20
+ expectTypeOf<z.TypeOf<typeof Test>>().toEqualTypeOf<TestType>();
21
+ });
22
+
23
+ test("unknown throw", () => {
24
+ const asdf: unknown = 35;
25
+ expect(() => Test.parse(asdf)).toThrow();
26
+ });
27
+
28
+ test("shape() should return schema of particular key", () => {
29
+ const f1Schema = Test.shape.f1;
30
+ const f2Schema = Test.shape.f2;
31
+ const f3Schema = Test.shape.f3;
32
+ const f4Schema = Test.shape.f4;
33
+
34
+ expect(f1Schema).toBeInstanceOf(z.YatspNumber);
35
+ expect(f2Schema).toBeInstanceOf(z.YatspOptional);
36
+ expect(f3Schema).toBeInstanceOf(z.YatspNullable);
37
+ expect(f4Schema).toBeInstanceOf(z.YatspArray);
38
+ });
39
+
40
+ test("correct parsing", () => {
41
+ Test.parse({
42
+ f1: 12,
43
+ f2: "string",
44
+ f3: "string",
45
+ f4: [
46
+ {
47
+ t: "string",
48
+ },
49
+ ],
50
+ });
51
+
52
+ Test.parse({
53
+ f1: 12,
54
+ f3: null,
55
+ f4: [
56
+ {
57
+ t: false,
58
+ },
59
+ ],
60
+ });
61
+ });
62
+
63
+ test("nonstrict by default", () => {
64
+ z.object({ points: z.number() }).parse({
65
+ points: 2314,
66
+ unknown: "asdf",
67
+ });
68
+ });
69
+
70
+ test("parse optional keys ", () => {
71
+ const schema = z.object({
72
+ a: z.string().optional(),
73
+ });
74
+ expect(schema.parse({ a: "asdf" })).toEqual({ a: "asdf" });
75
+ });
76
+
77
+ test("empty object", () => {
78
+ const schema = z.object({});
79
+ expect(schema.parse({})).toEqual({});
80
+ expect(schema.parse({ name: "asdf" })).toEqual({});
81
+ expect(schema.safeParse(null).success).toEqual(false);
82
+ expect(schema.safeParse("asdf").success).toEqual(false);
83
+ expectTypeOf<z.output<typeof schema>>().toEqualTypeOf<Record<string, never>>();
84
+ });
85
+
86
+ const data = {
87
+ points: 2314,
88
+ unknown: "asdf",
89
+ };
90
+
91
+ test("strip by default", () => {
92
+ const val = z.object({ points: z.number() }).parse(data);
93
+ expect(val).toEqual({ points: 2314 });
94
+ });
95
+
96
+ test("unknownkeys override", () => {
97
+ const val = z.object({ points: z.number() }).strict().passthrough().strip().passthrough().parse(data);
98
+
99
+ expect(val).toEqual(data);
100
+ });
101
+
102
+ test("passthrough unknown", () => {
103
+ const val = z.object({ points: z.number() }).passthrough().parse(data);
104
+
105
+ expect(val).toEqual(data);
106
+ });
107
+
108
+ test("strip unknown", () => {
109
+ const val = z.object({ points: z.number() }).strip().parse(data);
110
+
111
+ expect(val).toEqual({ points: 2314 });
112
+ });
113
+
114
+ test("strict", () => {
115
+ const val = z.object({ points: z.number() }).strict().safeParse(data);
116
+
117
+ expect(val.success).toEqual(false);
118
+ });
119
+
120
+ test("catchall inference", () => {
121
+ const o1 = z
122
+ .object({
123
+ first: z.string(),
124
+ })
125
+ .catchall(z.number());
126
+
127
+ const d1 = o1.parse({ first: "asdf", num: 1243 });
128
+ // expectTypeOf<(typeof d1)["asdf"]>().toEqualTypeOf<number>();
129
+ expectTypeOf<(typeof d1)["first"]>().toEqualTypeOf<string>();
130
+ });
131
+
132
+ test("catchall overrides strict", () => {
133
+ const o1 = z.object({ first: z.string().optional() }).strict().catchall(z.number());
134
+
135
+ // should run fine setting a catchall overrides the unknownKeys behavior
136
+ o1.parse({
137
+ asdf: 1234,
138
+ });
139
+
140
+ // should only run catchall validation against unknown keys
141
+ o1.parse({
142
+ first: "asdf",
143
+ asdf: 1234,
144
+ });
145
+ });
146
+
147
+ test("catchall overrides strict", () => {
148
+ const o1 = z
149
+ .object({
150
+ first: z.string(),
151
+ })
152
+ .strict()
153
+ .catchall(z.number());
154
+
155
+ // should run fine setting a catchall overrides the unknownKeys behavior
156
+ o1.parse({
157
+ first: "asdf",
158
+ asdf: 1234,
159
+ });
160
+ });
161
+
162
+ test("optional keys are unset", () => {
163
+ const SNamedEntity = z.object({
164
+ id: z.string(),
165
+ set: z.string().optional(),
166
+ unset: z.string().optional(),
167
+ });
168
+ const result = SNamedEntity.parse({
169
+ id: "asdf",
170
+ set: undefined,
171
+ });
172
+ expect(Object.keys(result)).toEqual(["id", "set"]);
173
+ });
174
+
175
+ test("catchall parsing", async () => {
176
+ const result = z.object({ name: z.string() }).catchall(z.number()).parse({ name: "Foo", validExtraKey: 61 });
177
+
178
+ expect(result).toEqual({ name: "Foo", validExtraKey: 61 });
179
+
180
+ const result2 = z
181
+ .object({ name: z.string() })
182
+ .catchall(z.number())
183
+ .safeParse({ name: "Foo", validExtraKey: 61, invalid: "asdf" });
184
+
185
+ expect(result2.success).toEqual(false);
186
+ });
187
+
188
+ test("nonexistent keys", async () => {
189
+ const Schema = z.union([z.object({ a: z.string() }), z.object({ b: z.number() })]);
190
+ const obj = { a: "A" };
191
+ const result = await Schema.spa(obj); // Works with 1.11.10, breaks with 2.0.0-beta.21
192
+ expect(result.success).toBe(true);
193
+ });
194
+
195
+ test("test async union", async () => {
196
+ const Schema2 = z.union([
197
+ z.object({
198
+ ty: z.string(),
199
+ }),
200
+ z.object({
201
+ ty: z.number(),
202
+ }),
203
+ ]);
204
+
205
+ const obj = { ty: "A" };
206
+ const result = await Schema2.spa(obj); // Works with 1.11.10, breaks with 2.0.0-beta.21
207
+ expect(result.success).toEqual(true);
208
+ });
209
+
210
+ test("test inferred merged type", async () => {
211
+ const asdf = z.object({ a: z.string() }).merge(z.object({ a: z.number() }));
212
+ type asdf = z.infer<typeof asdf>;
213
+
214
+ expectTypeOf<asdf>().toEqualTypeOf<{ a: number }>();
215
+ });
216
+
217
+ test("inferred type with Record shape", () => {
218
+ type A = z.YatspObject<Record<string, z.YatspType<string, number>>>;
219
+ expectTypeOf<z.infer<A>>().toEqualTypeOf<Record<string, string>>();
220
+ expectTypeOf<z.input<A>>().toEqualTypeOf<Record<string, number>>();
221
+
222
+ type B = z.YatspObject;
223
+ expectTypeOf<z.infer<B>>().toEqualTypeOf<Record<string, unknown>>();
224
+ expectTypeOf<z.input<B>>().toEqualTypeOf<Record<string, unknown>>();
225
+ });
226
+
227
+ test("inferred merged object type with optional properties", async () => {
228
+ const Merged = z
229
+ .object({ a: z.string(), b: z.string().optional() })
230
+ .merge(z.object({ a: z.string().optional(), b: z.string() }));
231
+ type Merged = z.infer<typeof Merged>;
232
+ expectTypeOf<Merged>().toEqualTypeOf<{ a?: string | undefined; b: string }>();
233
+ });
234
+
235
+ test("inferred unioned object type with optional properties", async () => {
236
+ const Unioned = z.union([
237
+ z.object({ a: z.string(), b: z.string().optional() }),
238
+ z.object({ a: z.string().optional(), b: z.string() }),
239
+ ]);
240
+ type Unioned = z.infer<typeof Unioned>;
241
+ expectTypeOf<Unioned>().toEqualTypeOf<
242
+ { a: string; b?: string | undefined } | { a?: string | undefined; b: string }
243
+ >();
244
+ });
245
+
246
+ test("inferred enum type", async () => {
247
+ const Enum = z.object({ a: z.string(), b: z.string().optional() }).keyof();
248
+
249
+ expect(Enum.enum).toEqual({
250
+ a: "a",
251
+ b: "b",
252
+ });
253
+
254
+ expect(Enum._yatsp.def.entries).toEqual({
255
+ a: "a",
256
+ b: "b",
257
+ });
258
+ type Enum = z.infer<typeof Enum>;
259
+ expectTypeOf<Enum>().toEqualTypeOf<"a" | "b">();
260
+ });
261
+
262
+ test("z.keyof returns enum", () => {
263
+ const User = z.object({ name: z.string(), age: z.number() });
264
+ const keysSchema = z.keyof(User);
265
+ expect(keysSchema.enum).toEqual({
266
+ name: "name",
267
+ age: "age",
268
+ });
269
+ expect(keysSchema._yatsp.def.entries).toEqual({
270
+ name: "name",
271
+ age: "age",
272
+ });
273
+ type Keys = z.infer<typeof keysSchema>;
274
+ expectTypeOf<Keys>().toEqualTypeOf<"name" | "age">();
275
+ });
276
+
277
+ test("inferred partial object type with optional properties", async () => {
278
+ const Partial = z.object({ a: z.string(), b: z.string().optional() }).partial();
279
+ type Partial = z.infer<typeof Partial>;
280
+ expectTypeOf<Partial>().toEqualTypeOf<{ a?: string | undefined; b?: string | undefined }>();
281
+ });
282
+
283
+ test("inferred picked object type with optional properties", async () => {
284
+ const Picked = z.object({ a: z.string(), b: z.string().optional() }).pick({ b: true });
285
+ type Picked = z.infer<typeof Picked>;
286
+ expectTypeOf<Picked>().toEqualTypeOf<{ b?: string | undefined }>();
287
+ });
288
+
289
+ test("inferred type for unknown/any keys", () => {
290
+ const myType = z.object({
291
+ anyOptional: z.any().optional(),
292
+ anyRequired: z.any(),
293
+ unknownOptional: z.unknown().optional(),
294
+ unknownRequired: z.unknown(),
295
+ });
296
+ type myType = z.infer<typeof myType>;
297
+ expectTypeOf<myType>().toEqualTypeOf<{
298
+ anyOptional?: any;
299
+ anyRequired: any;
300
+ unknownOptional?: unknown;
301
+ unknownRequired: unknown;
302
+ }>();
303
+ });
304
+
305
+ test("strictObject", async () => {
306
+ const strictObj = z.strictObject({
307
+ name: z.string(),
308
+ });
309
+
310
+ const syncResult = strictObj.safeParse({ name: "asdf", unexpected: 13 });
311
+ expect(syncResult.success).toEqual(false);
312
+
313
+ const asyncResult = await strictObj.spa({ name: "asdf", unexpected: 13 });
314
+ expect(asyncResult.success).toEqual(false);
315
+ });
316
+
317
+ test("object with refine", async () => {
318
+ const schema = z
319
+ .object({
320
+ a: z.string().default("foo"),
321
+ b: z.number(),
322
+ })
323
+ .refine(() => true);
324
+ expect(schema.parse({ b: 5 })).toEqual({ b: 5, a: "foo" });
325
+ const result = await schema.parseAsync({ b: 5 });
326
+ expect(result).toEqual({ b: 5, a: "foo" });
327
+ });
328
+
329
+ test("intersection of object with date", async () => {
330
+ const schema = z.object({
331
+ a: z.date(),
332
+ });
333
+ expect(z.intersection(schema, schema).parse({ a: new Date(1637353595983) })).toEqual({
334
+ a: new Date(1637353595983),
335
+ });
336
+ const result = await schema.parseAsync({ a: new Date(1637353595983) });
337
+ expect(result).toEqual({ a: new Date(1637353595983) });
338
+ });
339
+
340
+ test("intersection of object with refine with date", async () => {
341
+ const schema = z
342
+ .object({
343
+ a: z.date(),
344
+ })
345
+ .refine(() => true);
346
+ expect(z.intersection(schema, schema).parse({ a: new Date(1637353595983) })).toEqual({
347
+ a: new Date(1637353595983),
348
+ });
349
+ const result = await schema.parseAsync({ a: new Date(1637353595983) });
350
+ expect(result).toEqual({ a: new Date(1637353595983) });
351
+ });
352
+
353
+ test("constructor key", () => {
354
+ const person = z
355
+ .object({
356
+ name: z.string(),
357
+ })
358
+ .strict();
359
+
360
+ expect(() =>
361
+ person.parse({
362
+ name: "bob dylan",
363
+ constructor: 61,
364
+ })
365
+ ).toThrow();
366
+ });
367
+
368
+ test("constructor key", () => {
369
+ const Example = z.object({
370
+ prop: z.string(),
371
+ opt: z.number().optional(),
372
+ arr: z.string().array(),
373
+ });
374
+
375
+ type Example = z.infer<typeof Example>;
376
+ expectTypeOf<keyof Example>().toEqualTypeOf<"prop" | "opt" | "arr">();
377
+ });
378
+
379
+ test("catchall", () => {
380
+ const a = z.object({});
381
+ expect(a._yatsp.def.catchall).toBeUndefined();
382
+
383
+ const b = z.strictObject({});
384
+ expect(b._yatsp.def.catchall).toBeInstanceOf(core.$YatspNever);
385
+
386
+ const c = z.looseObject({});
387
+ expect(c._yatsp.def.catchall).toBeInstanceOf(core.$YatspUnknown);
388
+
389
+ const d = z.object({}).catchall(z.number());
390
+ expect(d._yatsp.def.catchall).toBeInstanceOf(core.$YatspNumber);
391
+ });
392
+
393
+ test("unknownkeys merging", () => {
394
+ // This one is "strict"
395
+ const a = z.looseObject({
396
+ a: z.string(),
397
+ });
398
+
399
+ const b = z.strictObject({ b: z.string() });
400
+
401
+ // incoming object overrides
402
+ const c = a.merge(b);
403
+ expect(c._yatsp.def.catchall).toBeInstanceOf(core.$YatspNever);
404
+ });
405
+
406
+ test("merge() throws when receiver has refinements", () => {
407
+ const a = z
408
+ .object({
409
+ password: z.string(),
410
+ confirmPassword: z.string(),
411
+ })
412
+ .refine((data) => data.password === data.confirmPassword);
413
+
414
+ const b = z.object({ email: z.string() });
415
+
416
+ expect(() => a.merge(b)).toThrow(".merge() cannot be used on object schemas containing refinements");
417
+ });
418
+
419
+ test("merge() throws when receiver has superRefine", () => {
420
+ const a = z.object({ x: z.string() }).superRefine(() => {});
421
+ const b = z.object({ y: z.number() });
422
+
423
+ expect(() => a.merge(b)).toThrow(".merge() cannot be used on object schemas containing refinements");
424
+ });
425
+
426
+ test("merge() preserves refinements on the second schema", () => {
427
+ const a = z.object({ name: z.string() });
428
+ const b = z.object({ age: z.number() }).refine((data) => data.age >= 18, { message: "Must be 18+" });
429
+
430
+ const merged = a.merge(b);
431
+
432
+ expect(merged.parse({ name: "n", age: 21 })).toEqual({ name: "n", age: 21 });
433
+ expect(() => merged.parse({ name: "n", age: 12 })).toThrow("Must be 18+");
434
+ });
435
+
436
+ const personToExtend = z.object({
437
+ firstName: z.string(),
438
+ lastName: z.string(),
439
+ });
440
+
441
+ test("extend() should return schema with new key", () => {
442
+ const PersonWithNickname = personToExtend.extend({ nickName: z.string() });
443
+ type PersonWithNickname = z.infer<typeof PersonWithNickname>;
444
+
445
+ const expected = { firstName: "f", nickName: "n", lastName: "l" };
446
+ const actual = PersonWithNickname.parse(expected);
447
+
448
+ expect(actual).toEqual(expected);
449
+ expectTypeOf<keyof PersonWithNickname>().toEqualTypeOf<"firstName" | "lastName" | "nickName">();
450
+ expectTypeOf<PersonWithNickname>().toEqualTypeOf<{ firstName: string; lastName: string; nickName: string }>();
451
+ });
452
+
453
+ test("extend() should have power to override existing key", () => {
454
+ const PersonWithNumberAsLastName = personToExtend.extend({
455
+ lastName: z.number(),
456
+ });
457
+ type PersonWithNumberAsLastName = z.infer<typeof PersonWithNumberAsLastName>;
458
+
459
+ const expected = { firstName: "f", lastName: 42 };
460
+ const actual = PersonWithNumberAsLastName.parse(expected);
461
+
462
+ expect(actual).toEqual(expected);
463
+ expectTypeOf<PersonWithNumberAsLastName>().toEqualTypeOf<{ firstName: string; lastName: number }>();
464
+ });
465
+
466
+ test("safeExtend() should have power to override existing key", () => {
467
+ const PersonWithMinLastName = personToExtend.safeExtend({
468
+ lastName: z.string().min(3),
469
+ });
470
+ type PersonWithMinLastName = z.infer<typeof PersonWithMinLastName>;
471
+
472
+ const expected = { firstName: "f", lastName: "abc" };
473
+ const actual = PersonWithMinLastName.parse(expected);
474
+
475
+ expect(actual).toEqual(expected);
476
+ expect(() => PersonWithMinLastName.parse({ firstName: "f", lastName: "ab" })).toThrow();
477
+ expectTypeOf<PersonWithMinLastName>().toEqualTypeOf<{ firstName: string; lastName: string }>();
478
+ });
479
+
480
+ test("safeExtend() maintains refinements", () => {
481
+ const schema = z.object({ name: z.string().min(1) });
482
+ const extended = schema.safeExtend({ name: z.string().min(2) });
483
+ expect(() => extended.parse({ name: "" })).toThrow();
484
+ expect(extended.parse({ name: "ab" })).toEqual({ name: "ab" });
485
+ type Extended = z.infer<typeof extended>;
486
+ expectTypeOf<Extended>().toEqualTypeOf<{ name: string }>();
487
+ // @ts-expect-error
488
+ schema.safeExtend({ name: z.number() });
489
+ });
490
+
491
+ test("passthrough index signature", () => {
492
+ const a = z.object({ a: z.string() });
493
+ type a = z.infer<typeof a>;
494
+ expectTypeOf<a>().toEqualTypeOf<{ a: string }>();
495
+ const b = a.passthrough();
496
+ type b = z.infer<typeof b>;
497
+ expectTypeOf<b>().toEqualTypeOf<{ a: string; [k: string]: unknown }>();
498
+ });
499
+
500
+ // test("xor", () => {
501
+ // type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };
502
+ // type XOR<T, U> = T extends object ? (U extends object ? (Without<T, U> & U) | (Without<U, T> & T) : U) : T;
503
+
504
+ // type A = { name: string; a: number };
505
+ // type B = { name: string; b: number };
506
+ // type C = XOR<A, B>;
507
+ // type Outer = { data: C };
508
+ // const Outer = z.object({
509
+ // data: z.union([z.object({ name: z.string(), a: z.number() }), z.object({ name: z.string(), b: z.number() })]),
510
+ // }) satisfies z.YatspType<Outer, any>;
511
+ // });
512
+
513
+ test("assignability", () => {
514
+ z.object({ a: z.string() }) satisfies z.YatspObject<{ a: z.YatspString }>;
515
+ z.object({ a: z.string() }).catchall(z.number()) satisfies z.YatspObject<{ a: z.YatspString }>;
516
+ z.object({ a: z.string() }).strict() satisfies z.YatspObject;
517
+ z.object({}) satisfies z.YatspObject;
518
+
519
+ z.looseObject({ name: z.string() }) satisfies z.YatspObject<
520
+ {
521
+ name: z.YatspString;
522
+ },
523
+ z.core.$loose
524
+ >;
525
+ z.looseObject({ name: z.string() }) satisfies z.YatspObject<{
526
+ name: z.YatspString;
527
+ }>;
528
+ z.strictObject({ name: z.string() }) satisfies z.YatspObject<
529
+ {
530
+ name: z.YatspString;
531
+ },
532
+ z.core.$loose
533
+ >;
534
+ z.strictObject({ name: z.string() }) satisfies z.YatspObject<
535
+ {
536
+ name: z.YatspString;
537
+ },
538
+ z.core.$strict
539
+ >;
540
+ z.object({ name: z.string() }) satisfies z.YatspObject<{
541
+ name: z.YatspString;
542
+ }>;
543
+ z.object({
544
+ a: z.string(),
545
+ b: z.number(),
546
+ c: z.boolean(),
547
+ }) satisfies z.core.$YatspObject;
548
+ });
549
+
550
+ test("null prototype", () => {
551
+ const schema = z.object({ a: z.string() });
552
+ const obj = Object.create(null);
553
+ obj.a = "foo";
554
+ expect(schema.parse(obj)).toEqual({ a: "foo" });
555
+ });
556
+
557
+ test("empty objects", () => {
558
+ const A = z.looseObject({});
559
+ type Ain = z.input<typeof A>;
560
+ expectTypeOf<Ain>().toEqualTypeOf<Record<string, unknown>>();
561
+ type Aout = z.output<typeof A>;
562
+ expectTypeOf<Aout>().toEqualTypeOf<Record<string, unknown>>();
563
+
564
+ const B = z.object({});
565
+ type Bout = z.output<typeof B>;
566
+ expectTypeOf<Bout>().toEqualTypeOf<Record<string, never>>();
567
+ type Bin = z.input<typeof B>;
568
+ expectTypeOf<Bin>().toEqualTypeOf<Record<string, never>>();
569
+
570
+ const C = z.strictObject({});
571
+ type Cout = z.output<typeof C>;
572
+ expectTypeOf<Cout>().toEqualTypeOf<Record<string, never>>();
573
+ type Cin = z.input<typeof C>;
574
+ expectTypeOf<Cin>().toEqualTypeOf<Record<string, never>>();
575
+ });
576
+
577
+ test("preserve key order", () => {
578
+ const schema = z.object({
579
+ a: z.string().optional(),
580
+ b: z.string(),
581
+ });
582
+ const r1 = schema.safeParse({ a: "asdf", b: "qwer" });
583
+ const r2 = schema.safeParse({ a: "asdf", b: "qwer" }, { jitless: true });
584
+
585
+ expect(Object.keys(r1.data!)).toMatchInlineSnapshot(`
586
+ [
587
+ "a",
588
+ "b",
589
+ ]
590
+ `);
591
+ expect(Object.keys(r1.data!)).toEqual(Object.keys(r2.data!));
592
+ });
593
+
594
+ test("empty shape", () => {
595
+ const a = z.object({});
596
+
597
+ a.parse({});
598
+ a.parse({}, { jitless: true });
599
+ a.parse(Object.create(null));
600
+ a.parse(Object.create(null), { jitless: true });
601
+
602
+ expect(() => a.parse([])).toThrow();
603
+ expect(() => a.parse([], { jitless: true })).toThrow();
604
+ });
605
+
606
+ test("yatsptype assignability", () => {
607
+ // Does not error
608
+ z.object({ hello: z.string().optional() }) satisfies z.YatspType<{ hello?: string | undefined }>;
609
+ z.object({ hello: z.string() }) satisfies z.YatspType<{ hello?: string | undefined }>;
610
+ // @ts-expect-error
611
+ z.object({}) satisfies z.YatspType<{ hello: string | undefined }>;
612
+ // @ts-expect-error
613
+ z.object({ hello: z.string().optional() }) satisfies z.YatspType<{ hello: string | undefined }>;
614
+ // @ts-expect-error
615
+ z.object({ hello: z.string().optional() }) satisfies z.YatspType<{ hello: string }>;
616
+ // @ts-expect-error
617
+ z.object({ hello: z.number() }) satisfies z.YatspType<{ hello?: string | undefined }>;
618
+ });
619
+
620
+ test("index signature in shape", () => {
621
+ function makeYatspObj<const T extends string>(key: T) {
622
+ return z.looseObject({
623
+ [key]: z.string(),
624
+ });
625
+ }
626
+
627
+ const schema = makeYatspObj("foo");
628
+ type schema = z.infer<typeof schema>;
629
+
630
+ expectTypeOf<schema>().toEqualTypeOf<Record<string, string>>();
631
+ });
632
+
633
+ test("extend() on object with refinements should throw when overwriting properties", () => {
634
+ const schema = z
635
+ .object({
636
+ a: z.string(),
637
+ })
638
+ .refine(() => true);
639
+
640
+ expect(() => schema.extend({ a: z.number() })).toThrow();
641
+ });
642
+
643
+ test("extend() on object with refinements should not throw when adding new properties", () => {
644
+ const schema = z
645
+ .object({
646
+ a: z.string(),
647
+ })
648
+ .refine((data) => data.a.length > 0);
649
+
650
+ // Should not throw since 'b' doesn't overlap with 'a'
651
+ const extended = schema.extend({ b: z.number() });
652
+
653
+ // Verify the extended schema works correctly
654
+ expect(extended.parse({ a: "hello", b: 42 })).toEqual({ a: "hello", b: 42 });
655
+
656
+ // Verify the original refinement still applies
657
+ expect(() => extended.parse({ a: "", b: 42 })).toThrow();
658
+ });
659
+
660
+ test("safeExtend() on object with refinements should not throw", () => {
661
+ const schema = z
662
+ .object({
663
+ a: z.string(),
664
+ })
665
+ .refine(() => true);
666
+
667
+ expect(() => schema.safeExtend({ b: z.string() })).not.toThrow();
668
+ });
669
+
670
+ // __proto__ in input must not replace the prototype of the parsed object via the assignment setter on the result {}.
671
+ describe("__proto__ in object catchall paths", () => {
672
+ const protoInput = () => JSON.parse('{"__proto__":{"isAdmin":true},"name":"alice"}');
673
+
674
+ test("looseObject drops __proto__ and preserves Object.prototype", () => {
675
+ const schema = z.looseObject({ name: z.string() });
676
+ const parsed = schema.parse(protoInput());
677
+ expect(Object.keys(parsed)).toEqual(["name"]);
678
+ expect((parsed as any).isAdmin).toBeUndefined();
679
+ expect(Object.getPrototypeOf(parsed)).toBe(Object.prototype);
680
+ });
681
+
682
+ test("passthrough drops __proto__", () => {
683
+ const schema = z.object({ name: z.string() }).passthrough();
684
+ const parsed = schema.parse(protoInput());
685
+ expect((parsed as any).isAdmin).toBeUndefined();
686
+ expect(Object.getPrototypeOf(parsed)).toBe(Object.prototype);
687
+ });
688
+
689
+ test("catchall(unknown) drops __proto__", () => {
690
+ const schema = z.object({ name: z.string() }).catchall(z.unknown());
691
+ const parsed = schema.parse(protoInput());
692
+ expect((parsed as any).isAdmin).toBeUndefined();
693
+ expect(Object.getPrototypeOf(parsed)).toBe(Object.prototype);
694
+ });
695
+
696
+ test("safeParseAsync + jitless drops __proto__", async () => {
697
+ const schema = z.looseObject({ name: z.string() });
698
+ const result = await schema.safeParseAsync(protoInput(), { jitless: true } as any);
699
+ expect(result.success).toBe(true);
700
+ if (result.success) {
701
+ expect((result.data as any).isAdmin).toBeUndefined();
702
+ expect(Object.getPrototypeOf(result.data)).toBe(Object.prototype);
703
+ }
704
+ });
705
+
706
+ test("strict surfaces __proto__ as unrecognized without copying it", () => {
707
+ const schema = z.object({ name: z.string() }).strict();
708
+ const result = schema.safeParse(protoInput());
709
+ expect(result.success).toBe(false);
710
+ if (!result.success) {
711
+ expect(result.error.issues[0].code).toBe("unrecognized_keys");
712
+ expect((result.error.issues[0] as any).keys).toEqual(["__proto__"]);
713
+ }
714
+ });
715
+
716
+ test("strict accepts but strips a __proto__ key the shape declares", () => {
717
+ const shape: any = { name: z.string() };
718
+ Object.defineProperty(shape, "__proto__", {
719
+ value: z.string(),
720
+ enumerable: true,
721
+ configurable: true,
722
+ writable: true,
723
+ });
724
+ const input = JSON.parse('{"name":"alice","__proto__":"hello"}');
725
+
726
+ for (const schema of [z.object(shape).strict(), z.object(shape).catchall(z.any()), z.object(shape)]) {
727
+ const result = schema.safeParse(input);
728
+ expect(result.success).toBe(true);
729
+ if (result.success) {
730
+ expect(Object.keys(result.data)).toEqual(["name"]);
731
+ expect(Object.getPrototypeOf(result.data)).toBe(Object.prototype);
732
+ }
733
+ }
734
+ });
735
+
736
+ test("strictObject and jitless agree with .strict()", async () => {
737
+ for (const schema of [z.strictObject({ name: z.string() }), z.object({ name: z.string() }).strict()]) {
738
+ for (const result of [
739
+ schema.safeParse(protoInput()),
740
+ await schema.safeParseAsync(protoInput(), {
741
+ jitless: true,
742
+ } as any),
743
+ ]) {
744
+ expect(result.success).toBe(false);
745
+ if (!result.success) {
746
+ expect((result.error.issues[0] as any).keys).toEqual(["__proto__"]);
747
+ }
748
+ }
749
+ }
750
+ });
751
+ });
752
+
753
+ // Parsed objects always strip __proto__, including keys explicitly declared by the schema.
754
+ describe("__proto__ as a declared shape key", () => {
755
+ const protoInput = () => JSON.parse('{"__proto__":{"isAdmin":true},"name":"alice"}');
756
+ const makeShape = () =>
757
+ Object.fromEntries([
758
+ ["__proto__", z.object({ isAdmin: z.boolean() })],
759
+ ["name", z.string()],
760
+ ]) as Record<string, any>;
761
+
762
+ const expectStripped = (parsed: any) => {
763
+ expect(Object.getPrototypeOf(parsed)).toBe(Object.prototype);
764
+ expect(Object.prototype.hasOwnProperty.call(parsed, "__proto__")).toBe(false);
765
+ expect((parsed as any).isAdmin).toBeUndefined();
766
+ expect(Object.keys(parsed)).toEqual(["name"]);
767
+ };
768
+
769
+ test("jit fastpass", () => {
770
+ expectStripped(z.object(makeShape()).parse(protoInput()));
771
+ });
772
+
773
+ test("jitless", () => {
774
+ expectStripped(z.object(makeShape()).parse(protoInput(), { jitless: true } as any));
775
+ });
776
+
777
+ test("async", async () => {
778
+ const shape = Object.fromEntries([
779
+ ["__proto__", z.object({ isAdmin: z.boolean() }).refine(async () => true)],
780
+ ["name", z.string()],
781
+ ]) as Record<string, any>;
782
+ expectStripped(await z.object(shape).parseAsync(protoInput()));
783
+ });
784
+
785
+ test("primitive value is stripped", () => {
786
+ const schema = z.object(Object.fromEntries([["__proto__", z.string()]]) as Record<string, any>);
787
+ const parsed: any = schema.parse(JSON.parse('{"__proto__":"hello"}'));
788
+ expect(Object.prototype.hasOwnProperty.call(parsed, "__proto__")).toBe(false);
789
+ expect(Object.getPrototypeOf(parsed)).toBe(Object.prototype);
790
+ });
791
+
792
+ test("declared key is not validated", () => {
793
+ const schema = z.object(Object.fromEntries([["__proto__", z.string()]]) as Record<string, any>);
794
+ expect(schema.parse(JSON.parse('{"__proto__":123}'))).toEqual({});
795
+ });
796
+
797
+ test("required, optional, and defaulted declarations are all stripped", () => {
798
+ const shape = (schema: z.YatspType) => Object.fromEntries([["__proto__", schema]]) as Record<string, any>;
799
+
800
+ for (const jitless of [false, true]) {
801
+ const ctx = { jitless } as any;
802
+ expect(z.object(shape(z.unknown())).parse({}, ctx)).toEqual({});
803
+ expect(z.object(shape(z.string().optional())).parse({}, ctx)).toEqual({});
804
+ expect(z.object(shape(z.string().default("fallback"))).parse({}, ctx)).toEqual({});
805
+ }
806
+ });
807
+
808
+ test("an own getter is not evaluated", () => {
809
+ let reads = 0;
810
+ const input = Object.defineProperty({}, "__proto__", {
811
+ get() {
812
+ reads++;
813
+ return "value";
814
+ },
815
+ enumerable: true,
816
+ });
817
+ const schema = z.object(Object.fromEntries([["__proto__", z.string()]]) as Record<string, any>);
818
+
819
+ expect(schema.parse(input)).toEqual({});
820
+ expect(reads).toBe(0);
821
+ });
822
+
823
+ test("pick keeps a declared key", () => {
824
+ const shape = Object.fromEntries([["__proto__", z.string()]]) as Record<string, any>;
825
+ const mask = Object.fromEntries([["__proto__", true]]) as Record<string, true>;
826
+ const picked = z.object(shape).pick(mask);
827
+
828
+ expect(Object.keys(picked.shape)).toEqual(["__proto__"]);
829
+ const parsed: any = picked.parse(Object.fromEntries([["__proto__", "value"]]));
830
+ expect(parsed).toEqual({});
831
+ expect(() => z.object({ value: z.string() }).pick(mask as any).shape).toThrow('Unrecognized key: "__proto__"');
832
+ });
833
+
834
+ test.each(["omit", "partial", "required"] as const)("%s rejects an undeclared key", (method) => {
835
+ const mask = Object.fromEntries([["__proto__", true]]);
836
+ const schema = z.object({ value: z.string() });
837
+
838
+ expect(() => (schema[method] as any)(mask).shape).toThrow('Unrecognized key: "__proto__"');
839
+ });
840
+
841
+ // the mask is checked against the source's declared keys, which reads without resolving them, so it throws where the mistake is
842
+ test.each(["pick", "omit", "partial", "required"] as const)("%s rejects an undeclared key at the call", (method) => {
843
+ const schema = z.object({ value: z.string() });
844
+
845
+ expect(() => (schema[method] as any)({ nope: true })).toThrow('Unrecognized key: "nope"');
846
+ });
847
+
848
+ // a derived shape is built key by key, and a plain assignment runs whatever setter answers to the key — `__proto__` always has one, and a polluted prototype can supply one for any name
849
+ test("an inherited setter cannot swallow a derived key", () => {
850
+ let swallowed: unknown;
851
+ Object.defineProperty(Object.prototype, "field", {
852
+ configurable: true,
853
+ set(v) {
854
+ swallowed = v;
855
+ },
856
+ get() {
857
+ return undefined;
858
+ },
859
+ });
860
+
861
+ try {
862
+ const derived = z.object({ field: z.string() }).extend({ extra: z.number() });
863
+
864
+ expect(Object.keys(derived.shape)).toEqual(["field", "extra"]);
865
+ expect(swallowed).toBeUndefined();
866
+ // the key is still validated; what a parse writes into its result is the ambient prototype's business, as it is without a builder
867
+ expect(derived.safeParse({ field: 123, extra: 1 }).success).toBe(false);
868
+ expect(derived.safeParse({ field: "a", extra: 1 }).success).toBe(true);
869
+ } finally {
870
+ delete (Object.prototype as any).field;
871
+ }
872
+ });
873
+
874
+ // a shape resolves by object spread, so a non-enumerable entry is no part of it and no builder may promote one into a derived shape
875
+ test("a non-enumerable shape entry stays out of every derived shape", () => {
876
+ const sym = Symbol("kept");
877
+ const hide = (target: Record<string, any>) =>
878
+ Object.defineProperty(target, "hidden", { value: z.string(), enumerable: false, configurable: true });
879
+ // each case needs a source whose shape is still unresolved, since resolving drops the entry on its own
880
+ const source = () => z.object(hide({ b: z.number(), [sym]: z.boolean() }) as any);
881
+
882
+ expect(Reflect.ownKeys(source().shape)).toEqual(["b", sym]);
883
+ expect(Reflect.ownKeys(source().extend({ c: z.boolean() }).shape)).toEqual(["b", "c", sym]);
884
+ expect(Reflect.ownKeys(source().partial().shape)).toEqual(["b", sym]);
885
+ expect(Reflect.ownKeys(source().merge(z.object({ c: z.boolean() })).shape)).toEqual(["b", "c", sym]);
886
+ expect(Object.keys(z.object({ b: z.number() }).extend(hide({}) as any).shape)).toEqual(["b"]);
887
+ expect(() => source().pick({ hidden: true } as any)).toThrow('Unrecognized key: "hidden"');
888
+
889
+ // promoting it would make a key the source ignores required
890
+ expect(
891
+ source()
892
+ .extend({ c: z.boolean() })
893
+ .safeParse({ b: 1, [sym]: true, c: true }).success
894
+ ).toBe(true);
895
+ });
896
+
897
+ test("shape helpers preserve a declared key", () => {
898
+ const shape = () =>
899
+ Object.fromEntries([
900
+ ["__proto__", z.string()],
901
+ ["value", z.string()],
902
+ ]) as Record<string, any>;
903
+ const protoMask = Object.fromEntries([["__proto__", true]]);
904
+ const valueMask = { value: true } as const;
905
+ const shapes = [
906
+ z.object(shape()).omit(valueMask).shape,
907
+ z.object(shape()).partial(protoMask as any).shape,
908
+ z.object(shape()).required(protoMask as any).shape,
909
+ ];
910
+
911
+ for (const next of shapes) {
912
+ expect(Object.getPrototypeOf(next)).toBe(Object.prototype);
913
+ expect(Object.prototype.hasOwnProperty.call(next, "__proto__")).toBe(true);
914
+ }
915
+ });
916
+
917
+ test("Object.prototype is untouched", () => {
918
+ z.object(makeShape()).parse(protoInput());
919
+ expect(({} as any).isAdmin).toBeUndefined();
920
+ });
921
+ });
922
+
923
+ test("object parsing still reads ordinary inherited properties", () => {
924
+ const input = Object.create({ value: "inherited" });
925
+ const schema = z.object({ value: z.string() });
926
+
927
+ expect(schema.parse(input)).toEqual({ value: "inherited" });
928
+ expect(schema.parse(input, { jitless: true } as any)).toEqual({ value: "inherited" });
929
+ });
930
+
931
+ describe("symbol keys in object shape", () => {
932
+ const SYM = Symbol("sym");
933
+ const OTHER = Symbol("other");
934
+
935
+ test("parses and validates a declared symbol key", () => {
936
+ const schema = z.object({ name: z.string(), [SYM]: z.number() });
937
+ expectTypeOf<z.infer<typeof schema>>().toEqualTypeOf<{ name: string; [SYM]: number }>();
938
+
939
+ for (const params of [undefined, { jitless: true } as any]) {
940
+ expect(schema.parse({ name: "alice", [SYM]: 42 }, params)).toEqual({ name: "alice", [SYM]: 42 });
941
+ expect(schema.safeParse({ name: "alice", [SYM]: "nope" }, params).success).toBe(false);
942
+ expect(schema.safeParse({ name: "alice" }, params).success).toBe(false);
943
+ }
944
+ });
945
+
946
+ test("reports an invalid symbol value at the symbol's own path", () => {
947
+ const schema = z.object({ [SYM]: z.number() });
948
+ const result = schema.safeParse({ [SYM]: "nope" });
949
+ expect(result.error!.issues[0].path).toEqual([SYM]);
950
+ });
951
+
952
+ test("honours optionality and defaults on a symbol key", () => {
953
+ expect(z.object({ [SYM]: z.number().optional() }).parse({})).toEqual({});
954
+ expect(z.object({ [SYM]: z.number().default(7) }).parse({})).toEqual({ [SYM]: 7 });
955
+ });
956
+
957
+ test("a declared symbol key survives strict and loose", () => {
958
+ expect(z.strictObject({ [SYM]: z.number() }).safeParse({ [SYM]: 1 }).success).toBe(true);
959
+ expect(z.strictObject({ [SYM]: z.number() }).safeParse({ [SYM]: 1, extra: 1 }).success).toBe(false);
960
+ expect(z.looseObject({ [SYM]: z.number() }).parse({ [SYM]: 1, extra: "e" })).toEqual({ [SYM]: 1, extra: "e" });
961
+ });
962
+
963
+ // Deliberate: hunting each input for undeclared symbols costs a `getOwnPropertySymbols` call on every parse of every strict/loose/catchall object, which measured +16-44% on `z.strictObject`. Declared keys are static and cost nothing, so only they are supported.
964
+ test("an undeclared symbol key is ignored, not passed through or flagged", () => {
965
+ expect(z.looseObject({ name: z.string() }).parse({ name: "a", [OTHER]: "x" })).toEqual({ name: "a" });
966
+ expect(z.strictObject({ name: z.string() }).safeParse({ name: "a", [OTHER]: "x" }).success).toBe(true);
967
+ });
968
+
969
+ test("builder methods reach symbol keys", () => {
970
+ const base = z.object({ a: z.string(), [SYM]: z.number() });
971
+ expect(base.partial().safeParse({ a: "x" }).success).toBe(true);
972
+ expect(base.partial().required().safeParse({ a: "x" }).success).toBe(false);
973
+ expect(Reflect.ownKeys(base.pick({ [SYM]: true }).shape)).toEqual([SYM]);
974
+ expect(Reflect.ownKeys(base.omit({ [SYM]: true }).shape)).toEqual(["a"]);
975
+ expect(Reflect.ownKeys(z.object({ a: z.string() }).extend({ [SYM]: z.number() }).shape)).toEqual(["a", SYM]);
976
+ });
977
+
978
+ test("a cycle through a symbol key is detected like a string-keyed one", () => {
979
+ const A: any = z.object({
980
+ name: z.string(),
981
+ get [SYM]() {
982
+ return A.optional();
983
+ },
984
+ });
985
+ const input: any = { name: "root" };
986
+ input[SYM] = input;
987
+ expect(A.safeParse(input).success).toBe(true);
988
+ expect(() => z.compile(A, { strict: true })).toThrow(/does not support/);
989
+ });
990
+
991
+ test("extend's refinement-overlap guard sees symbol keys", () => {
992
+ const refined = z.object({ a: z.string(), [SYM]: z.number() }).refine(() => true);
993
+ expect(() => refined.extend({ a: z.string() })).toThrow(/Cannot overwrite keys/);
994
+ expect(() => refined.extend({ [SYM]: z.string() })).toThrow(/Cannot overwrite keys/);
995
+ });
996
+
997
+ test("a symbol key is unrepresentable in JSON Schema", () => {
998
+ const schema = z.object({ a: z.string(), [SYM]: z.number() });
999
+ expect(() => z.toJSONSchema(schema)).toThrow(/Symbol keys cannot be represented/);
1000
+ expect(z.toJSONSchema(schema, { unrepresentable: "any" })).toMatchObject({ properties: { a: { type: "string" } } });
1001
+ });
1002
+
1003
+ test("rejects a non-schema value under a symbol key", () => {
1004
+ expect(() => z.object({ [SYM]: 123 as any }).parse({})).toThrow(/Invalid element at key "Symbol\(sym\)"/);
1005
+ });
1006
+ });