@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,944 @@
1
+ import type * as JSONSchema from "../core/json-schema.js";
2
+ import { type $YatspRegistry, globalRegistry } from "../core/registries.js";
3
+ import { assignProp, isPlainObject } from "../core/util.js";
4
+ import * as _checks from "./checks.js";
5
+ import * as _iso from "./iso.js";
6
+ import * as _schemas from "./schemas.js";
7
+ import type { YatspNumber, YatspString, YatspType } from "./schemas.js";
8
+
9
+ // Local z object to avoid circular dependency with ../index.js
10
+ const z = {
11
+ ..._schemas,
12
+ ..._checks,
13
+ iso: _iso,
14
+ };
15
+
16
+ type JSONSchemaVersion = "draft-2020-12" | "draft-7" | "draft-4" | "openapi-3.0";
17
+
18
+ interface FromJSONSchemaParams {
19
+ defaultTarget?: JSONSchemaVersion;
20
+ registry?: $YatspRegistry<any>;
21
+ }
22
+
23
+ interface ConversionContext {
24
+ version: JSONSchemaVersion;
25
+ defs: Record<string, JSONSchema.JSONSchema>;
26
+ refs: Map<string, YatspType>;
27
+ processing: Set<string>;
28
+ rootSchema: JSONSchema.JSONSchema;
29
+ registry: $YatspRegistry<any>;
30
+ }
31
+
32
+ // Keys that are recognized and handled by the conversion logic
33
+ const RECOGNIZED_KEYS = /*@__PURE__*/ new Set([
34
+ // Schema identification
35
+ "$schema",
36
+ "$ref",
37
+ "$defs",
38
+ "definitions",
39
+ // Core schema keywords
40
+ "$id",
41
+ "id",
42
+ "$comment",
43
+ "$anchor",
44
+ "$vocabulary",
45
+ "$dynamicRef",
46
+ "$dynamicAnchor",
47
+ // Type
48
+ "type",
49
+ "enum",
50
+ "const",
51
+ // Composition
52
+ "anyOf",
53
+ "oneOf",
54
+ "allOf",
55
+ "not",
56
+ // Object
57
+ "properties",
58
+ "required",
59
+ "additionalProperties",
60
+ "patternProperties",
61
+ "propertyNames",
62
+ "minProperties",
63
+ "maxProperties",
64
+ // Array
65
+ "items",
66
+ "prefixItems",
67
+ "additionalItems",
68
+ "minItems",
69
+ "maxItems",
70
+ "uniqueItems",
71
+ "contains",
72
+ "minContains",
73
+ "maxContains",
74
+ // String
75
+ "minLength",
76
+ "maxLength",
77
+ "pattern",
78
+ "format",
79
+ // Number
80
+ "minimum",
81
+ "maximum",
82
+ "exclusiveMinimum",
83
+ "exclusiveMaximum",
84
+ "multipleOf",
85
+ // Already handled metadata
86
+ "description",
87
+ "default",
88
+ // Content
89
+ "contentEncoding",
90
+ "contentMediaType",
91
+ "contentSchema",
92
+ // Unsupported (error-throwing)
93
+ "unevaluatedItems",
94
+ "unevaluatedProperties",
95
+ "if",
96
+ "then",
97
+ "else",
98
+ "dependentSchemas",
99
+ "dependentRequired",
100
+ // OpenAPI
101
+ "nullable",
102
+ "readOnly",
103
+ ]);
104
+
105
+ function detectVersion(schema: JSONSchema.JSONSchema, defaultTarget?: JSONSchemaVersion): JSONSchemaVersion {
106
+ const $schema = schema.$schema;
107
+
108
+ if ($schema === "https://json-schema.org/draft/2020-12/schema") {
109
+ return "draft-2020-12";
110
+ }
111
+ if ($schema === "http://json-schema.org/draft-07/schema#") {
112
+ return "draft-7";
113
+ }
114
+ if ($schema === "http://json-schema.org/draft-04/schema#") {
115
+ return "draft-4";
116
+ }
117
+
118
+ // Use defaultTarget if provided, otherwise default to draft-2020-12
119
+ return defaultTarget ?? "draft-2020-12";
120
+ }
121
+
122
+ // Positional schemas constrain the elements that are present; only minItems makes them required.
123
+ function applyMinItems(items: YatspType[], minItems: number): YatspType[] {
124
+ return items.map((item, index) => (index < minItems ? item : item.optional()));
125
+ }
126
+
127
+ // Inverse of the encoding applied to $ref pointer segments in to-json-schema.ts. Per RFC 6901 the `~1` replacement must run before `~0`.
128
+ function decodeJSONPointerSegment(segment: string): string {
129
+ return segment.replace(/~1/g, "/").replace(/~0/g, "~");
130
+ }
131
+
132
+ function resolveRef(ref: string, ctx: ConversionContext): JSONSchema.JSONSchema {
133
+ if (!ref.startsWith("#")) {
134
+ throw new Error("External $ref is not supported, only local refs (#/...) are allowed");
135
+ }
136
+
137
+ const path = ref.slice(1).split("/").filter(Boolean);
138
+
139
+ // Handle root reference "#"
140
+ if (path.length === 0) {
141
+ return ctx.rootSchema;
142
+ }
143
+
144
+ const defsKey = ctx.version === "draft-2020-12" ? "$defs" : "definitions";
145
+
146
+ if (path[0] === defsKey) {
147
+ const key = path[1] === undefined ? undefined : decodeJSONPointerSegment(path[1]);
148
+ if (!key || !ctx.defs[key]) {
149
+ throw new Error(`Reference not found: ${ref}`);
150
+ }
151
+ return ctx.defs[key]!;
152
+ }
153
+
154
+ throw new Error(`Reference not found: ${ref}`);
155
+ }
156
+
157
+ /**
158
+ * Enforces the keywords that constrain an object's own keys — `propertyNames`,
159
+ * `minProperties`, `maxProperties` — before `objectSchema` runs. The guard has
160
+ * to see the raw input: an object parse drops `__proto__` and can add keys from
161
+ * a property `default`, so its output is not the set of names the instance
162
+ * actually carried.
163
+ */
164
+ function checkObjectGuards(
165
+ objectSchema: YatspType,
166
+ guards: { keySchema?: YatspType | undefined; minProperties?: number | undefined; maxProperties?: number | undefined }
167
+ ): YatspType {
168
+ // An identity transform, not z.any(), so `toJSONSchema` reports the object on both the input and the output side of the pipe.
169
+ const guard = z
170
+ .transform((value: unknown) => value)
171
+ .check((payload) => {
172
+ const value = payload.value;
173
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return;
174
+ const keys = Object.getOwnPropertyNames(value);
175
+ if (guards.minProperties !== undefined && keys.length < guards.minProperties) {
176
+ payload.issues.push({
177
+ origin: "object",
178
+ code: "too_small",
179
+ minimum: guards.minProperties,
180
+ inclusive: true,
181
+ message: `Too small: expected object to have >=${guards.minProperties} properties`,
182
+ input: value,
183
+ inst: objectSchema,
184
+ continue: true,
185
+ });
186
+ }
187
+ if (guards.maxProperties !== undefined && keys.length > guards.maxProperties) {
188
+ payload.issues.push({
189
+ origin: "object",
190
+ code: "too_big",
191
+ maximum: guards.maxProperties,
192
+ inclusive: true,
193
+ message: `Too big: expected object to have <=${guards.maxProperties} properties`,
194
+ input: value,
195
+ inst: objectSchema,
196
+ continue: true,
197
+ });
198
+ }
199
+ if (guards.keySchema) {
200
+ for (const key of keys) {
201
+ const result = guards.keySchema.safeParse(key);
202
+ if (result.success) continue;
203
+ payload.issues.push({
204
+ code: "invalid_key",
205
+ origin: "record",
206
+ issues: result.error.issues,
207
+ input: key,
208
+ path: [key],
209
+ continue: true,
210
+ });
211
+ }
212
+ }
213
+ });
214
+ return guard.pipe(objectSchema);
215
+ }
216
+
217
+ /**
218
+ * An injective string for JSON data: two values share a key exactly when `uniqueItems` calls them
219
+ * equal, so duplicate detection is a Map lookup rather than a pairwise walk. Strings and keys are
220
+ * length-prefixed so no value can spell another one. `null` means "never equal to anything" — a
221
+ * cycle or a NaN, neither of which JSON can express.
222
+ */
223
+ function canonicalKey(value: unknown, seen: Set<object>): string | null {
224
+ if (value === null) return "z";
225
+ const type = typeof value;
226
+ if (type !== "object") {
227
+ if (type === "number" && Number.isNaN(value)) return null;
228
+ const raw = String(value);
229
+ return `${type[0]}${raw.length}:${raw}`;
230
+ }
231
+ if (seen.has(value as object)) return null;
232
+ seen.add(value as object);
233
+ try {
234
+ if (Array.isArray(value)) {
235
+ const parts: string[] = [];
236
+ for (const item of value) {
237
+ const key = canonicalKey(item, seen);
238
+ if (key === null) return null;
239
+ parts.push(key);
240
+ }
241
+ return `a${parts.length}:[${parts.join(",")}]`;
242
+ }
243
+ const keys = Object.keys(value as object).sort();
244
+ const parts: string[] = [];
245
+ for (const k of keys) {
246
+ const key = canonicalKey((value as any)[k], seen);
247
+ if (key === null) return null;
248
+ parts.push(`${k.length}:${k}=${key}`);
249
+ }
250
+ return `o${parts.length}:{${parts.join(",")}}`;
251
+ } finally {
252
+ seen.delete(value as object);
253
+ }
254
+ }
255
+
256
+ // keywords whose value is a schema or an array of them
257
+ const SCHEMA_KEYWORDS = /*@__PURE__*/ new Set([
258
+ "items",
259
+ "prefixItems",
260
+ "additionalItems",
261
+ "additionalProperties",
262
+ "contains",
263
+ "propertyNames",
264
+ "not",
265
+ "if",
266
+ "then",
267
+ "else",
268
+ "allOf",
269
+ "anyOf",
270
+ "oneOf",
271
+ "unevaluatedItems",
272
+ "unevaluatedProperties",
273
+ "contentSchema",
274
+ ]);
275
+
276
+ // keywords whose value maps names to schemas. draft-7 `dependencies` also allows an array of property names, which holds no schema to walk
277
+ const SCHEMA_MAP_KEYWORDS = /*@__PURE__*/ new Set([
278
+ "properties",
279
+ "patternProperties",
280
+ "dependentSchemas",
281
+ "dependencies",
282
+ "$defs",
283
+ "definitions",
284
+ ]);
285
+
286
+ /**
287
+ * True when a subschema holds a `$ref` anywhere a schema can appear. Only those positions are
288
+ * walked: `$ref` under `default` or an `x-` annotation is instance data with an ordinary key, and
289
+ * reading it as a reference would drop a constraint that resolves perfectly well.
290
+ */
291
+ function containsRef(value: unknown): boolean {
292
+ if (typeof value !== "object" || value === null) return false;
293
+ if (Array.isArray(value)) return value.some(containsRef);
294
+ if (typeof (value as any).$ref === "string") return true;
295
+ return Object.entries(value).some(([key, sub]) => {
296
+ if (SCHEMA_KEYWORDS.has(key)) return containsRef(sub);
297
+ if (!SCHEMA_MAP_KEYWORDS.has(key) || typeof sub !== "object" || sub === null) return false;
298
+ return Object.values(sub).some(containsRef);
299
+ });
300
+ }
301
+
302
+ function plural(n: number): string {
303
+ return n === 1 ? "element" : "elements";
304
+ }
305
+
306
+ /**
307
+ * Enforces `uniqueItems` and the `contains` family before `arraySchema` runs, for the same reason
308
+ * `checkObjectGuards` runs pre-pipe: an item parse can apply a nested `default`, so the parsed
309
+ * array is not the instance the keywords are defined over. A guard issue aborts the pipe, so
310
+ * `minItems`/`maxItems` are not also reported on the same parse — instance correctness is worth
311
+ * more than co-reporting two issues.
312
+ */
313
+ function checkArrayGuards(
314
+ arraySchema: YatspType,
315
+ guards: {
316
+ uniqueItems?: boolean | undefined;
317
+ containsSchema?: YatspType | undefined;
318
+ minContains?: number | undefined;
319
+ maxContains?: number | undefined;
320
+ }
321
+ ): YatspType {
322
+ // An identity transform, not z.any(), so `toJSONSchema` reports the array on both the input and the output side of the pipe.
323
+ const guard = z
324
+ .transform((value: unknown) => value)
325
+ .check((payload) => {
326
+ const items = payload.value;
327
+ if (!Array.isArray(items)) return;
328
+ if (guards.uniqueItems === true) {
329
+ const firstSeen = new Map<string, number>();
330
+ for (let i = 0; i < items.length; i++) {
331
+ const key = canonicalKey(items[i], new Set());
332
+ if (key === null) continue;
333
+ const first = firstSeen.get(key);
334
+ if (first === undefined) {
335
+ firstSeen.set(key, i);
336
+ continue;
337
+ }
338
+ payload.issues.push({
339
+ code: "custom",
340
+ message: `Array items must be unique: element at index ${i} duplicates the one at index ${first}`,
341
+ input: items,
342
+ path: [i],
343
+ continue: true,
344
+ });
345
+ }
346
+ }
347
+ if (guards.containsSchema) {
348
+ const minContains = guards.minContains ?? 1;
349
+ // one past the ceiling already proves the failure, and nothing above it changes the verdict
350
+ const ceiling = guards.maxContains !== undefined ? guards.maxContains + 1 : Number.POSITIVE_INFINITY;
351
+ let matches = 0;
352
+ for (const item of items) {
353
+ if (guards.containsSchema.safeParse(item).success && ++matches >= ceiling) break;
354
+ }
355
+ if (matches < minContains) {
356
+ // the scan ran to the end, so this count is exact
357
+ payload.issues.push({
358
+ code: "custom",
359
+ message: `Array must contain at least ${minContains} matching ${plural(minContains)}; found ${matches}`,
360
+ input: items,
361
+ continue: true,
362
+ });
363
+ }
364
+ if (guards.maxContains !== undefined && matches > guards.maxContains) {
365
+ payload.issues.push({
366
+ code: "custom",
367
+ message: `Array must contain at most ${guards.maxContains} matching ${plural(guards.maxContains)}`,
368
+ input: items,
369
+ continue: true,
370
+ });
371
+ }
372
+ }
373
+ });
374
+ return guard.pipe(arraySchema);
375
+ }
376
+
377
+ function getTupleRest(restSchema: JSONSchema._JSONSchema | undefined, ctx: ConversionContext): YatspType | undefined {
378
+ if (restSchema === false) {
379
+ return undefined;
380
+ }
381
+ if (restSchema === undefined || restSchema === true) {
382
+ return z.any();
383
+ }
384
+ return convertSchema(restSchema, ctx);
385
+ }
386
+
387
+ // the RFC 3339 full-time keyword, narrower than `z.iso.time()`; local because sharing it via `timeSource` pins that builder into every bundle (+139 B gzipped on a mini `z.boolean()`)
388
+ const fullTime = /^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|[+-](?:[01]\d|2[0-3]):[0-5]\d)$/;
389
+
390
+ function convertBaseSchema(schema: JSONSchema.JSONSchema, ctx: ConversionContext): YatspType {
391
+ // Handle unsupported features
392
+ if (schema.not !== undefined) {
393
+ // Special case: { not: {} } represents never
394
+ if (typeof schema.not === "object" && Object.keys(schema.not).length === 0) {
395
+ return z.never();
396
+ }
397
+ throw new Error("not is not supported in Yatsp (except { not: {} } for never)");
398
+ }
399
+ if (schema.unevaluatedItems !== undefined) {
400
+ throw new Error("unevaluatedItems is not supported");
401
+ }
402
+ if (schema.unevaluatedProperties !== undefined) {
403
+ throw new Error("unevaluatedProperties is not supported");
404
+ }
405
+ if (schema.if !== undefined || schema.then !== undefined || schema.else !== undefined) {
406
+ throw new Error("Conditional schemas (if/then/else) are not supported");
407
+ }
408
+ if (schema.dependentSchemas !== undefined || schema.dependentRequired !== undefined) {
409
+ throw new Error("dependentSchemas and dependentRequired are not supported");
410
+ }
411
+
412
+ // Handle $ref
413
+ if (schema.$ref) {
414
+ const refPath = schema.$ref;
415
+ if (ctx.refs.has(refPath)) {
416
+ return ctx.refs.get(refPath)!;
417
+ }
418
+
419
+ if (ctx.processing.has(refPath)) {
420
+ // Circular reference - use lazy
421
+ return z.lazy(() => {
422
+ if (!ctx.refs.has(refPath)) {
423
+ throw new Error(`Circular reference not resolved: ${refPath}`);
424
+ }
425
+ return ctx.refs.get(refPath)!;
426
+ });
427
+ }
428
+
429
+ ctx.processing.add(refPath);
430
+ const resolved = resolveRef(refPath, ctx);
431
+ const yatspSchema = convertSchema(resolved, ctx);
432
+ ctx.refs.set(refPath, yatspSchema);
433
+ ctx.processing.delete(refPath);
434
+ return yatspSchema;
435
+ }
436
+
437
+ // Handle enum
438
+ if (schema.enum !== undefined) {
439
+ const enumValues = schema.enum;
440
+
441
+ // Special case: OpenAPI 3.0 null representation { type: "string", nullable: true, enum: [null] }
442
+ if (
443
+ ctx.version === "openapi-3.0" &&
444
+ schema.nullable === true &&
445
+ enumValues.length === 1 &&
446
+ enumValues[0] === null
447
+ ) {
448
+ return z.null();
449
+ }
450
+
451
+ if (enumValues.length === 0) {
452
+ return z.never();
453
+ }
454
+ if (enumValues.length === 1) {
455
+ return z.literal(enumValues[0]!);
456
+ }
457
+ // Check if all values are strings
458
+ if (enumValues.every((v) => typeof v === "string")) {
459
+ return z.enum(enumValues as [string, ...string[]]);
460
+ }
461
+ // Mixed types - use union of literals
462
+ const literalSchemas = enumValues.map((v) => z.literal(v));
463
+ if (literalSchemas.length < 2) {
464
+ return literalSchemas[0]!;
465
+ }
466
+ return z.union([literalSchemas[0]!, literalSchemas[1]!, ...literalSchemas.slice(2)] as [
467
+ YatspType,
468
+ YatspType,
469
+ ...YatspType[],
470
+ ]);
471
+ }
472
+
473
+ // Handle const
474
+ if (schema.const !== undefined) {
475
+ return z.literal(schema.const);
476
+ }
477
+
478
+ // Handle type
479
+ const type = schema.type;
480
+
481
+ if (Array.isArray(type)) {
482
+ // Expand type array into anyOf union
483
+ const typeSchemas = type.map((t) => {
484
+ const typeSchema: JSONSchema.JSONSchema = { ...schema, type: t };
485
+ return convertBaseSchema(typeSchema, ctx);
486
+ });
487
+ if (typeSchemas.length === 0) {
488
+ return z.never();
489
+ }
490
+ if (typeSchemas.length === 1) {
491
+ return typeSchemas[0]!;
492
+ }
493
+ return z.union(typeSchemas as [YatspType, YatspType, ...YatspType[]]);
494
+ }
495
+
496
+ if (!type) {
497
+ // No type specified - empty schema (any)
498
+ return z.any();
499
+ }
500
+
501
+ let yatspSchema: YatspType;
502
+
503
+ switch (type) {
504
+ case "string": {
505
+ let stringSchema: YatspString = z.string();
506
+
507
+ // Apply format using .check() with Yatsp format functions
508
+ if (schema.format) {
509
+ const format = schema.format;
510
+ // Map common formats to Yatsp check functions
511
+ if (format === "email") {
512
+ stringSchema = stringSchema.check(z.email());
513
+ } else if (format === "uri" || format === "uri-reference") {
514
+ stringSchema = stringSchema.check(z.url());
515
+ } else if (format === "uuid" || format === "guid") {
516
+ stringSchema = stringSchema.check(z.uuid());
517
+ } else if (format === "date-time") {
518
+ stringSchema = stringSchema.check(z.iso.datetime({ offset: true }));
519
+ } else if (format === "date") {
520
+ stringSchema = stringSchema.check(z.iso.date());
521
+ } else if (format === "time") {
522
+ stringSchema = stringSchema.check(z.regex(fullTime));
523
+ } else if (format === "duration") {
524
+ stringSchema = stringSchema.check(z.iso.duration());
525
+ } else if (format === "hostname") {
526
+ stringSchema = stringSchema.check(z.hostname());
527
+ } else if (format === "ipv4") {
528
+ stringSchema = stringSchema.check(z.ipv4());
529
+ } else if (format === "ipv6") {
530
+ stringSchema = stringSchema.check(z.ipv6());
531
+ } else if (format === "mac") {
532
+ stringSchema = stringSchema.check(z.mac());
533
+ } else if (format === "cidr") {
534
+ stringSchema = stringSchema.check(z.cidrv4());
535
+ } else if (format === "cidr-v6") {
536
+ stringSchema = stringSchema.check(z.cidrv6());
537
+ } else if (format === "base64") {
538
+ stringSchema = stringSchema.check(z.base64());
539
+ } else if (format === "base64url") {
540
+ stringSchema = stringSchema.check(z.base64url());
541
+ } else if (format === "e164") {
542
+ stringSchema = stringSchema.check(z.e164());
543
+ } else if (format === "credit_card") {
544
+ stringSchema = stringSchema.check(z.creditCard());
545
+ } else if (format === "iban") {
546
+ stringSchema = stringSchema.check(z.iban());
547
+ } else if (format === "jwt") {
548
+ stringSchema = stringSchema.check(z.jwt());
549
+ } else if (format === "emoji") {
550
+ stringSchema = stringSchema.check(z.emoji());
551
+ } else if (format === "nanoid") {
552
+ stringSchema = stringSchema.check(z.nanoid());
553
+ } else if (format === "cuid") {
554
+ stringSchema = stringSchema.check(z.cuid());
555
+ } else if (format === "cuid2") {
556
+ stringSchema = stringSchema.check(z.cuid2());
557
+ } else if (format === "ulid") {
558
+ stringSchema = stringSchema.check(z.ulid());
559
+ } else if (format === "xid") {
560
+ stringSchema = stringSchema.check(z.xid());
561
+ } else if (format === "ksuid") {
562
+ stringSchema = stringSchema.check(z.ksuid());
563
+ }
564
+ // Note: json-string format is not currently supported by Yatsp
565
+ // Custom formats are ignored - keep as plain string
566
+ }
567
+
568
+ // Apply constraints
569
+ if (typeof schema.minLength === "number") {
570
+ stringSchema = stringSchema.min(schema.minLength);
571
+ }
572
+ if (typeof schema.maxLength === "number") {
573
+ stringSchema = stringSchema.max(schema.maxLength);
574
+ }
575
+ if (schema.pattern) {
576
+ // JSON Schema patterns are not implicitly anchored (match anywhere in string)
577
+ stringSchema = stringSchema.regex(new RegExp(schema.pattern));
578
+ }
579
+
580
+ yatspSchema = stringSchema;
581
+ break;
582
+ }
583
+
584
+ case "number":
585
+ case "integer": {
586
+ let numberSchema: YatspNumber = type === "integer" ? z.number().int() : z.number();
587
+
588
+ // Apply constraints
589
+
590
+ // In draft-04, `exclusiveMinimum: true` makes the sibling `minimum` exclusive rather than an independent bound, so the inclusive `.min()` is skipped; emitting it too would be dominated by the exclusive check and report a second, weaker issue.
591
+ if (typeof schema.minimum === "number" && schema.exclusiveMinimum !== true) {
592
+ numberSchema = numberSchema.min(schema.minimum);
593
+ }
594
+ if (typeof schema.maximum === "number" && schema.exclusiveMaximum !== true) {
595
+ numberSchema = numberSchema.max(schema.maximum);
596
+ }
597
+ if (typeof schema.exclusiveMinimum === "number") {
598
+ numberSchema = numberSchema.gt(schema.exclusiveMinimum);
599
+ } else if (schema.exclusiveMinimum === true && typeof schema.minimum === "number") {
600
+ numberSchema = numberSchema.gt(schema.minimum);
601
+ }
602
+ if (typeof schema.exclusiveMaximum === "number") {
603
+ numberSchema = numberSchema.lt(schema.exclusiveMaximum);
604
+ } else if (schema.exclusiveMaximum === true && typeof schema.maximum === "number") {
605
+ numberSchema = numberSchema.lt(schema.maximum);
606
+ }
607
+ if (typeof schema.multipleOf === "number") {
608
+ numberSchema = numberSchema.multipleOf(schema.multipleOf);
609
+ }
610
+
611
+ yatspSchema = numberSchema;
612
+ break;
613
+ }
614
+
615
+ case "boolean": {
616
+ yatspSchema = z.boolean();
617
+ break;
618
+ }
619
+
620
+ case "null": {
621
+ yatspSchema = z.null();
622
+ break;
623
+ }
624
+
625
+ case "object": {
626
+ const shape: Record<string, YatspType> = {};
627
+ const properties = schema.properties || {};
628
+ const requiredSet = new Set(schema.required || []);
629
+
630
+ const additionalSchema =
631
+ typeof schema.additionalProperties === "object"
632
+ ? convertSchema(schema.additionalProperties as JSONSchema.JSONSchema, ctx)
633
+ : undefined;
634
+
635
+ // Convert properties - mark optional ones
636
+ for (const [key, propSchema] of Object.entries(properties)) {
637
+ const propYatspSchema = convertSchema(propSchema as JSONSchema.JSONSchema, ctx);
638
+ // If not in required array, make it optional. assignProp so a __proto__ key becomes an own property instead of hitting the inherited setter
639
+ assignProp(shape, key, requiredSet.has(key) ? propYatspSchema : propYatspSchema.optional());
640
+ }
641
+
642
+ // Handle patternProperties
643
+ if (schema.patternProperties) {
644
+ // patternProperties: keys matching pattern must satisfy corresponding schema. Use loose records so non-matching keys pass through
645
+ const patternProps = schema.patternProperties;
646
+ const patternKeys = Object.keys(patternProps);
647
+ const looseRecords: YatspType[] = [];
648
+
649
+ for (const pattern of patternKeys) {
650
+ const patternValue = convertSchema(patternProps[pattern] as JSONSchema.JSONSchema, ctx);
651
+ const keySchema = z.string().regex(new RegExp(pattern));
652
+ looseRecords.push(z.looseRecord(keySchema, patternValue));
653
+ }
654
+
655
+ // Build intersection: object schema + all pattern property records
656
+ const schemasToIntersect: YatspType[] = [];
657
+ if (Object.keys(shape).length > 0) {
658
+ // Use passthrough so patternProperties can validate additional keys
659
+ schemasToIntersect.push(z.object(shape).passthrough());
660
+ }
661
+ schemasToIntersect.push(...looseRecords);
662
+
663
+ if (schemasToIntersect.length === 0) {
664
+ yatspSchema = z.object({}).passthrough();
665
+ } else if (schemasToIntersect.length === 1) {
666
+ yatspSchema = schemasToIntersect[0]!;
667
+ } else {
668
+ // Chain intersections: (A & B) & C & D ...
669
+ let result = z.intersection(schemasToIntersect[0]!, schemasToIntersect[1]!);
670
+ for (let i = 2; i < schemasToIntersect.length; i++) {
671
+ result = z.intersection(result, schemasToIntersect[i]!);
672
+ }
673
+ yatspSchema = result;
674
+ }
675
+
676
+ // When additionalProperties is false, reject keys that are neither defined in properties nor matched by any patternProperty.
677
+ if (schema.additionalProperties === false) {
678
+ const propertyKeys = Object.keys(shape);
679
+ const patterns = patternKeys.map((p) => new RegExp(p));
680
+ const basePatternSchema = yatspSchema;
681
+ yatspSchema = yatspSchema.check((payload) => {
682
+ if (!isPlainObject(payload.value)) return;
683
+ const unrecognized: string[] = [];
684
+ for (const key of Object.keys(payload.value)) {
685
+ if (propertyKeys.includes(key)) continue;
686
+ if (patterns.some((regex) => regex.test(key))) continue;
687
+ unrecognized.push(key);
688
+ }
689
+ if (unrecognized.length) {
690
+ payload.issues.push({
691
+ code: "unrecognized_keys",
692
+ keys: unrecognized,
693
+ input: payload.value,
694
+ inst: basePatternSchema,
695
+ });
696
+ }
697
+ });
698
+ }
699
+ } else {
700
+ // Handle additionalProperties. In JSON Schema, additionalProperties defaults to true (allow any extra properties). In Yatsp, objects strip unknown keys by default, so we need to handle this explicitly
701
+ const objectSchema = z.object(shape);
702
+ if (schema.additionalProperties === false) {
703
+ // Strict mode - no extra properties allowed
704
+ yatspSchema = objectSchema.strict();
705
+ } else if (additionalSchema) {
706
+ // Extra properties must match the specified schema
707
+ yatspSchema = objectSchema.catchall(additionalSchema);
708
+ } else {
709
+ // additionalProperties is true or undefined - allow any extra properties (passthrough)
710
+ yatspSchema = objectSchema.passthrough();
711
+ }
712
+ }
713
+
714
+ // propertyNames constrains key *names* only, and says nothing about which keys are required or how their values validate. Layering it on top of the result keeps properties/patternProperties/additionalProperties composing underneath. `true` allows every name, so it needs no guard.
715
+ const hasKeyGuard = schema.propertyNames !== undefined && schema.propertyNames !== true;
716
+ const minProperties = typeof schema.minProperties === "number" ? schema.minProperties : undefined;
717
+ const maxProperties = typeof schema.maxProperties === "number" ? schema.maxProperties : undefined;
718
+ if (hasKeyGuard || minProperties !== undefined || maxProperties !== undefined) {
719
+ let keySchema: YatspType | undefined;
720
+ if (hasKeyGuard) {
721
+ // Keys are always strings, so a propertyNames subschema that omits `type` still constrains them — without this it would convert to z.any().
722
+ const keyJSONSchema =
723
+ typeof schema.propertyNames === "object" && schema.propertyNames.type === undefined
724
+ ? { type: "string", ...schema.propertyNames }
725
+ : schema.propertyNames;
726
+ keySchema = convertSchema(keyJSONSchema as JSONSchema.JSONSchema, ctx);
727
+ }
728
+ yatspSchema = checkObjectGuards(yatspSchema, { keySchema, minProperties, maxProperties });
729
+ }
730
+ break;
731
+ }
732
+
733
+ case "array": {
734
+ // Check if this is a tuple (prefixItems or items as array)
735
+ const prefixItems = schema.prefixItems;
736
+ const items = schema.items;
737
+
738
+ if (prefixItems && Array.isArray(prefixItems)) {
739
+ // Tuple with prefixItems (draft-2020-12)
740
+ const minItems = typeof schema.minItems === "number" ? schema.minItems : 0;
741
+ const tupleItems = prefixItems.map((item) => convertSchema(item as JSONSchema.JSONSchema, ctx));
742
+ const positionalItems = applyMinItems(tupleItems, minItems);
743
+ const rest = !Array.isArray(items) ? getTupleRest(items, ctx) : undefined;
744
+ const tupleSchema = z.tuple(positionalItems as [YatspType, ...YatspType[]]);
745
+ yatspSchema = rest ? tupleSchema.rest(rest) : tupleSchema;
746
+ // Apply minItems/maxItems constraints to tuples
747
+ if (typeof schema.minItems === "number") {
748
+ yatspSchema = yatspSchema.check(z.minLength(schema.minItems));
749
+ }
750
+ if (typeof schema.maxItems === "number") {
751
+ yatspSchema = yatspSchema.check(z.maxLength(schema.maxItems));
752
+ }
753
+ } else if (Array.isArray(items)) {
754
+ // Tuple with items array (draft-7)
755
+ const minItems = typeof schema.minItems === "number" ? schema.minItems : 0;
756
+ const tupleItems = items.map((item) => convertSchema(item as JSONSchema.JSONSchema, ctx));
757
+ const positionalItems = applyMinItems(tupleItems, minItems);
758
+ const rest = getTupleRest(schema.additionalItems, ctx);
759
+ const tupleSchema = z.tuple(positionalItems as [YatspType, ...YatspType[]]);
760
+ yatspSchema = rest ? tupleSchema.rest(rest) : tupleSchema;
761
+ // Apply minItems/maxItems constraints to tuples
762
+ if (typeof schema.minItems === "number") {
763
+ yatspSchema = yatspSchema.check(z.minLength(schema.minItems));
764
+ }
765
+ if (typeof schema.maxItems === "number") {
766
+ yatspSchema = yatspSchema.check(z.maxLength(schema.maxItems));
767
+ }
768
+ } else if (items !== undefined) {
769
+ // Regular array
770
+ const element = convertSchema(items as JSONSchema.JSONSchema, ctx);
771
+ let arraySchema = z.array(element);
772
+
773
+ // Apply constraints
774
+ if (typeof schema.minItems === "number") {
775
+ arraySchema = arraySchema.min(schema.minItems);
776
+ }
777
+ if (typeof schema.maxItems === "number") {
778
+ arraySchema = arraySchema.max(schema.maxItems);
779
+ }
780
+
781
+ yatspSchema = arraySchema;
782
+ } else {
783
+ // No items specified - array of any
784
+ yatspSchema = z.array(z.any());
785
+ }
786
+
787
+ // minContains/maxContains only constrain anything when `contains` itself is present
788
+ if (schema.uniqueItems === true || schema.contains !== undefined) {
789
+ yatspSchema = checkArrayGuards(yatspSchema, {
790
+ uniqueItems: schema.uniqueItems === true,
791
+ containsSchema:
792
+ schema.contains !== undefined ? convertSchema(schema.contains as JSONSchema.JSONSchema, ctx) : undefined,
793
+ minContains: typeof schema.minContains === "number" ? schema.minContains : undefined,
794
+ maxContains: typeof schema.maxContains === "number" ? schema.maxContains : undefined,
795
+ });
796
+ }
797
+
798
+ break;
799
+ }
800
+
801
+ default:
802
+ throw new Error(`Unsupported type: ${type}`);
803
+ }
804
+
805
+ return yatspSchema;
806
+ }
807
+
808
+ function convertSchema(schema: JSONSchema.JSONSchema | boolean, ctx: ConversionContext): YatspType {
809
+ if (typeof schema === "boolean") {
810
+ return schema ? z.any() : z.never();
811
+ }
812
+
813
+ // Convert base schema first (ignoring composition keywords)
814
+ let baseSchema = convertBaseSchema(schema, ctx);
815
+ const hasExplicitType = schema.type || schema.enum !== undefined || schema.const !== undefined;
816
+
817
+ // Process composition keywords LAST (they can appear together)
818
+
819
+ // Handle anyOf - wrap base schema with union
820
+ if (schema.anyOf && Array.isArray(schema.anyOf)) {
821
+ const options = schema.anyOf.map((s) => convertSchema(s, ctx));
822
+ const anyOfUnion = z.union(options as [YatspType, YatspType, ...YatspType[]]);
823
+ baseSchema = hasExplicitType ? z.intersection(baseSchema, anyOfUnion) : anyOfUnion;
824
+ }
825
+
826
+ // Handle oneOf - exclusive union (exactly one must match)
827
+ if (schema.oneOf && Array.isArray(schema.oneOf)) {
828
+ const options = schema.oneOf.map((s) => convertSchema(s, ctx));
829
+ const oneOfUnion = z.xor(options as [YatspType, YatspType, ...YatspType[]]);
830
+ baseSchema = hasExplicitType ? z.intersection(baseSchema, oneOfUnion) : oneOfUnion;
831
+ }
832
+
833
+ // Handle allOf - wrap base schema with intersection
834
+ if (schema.allOf && Array.isArray(schema.allOf)) {
835
+ if (schema.allOf.length === 0) {
836
+ baseSchema = hasExplicitType ? baseSchema : z.any();
837
+ } else {
838
+ let result = hasExplicitType ? baseSchema : convertSchema(schema.allOf[0]!, ctx);
839
+ const startIdx = hasExplicitType ? 0 : 1;
840
+ for (let i = startIdx; i < schema.allOf.length; i++) {
841
+ result = z.intersection(result, convertSchema(schema.allOf[i]!, ctx));
842
+ }
843
+ baseSchema = result;
844
+ }
845
+ }
846
+
847
+ // Handle nullable (OpenAPI 3.0)
848
+ if (schema.nullable === true && ctx.version === "openapi-3.0") {
849
+ baseSchema = z.nullable(baseSchema);
850
+ }
851
+
852
+ // Handle readOnly
853
+ if (schema.readOnly === true) {
854
+ baseSchema = z.readonly(baseSchema);
855
+ }
856
+
857
+ // Apply `default` so it wraps the fully-composed schema. This ensures `parse(undefined) -> default` works regardless of which branch of `convertBaseSchema` produced the inner schema (enum/const/not/typed/etc.).
858
+ if (schema.default !== undefined) {
859
+ baseSchema = baseSchema.default(schema.default);
860
+ }
861
+
862
+ // Collect non-description annotation metadata into the user-supplied registry. Description is handled separately below via `.describe()` to preserve the contract that `schema.description` reads from globalRegistry.
863
+ const extraMeta: Record<string, unknown> = {};
864
+
865
+ const coreMetadataKeys = ["$id", "id", "$comment", "$anchor", "$vocabulary", "$dynamicRef", "$dynamicAnchor"];
866
+ for (const key of coreMetadataKeys) {
867
+ if (key in schema) {
868
+ extraMeta[key] = schema[key];
869
+ }
870
+ }
871
+
872
+ const contentMetadataKeys = ["contentEncoding", "contentMediaType", "contentSchema"];
873
+ for (const key of contentMetadataKeys) {
874
+ if (key in schema) {
875
+ extraMeta[key] = schema[key];
876
+ }
877
+ }
878
+
879
+ // `propertyNames` and `contains` are enforced by a guard, which `toJSONSchema` cannot infer, so the original keyword is carried as metadata to keep the round-trip lossless. Only where it was actually applied: on any other type it is inert, and on a `$ref` the metadata would land on the target every reference shares. A carried subschema is copied verbatim while the root `$defs` stay behind, so one holding a `$ref` is dropped rather than emitted as a dangling reference.
880
+ if (schema.type === "object" && schema.$ref === undefined) {
881
+ if (schema.propertyNames !== undefined && !containsRef(schema.propertyNames)) {
882
+ extraMeta.propertyNames = schema.propertyNames;
883
+ }
884
+ for (const key of ["minProperties", "maxProperties"] as const) {
885
+ if (schema[key] !== undefined) extraMeta[key] = schema[key];
886
+ }
887
+ }
888
+ if (schema.type === "array" && schema.$ref === undefined) {
889
+ if (schema.contains !== undefined && !containsRef(schema.contains)) {
890
+ extraMeta.contains = schema.contains;
891
+ }
892
+ for (const key of ["uniqueItems", "minContains", "maxContains"] as const) {
893
+ if (schema[key] !== undefined) extraMeta[key] = schema[key];
894
+ }
895
+ }
896
+
897
+ for (const key of Object.keys(schema)) {
898
+ if (!RECOGNIZED_KEYS.has(key)) {
899
+ assignProp(extraMeta, key, schema[key]);
900
+ }
901
+ }
902
+
903
+ if (Object.keys(extraMeta).length > 0) {
904
+ ctx.registry.add(baseSchema, extraMeta);
905
+ }
906
+
907
+ // Apply description last. `.describe()` clones the schema and sets `_yatsp.parent` on the clone, so registry lookups on the returned reference still resolve `extraMeta` via parent inheritance.
908
+ if (schema.description) {
909
+ baseSchema = baseSchema.describe(schema.description);
910
+ }
911
+
912
+ return baseSchema;
913
+ }
914
+
915
+ /**
916
+ * Converts a JSON Schema to a Yatsp schema. This function should be considered semi-experimental. It's behavior is liable to change. */
917
+ export function fromJSONSchema(schema: JSONSchema.JSONSchema | boolean, params?: FromJSONSchemaParams): YatspType {
918
+ // Handle boolean schemas
919
+ if (typeof schema === "boolean") {
920
+ return schema ? z.any() : z.never();
921
+ }
922
+
923
+ // Normalize input via a JSON round-trip. This guarantees the converter walks a plain, finite, JSON-valid object graph: cyclic inputs fail here, getter/Proxy-based properties are materialized into static values, and class instances collapse to plain objects.
924
+ let normalized: JSONSchema.JSONSchema;
925
+ try {
926
+ normalized = JSON.parse(JSON.stringify(schema));
927
+ } catch {
928
+ throw new Error("fromJSONSchema input is not valid JSON (possibly cyclic); use $defs/$ref for recursive schemas");
929
+ }
930
+
931
+ const version = detectVersion(normalized, params?.defaultTarget);
932
+ const defs = (normalized.$defs || normalized.definitions || {}) as Record<string, JSONSchema.JSONSchema>;
933
+
934
+ const ctx: ConversionContext = {
935
+ version,
936
+ defs,
937
+ refs: new Map(),
938
+ processing: new Set(),
939
+ rootSchema: normalized,
940
+ registry: params?.registry ?? globalRegistry,
941
+ };
942
+
943
+ return convertSchema(normalized, ctx);
944
+ }