@oxog/vld 2.0.3 → 2.1.0

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 (449) hide show
  1. package/CHANGELOG.md +33 -1
  2. package/README.md +101 -37
  3. package/dist/chunks/errors-core-BeiFUtZM.js +81 -0
  4. package/dist/chunks/{index-DO8CFMxD.js → index-0R2ntSud.js} +16 -402
  5. package/dist/chunks/index-BvH403Yy.js +88 -0
  6. package/dist/chunks/security-B0Pd_vSY.js +35 -0
  7. package/dist/chunks/string-BJRQod3t.js +530 -0
  8. package/dist/cjs/chunks/errors-core-DWxLFs2f.cjs +83 -0
  9. package/dist/cjs/chunks/index-BkI37108.cjs +538 -0
  10. package/dist/cjs/chunks/index-Cc3bjUMX.cjs +91 -0
  11. package/dist/cjs/chunks/security-Dc3Jh13T.cjs +37 -0
  12. package/dist/cjs/chunks/string-BKZrc4hs.cjs +533 -0
  13. package/dist/cjs/cli/bin.cjs +506 -0
  14. package/dist/cjs/cli/index.cjs +209 -0
  15. package/dist/cjs/codecs/index.cjs +45 -0
  16. package/dist/{chunks/date-50JV_Mfj.js → cjs/coercion/index.cjs} +185 -103
  17. package/dist/cjs/compat/emitter.cjs +184 -0
  18. package/dist/cjs/compat/result.cjs +189 -0
  19. package/dist/cjs/errors.cjs +6 -213
  20. package/dist/cjs/index.cjs +1471 -10336
  21. package/dist/cjs/kernel.cjs +415 -0
  22. package/dist/cjs/locales/af.cjs +108 -0
  23. package/dist/cjs/locales/ar.cjs +108 -0
  24. package/dist/cjs/locales/bn.cjs +108 -0
  25. package/dist/cjs/locales/da.cjs +108 -0
  26. package/dist/cjs/locales/de.cjs +108 -0
  27. package/dist/cjs/locales/en.cjs +108 -0
  28. package/dist/cjs/locales/es-MX.cjs +107 -0
  29. package/dist/cjs/locales/es.cjs +96 -0
  30. package/dist/cjs/locales/fi.cjs +108 -0
  31. package/dist/cjs/locales/fr.cjs +96 -0
  32. package/dist/cjs/locales/hi.cjs +108 -0
  33. package/dist/cjs/locales/id.cjs +108 -0
  34. package/dist/cjs/locales/index.cjs +41 -2875
  35. package/dist/cjs/locales/it.cjs +108 -0
  36. package/dist/cjs/locales/ja.cjs +108 -0
  37. package/dist/cjs/locales/ko.cjs +108 -0
  38. package/dist/cjs/locales/lazy.cjs +42 -3023
  39. package/dist/cjs/locales/nl.cjs +108 -0
  40. package/dist/cjs/locales/no.cjs +108 -0
  41. package/dist/cjs/locales/pl.cjs +108 -0
  42. package/dist/cjs/locales/pt-BR.cjs +108 -0
  43. package/dist/cjs/locales/pt.cjs +108 -0
  44. package/dist/cjs/locales/ru.cjs +108 -0
  45. package/dist/cjs/locales/runtime.cjs +51 -0
  46. package/dist/cjs/locales/sv.cjs +108 -0
  47. package/dist/cjs/locales/sw.cjs +108 -0
  48. package/dist/cjs/locales/th.cjs +108 -0
  49. package/dist/cjs/locales/tr.cjs +108 -0
  50. package/dist/cjs/locales/vi.cjs +108 -0
  51. package/dist/cjs/locales/zh.cjs +108 -0
  52. package/dist/cjs/mini.cjs +121 -7353
  53. package/dist/cjs/pigment.cjs +207 -0
  54. package/dist/cjs/plugins/index.cjs +12 -0
  55. package/dist/cjs/registry.cjs +37 -0
  56. package/dist/cjs/v3/index.cjs +425 -0
  57. package/dist/cjs/v4/core/index.cjs +894 -0
  58. package/dist/cjs/v4/index.cjs +425 -0
  59. package/dist/cjs/v4/locales/index.cjs +130 -0
  60. package/dist/cjs/v4/mini/index.cjs +509 -0
  61. package/dist/cjs/v4-mini/index.cjs +532 -0
  62. package/dist/cjs/validators/any.cjs +40 -0
  63. package/dist/cjs/validators/array.cjs +283 -0
  64. package/dist/cjs/validators/base.cjs +887 -0
  65. package/dist/cjs/validators/base64.cjs +73 -0
  66. package/dist/cjs/validators/bigint.cjs +232 -0
  67. package/dist/cjs/validators/boolean.cjs +146 -0
  68. package/dist/cjs/validators/codec.cjs +205 -0
  69. package/dist/cjs/validators/custom.cjs +71 -0
  70. package/dist/cjs/validators/date.cjs +278 -0
  71. package/dist/cjs/validators/discriminated-union.cjs +130 -0
  72. package/dist/cjs/validators/enum.cjs +154 -0
  73. package/dist/cjs/validators/file.cjs +130 -0
  74. package/dist/cjs/validators/function.cjs +63 -0
  75. package/dist/cjs/validators/hex.cjs +70 -0
  76. package/dist/cjs/validators/index.cjs +123 -0
  77. package/dist/cjs/validators/intersection.cjs +120 -0
  78. package/dist/cjs/validators/json.cjs +70 -0
  79. package/dist/cjs/validators/lazy.cjs +53 -0
  80. package/dist/cjs/validators/literal.cjs +64 -0
  81. package/dist/cjs/validators/map.cjs +218 -0
  82. package/dist/cjs/validators/nan.cjs +41 -0
  83. package/dist/cjs/validators/never.cjs +36 -0
  84. package/dist/cjs/validators/null.cjs +43 -0
  85. package/dist/cjs/validators/number.cjs +427 -0
  86. package/dist/cjs/validators/object.cjs +868 -0
  87. package/dist/cjs/validators/promise.cjs +115 -0
  88. package/dist/cjs/validators/record.cjs +262 -0
  89. package/dist/cjs/validators/set.cjs +203 -0
  90. package/dist/cjs/validators/string-bool.cjs +124 -0
  91. package/dist/cjs/validators/string-formats.cjs +168 -0
  92. package/dist/cjs/validators/string.cjs +12 -0
  93. package/dist/cjs/validators/symbol.cjs +62 -0
  94. package/dist/cjs/validators/template-literal.cjs +108 -0
  95. package/dist/cjs/validators/tuple.cjs +187 -0
  96. package/dist/cjs/validators/uint8array.cjs +106 -0
  97. package/dist/cjs/validators/undefined.cjs +43 -0
  98. package/dist/cjs/validators/union.cjs +191 -0
  99. package/dist/cjs/validators/unknown.cjs +40 -0
  100. package/dist/cjs/validators/void.cjs +48 -0
  101. package/dist/cjs/validators/xor.cjs +69 -0
  102. package/dist/cli/bin.d.ts +0 -1
  103. package/dist/cli/bin.js +407 -0
  104. package/dist/cli/commands/benchmark.d.ts +1 -2
  105. package/dist/cli/commands/validate.d.ts +1 -2
  106. package/dist/cli/index.d.ts +0 -1
  107. package/dist/cli/index.js +205 -0
  108. package/dist/codecs/index.d.ts +21 -4
  109. package/dist/codecs/index.js +11 -4
  110. package/dist/coercion/bigint.d.ts +2 -3
  111. package/dist/coercion/boolean.d.ts +3 -3
  112. package/dist/coercion/date.d.ts +3 -3
  113. package/dist/coercion/index.d.ts +5 -6
  114. package/dist/coercion/index.js +473 -5
  115. package/dist/coercion/number.d.ts +2 -3
  116. package/dist/coercion/string.d.ts +2 -3
  117. package/dist/compat/emitter.d.ts +0 -1
  118. package/dist/compat/emitter.js +0 -1
  119. package/dist/compat/index.d.ts +4 -5
  120. package/dist/compat/result.d.ts +1 -2
  121. package/dist/compat/result.js +0 -1
  122. package/dist/errors-core.d.ts +39 -0
  123. package/dist/errors.d.ts +4 -54
  124. package/dist/errors.js +4 -68
  125. package/dist/events.d.ts +3 -4
  126. package/dist/index.d.ts +1186 -835
  127. package/dist/index.js +1046 -367
  128. package/dist/kernel.d.ts +2 -3
  129. package/dist/kernel.js +10 -6
  130. package/dist/locales/af.d.ts +1 -2
  131. package/dist/locales/af.js +0 -1
  132. package/dist/locales/ar.d.ts +1 -2
  133. package/dist/locales/ar.js +0 -1
  134. package/dist/locales/bn.d.ts +1 -2
  135. package/dist/locales/bn.js +0 -1
  136. package/dist/locales/da.d.ts +1 -2
  137. package/dist/locales/da.js +0 -1
  138. package/dist/locales/de.d.ts +1 -2
  139. package/dist/locales/de.js +0 -1
  140. package/dist/locales/en.d.ts +1 -2
  141. package/dist/locales/en.js +0 -1
  142. package/dist/locales/es-MX.d.ts +1 -2
  143. package/dist/locales/es-MX.js +0 -1
  144. package/dist/locales/es.d.ts +1 -2
  145. package/dist/locales/es.js +0 -1
  146. package/dist/locales/fi.d.ts +1 -2
  147. package/dist/locales/fi.js +0 -1
  148. package/dist/locales/fr.d.ts +1 -2
  149. package/dist/locales/fr.js +0 -1
  150. package/dist/locales/hi.d.ts +1 -2
  151. package/dist/locales/hi.js +0 -1
  152. package/dist/locales/id.d.ts +1 -2
  153. package/dist/locales/id.js +0 -1
  154. package/dist/locales/index.d.ts +10 -15
  155. package/dist/locales/index.js +28 -2
  156. package/dist/locales/it.d.ts +1 -2
  157. package/dist/locales/it.js +0 -1
  158. package/dist/locales/ja.d.ts +1 -2
  159. package/dist/locales/ja.js +0 -1
  160. package/dist/locales/ko.d.ts +1 -2
  161. package/dist/locales/ko.js +0 -1
  162. package/dist/locales/lazy.d.ts +4 -26
  163. package/dist/locales/lazy.js +12 -55
  164. package/dist/locales/nl.d.ts +1 -2
  165. package/dist/locales/nl.js +0 -1
  166. package/dist/locales/no.d.ts +1 -2
  167. package/dist/locales/no.js +0 -1
  168. package/dist/locales/pl.d.ts +1 -2
  169. package/dist/locales/pl.js +0 -1
  170. package/dist/locales/pt-BR.d.ts +1 -2
  171. package/dist/locales/pt-BR.js +0 -1
  172. package/dist/locales/pt.d.ts +1 -2
  173. package/dist/locales/pt.js +0 -1
  174. package/dist/locales/ru.d.ts +1 -2
  175. package/dist/locales/ru.js +0 -1
  176. package/dist/locales/runtime.d.ts +10 -0
  177. package/dist/locales/runtime.js +41 -0
  178. package/dist/locales/sv.d.ts +1 -2
  179. package/dist/locales/sv.js +0 -1
  180. package/dist/locales/sw.d.ts +1 -2
  181. package/dist/locales/sw.js +0 -1
  182. package/dist/locales/th.d.ts +1 -2
  183. package/dist/locales/th.js +0 -1
  184. package/dist/locales/tr.d.ts +1 -2
  185. package/dist/locales/tr.js +0 -1
  186. package/dist/locales/types.d.ts +0 -1
  187. package/dist/locales/vi.d.ts +1 -2
  188. package/dist/locales/vi.js +0 -1
  189. package/dist/locales/zh.d.ts +1 -2
  190. package/dist/locales/zh.js +0 -1
  191. package/dist/logger.d.ts +0 -1
  192. package/dist/mini.d.ts +64 -65
  193. package/dist/mini.js +31 -7
  194. package/dist/pigment.d.ts +0 -1
  195. package/dist/pigment.js +6 -4
  196. package/dist/plugins/index.d.ts +2 -3
  197. package/dist/plugins/index.js +1 -0
  198. package/dist/plugins/types.d.ts +4 -5
  199. package/dist/registry.d.ts +23 -0
  200. package/dist/registry.js +34 -0
  201. package/dist/utils/codec-utils.d.ts +0 -1
  202. package/dist/utils/deep-merge.d.ts +0 -1
  203. package/dist/utils/ip-validation.d.ts +0 -1
  204. package/dist/utils/json-schema.d.ts +16 -6
  205. package/dist/utils/security.d.ts +2 -6
  206. package/dist/v3/index.d.ts +2 -0
  207. package/dist/v3/index.js +46 -0
  208. package/dist/v4/core/index.d.ts +260 -0
  209. package/dist/v4/core/index.js +277 -0
  210. package/dist/v4/index.d.ts +4 -0
  211. package/dist/v4/index.js +50 -0
  212. package/dist/v4/locales/index.d.ts +53 -0
  213. package/dist/v4/locales/index.js +77 -0
  214. package/dist/v4/mini/index.d.ts +2 -0
  215. package/dist/v4/mini/index.js +47 -0
  216. package/dist/v4-mini/index.d.ts +22 -0
  217. package/dist/v4-mini/index.js +75 -0
  218. package/dist/validators/any.d.ts +7 -2
  219. package/dist/validators/any.js +37 -0
  220. package/dist/validators/array.d.ts +9 -2
  221. package/dist/validators/array.js +279 -0
  222. package/dist/validators/base.d.ts +150 -6
  223. package/dist/validators/base.js +868 -0
  224. package/dist/validators/base64.d.ts +1 -2
  225. package/dist/validators/base64.js +68 -0
  226. package/dist/validators/bigint.d.ts +21 -3
  227. package/dist/validators/bigint.js +228 -0
  228. package/dist/validators/boolean.d.ts +13 -4
  229. package/dist/validators/boolean.js +142 -0
  230. package/dist/validators/codec.d.ts +9 -2
  231. package/dist/validators/codec.js +200 -0
  232. package/dist/validators/custom.d.ts +15 -2
  233. package/dist/validators/custom.js +67 -0
  234. package/dist/validators/date.d.ts +19 -3
  235. package/dist/validators/date.js +274 -0
  236. package/dist/validators/discriminated-union.d.ts +4 -3
  237. package/dist/validators/discriminated-union.js +123 -0
  238. package/dist/validators/enum.d.ts +10 -7
  239. package/dist/validators/enum.js +150 -0
  240. package/dist/validators/file.d.ts +7 -2
  241. package/dist/validators/file.js +125 -0
  242. package/dist/validators/function.d.ts +11 -5
  243. package/dist/validators/function.js +58 -0
  244. package/dist/validators/hex.d.ts +1 -2
  245. package/dist/validators/hex.js +65 -0
  246. package/dist/validators/index.d.ts +38 -39
  247. package/dist/validators/index.js +35 -515
  248. package/dist/validators/intersection.d.ts +1 -2
  249. package/dist/validators/intersection.js +116 -0
  250. package/dist/validators/json.d.ts +1 -2
  251. package/dist/validators/json.js +66 -0
  252. package/dist/validators/lazy.d.ts +5 -9
  253. package/dist/validators/lazy.js +50 -0
  254. package/dist/validators/literal.d.ts +2 -2
  255. package/dist/validators/literal.js +60 -0
  256. package/dist/validators/map.d.ts +15 -2
  257. package/dist/validators/map.js +214 -0
  258. package/dist/validators/nan.d.ts +2 -3
  259. package/dist/validators/nan.js +38 -0
  260. package/dist/validators/never.d.ts +1 -2
  261. package/dist/validators/never.js +32 -0
  262. package/dist/validators/null.d.ts +3 -3
  263. package/dist/validators/null.js +40 -0
  264. package/dist/validators/number.d.ts +56 -27
  265. package/dist/validators/number.js +423 -0
  266. package/dist/validators/object.d.ts +30 -9
  267. package/dist/validators/object.js +864 -0
  268. package/dist/validators/promise.d.ts +15 -10
  269. package/dist/validators/promise.js +111 -0
  270. package/dist/validators/record.d.ts +11 -2
  271. package/dist/validators/record.js +258 -0
  272. package/dist/validators/set.d.ts +11 -2
  273. package/dist/validators/set.js +199 -0
  274. package/dist/validators/string-bool.d.ts +7 -10
  275. package/dist/validators/string-bool.js +120 -0
  276. package/dist/validators/string-formats.d.ts +7 -4
  277. package/dist/validators/string-formats.js +135 -0
  278. package/dist/validators/string.d.ts +39 -18
  279. package/dist/validators/string.js +4 -0
  280. package/dist/validators/symbol.d.ts +8 -3
  281. package/dist/validators/symbol.js +58 -0
  282. package/dist/validators/template-literal.d.ts +1 -2
  283. package/dist/validators/template-literal.js +103 -0
  284. package/dist/validators/tuple.d.ts +15 -2
  285. package/dist/validators/tuple.js +183 -0
  286. package/dist/validators/uint8array.d.ts +3 -4
  287. package/dist/validators/uint8array.js +101 -0
  288. package/dist/validators/undefined.d.ts +3 -3
  289. package/dist/validators/undefined.js +40 -0
  290. package/dist/validators/union.d.ts +7 -4
  291. package/dist/validators/union.js +187 -0
  292. package/dist/validators/unknown.d.ts +7 -2
  293. package/dist/{chunks/unknown-Dhzri_T-.js → validators/unknown.js} +12 -3
  294. package/dist/validators/void.d.ts +3 -2
  295. package/dist/validators/void.js +44 -0
  296. package/dist/validators/xor.d.ts +2 -3
  297. package/dist/validators/xor.js +66 -0
  298. package/package.json +114 -30
  299. package/dist/chunks/bigint-CRS0QVsy.js +0 -1854
  300. package/dist/chunks/bigint-CRS0QVsy.js.map +0 -1
  301. package/dist/chunks/date-50JV_Mfj.js.map +0 -1
  302. package/dist/chunks/index-DO8CFMxD.js.map +0 -1
  303. package/dist/chunks/json-Cp4WO0M9.js +0 -2021
  304. package/dist/chunks/json-Cp4WO0M9.js.map +0 -1
  305. package/dist/chunks/unknown-Dhzri_T-.js.map +0 -1
  306. package/dist/cjs/errors.cjs.map +0 -1
  307. package/dist/cjs/index.cjs.map +0 -1
  308. package/dist/cjs/locales/index.cjs.map +0 -1
  309. package/dist/cjs/locales/lazy.cjs.map +0 -1
  310. package/dist/cjs/mini.cjs.map +0 -1
  311. package/dist/cli/bin.d.ts.map +0 -1
  312. package/dist/cli/commands/benchmark.d.ts.map +0 -1
  313. package/dist/cli/commands/validate.d.ts.map +0 -1
  314. package/dist/cli/index.d.ts.map +0 -1
  315. package/dist/codecs/index.d.ts.map +0 -1
  316. package/dist/codecs/index.js.map +0 -1
  317. package/dist/coercion/bigint.d.ts.map +0 -1
  318. package/dist/coercion/boolean.d.ts.map +0 -1
  319. package/dist/coercion/date.d.ts.map +0 -1
  320. package/dist/coercion/index.d.ts.map +0 -1
  321. package/dist/coercion/index.js.map +0 -1
  322. package/dist/coercion/number.d.ts.map +0 -1
  323. package/dist/coercion/string.d.ts.map +0 -1
  324. package/dist/compat/emitter.d.ts.map +0 -1
  325. package/dist/compat/emitter.js.map +0 -1
  326. package/dist/compat/index.d.ts.map +0 -1
  327. package/dist/compat/result.d.ts.map +0 -1
  328. package/dist/compat/result.js.map +0 -1
  329. package/dist/errors.d.ts.map +0 -1
  330. package/dist/errors.js.map +0 -1
  331. package/dist/events.d.ts.map +0 -1
  332. package/dist/index.d.ts.map +0 -1
  333. package/dist/index.js.map +0 -1
  334. package/dist/kernel.d.ts.map +0 -1
  335. package/dist/kernel.js.map +0 -1
  336. package/dist/locales/af.d.ts.map +0 -1
  337. package/dist/locales/af.js.map +0 -1
  338. package/dist/locales/ar.d.ts.map +0 -1
  339. package/dist/locales/ar.js.map +0 -1
  340. package/dist/locales/backup-en.d.ts +0 -3
  341. package/dist/locales/backup-en.d.ts.map +0 -1
  342. package/dist/locales/bn.d.ts.map +0 -1
  343. package/dist/locales/bn.js.map +0 -1
  344. package/dist/locales/da.d.ts.map +0 -1
  345. package/dist/locales/da.js.map +0 -1
  346. package/dist/locales/de.d.ts.map +0 -1
  347. package/dist/locales/de.js.map +0 -1
  348. package/dist/locales/en.d.ts.map +0 -1
  349. package/dist/locales/en.js.map +0 -1
  350. package/dist/locales/es-MX.d.ts.map +0 -1
  351. package/dist/locales/es-MX.js.map +0 -1
  352. package/dist/locales/es.d.ts.map +0 -1
  353. package/dist/locales/es.js.map +0 -1
  354. package/dist/locales/fi.d.ts.map +0 -1
  355. package/dist/locales/fi.js.map +0 -1
  356. package/dist/locales/fr.d.ts.map +0 -1
  357. package/dist/locales/fr.js.map +0 -1
  358. package/dist/locales/hi.d.ts.map +0 -1
  359. package/dist/locales/hi.js.map +0 -1
  360. package/dist/locales/id.d.ts.map +0 -1
  361. package/dist/locales/id.js.map +0 -1
  362. package/dist/locales/index.d.ts.map +0 -1
  363. package/dist/locales/index.js.map +0 -1
  364. package/dist/locales/it.d.ts.map +0 -1
  365. package/dist/locales/it.js.map +0 -1
  366. package/dist/locales/ja.d.ts.map +0 -1
  367. package/dist/locales/ja.js.map +0 -1
  368. package/dist/locales/ko.d.ts.map +0 -1
  369. package/dist/locales/ko.js.map +0 -1
  370. package/dist/locales/lazy.d.ts.map +0 -1
  371. package/dist/locales/lazy.js.map +0 -1
  372. package/dist/locales/nl.d.ts.map +0 -1
  373. package/dist/locales/nl.js.map +0 -1
  374. package/dist/locales/no.d.ts.map +0 -1
  375. package/dist/locales/no.js.map +0 -1
  376. package/dist/locales/pl.d.ts.map +0 -1
  377. package/dist/locales/pl.js.map +0 -1
  378. package/dist/locales/pt-BR.d.ts.map +0 -1
  379. package/dist/locales/pt-BR.js.map +0 -1
  380. package/dist/locales/pt.d.ts.map +0 -1
  381. package/dist/locales/pt.js.map +0 -1
  382. package/dist/locales/ru.d.ts.map +0 -1
  383. package/dist/locales/ru.js.map +0 -1
  384. package/dist/locales/sv.d.ts.map +0 -1
  385. package/dist/locales/sv.js.map +0 -1
  386. package/dist/locales/sw.d.ts.map +0 -1
  387. package/dist/locales/sw.js.map +0 -1
  388. package/dist/locales/th.d.ts.map +0 -1
  389. package/dist/locales/th.js.map +0 -1
  390. package/dist/locales/tr.d.ts.map +0 -1
  391. package/dist/locales/tr.js.map +0 -1
  392. package/dist/locales/types.d.ts.map +0 -1
  393. package/dist/locales/vi.d.ts.map +0 -1
  394. package/dist/locales/vi.js.map +0 -1
  395. package/dist/locales/zh.d.ts.map +0 -1
  396. package/dist/locales/zh.js.map +0 -1
  397. package/dist/logger.d.ts.map +0 -1
  398. package/dist/mini.d.ts.map +0 -1
  399. package/dist/mini.js.map +0 -1
  400. package/dist/pigment.d.ts.map +0 -1
  401. package/dist/pigment.js.map +0 -1
  402. package/dist/plugins/index.d.ts.map +0 -1
  403. package/dist/plugins/types.d.ts.map +0 -1
  404. package/dist/utils/codec-utils.d.ts.map +0 -1
  405. package/dist/utils/deep-merge.d.ts.map +0 -1
  406. package/dist/utils/ip-validation.d.ts.map +0 -1
  407. package/dist/utils/json-schema.d.ts.map +0 -1
  408. package/dist/utils/security.d.ts.map +0 -1
  409. package/dist/validators/any.d.ts.map +0 -1
  410. package/dist/validators/array.d.ts.map +0 -1
  411. package/dist/validators/base.d.ts.map +0 -1
  412. package/dist/validators/base64.d.ts.map +0 -1
  413. package/dist/validators/bigint.d.ts.map +0 -1
  414. package/dist/validators/boolean.d.ts.map +0 -1
  415. package/dist/validators/codec.d.ts.map +0 -1
  416. package/dist/validators/custom.d.ts.map +0 -1
  417. package/dist/validators/date.d.ts.map +0 -1
  418. package/dist/validators/discriminated-union.d.ts.map +0 -1
  419. package/dist/validators/enum.d.ts.map +0 -1
  420. package/dist/validators/file.d.ts.map +0 -1
  421. package/dist/validators/function.d.ts.map +0 -1
  422. package/dist/validators/hex.d.ts.map +0 -1
  423. package/dist/validators/index.d.ts.map +0 -1
  424. package/dist/validators/index.js.map +0 -1
  425. package/dist/validators/intersection.d.ts.map +0 -1
  426. package/dist/validators/json.d.ts.map +0 -1
  427. package/dist/validators/lazy.d.ts.map +0 -1
  428. package/dist/validators/literal.d.ts.map +0 -1
  429. package/dist/validators/map.d.ts.map +0 -1
  430. package/dist/validators/nan.d.ts.map +0 -1
  431. package/dist/validators/never.d.ts.map +0 -1
  432. package/dist/validators/null.d.ts.map +0 -1
  433. package/dist/validators/number.d.ts.map +0 -1
  434. package/dist/validators/object.d.ts.map +0 -1
  435. package/dist/validators/promise.d.ts.map +0 -1
  436. package/dist/validators/record.d.ts.map +0 -1
  437. package/dist/validators/set.d.ts.map +0 -1
  438. package/dist/validators/string-bool.d.ts.map +0 -1
  439. package/dist/validators/string-formats.d.ts.map +0 -1
  440. package/dist/validators/string.d.ts.map +0 -1
  441. package/dist/validators/symbol.d.ts.map +0 -1
  442. package/dist/validators/template-literal.d.ts.map +0 -1
  443. package/dist/validators/tuple.d.ts.map +0 -1
  444. package/dist/validators/uint8array.d.ts.map +0 -1
  445. package/dist/validators/undefined.d.ts.map +0 -1
  446. package/dist/validators/union.d.ts.map +0 -1
  447. package/dist/validators/unknown.d.ts.map +0 -1
  448. package/dist/validators/void.d.ts.map +0 -1
  449. package/dist/validators/xor.d.ts.map +0 -1
@@ -0,0 +1,123 @@
1
+ import { VldBase, VLD_VALIDATOR_TYPES } from './base.js';
2
+ import { VldObject } from './object.js';
3
+ import { VldLiteral } from './literal.js';
4
+ import { VldEnum } from './enum.js';
5
+
6
+ /**
7
+ * VldDiscriminatedUnion - Fast union validation using discriminator field
8
+ * Part of Zod 4 API parity implementation
9
+ * Provides O(1) lookup performance by using a discriminator key
10
+ */
11
+ /**
12
+ * Extract literal values from a schema
13
+ */
14
+ function extractLiteralValues(schema) {
15
+ if (schema instanceof VldLiteral) {
16
+ return [schema.literal];
17
+ }
18
+ if (schema instanceof VldEnum) {
19
+ return [...schema.values];
20
+ }
21
+ throw new Error('Discriminator must be a literal or enum schema');
22
+ }
23
+ /**
24
+ * Discriminated union validator - validates union based on discriminator key
25
+ * Much faster than regular union when you have a discriminator field
26
+ */
27
+ class VldDiscriminatedUnion extends VldBase {
28
+ constructor(_discriminator, _options) {
29
+ super(VLD_VALIDATOR_TYPES.DISCRIMINATED_UNION);
30
+ this._discriminator = _discriminator;
31
+ this._options = _options;
32
+ // Build discriminator map for O(1) lookup
33
+ this._discriminatorMap = new Map();
34
+ this._stringDiscriminatorMap = Object.create(null);
35
+ for (const option of _options) {
36
+ if (!(option instanceof VldObject)) {
37
+ throw new Error('All options in a discriminated union must be objects');
38
+ }
39
+ const discriminatorSchema = option.config?.shape?.[this._discriminator];
40
+ if (!discriminatorSchema) {
41
+ throw new Error(`Missing discriminator key "${this._discriminator}" in one of the options`);
42
+ }
43
+ const values = extractLiteralValues(discriminatorSchema);
44
+ for (const value of values) {
45
+ if (this._discriminatorMap.has(value)) {
46
+ throw new Error(`Duplicate discriminator value "${String(value)}" found in discriminated union`);
47
+ }
48
+ this._discriminatorMap.set(value, option);
49
+ if (typeof value === 'string') {
50
+ this._stringDiscriminatorMap[value] = option;
51
+ }
52
+ }
53
+ }
54
+ this._validValues = Array.from(this._discriminatorMap.keys());
55
+ }
56
+ static create(discriminator, options) {
57
+ return new VldDiscriminatedUnion(discriminator, options);
58
+ }
59
+ parse(value) {
60
+ if (typeof value !== 'object' || value === null) {
61
+ throw new Error(`Expected object, received ${value === null ? 'null' : typeof value}`);
62
+ }
63
+ const discriminatorValue = value[this._discriminator];
64
+ const matchedSchema = typeof discriminatorValue === 'string'
65
+ ? this._stringDiscriminatorMap[discriminatorValue]
66
+ : this._discriminatorMap.get(discriminatorValue);
67
+ if (!matchedSchema) {
68
+ throw new Error(`Invalid discriminator value for "${this._discriminator}". ` +
69
+ `Expected one of: ${JSON.stringify(this._validValues)}, ` +
70
+ `received: ${JSON.stringify(discriminatorValue)}`);
71
+ }
72
+ return matchedSchema.parseTrustedKnownObject(value, this._discriminator);
73
+ }
74
+ safeParse(value) {
75
+ // Check if input is an object
76
+ if (typeof value !== 'object' || value === null) {
77
+ return {
78
+ success: false,
79
+ error: new Error(`Expected object, received ${value === null ? 'null' : typeof value}`)
80
+ };
81
+ }
82
+ // Get discriminator value
83
+ const discriminatorValue = value[this._discriminator];
84
+ // Look up matching schema
85
+ const matchedSchema = typeof discriminatorValue === 'string'
86
+ ? this._stringDiscriminatorMap[discriminatorValue]
87
+ : this._discriminatorMap.get(discriminatorValue);
88
+ if (!matchedSchema) {
89
+ return {
90
+ success: false,
91
+ error: new Error(`Invalid discriminator value for "${this._discriminator}". ` +
92
+ `Expected one of: ${JSON.stringify(this._validValues)}, ` +
93
+ `received: ${JSON.stringify(discriminatorValue)}`)
94
+ };
95
+ }
96
+ try {
97
+ return {
98
+ success: true,
99
+ data: matchedSchema.parseTrustedKnownObject(value, this._discriminator)
100
+ };
101
+ }
102
+ catch (error) {
103
+ return {
104
+ success: false,
105
+ error: error
106
+ };
107
+ }
108
+ }
109
+ /**
110
+ * Get the discriminator key
111
+ */
112
+ getDiscriminator() {
113
+ return this._discriminator;
114
+ }
115
+ /**
116
+ * Get all options
117
+ */
118
+ getOptions() {
119
+ return this._options;
120
+ }
121
+ }
122
+
123
+ export { VldDiscriminatedUnion };
@@ -1,14 +1,17 @@
1
- import { VldBase, ParseResult } from './base';
1
+ import { VldBase, ParseResult } from './base.js';
2
2
  /**
3
- * Immutable enum validator for string enum values
3
+ * Immutable enum validator for string and number enum values
4
4
  */
5
- export declare class VldEnum<T extends readonly [string, ...string[]]> extends VldBase<string, T[number]> {
5
+ type EnumValue = string | number;
6
+ export declare class VldEnum<T extends readonly [EnumValue, ...EnumValue[]]> extends VldBase<EnumValue, T[number]> {
6
7
  private readonly _values;
7
8
  private readonly errorMessage?;
9
+ private readonly _valueSet;
8
10
  /**
9
11
  * Private constructor to enforce immutability
10
12
  */
11
13
  private constructor();
14
+ private createError;
12
15
  /**
13
16
  * Get the enum values
14
17
  */
@@ -16,7 +19,7 @@ export declare class VldEnum<T extends readonly [string, ...string[]]> extends V
16
19
  /**
17
20
  * Create a new enum validator
18
21
  */
19
- static create<T extends readonly [string, ...string[]]>(values: T): VldEnum<T>;
22
+ static create<T extends readonly [EnumValue, ...EnumValue[]]>(values: T): VldEnum<T>;
20
23
  /**
21
24
  * Parse and validate an enum value
22
25
  */
@@ -29,11 +32,11 @@ export declare class VldEnum<T extends readonly [string, ...string[]]> extends V
29
32
  * Exclude specific values from the enum
30
33
  * Creates a new enum validator without the specified values
31
34
  */
32
- exclude<const E extends readonly string[]>(...excludeValues: E): VldEnum<T[number] extends E[number] ? never : T[number] extends Exclude<T[number], E[number]> ? T : Exclude<T, E>>;
35
+ exclude<const E extends readonly EnumValue[]>(...excludeValues: E): VldEnum<T[number] extends E[number] ? never : T[number] extends Exclude<T[number], E[number]> ? T : Exclude<T, E>>;
33
36
  /**
34
37
  * Extract specific values from the enum
35
38
  * Creates a new enum validator with only the specified values
36
39
  */
37
- extract<const E extends readonly string[]>(...extractValues: E): VldEnum<[string, ...string[]]>;
40
+ extract<const E extends readonly EnumValue[]>(...extractValues: E): VldEnum<[E[number], ...E[number][]]>;
38
41
  }
39
- //# sourceMappingURL=enum.d.ts.map
42
+ export {};
@@ -0,0 +1,150 @@
1
+ import { VldBase, VLD_VALIDATOR_TYPES } from './base.js';
2
+ import { getMessages } from '../locales/runtime.js';
3
+
4
+ class VldEnum extends VldBase {
5
+ /**
6
+ * Private constructor to enforce immutability
7
+ */
8
+ constructor(_values, errorMessage) {
9
+ super(VLD_VALIDATOR_TYPES.ENUM);
10
+ this._values = _values;
11
+ this.errorMessage = errorMessage;
12
+ this._valueSet = _values.length > 6 ? new Set(_values) : undefined;
13
+ }
14
+ createError(value) {
15
+ return new Error(this.errorMessage ||
16
+ getMessages().enumExpected([...this._values], JSON.stringify(value)));
17
+ }
18
+ /**
19
+ * Get the enum values
20
+ */
21
+ get values() {
22
+ return this._values;
23
+ }
24
+ /**
25
+ * Create a new enum validator
26
+ */
27
+ static create(values) {
28
+ return new VldEnum(values);
29
+ }
30
+ /**
31
+ * Parse and validate an enum value
32
+ */
33
+ parse(value) {
34
+ // BUG-002 FIX: Add type check before includes() to prevent type confusion
35
+ if (typeof value !== 'string' && typeof value !== 'number') {
36
+ throw this.createError(value);
37
+ }
38
+ const values = this._values;
39
+ switch (values.length) {
40
+ case 1:
41
+ if (value === values[0])
42
+ return value;
43
+ break;
44
+ case 2:
45
+ if (value === values[0] || value === values[1])
46
+ return value;
47
+ break;
48
+ case 3:
49
+ if (value === values[0] || value === values[1] || value === values[2])
50
+ return value;
51
+ break;
52
+ case 4:
53
+ if (value === values[0] || value === values[1] || value === values[2] || value === values[3]) {
54
+ return value;
55
+ }
56
+ break;
57
+ case 5:
58
+ if (value === values[0] || value === values[1] || value === values[2] || value === values[3] || value === values[4]) {
59
+ return value;
60
+ }
61
+ break;
62
+ case 6:
63
+ if (value === values[0] || value === values[1] || value === values[2] || value === values[3] || value === values[4] || value === values[5]) {
64
+ return value;
65
+ }
66
+ break;
67
+ default:
68
+ if (this._valueSet.has(value))
69
+ return value;
70
+ break;
71
+ }
72
+ throw this.createError(value);
73
+ }
74
+ /**
75
+ * Safely parse and validate an enum value
76
+ */
77
+ safeParse(value) {
78
+ // BUG-002 FIX: Add type check before includes() to prevent type confusion
79
+ if (typeof value !== 'string' && typeof value !== 'number') {
80
+ return {
81
+ success: false,
82
+ error: this.createError(value)
83
+ };
84
+ }
85
+ const values = this._values;
86
+ switch (values.length) {
87
+ case 1:
88
+ if (value === values[0])
89
+ return { success: true, data: value };
90
+ break;
91
+ case 2:
92
+ if (value === values[0] || value === values[1])
93
+ return { success: true, data: value };
94
+ break;
95
+ case 3:
96
+ if (value === values[0] || value === values[1] || value === values[2])
97
+ return { success: true, data: value };
98
+ break;
99
+ case 4:
100
+ if (value === values[0] || value === values[1] || value === values[2] || value === values[3]) {
101
+ return { success: true, data: value };
102
+ }
103
+ break;
104
+ case 5:
105
+ if (value === values[0] || value === values[1] || value === values[2] || value === values[3] || value === values[4]) {
106
+ return { success: true, data: value };
107
+ }
108
+ break;
109
+ case 6:
110
+ if (value === values[0] || value === values[1] || value === values[2] || value === values[3] || value === values[4] || value === values[5]) {
111
+ return { success: true, data: value };
112
+ }
113
+ break;
114
+ default:
115
+ if (this._valueSet.has(value))
116
+ return { success: true, data: value };
117
+ break;
118
+ }
119
+ return {
120
+ success: false,
121
+ error: this.createError(value)
122
+ };
123
+ }
124
+ /**
125
+ * Exclude specific values from the enum
126
+ * Creates a new enum validator without the specified values
127
+ */
128
+ exclude(...excludeValues) {
129
+ const filtered = this._values.filter(v => !excludeValues.includes(v));
130
+ if (filtered.length === 0) {
131
+ throw new Error('Cannot exclude all enum values');
132
+ }
133
+ // Type assertion needed because TypeScript can't guarantee the filtered array maintains the required type
134
+ return new VldEnum(filtered, this.errorMessage);
135
+ }
136
+ /**
137
+ * Extract specific values from the enum
138
+ * Creates a new enum validator with only the specified values
139
+ */
140
+ extract(...extractValues) {
141
+ const extracted = this._values.filter(v => extractValues.includes(v));
142
+ if (extracted.length === 0) {
143
+ throw new Error('Cannot extract non-existent enum values');
144
+ }
145
+ // Type assertion needed because TypeScript can't guarantee the extracted array has the required type
146
+ return new VldEnum(extracted, this.errorMessage);
147
+ }
148
+ }
149
+
150
+ export { VldEnum };
@@ -1,4 +1,4 @@
1
- import { VldBase, ParseResult } from './base';
1
+ import { VldBase, ParseResult } from './base.js';
2
2
  /**
3
3
  * File representation for validation
4
4
  * In browsers: File object
@@ -20,10 +20,16 @@ export declare class VldFile extends VldBase<unknown, VldFileValue> {
20
20
  * Create a new file validator
21
21
  */
22
22
  static create(): VldFile;
23
+ private isFileLike;
23
24
  /**
24
25
  * Parse and validate a file value
25
26
  */
26
27
  parse(value: unknown): VldFileValue;
28
+ /**
29
+ * Parse a value that has already passed the file-like type guard.
30
+ * @internal Used by object validators to avoid duplicate hot-path checks.
31
+ */
32
+ parseKnownFile(value: VldFileValue): VldFileValue;
27
33
  /**
28
34
  * Run all validation checks on the file
29
35
  */
@@ -54,4 +60,3 @@ export declare class VldFile extends VldBase<unknown, VldFileValue> {
54
60
  * Usage: v.file().min(1024).max(10485760).mime(['image/jpeg', 'image/png'])
55
61
  */
56
62
  export declare function file(): VldFile;
57
- //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1,125 @@
1
+ import { VldBase, VLD_VALIDATOR_TYPES } from './base.js';
2
+ import { getMessages } from '../locales/runtime.js';
3
+ import { V as VldError } from '../chunks/errors-core-BeiFUtZM.js';
4
+
5
+ function createFileError(message) {
6
+ return new VldError([{ code: 'invalid_type', path: [], message }]);
7
+ }
8
+ /**
9
+ * Immutable file validator for file uploads
10
+ * Supports size and MIME type validation
11
+ */
12
+ class VldFile extends VldBase {
13
+ constructor(checks = []) {
14
+ super(VLD_VALIDATOR_TYPES.FILE);
15
+ this.checks = checks;
16
+ }
17
+ /**
18
+ * Create a new file validator
19
+ */
20
+ static create() {
21
+ return new VldFile();
22
+ }
23
+ isFileLike(value) {
24
+ if (typeof value !== 'object' || value === null) {
25
+ return false;
26
+ }
27
+ if (typeof File !== 'undefined' && value instanceof File) {
28
+ return true;
29
+ }
30
+ return 'size' in value && 'type' in value;
31
+ }
32
+ /**
33
+ * Parse and validate a file value
34
+ */
35
+ parse(value) {
36
+ if (this.isFileLike(value)) {
37
+ return this.parseKnownFile(value);
38
+ }
39
+ if (typeof File === 'undefined') {
40
+ throw new Error(getMessages().fileNotSupported || 'File API not supported in this environment');
41
+ }
42
+ throw new Error(getMessages().invalidFile || 'Expected a File object');
43
+ }
44
+ /**
45
+ * Parse a value that has already passed the file-like type guard.
46
+ * @internal Used by object validators to avoid duplicate hot-path checks.
47
+ */
48
+ parseKnownFile(value) {
49
+ return this.runChecks(value);
50
+ }
51
+ /**
52
+ * Run all validation checks on the file
53
+ */
54
+ runChecks(file) {
55
+ const msgs = getMessages();
56
+ for (const check of this.checks) {
57
+ switch (check.type) {
58
+ case 'min':
59
+ if (file.size < check.value) {
60
+ throw new Error(check.message ||
61
+ (msgs.fileMinSize?.(check.value) || `File size must be at least ${check.value} bytes`));
62
+ }
63
+ break;
64
+ case 'max':
65
+ if (file.size > check.value) {
66
+ throw new Error(check.message ||
67
+ (msgs.fileMaxSize?.(check.value) || `File size must not exceed ${check.value} bytes`));
68
+ }
69
+ break;
70
+ case 'mime':
71
+ if (!check.value.includes(file.type)) {
72
+ throw new Error(check.message ||
73
+ (msgs.fileMimeType?.(check.value) || `Invalid file type. Expected: ${check.value.join(', ')}`));
74
+ }
75
+ break;
76
+ }
77
+ }
78
+ return file;
79
+ }
80
+ /**
81
+ * Safely parse and validate a file value
82
+ */
83
+ safeParse(value) {
84
+ try {
85
+ return { success: true, data: this.parse(value) };
86
+ }
87
+ catch (error) {
88
+ return { success: false, error: createFileError(error.message) };
89
+ }
90
+ }
91
+ /**
92
+ * Set minimum file size in bytes
93
+ */
94
+ min(bytes, message) {
95
+ return new VldFile([...this.checks, { type: 'min', value: bytes, message }]);
96
+ }
97
+ /**
98
+ * Set maximum file size in bytes
99
+ */
100
+ max(bytes, message) {
101
+ return new VldFile([...this.checks, { type: 'max', value: bytes, message }]);
102
+ }
103
+ /**
104
+ * Set allowed MIME types
105
+ */
106
+ mime(types, message) {
107
+ const typeArray = Array.isArray(types) ? types : [types];
108
+ return new VldFile([...this.checks, { type: 'mime', value: typeArray, message }]);
109
+ }
110
+ /**
111
+ * Set both minimum and maximum file size
112
+ */
113
+ size(min, max, message) {
114
+ return this.min(min, message).max(max, message);
115
+ }
116
+ }
117
+ /**
118
+ * Helper function to create file validators
119
+ * Usage: v.file().min(1024).max(10485760).mime(['image/jpeg', 'image/png'])
120
+ */
121
+ function file() {
122
+ return VldFile.create();
123
+ }
124
+
125
+ export { VldFile, file };
@@ -1,9 +1,10 @@
1
- import { VldBase, ParseResult } from './base';
1
+ import { VldBase, ParseResult } from './base.js';
2
+ type AnyFunction = (...args: any[]) => any;
2
3
  /**
3
4
  * Immutable function validator
4
5
  * Validates that a value is a function
5
6
  */
6
- export declare class VldFunction extends VldBase<unknown, Function> {
7
+ export declare class VldFunction extends VldBase<unknown, AnyFunction> {
7
8
  private constructor();
8
9
  /**
9
10
  * Create a new function validator
@@ -12,15 +13,20 @@ export declare class VldFunction extends VldBase<unknown, Function> {
12
13
  /**
13
14
  * Parse and validate a function value
14
15
  */
15
- parse(value: unknown): Function;
16
+ parse(value: unknown): AnyFunction;
17
+ /**
18
+ * Parse a value that has already passed the function type guard.
19
+ * @internal Used by object validators to avoid duplicate hot-path checks.
20
+ */
21
+ parseKnownFunction(value: AnyFunction): AnyFunction;
16
22
  /**
17
23
  * Safely parse and validate a function value
18
24
  */
19
- safeParse(value: unknown): ParseResult<Function>;
25
+ safeParse(value: unknown): ParseResult<AnyFunction>;
20
26
  }
21
27
  /**
22
28
  * Helper function to create function validators
23
29
  * Usage: v.function()
24
30
  */
25
31
  export declare function functionValidator(): VldFunction;
26
- //# sourceMappingURL=function.d.ts.map
32
+ export {};
@@ -0,0 +1,58 @@
1
+ import { VldBase, VLD_VALIDATOR_TYPES } from './base.js';
2
+ import { getMessages } from '../locales/runtime.js';
3
+ import { V as VldError } from '../chunks/errors-core-BeiFUtZM.js';
4
+
5
+ function createFunctionError(message) {
6
+ return new VldError([{ code: 'invalid_type', path: [], message }]);
7
+ }
8
+ /**
9
+ * Immutable function validator
10
+ * Validates that a value is a function
11
+ */
12
+ class VldFunction extends VldBase {
13
+ constructor() {
14
+ super(VLD_VALIDATOR_TYPES.FUNCTION);
15
+ }
16
+ /**
17
+ * Create a new function validator
18
+ */
19
+ static create() {
20
+ return new VldFunction();
21
+ }
22
+ /**
23
+ * Parse and validate a function value
24
+ */
25
+ parse(value) {
26
+ if (typeof value !== 'function') {
27
+ throw new Error(getMessages().invalidFunction || 'Expected a function');
28
+ }
29
+ return value;
30
+ }
31
+ /**
32
+ * Parse a value that has already passed the function type guard.
33
+ * @internal Used by object validators to avoid duplicate hot-path checks.
34
+ */
35
+ parseKnownFunction(value) {
36
+ return value;
37
+ }
38
+ /**
39
+ * Safely parse and validate a function value
40
+ */
41
+ safeParse(value) {
42
+ try {
43
+ return { success: true, data: this.parse(value) };
44
+ }
45
+ catch (error) {
46
+ return { success: false, error: createFunctionError(error.message) };
47
+ }
48
+ }
49
+ }
50
+ /**
51
+ * Helper function to create function validators
52
+ * Usage: v.function()
53
+ */
54
+ function functionValidator() {
55
+ return VldFunction.create();
56
+ }
57
+
58
+ export { VldFunction, functionValidator };
@@ -1,4 +1,4 @@
1
- import { VldBase, ParseResult } from './base';
1
+ import { VldBase, ParseResult } from './base.js';
2
2
  /**
3
3
  * Hexadecimal string validator
4
4
  */
@@ -14,4 +14,3 @@ export declare class VldHex extends VldBase<string, string> {
14
14
  lowercaseMode(): VldHex;
15
15
  static create(lowercase?: boolean): VldHex;
16
16
  }
17
- //# sourceMappingURL=hex.d.ts.map
@@ -0,0 +1,65 @@
1
+ import { VldBase, VLD_VALIDATOR_TYPES } from './base.js';
2
+ import { createIssue } from '../errors.js';
3
+ import { getMessages } from '../locales/runtime.js';
4
+ import { V as VldError } from '../chunks/errors-core-BeiFUtZM.js';
5
+
6
+ /**
7
+ * Hexadecimal string validator
8
+ */
9
+ class VldHex extends VldBase {
10
+ constructor(lowercase = false) {
11
+ super(VLD_VALIDATOR_TYPES.HEX);
12
+ this.lowercase = lowercase;
13
+ }
14
+ parse(value) {
15
+ const result = this.safeParse(value);
16
+ if (!result.success) {
17
+ throw result.error;
18
+ }
19
+ return result.data;
20
+ }
21
+ safeParse(value) {
22
+ if (typeof value !== 'string') {
23
+ return {
24
+ success: false,
25
+ error: new VldError([
26
+ createIssue('invalid_type', [], getMessages().expectedString)
27
+ ])
28
+ };
29
+ }
30
+ // Check if it's a valid hex string
31
+ if (!VldHex.HEX_REGEX.test(value)) {
32
+ return {
33
+ success: false,
34
+ error: new VldError([
35
+ createIssue('custom', [], getMessages().invalidHex)
36
+ ])
37
+ };
38
+ }
39
+ // Check if even length (full bytes)
40
+ if (value.length % 2 !== 0) {
41
+ return {
42
+ success: false,
43
+ error: new VldError([
44
+ createIssue('custom', [], getMessages().invalidHex)
45
+ ])
46
+ };
47
+ }
48
+ // Normalize case if required
49
+ const normalizedValue = this.lowercase ? value.toLowerCase() : value;
50
+ return { success: true, data: normalizedValue };
51
+ }
52
+ /**
53
+ * Require lowercase hex characters
54
+ */
55
+ lowercaseMode() {
56
+ return new VldHex(true);
57
+ }
58
+ static create(lowercase = false) {
59
+ return new VldHex(lowercase);
60
+ }
61
+ }
62
+ // BUG-008 FIX: Use * instead of + to allow empty hex strings (consistent with base64 validator)
63
+ VldHex.HEX_REGEX = /^[0-9a-fA-F]*$/;
64
+
65
+ export { VldHex };