@warlock.js/seal 5.29.0 → 5.30.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 (430) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +2 -0
  3. package/cjs/index.cjs +37 -30
  4. package/cjs/index.cjs.map +1 -1
  5. package/cjs/{object-DubGC-xu.cjs → object--LXRt5RF.cjs} +10 -8
  6. package/cjs/object--LXRt5RF.cjs.map +1 -0
  7. package/cjs/object.cjs +2 -2
  8. package/cjs/{required-methods-BOVNRtci.cjs → required-methods-DYsRO9aZ.cjs} +97 -68
  9. package/cjs/required-methods-DYsRO9aZ.cjs.map +1 -0
  10. package/cjs/{string-DpDpgefH.cjs → string-DsqnKoSB.cjs} +6 -6
  11. package/cjs/string-DsqnKoSB.cjs.map +1 -0
  12. package/cjs/string.cjs +2 -2
  13. package/esm/config.d.mts +2 -1
  14. package/esm/config.d.mts.map +1 -1
  15. package/esm/config.mjs +1 -1
  16. package/esm/config.mjs.map +1 -1
  17. package/esm/factory/validate.d.mts +9 -6
  18. package/esm/factory/validate.d.mts.map +1 -1
  19. package/esm/factory/validate.mjs +12 -4
  20. package/esm/factory/validate.mjs.map +1 -1
  21. package/esm/factory/validators.d.mts +5 -5
  22. package/esm/factory/validators.d.mts.map +1 -1
  23. package/esm/factory/validators.mjs +1 -1
  24. package/esm/factory/validators.mjs.map +1 -1
  25. package/esm/helpers/date-helpers.d.mts +1 -1
  26. package/esm/helpers/date-helpers.d.mts.map +1 -1
  27. package/esm/helpers/date-helpers.mjs +1 -1
  28. package/esm/helpers/date-helpers.mjs.map +1 -1
  29. package/esm/helpers/file.utils.d.mts +1 -1
  30. package/esm/helpers/file.utils.d.mts.map +1 -1
  31. package/esm/helpers/file.utils.mjs +1 -1
  32. package/esm/helpers/file.utils.mjs.map +1 -1
  33. package/esm/helpers/get-field-value.d.mts +2 -1
  34. package/esm/helpers/get-field-value.d.mts.map +1 -1
  35. package/esm/helpers/get-field-value.mjs +1 -1
  36. package/esm/helpers/get-field-value.mjs.map +1 -1
  37. package/esm/helpers/is-empty-value.mjs +1 -1
  38. package/esm/helpers/is-empty-value.mjs.map +1 -1
  39. package/esm/helpers/path-helpers.d.mts +1 -1
  40. package/esm/helpers/path-helpers.d.mts.map +1 -1
  41. package/esm/helpers/path-helpers.mjs +1 -1
  42. package/esm/helpers/path-helpers.mjs.map +1 -1
  43. package/esm/helpers/validation-helpers.d.mts +2 -1
  44. package/esm/helpers/validation-helpers.d.mts.map +1 -1
  45. package/esm/helpers/validation-helpers.mjs +1 -1
  46. package/esm/helpers/validation-helpers.mjs.map +1 -1
  47. package/esm/index.d.mts +3 -3
  48. package/esm/mutators/array-mutators.d.mts +2 -1
  49. package/esm/mutators/array-mutators.d.mts.map +1 -1
  50. package/esm/mutators/array-mutators.mjs +1 -1
  51. package/esm/mutators/array-mutators.mjs.map +1 -1
  52. package/esm/mutators/boolean-mutators.d.mts +2 -1
  53. package/esm/mutators/boolean-mutators.d.mts.map +1 -1
  54. package/esm/mutators/boolean-mutators.mjs +1 -1
  55. package/esm/mutators/boolean-mutators.mjs.map +1 -1
  56. package/esm/mutators/date-mutators.d.mts +2 -1
  57. package/esm/mutators/date-mutators.d.mts.map +1 -1
  58. package/esm/mutators/date-mutators.mjs +1 -1
  59. package/esm/mutators/date-mutators.mjs.map +1 -1
  60. package/esm/mutators/number-mutators.d.mts +2 -1
  61. package/esm/mutators/number-mutators.d.mts.map +1 -1
  62. package/esm/mutators/number-mutators.mjs +1 -1
  63. package/esm/mutators/number-mutators.mjs.map +1 -1
  64. package/esm/mutators/object-mutators.d.mts +2 -1
  65. package/esm/mutators/object-mutators.d.mts.map +1 -1
  66. package/esm/mutators/object-mutators.mjs +1 -1
  67. package/esm/mutators/object-mutators.mjs.map +1 -1
  68. package/esm/mutators/scalar-mutators.d.mts +2 -1
  69. package/esm/mutators/scalar-mutators.d.mts.map +1 -1
  70. package/esm/mutators/scalar-mutators.mjs +1 -1
  71. package/esm/mutators/scalar-mutators.mjs.map +1 -1
  72. package/esm/mutators/string-mutators.d.mts +2 -1
  73. package/esm/mutators/string-mutators.d.mts.map +1 -1
  74. package/esm/mutators/string-mutators.mjs +1 -1
  75. package/esm/mutators/string-mutators.mjs.map +1 -1
  76. package/esm/object.d.mts +1 -1
  77. package/esm/object.d.mts.map +1 -1
  78. package/esm/object.mjs +1 -1
  79. package/esm/object.mjs.map +1 -1
  80. package/esm/plugins/plugin-system.d.mts +1 -1
  81. package/esm/plugins/plugin-system.d.mts.map +1 -1
  82. package/esm/plugins/plugin-system.mjs +1 -1
  83. package/esm/plugins/plugin-system.mjs.map +1 -1
  84. package/esm/rules/array/array-rules.d.mts +2 -1
  85. package/esm/rules/array/array-rules.d.mts.map +1 -1
  86. package/esm/rules/array/array-rules.mjs +1 -1
  87. package/esm/rules/array/array-rules.mjs.map +1 -1
  88. package/esm/rules/color/color-rules.d.mts +2 -1
  89. package/esm/rules/color/color-rules.d.mts.map +1 -1
  90. package/esm/rules/color/color-rules.mjs +1 -1
  91. package/esm/rules/color/color-rules.mjs.map +1 -1
  92. package/esm/rules/common/enum.d.mts +2 -1
  93. package/esm/rules/common/enum.d.mts.map +1 -1
  94. package/esm/rules/common/enum.mjs +1 -1
  95. package/esm/rules/common/enum.mjs.map +1 -1
  96. package/esm/rules/common/equals-field-rules.d.mts +2 -1
  97. package/esm/rules/common/equals-field-rules.d.mts.map +1 -1
  98. package/esm/rules/common/equals-field-rules.mjs +1 -1
  99. package/esm/rules/common/equals-field-rules.mjs.map +1 -1
  100. package/esm/rules/common/instanceof.d.mts +2 -1
  101. package/esm/rules/common/instanceof.d.mts.map +1 -1
  102. package/esm/rules/common/instanceof.mjs +1 -1
  103. package/esm/rules/common/instanceof.mjs.map +1 -1
  104. package/esm/rules/common/literal.d.mts +2 -1
  105. package/esm/rules/common/literal.d.mts.map +1 -1
  106. package/esm/rules/common/literal.mjs +1 -1
  107. package/esm/rules/common/literal.mjs.map +1 -1
  108. package/esm/rules/common/type-rules.d.mts +2 -1
  109. package/esm/rules/common/type-rules.d.mts.map +1 -1
  110. package/esm/rules/common/type-rules.mjs +1 -1
  111. package/esm/rules/common/type-rules.mjs.map +1 -1
  112. package/esm/rules/common/unknown-key.d.mts +2 -1
  113. package/esm/rules/common/unknown-key.d.mts.map +1 -1
  114. package/esm/rules/common/unknown-key.mjs +1 -1
  115. package/esm/rules/common/unknown-key.mjs.map +1 -1
  116. package/esm/rules/conditional/forbidden-if-rules.d.mts +2 -1
  117. package/esm/rules/conditional/forbidden-if-rules.d.mts.map +1 -1
  118. package/esm/rules/conditional/forbidden-if-rules.mjs +1 -1
  119. package/esm/rules/conditional/forbidden-if-rules.mjs.map +1 -1
  120. package/esm/rules/conditional/present-if-rules.d.mts +2 -1
  121. package/esm/rules/conditional/present-if-rules.d.mts.map +1 -1
  122. package/esm/rules/conditional/present-if-rules.mjs +1 -1
  123. package/esm/rules/conditional/present-if-rules.mjs.map +1 -1
  124. package/esm/rules/conditional/present-unless-rules.d.mts +2 -1
  125. package/esm/rules/conditional/present-unless-rules.d.mts.map +1 -1
  126. package/esm/rules/conditional/present-unless-rules.mjs +1 -1
  127. package/esm/rules/conditional/present-unless-rules.mjs.map +1 -1
  128. package/esm/rules/conditional/present-with-rules.d.mts +2 -1
  129. package/esm/rules/conditional/present-with-rules.d.mts.map +1 -1
  130. package/esm/rules/conditional/present-with-rules.mjs +1 -1
  131. package/esm/rules/conditional/present-with-rules.mjs.map +1 -1
  132. package/esm/rules/conditional/present-without-rules.d.mts +2 -1
  133. package/esm/rules/conditional/present-without-rules.d.mts.map +1 -1
  134. package/esm/rules/conditional/present-without-rules.mjs +1 -1
  135. package/esm/rules/conditional/present-without-rules.mjs.map +1 -1
  136. package/esm/rules/conditional/required-if-rules.d.mts +2 -1
  137. package/esm/rules/conditional/required-if-rules.d.mts.map +1 -1
  138. package/esm/rules/conditional/required-if-rules.mjs +1 -1
  139. package/esm/rules/conditional/required-if-rules.mjs.map +1 -1
  140. package/esm/rules/conditional/required-unless-rules.d.mts +2 -1
  141. package/esm/rules/conditional/required-unless-rules.d.mts.map +1 -1
  142. package/esm/rules/conditional/required-unless-rules.mjs +1 -1
  143. package/esm/rules/conditional/required-unless-rules.mjs.map +1 -1
  144. package/esm/rules/conditional/required-when-rule.d.mts +2 -1
  145. package/esm/rules/conditional/required-when-rule.d.mts.map +1 -1
  146. package/esm/rules/conditional/required-when-rule.mjs +1 -1
  147. package/esm/rules/conditional/required-when-rule.mjs.map +1 -1
  148. package/esm/rules/conditional/required-with-rules.d.mts +2 -1
  149. package/esm/rules/conditional/required-with-rules.d.mts.map +1 -1
  150. package/esm/rules/conditional/required-with-rules.mjs +1 -1
  151. package/esm/rules/conditional/required-with-rules.mjs.map +1 -1
  152. package/esm/rules/conditional/required-without-rules.d.mts +2 -1
  153. package/esm/rules/conditional/required-without-rules.d.mts.map +1 -1
  154. package/esm/rules/conditional/required-without-rules.mjs +1 -1
  155. package/esm/rules/conditional/required-without-rules.mjs.map +1 -1
  156. package/esm/rules/core/equal.d.mts +2 -1
  157. package/esm/rules/core/equal.d.mts.map +1 -1
  158. package/esm/rules/core/equal.mjs +1 -1
  159. package/esm/rules/core/equal.mjs.map +1 -1
  160. package/esm/rules/core/forbidden.d.mts +2 -1
  161. package/esm/rules/core/forbidden.d.mts.map +1 -1
  162. package/esm/rules/core/forbidden.mjs +1 -1
  163. package/esm/rules/core/forbidden.mjs.map +1 -1
  164. package/esm/rules/core/required.d.mts +2 -1
  165. package/esm/rules/core/required.d.mts.map +1 -1
  166. package/esm/rules/core/required.mjs +1 -1
  167. package/esm/rules/core/required.mjs.map +1 -1
  168. package/esm/rules/core/union.d.mts +1 -1
  169. package/esm/rules/core/union.d.mts.map +1 -1
  170. package/esm/rules/core/union.mjs +3 -1
  171. package/esm/rules/core/union.mjs.map +1 -1
  172. package/esm/rules/core/when.d.mts +2 -1
  173. package/esm/rules/core/when.d.mts.map +1 -1
  174. package/esm/rules/core/when.mjs +1 -1
  175. package/esm/rules/core/when.mjs.map +1 -1
  176. package/esm/rules/date/date-comparison-rules.d.mts +2 -1
  177. package/esm/rules/date/date-comparison-rules.d.mts.map +1 -1
  178. package/esm/rules/date/date-comparison-rules.mjs +1 -1
  179. package/esm/rules/date/date-comparison-rules.mjs.map +1 -1
  180. package/esm/rules/date/date-day-rules.d.mts +2 -1
  181. package/esm/rules/date/date-day-rules.d.mts.map +1 -1
  182. package/esm/rules/date/date-day-rules.mjs +1 -1
  183. package/esm/rules/date/date-day-rules.mjs.map +1 -1
  184. package/esm/rules/date/date-field-comparison-rules.d.mts +2 -1
  185. package/esm/rules/date/date-field-comparison-rules.d.mts.map +1 -1
  186. package/esm/rules/date/date-field-comparison-rules.mjs +1 -1
  187. package/esm/rules/date/date-field-comparison-rules.mjs.map +1 -1
  188. package/esm/rules/date/date-period-rules.d.mts +2 -1
  189. package/esm/rules/date/date-period-rules.d.mts.map +1 -1
  190. package/esm/rules/date/date-period-rules.mjs +1 -1
  191. package/esm/rules/date/date-period-rules.mjs.map +1 -1
  192. package/esm/rules/date/date-relative-rules.d.mts +2 -1
  193. package/esm/rules/date/date-relative-rules.d.mts.map +1 -1
  194. package/esm/rules/date/date-relative-rules.mjs +1 -1
  195. package/esm/rules/date/date-relative-rules.mjs.map +1 -1
  196. package/esm/rules/date/date-special-rules.d.mts +2 -1
  197. package/esm/rules/date/date-special-rules.d.mts.map +1 -1
  198. package/esm/rules/date/date-special-rules.mjs +1 -1
  199. package/esm/rules/date/date-special-rules.mjs.map +1 -1
  200. package/esm/rules/date/date.d.mts +2 -1
  201. package/esm/rules/date/date.d.mts.map +1 -1
  202. package/esm/rules/date/date.mjs +1 -1
  203. package/esm/rules/date/date.mjs.map +1 -1
  204. package/esm/rules/file/dimensions.d.mts +2 -1
  205. package/esm/rules/file/dimensions.d.mts.map +1 -1
  206. package/esm/rules/file/dimensions.mjs +1 -1
  207. package/esm/rules/file/dimensions.mjs.map +1 -1
  208. package/esm/rules/file/file-size.d.mts +2 -1
  209. package/esm/rules/file/file-size.d.mts.map +1 -1
  210. package/esm/rules/file/file-size.mjs +1 -1
  211. package/esm/rules/file/file-size.mjs.map +1 -1
  212. package/esm/rules/length/length-rules.d.mts +2 -1
  213. package/esm/rules/length/length-rules.d.mts.map +1 -1
  214. package/esm/rules/length/length-rules.mjs +1 -1
  215. package/esm/rules/length/length-rules.mjs.map +1 -1
  216. package/esm/rules/number/number-rules.d.mts +2 -1
  217. package/esm/rules/number/number-rules.d.mts.map +1 -1
  218. package/esm/rules/number/number-rules.mjs +1 -1
  219. package/esm/rules/number/number-rules.mjs.map +1 -1
  220. package/esm/rules/scalar/accepted-rule.mjs +1 -1
  221. package/esm/rules/scalar/accepted-rule.mjs.map +1 -1
  222. package/esm/rules/scalar/declined-rule.mjs +1 -1
  223. package/esm/rules/scalar/declined-rule.mjs.map +1 -1
  224. package/esm/rules/string/alpha.d.mts +2 -1
  225. package/esm/rules/string/alpha.d.mts.map +1 -1
  226. package/esm/rules/string/alpha.mjs +1 -1
  227. package/esm/rules/string/alpha.mjs.map +1 -1
  228. package/esm/rules/string/credit-card.d.mts +2 -1
  229. package/esm/rules/string/credit-card.d.mts.map +1 -1
  230. package/esm/rules/string/credit-card.mjs +1 -1
  231. package/esm/rules/string/credit-card.mjs.map +1 -1
  232. package/esm/rules/string/email.d.mts +2 -1
  233. package/esm/rules/string/email.d.mts.map +1 -1
  234. package/esm/rules/string/email.mjs +1 -1
  235. package/esm/rules/string/email.mjs.map +1 -1
  236. package/esm/rules/string/id-formats.d.mts +2 -1
  237. package/esm/rules/string/id-formats.d.mts.map +1 -1
  238. package/esm/rules/string/id-formats.mjs +1 -1
  239. package/esm/rules/string/id-formats.mjs.map +1 -1
  240. package/esm/rules/string/ip.d.mts +2 -1
  241. package/esm/rules/string/ip.d.mts.map +1 -1
  242. package/esm/rules/string/ip.mjs +1 -1
  243. package/esm/rules/string/ip.mjs.map +1 -1
  244. package/esm/rules/string/matches.d.mts +2 -1
  245. package/esm/rules/string/matches.d.mts.map +1 -1
  246. package/esm/rules/string/matches.mjs +1 -1
  247. package/esm/rules/string/matches.mjs.map +1 -1
  248. package/esm/rules/string/pattern.d.mts +2 -1
  249. package/esm/rules/string/pattern.d.mts.map +1 -1
  250. package/esm/rules/string/pattern.mjs +1 -1
  251. package/esm/rules/string/pattern.mjs.map +1 -1
  252. package/esm/rules/string/string-comparison.d.mts +2 -1
  253. package/esm/rules/string/string-comparison.d.mts.map +1 -1
  254. package/esm/rules/string/string-comparison.mjs +1 -1
  255. package/esm/rules/string/string-comparison.mjs.map +1 -1
  256. package/esm/rules/string/strong-password-rule.d.mts +2 -1
  257. package/esm/rules/string/strong-password-rule.d.mts.map +1 -1
  258. package/esm/rules/string/strong-password-rule.mjs +1 -1
  259. package/esm/rules/string/strong-password-rule.mjs.map +1 -1
  260. package/esm/rules/string/url.d.mts +2 -1
  261. package/esm/rules/string/url.d.mts.map +1 -1
  262. package/esm/rules/string/url.mjs +1 -1
  263. package/esm/rules/string/url.mjs.map +1 -1
  264. package/esm/rules/string/without-whitespace.d.mts +2 -1
  265. package/esm/rules/string/without-whitespace.d.mts.map +1 -1
  266. package/esm/rules/string/without-whitespace.mjs +1 -1
  267. package/esm/rules/string/without-whitespace.mjs.map +1 -1
  268. package/esm/standard-schema/json-schema.d.mts +1 -1
  269. package/esm/standard-schema/json-schema.d.mts.map +1 -1
  270. package/esm/standard-schema/json-schema.mjs +1 -1
  271. package/esm/standard-schema/json-schema.mjs.map +1 -1
  272. package/esm/standard-schema/map-result.d.mts +2 -1
  273. package/esm/standard-schema/map-result.d.mts.map +1 -1
  274. package/esm/standard-schema/map-result.mjs +1 -1
  275. package/esm/standard-schema/map-result.mjs.map +1 -1
  276. package/esm/standard-schema/types.d.mts +1 -1
  277. package/esm/standard-schema/types.d.mts.map +1 -1
  278. package/esm/string.d.mts +1 -1
  279. package/esm/string.d.mts.map +1 -1
  280. package/esm/string.mjs +1 -1
  281. package/esm/string.mjs.map +1 -1
  282. package/esm/types/conditional-types.d.mts +1 -1
  283. package/esm/types/conditional-types.d.mts.map +1 -1
  284. package/esm/types/context-types.d.mts +8 -2
  285. package/esm/types/context-types.d.mts.map +1 -1
  286. package/esm/types/data-transformer-types.d.mts +1 -1
  287. package/esm/types/data-transformer-types.d.mts.map +1 -1
  288. package/esm/types/date-types.d.mts +1 -1
  289. package/esm/types/date-types.d.mts.map +1 -1
  290. package/esm/types/date-types.mjs +1 -1
  291. package/esm/types/date-types.mjs.map +1 -1
  292. package/esm/types/file.types.d.mts +1 -1
  293. package/esm/types/file.types.d.mts.map +1 -1
  294. package/esm/types/inference-types.d.mts +21 -4
  295. package/esm/types/inference-types.d.mts.map +1 -1
  296. package/esm/types/mutator-types.d.mts +1 -1
  297. package/esm/types/mutator-types.d.mts.map +1 -1
  298. package/esm/types/result-types.d.mts +26 -2
  299. package/esm/types/result-types.d.mts.map +1 -1
  300. package/esm/types/rule-types.d.mts +1 -1
  301. package/esm/types/rule-types.d.mts.map +1 -1
  302. package/esm/types/schema-types.d.mts +1 -1
  303. package/esm/types/schema-types.d.mts.map +1 -1
  304. package/esm/validators/any-validator.d.mts +1 -1
  305. package/esm/validators/any-validator.d.mts.map +1 -1
  306. package/esm/validators/any-validator.mjs +1 -1
  307. package/esm/validators/any-validator.mjs.map +1 -1
  308. package/esm/validators/array-validator.d.mts +1 -1
  309. package/esm/validators/array-validator.d.mts.map +1 -1
  310. package/esm/validators/array-validator.mjs +1 -1
  311. package/esm/validators/array-validator.mjs.map +1 -1
  312. package/esm/validators/base-validator.d.mts +8 -1
  313. package/esm/validators/base-validator.d.mts.map +1 -1
  314. package/esm/validators/base-validator.mjs +23 -4
  315. package/esm/validators/base-validator.mjs.map +1 -1
  316. package/esm/validators/boolean-validator.d.mts +1 -1
  317. package/esm/validators/boolean-validator.d.mts.map +1 -1
  318. package/esm/validators/boolean-validator.mjs +1 -1
  319. package/esm/validators/boolean-validator.mjs.map +1 -1
  320. package/esm/validators/computed-validator.d.mts +1 -1
  321. package/esm/validators/computed-validator.d.mts.map +1 -1
  322. package/esm/validators/computed-validator.mjs +1 -1
  323. package/esm/validators/computed-validator.mjs.map +1 -1
  324. package/esm/validators/date-validator.d.mts +2 -1
  325. package/esm/validators/date-validator.d.mts.map +1 -1
  326. package/esm/validators/date-validator.mjs +1 -1
  327. package/esm/validators/date-validator.mjs.map +1 -1
  328. package/esm/validators/discriminated-union-validator.d.mts +8 -2
  329. package/esm/validators/discriminated-union-validator.d.mts.map +1 -1
  330. package/esm/validators/discriminated-union-validator.mjs +6 -1
  331. package/esm/validators/discriminated-union-validator.mjs.map +1 -1
  332. package/esm/validators/float-validator.d.mts +1 -1
  333. package/esm/validators/float-validator.d.mts.map +1 -1
  334. package/esm/validators/float-validator.mjs +1 -1
  335. package/esm/validators/float-validator.mjs.map +1 -1
  336. package/esm/validators/instanceof-validator.d.mts +1 -1
  337. package/esm/validators/instanceof-validator.d.mts.map +1 -1
  338. package/esm/validators/instanceof-validator.mjs +1 -1
  339. package/esm/validators/instanceof-validator.mjs.map +1 -1
  340. package/esm/validators/int-validator.d.mts +1 -1
  341. package/esm/validators/int-validator.d.mts.map +1 -1
  342. package/esm/validators/int-validator.mjs +1 -1
  343. package/esm/validators/int-validator.mjs.map +1 -1
  344. package/esm/validators/lazy-validator.d.mts +1 -1
  345. package/esm/validators/lazy-validator.d.mts.map +1 -1
  346. package/esm/validators/lazy-validator.mjs +1 -1
  347. package/esm/validators/lazy-validator.mjs.map +1 -1
  348. package/esm/validators/literal-validator.d.mts +1 -1
  349. package/esm/validators/literal-validator.d.mts.map +1 -1
  350. package/esm/validators/literal-validator.mjs +5 -2
  351. package/esm/validators/literal-validator.mjs.map +1 -1
  352. package/esm/validators/managed-validator.d.mts +1 -1
  353. package/esm/validators/managed-validator.d.mts.map +1 -1
  354. package/esm/validators/managed-validator.mjs +1 -1
  355. package/esm/validators/managed-validator.mjs.map +1 -1
  356. package/esm/validators/methods/equality-conditional-methods.d.mts +2 -1
  357. package/esm/validators/methods/equality-conditional-methods.d.mts.map +1 -1
  358. package/esm/validators/methods/equality-conditional-methods.mjs +1 -1
  359. package/esm/validators/methods/equality-conditional-methods.mjs.map +1 -1
  360. package/esm/validators/methods/forbidden-methods.d.mts +1 -1
  361. package/esm/validators/methods/forbidden-methods.d.mts.map +1 -1
  362. package/esm/validators/methods/forbidden-methods.mjs +1 -1
  363. package/esm/validators/methods/forbidden-methods.mjs.map +1 -1
  364. package/esm/validators/methods/present-methods.d.mts +1 -1
  365. package/esm/validators/methods/present-methods.d.mts.map +1 -1
  366. package/esm/validators/methods/present-methods.mjs +1 -1
  367. package/esm/validators/methods/present-methods.mjs.map +1 -1
  368. package/esm/validators/methods/required-methods.d.mts +2 -1
  369. package/esm/validators/methods/required-methods.d.mts.map +1 -1
  370. package/esm/validators/methods/required-methods.mjs +1 -1
  371. package/esm/validators/methods/required-methods.mjs.map +1 -1
  372. package/esm/validators/number-validator.d.mts +1 -1
  373. package/esm/validators/number-validator.d.mts.map +1 -1
  374. package/esm/validators/number-validator.mjs +1 -1
  375. package/esm/validators/number-validator.mjs.map +1 -1
  376. package/esm/validators/numeric-validator.d.mts +1 -1
  377. package/esm/validators/numeric-validator.d.mts.map +1 -1
  378. package/esm/validators/numeric-validator.mjs +1 -1
  379. package/esm/validators/numeric-validator.mjs.map +1 -1
  380. package/esm/validators/object-validator.d.mts +1 -1
  381. package/esm/validators/object-validator.d.mts.map +1 -1
  382. package/esm/validators/object-validator.mjs +5 -3
  383. package/esm/validators/object-validator.mjs.map +1 -1
  384. package/esm/validators/primitive-validator.d.mts +1 -1
  385. package/esm/validators/primitive-validator.d.mts.map +1 -1
  386. package/esm/validators/primitive-validator.mjs +1 -1
  387. package/esm/validators/primitive-validator.mjs.map +1 -1
  388. package/esm/validators/record-validator.d.mts +1 -1
  389. package/esm/validators/record-validator.d.mts.map +1 -1
  390. package/esm/validators/record-validator.mjs +1 -1
  391. package/esm/validators/record-validator.mjs.map +1 -1
  392. package/esm/validators/scalar-validator.d.mts +1 -1
  393. package/esm/validators/scalar-validator.d.mts.map +1 -1
  394. package/esm/validators/scalar-validator.mjs +1 -1
  395. package/esm/validators/scalar-validator.mjs.map +1 -1
  396. package/esm/validators/string-validator.d.mts +1 -1
  397. package/esm/validators/string-validator.d.mts.map +1 -1
  398. package/esm/validators/string-validator.mjs +1 -1
  399. package/esm/validators/string-validator.mjs.map +1 -1
  400. package/esm/validators/tuple-validator.d.mts +1 -1
  401. package/esm/validators/tuple-validator.d.mts.map +1 -1
  402. package/esm/validators/tuple-validator.mjs +1 -1
  403. package/esm/validators/tuple-validator.mjs.map +1 -1
  404. package/esm/validators/union-validator.d.mts +1 -1
  405. package/esm/validators/union-validator.d.mts.map +1 -1
  406. package/esm/validators/union-validator.mjs +1 -1
  407. package/esm/validators/union-validator.mjs.map +1 -1
  408. package/llms-full.txt +9 -7
  409. package/package.json +3 -2
  410. package/skills/handle-seal-errors/SKILL.md +4 -6
  411. package/skills/pick-seal-primitive/SKILL.md +4 -0
  412. package/skills/seal-basics/SKILL.md +1 -1
  413. package/cjs/object-DubGC-xu.cjs.map +0 -1
  414. package/cjs/required-methods-BOVNRtci.cjs.map +0 -1
  415. package/cjs/string-DpDpgefH.cjs.map +0 -1
  416. package/esm/helpers/index.d.mts +0 -5
  417. package/esm/mutators/index.d.mts +0 -7
  418. package/esm/rules/array/index.d.mts +0 -1
  419. package/esm/rules/color/index.d.mts +0 -1
  420. package/esm/rules/common/index.d.mts +0 -6
  421. package/esm/rules/conditional/index.d.mts +0 -10
  422. package/esm/rules/core/index.d.mts +0 -5
  423. package/esm/rules/date/index.d.mts +0 -7
  424. package/esm/rules/file/index.d.mts +0 -2
  425. package/esm/rules/index.d.mts +0 -45
  426. package/esm/rules/length/index.d.mts +0 -1
  427. package/esm/rules/number/index.d.mts +0 -1
  428. package/esm/rules/string/index.d.mts +0 -11
  429. package/esm/standard-schema/index.d.mts +0 -3
  430. package/esm/types/index.d.mts +0 -10
@@ -1 +1 @@
1
- {"version":3,"file":"primitive-validator.d.mts","names":[],"sources":["../../../../../../../seal/src/validators/primitive-validator.ts"],"mappings":";;;;;AAyBA;;;;;;;;;;;;;;;;;;;;uBAAsB,kBAAA,SAA2B,aAAa;EA2D/C;;;AAAoC;;;EApD1C,IAAA,CAAK,MAAA,OAAa,YAAA;;;;;;;;EAWlB,EAAA,CAAG,MAAA,SAAe,YAAA;;;;;;;EAUlB,KAAA,CAAM,MAAA,SAAe,YAAA;;;;;;;EAUrB,UAAA,CAAW,MAAA,SAAe,YAAA;;;;;;;;EAW1B,OAAA,CAAQ,MAAA,SAAe,YAAA;;;;;;;EAUvB,KAAA,CAAM,MAAA,SAAe,YAAA;AAAA"}
1
+ {"version":3,"file":"primitive-validator.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/validators/primitive-validator.ts"],"mappings":";;;;;AAyBA;;;;;;;;;;;;;;;;;;;;uBAAsB,kBAAA,SAA2B,aAAa;EA2D/C;;;AAAoC;;;EApD1C,IAAA,CAAK,MAAA,OAAa,YAAA;;;;;;;;EAWlB,EAAA,CAAG,MAAA,SAAe,YAAA;;;;;;;EAUlB,KAAA,CAAM,MAAA,SAAe,YAAA;;;;;;;EAUrB,UAAA,CAAW,MAAA,SAAe,YAAA;;;;;;;;EAW1B,OAAA,CAAQ,MAAA,SAAe,YAAA;;;;;;;EAUvB,KAAA,CAAM,MAAA,SAAe,YAAA;AAAA"}
@@ -1,7 +1,7 @@
1
1
  import { BaseValidator } from "./base-validator.mjs";
2
2
  import { allowedValuesRule, enumRule, inRule, notAllowedValuesRule } from "../rules/common/enum.mjs";
3
3
 
4
- //#region ../seal/src/validators/primitive-validator.ts
4
+ //#region ../../packages/seal/src/validators/primitive-validator.ts
5
5
  /**
6
6
  * Abstract base validator for primitive-typed fields (string, number, boolean).
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"primitive-validator.mjs","names":[],"sources":["../../../../../../../seal/src/validators/primitive-validator.ts"],"sourcesContent":["import { allowedValuesRule, enumRule, inRule, notAllowedValuesRule } from \"../rules/common/enum\";\nimport { BaseValidator } from \"./base-validator\";\n\n/**\n * Abstract base validator for primitive-typed fields (string, number, boolean).\n *\n * Provides value-membership rules that are meaningful for any single primitive value\n * but not for complex structures (object, array).\n *\n * Do NOT expose this on the `v` factory — it is an inheritance-only base class.\n *\n * Hierarchy:\n * BaseValidator\n * └── PrimitiveValidator ← enum, in, oneOf, allowsOnly, forbids, notIn\n * ├── StringValidator\n * ├── NumberValidator\n * │ └── FloatValidator\n * ├── BooleanValidator\n * └── ScalarValidator (extends PrimitiveValidator, adds asNumber/asString/accepted/declined)\n *\n * @example\n * class MyValidator extends PrimitiveValidator {\n * // inherits: in(), forbids(), enum(), oneOf(), allowsOnly(), notIn()\n * }\n */\nexport abstract class PrimitiveValidator extends BaseValidator {\n /**\n * Value must be one of the enum's values\n *\n * @example\n * v.string().enum(Direction) // Direction is a TS enum\n */\n public enum(values: any, errorMessage?: string) {\n return this.addRule(enumRule, errorMessage, { enum: Object.values(values) });\n }\n\n /**\n * Value must be one of the given values\n *\n * @example\n * v.string().in([\"admin\", \"user\", \"guest\"])\n * v.number().in([1, 2, 3])\n */\n public in(values: any[], errorMessage?: string) {\n return this.addRule(inRule, errorMessage, { values });\n }\n\n /**\n * Alias for `in()`\n *\n * @example\n * v.string().oneOf([\"active\", \"inactive\"])\n */\n public oneOf(values: any[], errorMessage?: string) {\n return this.in(values, errorMessage);\n }\n\n /**\n * Value must be one of the allowed values (stricter variant)\n *\n * @example\n * v.string().allowsOnly([\"yes\", \"no\"])\n */\n public allowsOnly(values: any[], errorMessage?: string) {\n return this.addRule(allowedValuesRule, errorMessage, { allowedValues: values });\n }\n\n /**\n * Value must NOT be one of the given values\n *\n * @example\n * v.string().forbids([\"banned\", \"blacklisted\"])\n * v.number().forbids([0, -1])\n */\n public forbids(values: any[], errorMessage?: string) {\n return this.addRule(notAllowedValuesRule, errorMessage, { notAllowedValues: values });\n }\n\n /**\n * Alias for `forbids()`\n *\n * @example\n * v.string().notIn([\"OK\", \"NOT OK\"])\n */\n public notIn(values: any[], errorMessage?: string) {\n return this.forbids(values, errorMessage);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,IAAsB,qBAAtB,cAAiD,cAAc;;;;;;;CAO7D,AAAO,KAAK,QAAa,cAAuB;EAC9C,OAAO,KAAK,QAAQ,UAAU,cAAc,EAAE,MAAM,OAAO,OAAO,MAAM,EAAE,CAAC;CAC7E;;;;;;;;CASA,AAAO,GAAG,QAAe,cAAuB;EAC9C,OAAO,KAAK,QAAQ,QAAQ,cAAc,EAAE,OAAO,CAAC;CACtD;;;;;;;CAQA,AAAO,MAAM,QAAe,cAAuB;EACjD,OAAO,KAAK,GAAG,QAAQ,YAAY;CACrC;;;;;;;CAQA,AAAO,WAAW,QAAe,cAAuB;EACtD,OAAO,KAAK,QAAQ,mBAAmB,cAAc,EAAE,eAAe,OAAO,CAAC;CAChF;;;;;;;;CASA,AAAO,QAAQ,QAAe,cAAuB;EACnD,OAAO,KAAK,QAAQ,sBAAsB,cAAc,EAAE,kBAAkB,OAAO,CAAC;CACtF;;;;;;;CAQA,AAAO,MAAM,QAAe,cAAuB;EACjD,OAAO,KAAK,QAAQ,QAAQ,YAAY;CAC1C;AACF"}
1
+ {"version":3,"file":"primitive-validator.mjs","names":[],"sources":["../../../../../../../../packages/seal/src/validators/primitive-validator.ts"],"sourcesContent":["import { allowedValuesRule, enumRule, inRule, notAllowedValuesRule } from \"../rules/common/enum\";\nimport { BaseValidator } from \"./base-validator\";\n\n/**\n * Abstract base validator for primitive-typed fields (string, number, boolean).\n *\n * Provides value-membership rules that are meaningful for any single primitive value\n * but not for complex structures (object, array).\n *\n * Do NOT expose this on the `v` factory — it is an inheritance-only base class.\n *\n * Hierarchy:\n * BaseValidator\n * └── PrimitiveValidator ← enum, in, oneOf, allowsOnly, forbids, notIn\n * ├── StringValidator\n * ├── NumberValidator\n * │ └── FloatValidator\n * ├── BooleanValidator\n * └── ScalarValidator (extends PrimitiveValidator, adds asNumber/asString/accepted/declined)\n *\n * @example\n * class MyValidator extends PrimitiveValidator {\n * // inherits: in(), forbids(), enum(), oneOf(), allowsOnly(), notIn()\n * }\n */\nexport abstract class PrimitiveValidator extends BaseValidator {\n /**\n * Value must be one of the enum's values\n *\n * @example\n * v.string().enum(Direction) // Direction is a TS enum\n */\n public enum(values: any, errorMessage?: string) {\n return this.addRule(enumRule, errorMessage, { enum: Object.values(values) });\n }\n\n /**\n * Value must be one of the given values\n *\n * @example\n * v.string().in([\"admin\", \"user\", \"guest\"])\n * v.number().in([1, 2, 3])\n */\n public in(values: any[], errorMessage?: string) {\n return this.addRule(inRule, errorMessage, { values });\n }\n\n /**\n * Alias for `in()`\n *\n * @example\n * v.string().oneOf([\"active\", \"inactive\"])\n */\n public oneOf(values: any[], errorMessage?: string) {\n return this.in(values, errorMessage);\n }\n\n /**\n * Value must be one of the allowed values (stricter variant)\n *\n * @example\n * v.string().allowsOnly([\"yes\", \"no\"])\n */\n public allowsOnly(values: any[], errorMessage?: string) {\n return this.addRule(allowedValuesRule, errorMessage, { allowedValues: values });\n }\n\n /**\n * Value must NOT be one of the given values\n *\n * @example\n * v.string().forbids([\"banned\", \"blacklisted\"])\n * v.number().forbids([0, -1])\n */\n public forbids(values: any[], errorMessage?: string) {\n return this.addRule(notAllowedValuesRule, errorMessage, { notAllowedValues: values });\n }\n\n /**\n * Alias for `forbids()`\n *\n * @example\n * v.string().notIn([\"OK\", \"NOT OK\"])\n */\n public notIn(values: any[], errorMessage?: string) {\n return this.forbids(values, errorMessage);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,IAAsB,qBAAtB,cAAiD,cAAc;;;;;;;CAO7D,AAAO,KAAK,QAAa,cAAuB;EAC9C,OAAO,KAAK,QAAQ,UAAU,cAAc,EAAE,MAAM,OAAO,OAAO,MAAM,EAAE,CAAC;CAC7E;;;;;;;;CASA,AAAO,GAAG,QAAe,cAAuB;EAC9C,OAAO,KAAK,QAAQ,QAAQ,cAAc,EAAE,OAAO,CAAC;CACtD;;;;;;;CAQA,AAAO,MAAM,QAAe,cAAuB;EACjD,OAAO,KAAK,GAAG,QAAQ,YAAY;CACrC;;;;;;;CAQA,AAAO,WAAW,QAAe,cAAuB;EACtD,OAAO,KAAK,QAAQ,mBAAmB,cAAc,EAAE,eAAe,OAAO,CAAC;CAChF;;;;;;;;CASA,AAAO,QAAQ,QAAe,cAAuB;EACnD,OAAO,KAAK,QAAQ,sBAAsB,cAAc,EAAE,kBAAkB,OAAO,CAAC;CACtF;;;;;;;CAQA,AAAO,MAAM,QAAe,cAAuB;EACjD,OAAO,KAAK,QAAQ,QAAQ,YAAY;CAC1C;AACF"}
@@ -3,7 +3,7 @@ import { SchemaContext } from "../types/context-types.mjs";
3
3
  import { ValidationResult } from "../types/result-types.mjs";
4
4
  import { BaseValidator } from "./base-validator.mjs";
5
5
 
6
- //#region ../seal/src/validators/record-validator.d.ts
6
+ //#region ../../packages/seal/src/validators/record-validator.d.ts
7
7
  /**
8
8
  * Record validator class - validates objects with dynamic keys and consistent value types
9
9
  *
@@ -1 +1 @@
1
- {"version":3,"file":"record-validator.d.mts","names":[],"sources":["../../../../../../../seal/src/validators/record-validator.ts"],"mappings":";;;;;;;;;;AAsBA;;;;;;;;;;cAAa,eAAA,SAAwB,aAAA;EAE1B,cAAA,EAAgB,aAAA;cAAhB,cAAA,EAAgB,aAAA,EACvB,YAAA;EAHiC;;;EAY5B,WAAA,CAAY,YAAA;EAVM;;;EAiBlB,WAAA,CAAY,KAAA;EAPA;;;EAcH,KAAA;EAaH;;;;;;;EAAA,QAAA,CAAS,IAAA,OAAW,OAAA,EAAS,aAAA,GAAgB,OAAA,CAAQ,gBAAA;EAkErC;;;AAA6D;;;;;;;;;;;;EAA1E,YAAA,CAAa,MAAA,GAAQ,gBAAA,GAAqC,gBAAA;AAAA"}
1
+ {"version":3,"file":"record-validator.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/validators/record-validator.ts"],"mappings":";;;;;;;;;AAsBA;;;;;;;;;;;cAAa,eAAA,SAAwB,aAAA;EAE1B,cAAA,EAAgB,aAAA;cAAhB,cAAA,EAAgB,aAAA,EACvB,YAAA;EADO;;;EAUF,WAAA,CAAY,YAAA;EAVV;;;EAiBF,WAAA,CAAY,KAAA;EAAZ;;;EAOS,KAAA;EAaM;;;;;;;EAAT,QAAA,CAAS,IAAA,OAAW,OAAA,EAAS,aAAA,GAAgB,OAAA,CAAQ,gBAAA;EAkEQ;;AAAgB;;;;;;;;;;;;;EAA1E,YAAA,CAAa,MAAA,GAAQ,gBAAA,GAAqC,gBAAA;AAAA"}
@@ -6,7 +6,7 @@ import { objectRule, plainObjectRule } from "../rules/common/type-rules.mjs";
6
6
  import "../rules/index.mjs";
7
7
  import { isPlainObject } from "@mongez/supportive-is";
8
8
 
9
- //#region ../seal/src/validators/record-validator.ts
9
+ //#region ../../packages/seal/src/validators/record-validator.ts
10
10
  /**
11
11
  * Record validator class - validates objects with dynamic keys and consistent value types
12
12
  *
@@ -1 +1 @@
1
- {"version":3,"file":"record-validator.mjs","names":[],"sources":["../../../../../../../seal/src/validators/record-validator.ts"],"sourcesContent":["import { isPlainObject } from \"@mongez/supportive-is\";\nimport { setKeyPath } from \"../helpers\";\nimport { objectRule, plainObjectRule } from \"../rules\";\nimport type { SchemaContext, ValidationResult } from \"../types\";\nimport { BaseValidator } from \"./base-validator\";\nimport { applyNullable } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * Record validator class - validates objects with dynamic keys and consistent value types\n *\n * @example\n * ```ts\n * // Translations object\n * v.record(v.string())\n * // Valid: { en: \"Hello\", ar: \"مرحبا\", fr: \"Bonjour\" }\n *\n * // User preferences\n * v.record(v.union([v.string(), v.number(), v.boolean()]))\n * // Valid: { theme: \"dark\", fontSize: 16, notifications: true }\n * ```\n */\nexport class RecordValidator extends BaseValidator {\n public constructor(\n public valueValidator: BaseValidator,\n errorMessage?: string,\n ) {\n super();\n this.addMutableRule(objectRule, errorMessage);\n }\n\n /**\n * Validate it as plain object\n */\n public plainObject(errorMessage?: string) {\n return this.addRule(plainObjectRule, errorMessage);\n }\n\n /**\n * Check if value is a plain object type\n */\n public matchesType(value: any): boolean {\n return isPlainObject(value);\n }\n\n /**\n * Clone the validator\n */\n public override clone(): this {\n const cloned = super.clone();\n cloned.valueValidator = this.valueValidator.clone();\n return cloned;\n }\n\n /**\n * Validate record - iterate all keys and validate each value\n *\n * Absent input (and absent without `.default()`) propagates as `data: undefined`\n * so the parent ObjectValidator can omit the key. Without this, optional record\n * fields would silently materialise as `{}` in the validated output.\n */\n public async validate(data: any, context: SchemaContext): Promise<ValidationResult> {\n // Apply default when absent, then mutate. Mirrors BaseValidator's\n // `valueForRules = data ?? this.getDefaultValue()` so `.default({...})`\n // works on records too.\n const valueForRules = data ?? this.getDefaultValue();\n const mutatedData = await this.mutate(valueForRules, context);\n\n const result = await super.validate(data, context);\n\n if (result.isValid === false) return result;\n\n // Nothing to iterate for absent (no default) or null (nullable) inputs —\n // propagate so the parent ObjectValidator can omit the key.\n if (mutatedData === undefined || mutatedData === null) return result;\n\n // Defensive: type rule (objectRule) should have failed for non-objects.\n if (!isPlainObject(mutatedData)) return result;\n\n const errors: ValidationResult[\"errors\"] = [];\n const keys = Object.keys(mutatedData);\n\n // Validate all values in parallel\n const validationPromises = keys.map(async (key) => {\n const childContext: SchemaContext = {\n ...context,\n parent: mutatedData,\n value: mutatedData[key],\n key,\n path: setKeyPath(context.path, key),\n };\n\n const childResult = await this.valueValidator.validate(mutatedData[key], childContext);\n\n // Update mutated data with validated result\n mutatedData[key] = childResult.data;\n\n // Collect errors from this value\n if (childResult.isValid === false) {\n errors.push(...childResult.errors);\n }\n });\n\n await Promise.all(validationPromises);\n\n return {\n isValid: errors.length === 0,\n errors,\n data: await this.startTransformationPipeline(mutatedData, context),\n };\n }\n\n /**\n * @inheritdoc\n *\n * Generates `{ type: \"object\", additionalProperties: <valueSchema> }` —\n * the standard JSON Schema for a dictionary/map with homogeneous values.\n *\n * @example\n * ```ts\n * v.record(v.string()).toJsonSchema(\"draft-2020-12\")\n * // → { type: \"object\", additionalProperties: { type: \"string\" } }\n *\n * v.record(v.union([v.string(), v.number()])).toJsonSchema(\"draft-2020-12\")\n * // → { type: \"object\", additionalProperties: { oneOf: [{ type: \"string\" }, { type: \"number\" }] } }\n * ```\n */\n public override toJsonSchema(target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n const schema: JsonSchemaResult = {\n type: \"object\",\n additionalProperties: this.valueValidator.toJsonSchema(target),\n };\n\n if (this.isNullable) applyNullable(schema, target);\n\n return schema;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAsBA,IAAa,kBAAb,cAAqC,cAAc;CACjD,AAAO,YACL,AAAO,gBACP,cACA;EACA,MAAM;EAHC;EAIP,KAAK,eAAe,YAAY,YAAY;CAC9C;;;;CAKA,AAAO,YAAY,cAAuB;EACxC,OAAO,KAAK,QAAQ,iBAAiB,YAAY;CACnD;;;;CAKA,AAAO,YAAY,OAAqB;EACtC,OAAO,cAAc,KAAK;CAC5B;;;;CAKA,AAAgB,QAAc;EAC5B,MAAM,SAAS,MAAM,MAAM;EAC3B,OAAO,iBAAiB,KAAK,eAAe,MAAM;EAClD,OAAO;CACT;;;;;;;;CASA,MAAa,SAAS,MAAW,SAAmD;EAIlF,MAAM,gBAAgB,QAAQ,KAAK,gBAAgB;EACnD,MAAM,cAAc,MAAM,KAAK,OAAO,eAAe,OAAO;EAE5D,MAAM,SAAS,MAAM,MAAM,SAAS,MAAM,OAAO;EAEjD,IAAI,OAAO,YAAY,OAAO,OAAO;EAIrC,IAAI,gBAAgB,UAAa,gBAAgB,MAAM,OAAO;EAG9D,IAAI,CAAC,cAAc,WAAW,GAAG,OAAO;EAExC,MAAM,SAAqC,CAAC;EAI5C,MAAM,qBAHO,OAAO,KAAK,WAGK,CAAC,CAAC,IAAI,OAAO,QAAQ;GACjD,MAAM,eAA8B;IAClC,GAAG;IACH,QAAQ;IACR,OAAO,YAAY;IACnB;IACA,MAAM,WAAW,QAAQ,MAAM,GAAG;GACpC;GAEA,MAAM,cAAc,MAAM,KAAK,eAAe,SAAS,YAAY,MAAM,YAAY;GAGrF,YAAY,OAAO,YAAY;GAG/B,IAAI,YAAY,YAAY,OAC1B,OAAO,KAAK,GAAG,YAAY,MAAM;EAErC,CAAC;EAED,MAAM,QAAQ,IAAI,kBAAkB;EAEpC,OAAO;GACL,SAAS,OAAO,WAAW;GAC3B;GACA,MAAM,MAAM,KAAK,4BAA4B,aAAa,OAAO;EACnE;CACF;;;;;;;;;;;;;;;;CAiBA,AAAgB,aAAa,SAA2B,iBAAmC;EACzF,MAAM,SAA2B;GAC/B,MAAM;GACN,sBAAsB,KAAK,eAAe,aAAa,MAAM;EAC/D;EAEA,IAAI,KAAK,YAAY,cAAc,QAAQ,MAAM;EAEjD,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"record-validator.mjs","names":[],"sources":["../../../../../../../../packages/seal/src/validators/record-validator.ts"],"sourcesContent":["import { isPlainObject } from \"@mongez/supportive-is\";\nimport { setKeyPath } from \"../helpers\";\nimport { objectRule, plainObjectRule } from \"../rules\";\nimport type { SchemaContext, ValidationResult } from \"../types\";\nimport { BaseValidator } from \"./base-validator\";\nimport { applyNullable } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * Record validator class - validates objects with dynamic keys and consistent value types\n *\n * @example\n * ```ts\n * // Translations object\n * v.record(v.string())\n * // Valid: { en: \"Hello\", ar: \"مرحبا\", fr: \"Bonjour\" }\n *\n * // User preferences\n * v.record(v.union([v.string(), v.number(), v.boolean()]))\n * // Valid: { theme: \"dark\", fontSize: 16, notifications: true }\n * ```\n */\nexport class RecordValidator extends BaseValidator {\n public constructor(\n public valueValidator: BaseValidator,\n errorMessage?: string,\n ) {\n super();\n this.addMutableRule(objectRule, errorMessage);\n }\n\n /**\n * Validate it as plain object\n */\n public plainObject(errorMessage?: string) {\n return this.addRule(plainObjectRule, errorMessage);\n }\n\n /**\n * Check if value is a plain object type\n */\n public matchesType(value: any): boolean {\n return isPlainObject(value);\n }\n\n /**\n * Clone the validator\n */\n public override clone(): this {\n const cloned = super.clone();\n cloned.valueValidator = this.valueValidator.clone();\n return cloned;\n }\n\n /**\n * Validate record - iterate all keys and validate each value\n *\n * Absent input (and absent without `.default()`) propagates as `data: undefined`\n * so the parent ObjectValidator can omit the key. Without this, optional record\n * fields would silently materialise as `{}` in the validated output.\n */\n public async validate(data: any, context: SchemaContext): Promise<ValidationResult> {\n // Apply default when absent, then mutate. Mirrors BaseValidator's\n // `valueForRules = data ?? this.getDefaultValue()` so `.default({...})`\n // works on records too.\n const valueForRules = data ?? this.getDefaultValue();\n const mutatedData = await this.mutate(valueForRules, context);\n\n const result = await super.validate(data, context);\n\n if (result.isValid === false) return result;\n\n // Nothing to iterate for absent (no default) or null (nullable) inputs —\n // propagate so the parent ObjectValidator can omit the key.\n if (mutatedData === undefined || mutatedData === null) return result;\n\n // Defensive: type rule (objectRule) should have failed for non-objects.\n if (!isPlainObject(mutatedData)) return result;\n\n const errors: ValidationResult[\"errors\"] = [];\n const keys = Object.keys(mutatedData);\n\n // Validate all values in parallel\n const validationPromises = keys.map(async (key) => {\n const childContext: SchemaContext = {\n ...context,\n parent: mutatedData,\n value: mutatedData[key],\n key,\n path: setKeyPath(context.path, key),\n };\n\n const childResult = await this.valueValidator.validate(mutatedData[key], childContext);\n\n // Update mutated data with validated result\n mutatedData[key] = childResult.data;\n\n // Collect errors from this value\n if (childResult.isValid === false) {\n errors.push(...childResult.errors);\n }\n });\n\n await Promise.all(validationPromises);\n\n return {\n isValid: errors.length === 0,\n errors,\n data: await this.startTransformationPipeline(mutatedData, context),\n };\n }\n\n /**\n * @inheritdoc\n *\n * Generates `{ type: \"object\", additionalProperties: <valueSchema> }` —\n * the standard JSON Schema for a dictionary/map with homogeneous values.\n *\n * @example\n * ```ts\n * v.record(v.string()).toJsonSchema(\"draft-2020-12\")\n * // → { type: \"object\", additionalProperties: { type: \"string\" } }\n *\n * v.record(v.union([v.string(), v.number()])).toJsonSchema(\"draft-2020-12\")\n * // → { type: \"object\", additionalProperties: { oneOf: [{ type: \"string\" }, { type: \"number\" }] } }\n * ```\n */\n public override toJsonSchema(target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n const schema: JsonSchemaResult = {\n type: \"object\",\n additionalProperties: this.valueValidator.toJsonSchema(target),\n };\n\n if (this.isNullable) applyNullable(schema, target);\n\n return schema;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAsBA,IAAa,kBAAb,cAAqC,cAAc;CACjD,AAAO,YACL,AAAO,gBACP,cACA;EACA,MAAM;EAHC;EAIP,KAAK,eAAe,YAAY,YAAY;CAC9C;;;;CAKA,AAAO,YAAY,cAAuB;EACxC,OAAO,KAAK,QAAQ,iBAAiB,YAAY;CACnD;;;;CAKA,AAAO,YAAY,OAAqB;EACtC,OAAO,cAAc,KAAK;CAC5B;;;;CAKA,AAAgB,QAAc;EAC5B,MAAM,SAAS,MAAM,MAAM;EAC3B,OAAO,iBAAiB,KAAK,eAAe,MAAM;EAClD,OAAO;CACT;;;;;;;;CASA,MAAa,SAAS,MAAW,SAAmD;EAIlF,MAAM,gBAAgB,QAAQ,KAAK,gBAAgB;EACnD,MAAM,cAAc,MAAM,KAAK,OAAO,eAAe,OAAO;EAE5D,MAAM,SAAS,MAAM,MAAM,SAAS,MAAM,OAAO;EAEjD,IAAI,OAAO,YAAY,OAAO,OAAO;EAIrC,IAAI,gBAAgB,UAAa,gBAAgB,MAAM,OAAO;EAG9D,IAAI,CAAC,cAAc,WAAW,GAAG,OAAO;EAExC,MAAM,SAAqC,CAAC;EAI5C,MAAM,qBAHO,OAAO,KAAK,WAGK,CAAC,CAAC,IAAI,OAAO,QAAQ;GACjD,MAAM,eAA8B;IAClC,GAAG;IACH,QAAQ;IACR,OAAO,YAAY;IACnB;IACA,MAAM,WAAW,QAAQ,MAAM,GAAG;GACpC;GAEA,MAAM,cAAc,MAAM,KAAK,eAAe,SAAS,YAAY,MAAM,YAAY;GAGrF,YAAY,OAAO,YAAY;GAG/B,IAAI,YAAY,YAAY,OAC1B,OAAO,KAAK,GAAG,YAAY,MAAM;EAErC,CAAC;EAED,MAAM,QAAQ,IAAI,kBAAkB;EAEpC,OAAO;GACL,SAAS,OAAO,WAAW;GAC3B;GACA,MAAM,MAAM,KAAK,4BAA4B,aAAa,OAAO;EACnE;CACF;;;;;;;;;;;;;;;;CAiBA,AAAgB,aAAa,SAA2B,iBAAmC;EACzF,MAAM,SAA2B;GAC/B,MAAM;GACN,sBAAsB,KAAK,eAAe,aAAa,MAAM;EAC/D;EAEA,IAAI,KAAK,YAAY,cAAc,QAAQ,MAAM;EAEjD,OAAO;CACT;AACF"}
@@ -1,7 +1,7 @@
1
1
  import { JsonSchemaResult, JsonSchemaTarget } from "../standard-schema/json-schema.mjs";
2
2
  import { PrimitiveValidator } from "./primitive-validator.mjs";
3
3
 
4
- //#region ../seal/src/validators/scalar-validator.d.ts
4
+ //#region ../../packages/seal/src/validators/scalar-validator.d.ts
5
5
  /**
6
6
  * Scalar validator class
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"scalar-validator.d.mts","names":[],"sources":["../../../../../../../seal/src/validators/scalar-validator.ts"],"mappings":";;;;;;AA6BA;;;;;;;cAAa,eAAA,SAAwB,kBAAA;cAChB,YAAA;;;;EAqBZ,WAAA,CAAY,KAAA,QAAU,KAAA;EAAA;;;EAOtB,QAAA;EAeS;;;EART,QAAA;EAesC;;;;EAPtC,QAAA,CAAS,YAAA;EAqBT;;;EAdA,UAAA,CAAW,KAAA,UAAe,KAAA,OAAY,YAAA;EAqBpB;;;EAdlB,cAAA,CAAe,KAAA,UAAe,KAAA,OAAY,YAAA;EAqBX;;;EAd/B,kBAAA,CAAmB,KAAA,UAAe,YAAA;EA6BvB;;;EAtBX,iBAAA,CAAkB,KAAA,UAAe,YAAA;EA6BlB;;;EAtBf,eAAA,CAAgB,KAAA,UAAe,YAAA;EA6BZ;;;;EArBnB,QAAA,CAAS,YAAA;EAmCT;;;EA5BA,UAAA,CAAW,KAAA,UAAe,KAAA,OAAY,YAAA;EA+CP;;;EAxC/B,cAAA,CAAe,KAAA,UAAe,KAAA,OAAY,YAAA;EAwC0C;;;EAjCpF,kBAAA,CAAmB,KAAA,UAAe,YAAA;;;;EAOlC,iBAAA,CAAkB,KAAA,UAAe,YAAA;;;;EAOjC,eAAA,CAAgB,KAAA,UAAe,YAAA;;;;;;;;;;;;;;;;EAmBtB,YAAA,CAAa,OAAA,GAAS,gBAAA,GAAqC,gBAAA;AAAA"}
1
+ {"version":3,"file":"scalar-validator.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/validators/scalar-validator.ts"],"mappings":";;;;;;AA6BA;;;;;;;cAAa,eAAA,SAAwB,kBAAA;cAChB,YAAA;;;;EAqBZ,WAAA,CAAY,KAAA,QAAU,KAAA;EAAA;;;EAOtB,QAAA;EAeS;;;EART,QAAA;EAesC;;;;EAPtC,QAAA,CAAS,YAAA;EAqBT;;;EAdA,UAAA,CAAW,KAAA,UAAe,KAAA,OAAY,YAAA;EAqBpB;;;EAdlB,cAAA,CAAe,KAAA,UAAe,KAAA,OAAY,YAAA;EAqBX;;;EAd/B,kBAAA,CAAmB,KAAA,UAAe,YAAA;EA6BvB;;;EAtBX,iBAAA,CAAkB,KAAA,UAAe,YAAA;EA6BlB;;;EAtBf,eAAA,CAAgB,KAAA,UAAe,YAAA;EA6BZ;;;;EArBnB,QAAA,CAAS,YAAA;EAmCT;;;EA5BA,UAAA,CAAW,KAAA,UAAe,KAAA,OAAY,YAAA;EA+CP;;;EAxC/B,cAAA,CAAe,KAAA,UAAe,KAAA,OAAY,YAAA;EAwC0C;;;EAjCpF,kBAAA,CAAmB,KAAA,UAAe,YAAA;;;;EAOlC,iBAAA,CAAkB,KAAA,UAAe,YAAA;;;;EAOjC,eAAA,CAAgB,KAAA,UAAe,YAAA;;;;;;;;;;;;;;;;EAmBtB,YAAA,CAAa,OAAA,GAAS,gBAAA,GAAqC,gBAAA;AAAA"}
@@ -9,7 +9,7 @@ import "../mutators/index.mjs";
9
9
  import { PrimitiveValidator } from "./primitive-validator.mjs";
10
10
  import "../rules/scalar/index.mjs";
11
11
 
12
- //#region ../seal/src/validators/scalar-validator.ts
12
+ //#region ../../packages/seal/src/validators/scalar-validator.ts
13
13
  /**
14
14
  * Scalar validator class
15
15
  *
@@ -1 +1 @@
1
- {"version":3,"file":"scalar-validator.mjs","names":[],"sources":["../../../../../../../seal/src/validators/scalar-validator.ts"],"sourcesContent":["import { invalidRule, VALID_RULE } from \"../helpers\";\nimport { numberMutator, stringMutator } from \"../mutators\";\nimport {\n acceptedIfPresentRule,\n acceptedIfRequiredRule,\n acceptedIfRule,\n acceptedRule,\n acceptedUnlessRule,\n acceptedWithoutRule,\n declinedIfPresentRule,\n declinedIfRequiredRule,\n declinedIfRule,\n declinedRule,\n declinedUnlessRule,\n declinedWithoutRule,\n} from \"../rules/scalar\";\nimport { PrimitiveValidator } from \"./primitive-validator\";\nimport { getRuleOptions } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * Scalar validator class\n *\n * Core validator for scalar values (string, number, boolean).\n * Extends PrimitiveValidator (inherits enum/in/oneOf/allowsOnly/forbids/notIn)\n * and additionally provides type-coercion mutators and accepted/declined rules.\n *\n * Database methods (unique, exists, etc.) are injected by the framework\n */\nexport class ScalarValidator extends PrimitiveValidator {\n public constructor(errorMessage?: string) {\n super();\n this.blankIsMissing = true;\n this.addMutableRule(\n {\n name: \"scalar\",\n defaultErrorMessage: \"The :input must be a scalar value\",\n async validate(value, context) {\n if ([\"string\", \"number\", \"boolean\"].includes(typeof value)) {\n return VALID_RULE;\n }\n return invalidRule(this, context);\n },\n },\n errorMessage,\n );\n }\n\n /**\n * Add matches type\n */\n public matchesType(value: any) {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n }\n\n /**\n * Mutate the scalar value to be number\n */\n public asNumber() {\n return this.addMutator(numberMutator);\n }\n\n /**\n * Mutate the scalar value to be string\n */\n public asString() {\n return this.addMutator(stringMutator);\n }\n\n /**\n * Accepted value\n * The value will be valid if it equals 1 | \"1\" | true | \"true\" | \"yes\" | \"y\" | \"on\"\n */\n public accepted(errorMessage?: string) {\n return this.addRule(acceptedRule, errorMessage);\n }\n\n /**\n * Accepted value if another field's value equals to a specific value\n */\n public acceptedIf(field: string, value: any, errorMessage?: string) {\n return this.addRule(acceptedIfRule, errorMessage, { field, value });\n }\n\n /**\n * Accepted value if another field's value is not equal to the given value\n */\n public acceptedUnless(field: string, value: any, errorMessage?: string) {\n return this.addRule(acceptedUnlessRule, errorMessage, { field, value });\n }\n\n /**\n * Accepted value if another field is required\n */\n public acceptedIfRequired(field: string, errorMessage?: string) {\n return this.addRule(acceptedIfRequiredRule, errorMessage, { field });\n }\n\n /**\n * Accepted value if another field is present\n */\n public acceptedIfPresent(field: string, errorMessage?: string) {\n return this.addRule(acceptedIfPresentRule, errorMessage, { field });\n }\n\n /**\n * Accepted value if another field is missing\n */\n public acceptedWithout(field: string, errorMessage?: string) {\n return this.addRule(acceptedWithoutRule, errorMessage, { field });\n }\n\n /**\n * Declined value\n * The value will be valid if it equals 0 | \"0\" | false | \"false\" | \"no\" | \"n\" | \"off\"\n */\n public declined(errorMessage?: string) {\n return this.addRule(declinedRule, errorMessage);\n }\n\n /**\n * Declined value if another field's value equals to a specific value\n */\n public declinedIf(field: string, value: any, errorMessage?: string) {\n return this.addRule(declinedIfRule, errorMessage, { field, value });\n }\n\n /**\n * Declined value if another field's value is not equal to the given value\n */\n public declinedUnless(field: string, value: any, errorMessage?: string) {\n return this.addRule(declinedUnlessRule, errorMessage, { field, value });\n }\n\n /**\n * Declined value if another field is required\n */\n public declinedIfRequired(field: string, errorMessage?: string) {\n return this.addRule(declinedIfRequiredRule, errorMessage, { field });\n }\n\n /**\n * Declined value if another field is present\n */\n public declinedIfPresent(field: string, errorMessage?: string) {\n return this.addRule(declinedIfPresentRule, errorMessage, { field });\n }\n\n /**\n * Declined value if another field is missing\n */\n public declinedWithout(field: string, errorMessage?: string) {\n return this.addRule(declinedWithoutRule, errorMessage, { field });\n }\n\n /**\n * @inheritdoc\n *\n * A scalar accepts string | number | boolean. If `.in()` / `.enum()` is used,\n * output collapses to a simple `enum` list instead.\n *\n * @example\n * ```ts\n * v.scalar().toJsonSchema(\"draft-2020-12\")\n * // → { oneOf: [{ type: \"string\" }, { type: \"number\" }, { type: \"boolean\" }] }\n *\n * v.scalar().in([\"active\", \"inactive\"]).toJsonSchema(\"draft-2020-12\")\n * // → { enum: [\"active\", \"inactive\"] }\n * ```\n */\n public override toJsonSchema(_target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n // If a value set is constrained, collapse to enum\n const inOpts = getRuleOptions(this.rules, \"in\");\n if (inOpts?.values && Array.isArray(inOpts.values)) {\n return { enum: inOpts.values };\n }\n\n const enumOpts = getRuleOptions(this.rules, \"enum\");\n if (enumOpts?.enum && Array.isArray(enumOpts.enum)) {\n return { enum: enumOpts.enum };\n }\n\n return {\n oneOf: [\n { type: \"string\" },\n { type: \"number\" },\n { type: \"boolean\" },\n ],\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA6BA,IAAa,kBAAb,cAAqC,mBAAmB;CACtD,AAAO,YAAY,cAAuB;EACxC,MAAM;EACN,KAAK,iBAAiB;EACtB,KAAK,eACH;GACE,MAAM;GACN,qBAAqB;GACrB,MAAM,SAAS,OAAO,SAAS;IAC7B,IAAI;KAAC;KAAU;KAAU;IAAS,CAAC,CAAC,SAAS,OAAO,KAAK,GACvD,OAAO;IAET,OAAO,YAAY,MAAM,OAAO;GAClC;EACF,GACA,YACF;CACF;;;;CAKA,AAAO,YAAY,OAAY;EAC7B,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU;CACpF;;;;CAKA,AAAO,WAAW;EAChB,OAAO,KAAK,WAAW,aAAa;CACtC;;;;CAKA,AAAO,WAAW;EAChB,OAAO,KAAK,WAAW,aAAa;CACtC;;;;;CAMA,AAAO,SAAS,cAAuB;EACrC,OAAO,KAAK,QAAQ,cAAc,YAAY;CAChD;;;;CAKA,AAAO,WAAW,OAAe,OAAY,cAAuB;EAClE,OAAO,KAAK,QAAQ,gBAAgB,cAAc;GAAE;GAAO;EAAM,CAAC;CACpE;;;;CAKA,AAAO,eAAe,OAAe,OAAY,cAAuB;EACtE,OAAO,KAAK,QAAQ,oBAAoB,cAAc;GAAE;GAAO;EAAM,CAAC;CACxE;;;;CAKA,AAAO,mBAAmB,OAAe,cAAuB;EAC9D,OAAO,KAAK,QAAQ,wBAAwB,cAAc,EAAE,MAAM,CAAC;CACrE;;;;CAKA,AAAO,kBAAkB,OAAe,cAAuB;EAC7D,OAAO,KAAK,QAAQ,uBAAuB,cAAc,EAAE,MAAM,CAAC;CACpE;;;;CAKA,AAAO,gBAAgB,OAAe,cAAuB;EAC3D,OAAO,KAAK,QAAQ,qBAAqB,cAAc,EAAE,MAAM,CAAC;CAClE;;;;;CAMA,AAAO,SAAS,cAAuB;EACrC,OAAO,KAAK,QAAQ,cAAc,YAAY;CAChD;;;;CAKA,AAAO,WAAW,OAAe,OAAY,cAAuB;EAClE,OAAO,KAAK,QAAQ,gBAAgB,cAAc;GAAE;GAAO;EAAM,CAAC;CACpE;;;;CAKA,AAAO,eAAe,OAAe,OAAY,cAAuB;EACtE,OAAO,KAAK,QAAQ,oBAAoB,cAAc;GAAE;GAAO;EAAM,CAAC;CACxE;;;;CAKA,AAAO,mBAAmB,OAAe,cAAuB;EAC9D,OAAO,KAAK,QAAQ,wBAAwB,cAAc,EAAE,MAAM,CAAC;CACrE;;;;CAKA,AAAO,kBAAkB,OAAe,cAAuB;EAC7D,OAAO,KAAK,QAAQ,uBAAuB,cAAc,EAAE,MAAM,CAAC;CACpE;;;;CAKA,AAAO,gBAAgB,OAAe,cAAuB;EAC3D,OAAO,KAAK,QAAQ,qBAAqB,cAAc,EAAE,MAAM,CAAC;CAClE;;;;;;;;;;;;;;;;CAiBA,AAAgB,aAAa,UAA4B,iBAAmC;EAE1F,MAAM,SAAS,eAAe,KAAK,OAAO,IAAI;EAC9C,IAAI,QAAQ,UAAU,MAAM,QAAQ,OAAO,MAAM,GAC/C,OAAO,EAAE,MAAM,OAAO,OAAO;EAG/B,MAAM,WAAW,eAAe,KAAK,OAAO,MAAM;EAClD,IAAI,UAAU,QAAQ,MAAM,QAAQ,SAAS,IAAI,GAC/C,OAAO,EAAE,MAAM,SAAS,KAAK;EAG/B,OAAO,EACL,OAAO;GACL,EAAE,MAAM,SAAS;GACjB,EAAE,MAAM,SAAS;GACjB,EAAE,MAAM,UAAU;EACpB,EACF;CACF;AACF"}
1
+ {"version":3,"file":"scalar-validator.mjs","names":[],"sources":["../../../../../../../../packages/seal/src/validators/scalar-validator.ts"],"sourcesContent":["import { invalidRule, VALID_RULE } from \"../helpers\";\nimport { numberMutator, stringMutator } from \"../mutators\";\nimport {\n acceptedIfPresentRule,\n acceptedIfRequiredRule,\n acceptedIfRule,\n acceptedRule,\n acceptedUnlessRule,\n acceptedWithoutRule,\n declinedIfPresentRule,\n declinedIfRequiredRule,\n declinedIfRule,\n declinedRule,\n declinedUnlessRule,\n declinedWithoutRule,\n} from \"../rules/scalar\";\nimport { PrimitiveValidator } from \"./primitive-validator\";\nimport { getRuleOptions } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * Scalar validator class\n *\n * Core validator for scalar values (string, number, boolean).\n * Extends PrimitiveValidator (inherits enum/in/oneOf/allowsOnly/forbids/notIn)\n * and additionally provides type-coercion mutators and accepted/declined rules.\n *\n * Database methods (unique, exists, etc.) are injected by the framework\n */\nexport class ScalarValidator extends PrimitiveValidator {\n public constructor(errorMessage?: string) {\n super();\n this.blankIsMissing = true;\n this.addMutableRule(\n {\n name: \"scalar\",\n defaultErrorMessage: \"The :input must be a scalar value\",\n async validate(value, context) {\n if ([\"string\", \"number\", \"boolean\"].includes(typeof value)) {\n return VALID_RULE;\n }\n return invalidRule(this, context);\n },\n },\n errorMessage,\n );\n }\n\n /**\n * Add matches type\n */\n public matchesType(value: any) {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n }\n\n /**\n * Mutate the scalar value to be number\n */\n public asNumber() {\n return this.addMutator(numberMutator);\n }\n\n /**\n * Mutate the scalar value to be string\n */\n public asString() {\n return this.addMutator(stringMutator);\n }\n\n /**\n * Accepted value\n * The value will be valid if it equals 1 | \"1\" | true | \"true\" | \"yes\" | \"y\" | \"on\"\n */\n public accepted(errorMessage?: string) {\n return this.addRule(acceptedRule, errorMessage);\n }\n\n /**\n * Accepted value if another field's value equals to a specific value\n */\n public acceptedIf(field: string, value: any, errorMessage?: string) {\n return this.addRule(acceptedIfRule, errorMessage, { field, value });\n }\n\n /**\n * Accepted value if another field's value is not equal to the given value\n */\n public acceptedUnless(field: string, value: any, errorMessage?: string) {\n return this.addRule(acceptedUnlessRule, errorMessage, { field, value });\n }\n\n /**\n * Accepted value if another field is required\n */\n public acceptedIfRequired(field: string, errorMessage?: string) {\n return this.addRule(acceptedIfRequiredRule, errorMessage, { field });\n }\n\n /**\n * Accepted value if another field is present\n */\n public acceptedIfPresent(field: string, errorMessage?: string) {\n return this.addRule(acceptedIfPresentRule, errorMessage, { field });\n }\n\n /**\n * Accepted value if another field is missing\n */\n public acceptedWithout(field: string, errorMessage?: string) {\n return this.addRule(acceptedWithoutRule, errorMessage, { field });\n }\n\n /**\n * Declined value\n * The value will be valid if it equals 0 | \"0\" | false | \"false\" | \"no\" | \"n\" | \"off\"\n */\n public declined(errorMessage?: string) {\n return this.addRule(declinedRule, errorMessage);\n }\n\n /**\n * Declined value if another field's value equals to a specific value\n */\n public declinedIf(field: string, value: any, errorMessage?: string) {\n return this.addRule(declinedIfRule, errorMessage, { field, value });\n }\n\n /**\n * Declined value if another field's value is not equal to the given value\n */\n public declinedUnless(field: string, value: any, errorMessage?: string) {\n return this.addRule(declinedUnlessRule, errorMessage, { field, value });\n }\n\n /**\n * Declined value if another field is required\n */\n public declinedIfRequired(field: string, errorMessage?: string) {\n return this.addRule(declinedIfRequiredRule, errorMessage, { field });\n }\n\n /**\n * Declined value if another field is present\n */\n public declinedIfPresent(field: string, errorMessage?: string) {\n return this.addRule(declinedIfPresentRule, errorMessage, { field });\n }\n\n /**\n * Declined value if another field is missing\n */\n public declinedWithout(field: string, errorMessage?: string) {\n return this.addRule(declinedWithoutRule, errorMessage, { field });\n }\n\n /**\n * @inheritdoc\n *\n * A scalar accepts string | number | boolean. If `.in()` / `.enum()` is used,\n * output collapses to a simple `enum` list instead.\n *\n * @example\n * ```ts\n * v.scalar().toJsonSchema(\"draft-2020-12\")\n * // → { oneOf: [{ type: \"string\" }, { type: \"number\" }, { type: \"boolean\" }] }\n *\n * v.scalar().in([\"active\", \"inactive\"]).toJsonSchema(\"draft-2020-12\")\n * // → { enum: [\"active\", \"inactive\"] }\n * ```\n */\n public override toJsonSchema(_target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n // If a value set is constrained, collapse to enum\n const inOpts = getRuleOptions(this.rules, \"in\");\n if (inOpts?.values && Array.isArray(inOpts.values)) {\n return { enum: inOpts.values };\n }\n\n const enumOpts = getRuleOptions(this.rules, \"enum\");\n if (enumOpts?.enum && Array.isArray(enumOpts.enum)) {\n return { enum: enumOpts.enum };\n }\n\n return {\n oneOf: [\n { type: \"string\" },\n { type: \"number\" },\n { type: \"boolean\" },\n ],\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA6BA,IAAa,kBAAb,cAAqC,mBAAmB;CACtD,AAAO,YAAY,cAAuB;EACxC,MAAM;EACN,KAAK,iBAAiB;EACtB,KAAK,eACH;GACE,MAAM;GACN,qBAAqB;GACrB,MAAM,SAAS,OAAO,SAAS;IAC7B,IAAI;KAAC;KAAU;KAAU;IAAS,CAAC,CAAC,SAAS,OAAO,KAAK,GACvD,OAAO;IAET,OAAO,YAAY,MAAM,OAAO;GAClC;EACF,GACA,YACF;CACF;;;;CAKA,AAAO,YAAY,OAAY;EAC7B,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU;CACpF;;;;CAKA,AAAO,WAAW;EAChB,OAAO,KAAK,WAAW,aAAa;CACtC;;;;CAKA,AAAO,WAAW;EAChB,OAAO,KAAK,WAAW,aAAa;CACtC;;;;;CAMA,AAAO,SAAS,cAAuB;EACrC,OAAO,KAAK,QAAQ,cAAc,YAAY;CAChD;;;;CAKA,AAAO,WAAW,OAAe,OAAY,cAAuB;EAClE,OAAO,KAAK,QAAQ,gBAAgB,cAAc;GAAE;GAAO;EAAM,CAAC;CACpE;;;;CAKA,AAAO,eAAe,OAAe,OAAY,cAAuB;EACtE,OAAO,KAAK,QAAQ,oBAAoB,cAAc;GAAE;GAAO;EAAM,CAAC;CACxE;;;;CAKA,AAAO,mBAAmB,OAAe,cAAuB;EAC9D,OAAO,KAAK,QAAQ,wBAAwB,cAAc,EAAE,MAAM,CAAC;CACrE;;;;CAKA,AAAO,kBAAkB,OAAe,cAAuB;EAC7D,OAAO,KAAK,QAAQ,uBAAuB,cAAc,EAAE,MAAM,CAAC;CACpE;;;;CAKA,AAAO,gBAAgB,OAAe,cAAuB;EAC3D,OAAO,KAAK,QAAQ,qBAAqB,cAAc,EAAE,MAAM,CAAC;CAClE;;;;;CAMA,AAAO,SAAS,cAAuB;EACrC,OAAO,KAAK,QAAQ,cAAc,YAAY;CAChD;;;;CAKA,AAAO,WAAW,OAAe,OAAY,cAAuB;EAClE,OAAO,KAAK,QAAQ,gBAAgB,cAAc;GAAE;GAAO;EAAM,CAAC;CACpE;;;;CAKA,AAAO,eAAe,OAAe,OAAY,cAAuB;EACtE,OAAO,KAAK,QAAQ,oBAAoB,cAAc;GAAE;GAAO;EAAM,CAAC;CACxE;;;;CAKA,AAAO,mBAAmB,OAAe,cAAuB;EAC9D,OAAO,KAAK,QAAQ,wBAAwB,cAAc,EAAE,MAAM,CAAC;CACrE;;;;CAKA,AAAO,kBAAkB,OAAe,cAAuB;EAC7D,OAAO,KAAK,QAAQ,uBAAuB,cAAc,EAAE,MAAM,CAAC;CACpE;;;;CAKA,AAAO,gBAAgB,OAAe,cAAuB;EAC3D,OAAO,KAAK,QAAQ,qBAAqB,cAAc,EAAE,MAAM,CAAC;CAClE;;;;;;;;;;;;;;;;CAiBA,AAAgB,aAAa,UAA4B,iBAAmC;EAE1F,MAAM,SAAS,eAAe,KAAK,OAAO,IAAI;EAC9C,IAAI,QAAQ,UAAU,MAAM,QAAQ,OAAO,MAAM,GAC/C,OAAO,EAAE,MAAM,OAAO,OAAO;EAG/B,MAAM,WAAW,eAAe,KAAK,OAAO,MAAM;EAClD,IAAI,UAAU,QAAQ,MAAM,QAAQ,SAAS,IAAI,GAC/C,OAAO,EAAE,MAAM,SAAS,KAAK;EAG/B,OAAO,EACL,OAAO;GACL,EAAE,MAAM,SAAS;GACjB,EAAE,MAAM,SAAS;GACjB,EAAE,MAAM,UAAU;EACpB,EACF;CACF;AACF"}
@@ -2,7 +2,7 @@ import { JsonSchemaResult, JsonSchemaTarget } from "../standard-schema/json-sche
2
2
  import { PrimitiveValidator } from "./primitive-validator.mjs";
3
3
  import { UUIDVersion } from "../rules/string/id-formats.mjs";
4
4
 
5
- //#region ../seal/src/validators/string-validator.d.ts
5
+ //#region ../../packages/seal/src/validators/string-validator.d.ts
6
6
  /**
7
7
  * String validator class
8
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"string-validator.d.mts","names":[],"sources":["../../../../../../../seal/src/validators/string-validator.ts"],"mappings":"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"}
1
+ {"version":3,"file":"string-validator.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/validators/string-validator.ts"],"mappings":"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"}
@@ -17,7 +17,7 @@ import "../rules/color/index.mjs";
17
17
  import { stringRule } from "../rules/common/type-rules.mjs";
18
18
  import { PrimitiveValidator } from "./primitive-validator.mjs";
19
19
 
20
- //#region ../seal/src/validators/string-validator.ts
20
+ //#region ../../packages/seal/src/validators/string-validator.ts
21
21
  /**
22
22
  * String validator class
23
23
  */
@@ -1 +1 @@
1
- {"version":3,"file":"string-validator.mjs","names":[],"sources":["../../../../../../../seal/src/validators/string-validator.ts"],"sourcesContent":["import {\n alphaOnlyMutator,\n alphanumericOnlyMutator,\n appendMutator,\n base64DecodeMutator,\n base64EncodeMutator,\n camelCaseMutator,\n capitalizeMutator,\n htmlEscapeMutator,\n kebabCaseMutator,\n lowercaseMutator,\n ltrimMutator,\n maskMutator,\n padEndMutator,\n padStartMutator,\n pascalCaseMutator,\n prependMutator,\n removeNumbersMutator,\n removeSpecialCharactersMutator,\n repeatMutator,\n replaceAllMutator,\n replaceMutator,\n reverseMutator,\n rtrimMutator,\n slugMutator,\n snakeCaseMutator,\n stringifyMutator,\n stripTagsMutator,\n titleCaseMutator,\n trimMultipleWhitespaceMutator,\n trimMutator,\n truncateMutator,\n unescapeHtmlMutator,\n uppercaseMutator,\n urlDecodeMutator,\n urlEncodeMutator,\n} from \"../mutators/string-mutators\";\nimport { alphaNumericRule, alphaRule, isNumericRule } from \"../rules/string/alpha\";\nimport { isCreditCardRule } from \"../rules/string/credit-card\";\nimport { emailRule } from \"../rules/string/email\";\nimport { cuidRule, nanoidRule, ulidRule, uuidRule } from \"../rules/string/id-formats\";\nimport { ip4Rule, ip6Rule, ipRule } from \"../rules/string/ip\";\nimport {\n containsRule,\n endsWithRule,\n notContainsRule,\n startsWithRule,\n} from \"../rules/string/string-comparison\";\nimport { patternRule } from \"../rules/string/pattern\";\nimport { strongPasswordRule } from \"../rules/string/strong-password-rule\";\nimport { urlRule } from \"../rules/string/url\";\nimport { withoutWhitespaceRule } from \"../rules/string/without-whitespace\";\nimport type { UUIDVersion } from \"../rules/string/id-formats\";\nimport {\n betweenLengthRule,\n lengthRule,\n maxLengthRule,\n maxWordsRule,\n minLengthRule,\n minWordsRule,\n wordsRule,\n} from \"../rules/length\";\nimport {\n colorRule,\n darkColorRule,\n hexColorRule,\n hslColorRule,\n lightColorRule,\n rgbColorRule,\n rgbaColorRule,\n} from \"../rules/color\";\nimport { stringRule } from \"../rules/common/type-rules\";\nimport { PrimitiveValidator } from \"./primitive-validator\";\nimport { applyNullable, getRuleOptions } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * String validator class\n */\nexport class StringValidator extends PrimitiveValidator {\n public constructor(errorMessage?: string) {\n super();\n this.addMutableRule(stringRule, errorMessage);\n }\n\n /**\n * Check if value is a string type\n */\n public matchesType(value: any): boolean {\n return typeof value === \"string\";\n }\n\n // ==================== Mutators ====================\n\n /**\n * Stringify the value if not a string\n */\n public toString() {\n return this.addMutator(stringifyMutator);\n }\n\n /** Convert string to uppercase */\n public uppercase() {\n return this.addMutator(uppercaseMutator);\n }\n\n /** Convert string to lowercase */\n public lowercase() {\n return this.addMutator(lowercaseMutator);\n }\n\n /** Capitalize only the first letter of the string */\n public capitalize() {\n return this.addMutator(capitalizeMutator);\n }\n\n /** Capitalize the first letter of each word (Title Case) */\n public titleCase() {\n return this.addMutator(titleCaseMutator);\n }\n\n /** Convert to camelCase */\n public camelCase() {\n return this.addMutator(camelCaseMutator);\n }\n\n /** Convert to PascalCase */\n public pascalCase() {\n return this.addMutator(pascalCaseMutator);\n }\n\n /** Convert to snake_case */\n public snakeCase() {\n return this.addMutator(snakeCaseMutator);\n }\n\n /** Convert to kebab-case */\n public kebabCase() {\n return this.addMutator(kebabCaseMutator);\n }\n\n /**\n * Trim the given needle from the string\n * If no needle is provided, the default is a single space\n */\n public trim(needle?: string) {\n return this.addMutator(trimMutator, { needle });\n }\n\n /** Trim from the left/start */\n public ltrim(needle?: string) {\n return this.addMutator(ltrimMutator, { needle });\n }\n\n /** Trim from the right/end */\n public rtrim(needle?: string) {\n return this.addMutator(rtrimMutator, { needle });\n }\n\n /** Trim multiple whitespace into single space */\n public trimMultipleWhitespace() {\n return this.addMutator(trimMultipleWhitespaceMutator);\n }\n\n /** Pad string from the start to reach target length */\n public padStart(length: number, char = \" \") {\n return this.addMutator(padStartMutator, { length, char });\n }\n\n /** Pad string from the end to reach target length */\n public padEnd(length: number, char = \" \") {\n return this.addMutator(padEndMutator, { length, char });\n }\n\n /**\n * Strip HTML tags with a naive `<...>` regex.\n *\n * This is a **tag stripper, not an XSS sanitizer**: it is not a parser,\n * so malformed/nested markup or content re-introduced later in a\n * pipeline can defeat it. Do not rely on this alone to make untrusted\n * rich text safe to render — use a real parser-based sanitizer (e.g.\n * DOMPurify / sanitize-html) for that.\n */\n public stripTags() {\n return this.addMutator(stripTagsMutator);\n }\n\n /**\n * @deprecated Renamed to {@link StringValidator.stripTags} — the old\n * name implied XSS safety this tag-stripping regex does not provide.\n * Kept as an alias for backward compatibility; switch to `.stripTags()`.\n */\n public safeHtml() {\n return this.stripTags();\n }\n\n /** HTML escape special characters */\n public htmlEscape() {\n return this.addMutator(htmlEscapeMutator);\n }\n\n /** Unescape HTML entities */\n public unescapeHtml() {\n return this.addMutator(unescapeHtmlMutator);\n }\n\n /**\n * Remove special characters\n * This will remove all characters that are not alphanumeric or whitespace\n */\n public removeSpecialCharacters() {\n return this.addMutator(removeSpecialCharactersMutator);\n }\n\n /** Convert to only alphabetic characters */\n public toAlpha() {\n return this.addMutator(alphaOnlyMutator);\n }\n\n /** Convert to only alphanumeric characters */\n public toAlphanumeric() {\n return this.addMutator(alphanumericOnlyMutator);\n }\n\n /** Remove all numeric characters */\n public removeNumbers() {\n return this.addMutator(removeNumbersMutator);\n }\n\n /** URL decode */\n public urlDecode() {\n return this.addMutator(urlDecodeMutator);\n }\n\n /** URL encode */\n public urlEncode() {\n return this.addMutator(urlEncodeMutator);\n }\n\n /** Convert to URL-friendly slug */\n public slug() {\n return this.addMutator(slugMutator);\n }\n\n /** Base64 encode */\n public base64Encode() {\n return this.addMutator(base64EncodeMutator);\n }\n\n /** Base64 decode */\n public base64Decode() {\n return this.addMutator(base64DecodeMutator);\n }\n\n /** Replace substring or pattern */\n public replace(search: string | RegExp, replace: string) {\n return this.addMutator(replaceMutator, { search, replace });\n }\n\n /** Replace all occurrences of substring or pattern */\n public replaceAll(search: string | RegExp, replace: string) {\n return this.addMutator(replaceAllMutator, { search, replace });\n }\n\n /** Append/suffix text to the end */\n public append(suffix: string) {\n return this.addMutator(appendMutator, { suffix });\n }\n\n /** Prepend/prefix text to the beginning */\n public prepend(prefix: string) {\n return this.addMutator(prependMutator, { prefix });\n }\n\n /** Reverse the string */\n public reverse() {\n return this.addMutator(reverseMutator);\n }\n\n /** Truncate to a maximum length */\n public truncate(maxLength: number, suffix = \"...\") {\n return this.addMutator(truncateMutator, { maxLength, suffix });\n }\n\n /** Repeat string N times */\n public repeat(count: number) {\n return this.addMutator(repeatMutator, { count });\n }\n\n /** Mask part of string */\n public mask(start: number, end?: number, char = \"*\") {\n return this.addMutator(maskMutator, { start, end, char });\n }\n\n // ==================== Validation Rules ====================\n\n /** Value must be a valid email */\n public email(errorMessage?: string) {\n return this.addRule(emailRule, errorMessage);\n }\n\n /** Value must be a valid URL */\n public url(errorMessage?: string) {\n return this.addRule(urlRule, errorMessage);\n }\n\n /** Value can not have whitespace */\n public withoutWhitespace(errorMessage?: string) {\n return this.addRule(withoutWhitespaceRule, errorMessage);\n }\n\n /** Value must match the given pattern */\n public pattern(pattern: RegExp, errorMessage?: string) {\n return this.addRule(patternRule, errorMessage, { pattern });\n }\n\n /**\n * Value must be a strong password\n * Requirements:\n * - At least 8 characters\n * - At least 1 uppercase letter\n * - At least 1 lowercase letter\n * - At least 1 number\n * - At least 1 special character\n */\n public strongPassword(minLength?: number, errorMessage?: string) {\n return this.addRule(strongPasswordRule, errorMessage, { minLength });\n }\n\n /** Value must be exactly the given number of words */\n public words(words: number, errorMessage?: string) {\n return this.addRule(wordsRule, errorMessage, { words });\n }\n\n /** Value must be at least the given number of words */\n public minWords(words: number, errorMessage?: string) {\n return this.addRule(minWordsRule, errorMessage, { minWords: words });\n }\n\n /** Value must be at most the given number of words */\n public maxWords(words: number, errorMessage?: string) {\n return this.addRule(maxWordsRule, errorMessage, { maxWords: words });\n }\n\n /** Value length must be greater than the given length */\n public minLength(length: number, errorMessage?: string) {\n return this.addRule(minLengthRule, errorMessage, { minLength: length });\n }\n\n /** @alias minLength */\n public min(min: number, errorMessage?: string) {\n return this.minLength(min, errorMessage);\n }\n\n /** Value length must be less than the given length */\n public maxLength(length: number, errorMessage?: string) {\n return this.addRule(maxLengthRule, errorMessage, { maxLength: length });\n }\n\n /** @alias maxLength */\n public max(max: number, errorMessage?: string) {\n return this.maxLength(max, errorMessage);\n }\n\n /** Value must be of the given length */\n public length(length: number, errorMessage?: string) {\n return this.addRule(lengthRule, errorMessage, { length });\n }\n\n /**\n * String length must be between min and max (inclusive)\n *\n * @param min - Minimum length (inclusive)\n * @param max - Maximum length (inclusive)\n *\n * @example\n * ```ts\n * v.string().between(5, 10) // Length: 5 to 10 characters\n * v.string().lengthBetween(8, 20) // Same using alias\n * ```\n *\n * @category Validation Rule\n */\n public lengthBetween(min: number, max: number, errorMessage?: string) {\n return this.addRule(betweenLengthRule, errorMessage, {\n minLength: min,\n maxLength: max,\n });\n }\n\n /** Allow only alphabetic characters */\n public alpha(errorMessage?: string) {\n return this.addRule(alphaRule, errorMessage);\n }\n\n /** Allow only alphanumeric characters */\n public alphanumeric(errorMessage?: string) {\n return this.addRule(alphaNumericRule, errorMessage);\n }\n\n /** Allow only numeric characters */\n public numeric(errorMessage?: string) {\n return this.addRule(isNumericRule, errorMessage);\n }\n\n /** Value must starts with the given string */\n public startsWith(value: string, errorMessage?: string) {\n return this.addRule(startsWithRule, errorMessage, { value });\n }\n\n /** Value must ends with the given string */\n public endsWith(value: string, errorMessage?: string) {\n return this.addRule(endsWithRule, errorMessage, { value });\n }\n\n /** Value must contain the given string */\n public contains(value: string, errorMessage?: string) {\n return this.addRule(containsRule, errorMessage, { value });\n }\n\n /** Value must not contain the given string */\n public notContains(value: string, errorMessage?: string) {\n return this.addRule(notContainsRule, errorMessage, { value });\n }\n\n /** Value must be a valid IP address */\n public ip(errorMessage?: string) {\n return this.addRule(ipRule, errorMessage);\n }\n\n /** Value must be a valid IPv4 address */\n public ip4(errorMessage?: string) {\n return this.addRule(ip4Rule, errorMessage);\n }\n\n /** Value must be a valid IPv6 address */\n public ip6(errorMessage?: string) {\n return this.addRule(ip6Rule, errorMessage);\n }\n\n /** Check if the string matches a credit card number */\n public creditCard(errorMessage?: string) {\n return this.addRule(isCreditCardRule, errorMessage);\n }\n\n /** Determine if the value is a valid color */\n public color(errorMessage?: string) {\n return this.addRule(colorRule, errorMessage);\n }\n\n /** Determine if the value is a valid hex color */\n public hexColor(errorMessage?: string) {\n return this.addRule(hexColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid HSL color */\n public hslColor(errorMessage?: string) {\n return this.addRule(hslColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid RGB color */\n public rgbColor(errorMessage?: string) {\n return this.addRule(rgbColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid RGBA color */\n public rgbaColor(errorMessage?: string) {\n return this.addRule(rgbaColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid light color */\n public lightColor(errorMessage?: string) {\n return this.addRule(lightColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid dark color */\n public darkColor(errorMessage?: string) {\n return this.addRule(darkColorRule, errorMessage);\n }\n\n // ==================== ID Format Rules ====================\n\n /**\n * Value must be a valid UUID. Optionally restrict to a specific version.\n *\n * @example\n * v.string().uuid() // any RFC 4122 UUID\n * v.string().uuid(4) // only v4 (random)\n * v.string().uuid(7) // only v7 (timestamp-ordered)\n */\n public uuid(version?: UUIDVersion, errorMessage?: string) {\n return this.addRule(uuidRule, errorMessage, { version });\n }\n\n /**\n * Value must be a valid CUID. Defaults to CUID2; pass `{ version: 1 }` for legacy.\n *\n * @example\n * v.string().cuid() // CUID2\n * v.string().cuid({ version: 1 }) // legacy CUID1\n */\n public cuid(options?: { version?: 1 | 2; errorMessage?: string }) {\n const { errorMessage, version } = options ?? {};\n return this.addRule(cuidRule, errorMessage, { version });\n }\n\n /** Value must be a valid ULID (26 chars, Crockford base32). */\n public ulid(errorMessage?: string) {\n return this.addRule(ulidRule, errorMessage);\n }\n\n /**\n * Value must be a valid nanoid string. Default length is 21.\n *\n * @example\n * v.string().nanoid() // 21 chars (default)\n * v.string().nanoid(10) // 10 chars\n */\n public nanoid(length?: number, errorMessage?: string) {\n return this.addRule(nanoidRule, errorMessage, { length });\n }\n\n /**\n * @inheritdoc\n *\n * Maps String-specific rule options to JSON Schema keywords.\n * Non-representable rules (cross-field, refine, color rules, etc.) are silently omitted.\n *\n * @example\n * ```ts\n * v.string().min(2).max(100).email().toJsonSchema(\"draft-2020-12\")\n * // → { type: \"string\", minLength: 2, maxLength: 100, format: \"email\" }\n * ```\n */\n public override toJsonSchema(target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n const schema: JsonSchemaResult = { type: \"string\" };\n\n // minLength / min\n const minOpts = getRuleOptions(this.rules, \"minLength\");\n if (minOpts?.minLength !== undefined) schema.minLength = minOpts.minLength;\n\n // maxLength / max\n const maxOpts = getRuleOptions(this.rules, \"maxLength\");\n if (maxOpts?.maxLength !== undefined) schema.maxLength = maxOpts.maxLength;\n\n // betweenLength covers both min and max in one rule\n const betweenOpts = getRuleOptions(this.rules, \"betweenLength\");\n if (betweenOpts) {\n if (betweenOpts.minLength !== undefined) schema.minLength = betweenOpts.minLength;\n if (betweenOpts.maxLength !== undefined) schema.maxLength = betweenOpts.maxLength;\n }\n\n // exact length\n const lengthOpts = getRuleOptions(this.rules, \"length\");\n if (lengthOpts?.length !== undefined) {\n schema.minLength = lengthOpts.length;\n schema.maxLength = lengthOpts.length;\n }\n\n // pattern (regex)\n const patternOpts = getRuleOptions(this.rules, \"pattern\");\n if (patternOpts?.pattern instanceof RegExp) {\n schema.pattern = patternOpts.pattern.source;\n }\n\n // format hints\n if (\n getRuleOptions(this.rules, \"email\") !== undefined ||\n this.rules.some((r) => r.name === \"email\")\n ) {\n schema.format = \"email\";\n } else if (this.rules.some((r) => r.name === \"url\")) {\n schema.format = \"uri\";\n } else if (this.rules.some((r) => r.name === \"ip\")) {\n schema.format = \"ipv4\";\n } else if (this.rules.some((r) => r.name === \"ip4\")) {\n schema.format = \"ipv4\";\n } else if (this.rules.some((r) => r.name === \"ip6\")) {\n schema.format = \"ipv6\";\n } else if (this.rules.some((r) => r.name === \"uuid\")) {\n schema.format = \"uuid\";\n } else if (this.rules.some((r) => r.name === \"hexColor\")) {\n schema.format = \"color\";\n }\n\n // CUID / ULID / nanoid don't have widely-supported format keywords —\n // fall back to pattern so JSON Schema validators still enforce shape.\n if (!schema.format) {\n const cuidOpts = getRuleOptions(this.rules, \"cuid\");\n if (cuidOpts) {\n schema.pattern = cuidOpts.version === 1 ? \"^c[a-z0-9]{24,}$\" : \"^[a-z][a-z0-9]{23}$\";\n }\n if (this.rules.some((r) => r.name === \"ulid\")) {\n schema.pattern = \"^[0-9A-HJKMNP-TV-Z]{26}$\";\n }\n const nanoidOpts = getRuleOptions(this.rules, \"nanoid\");\n if (nanoidOpts) {\n const len = (nanoidOpts.length as number | undefined) ?? 21;\n schema.pattern = `^[A-Za-z0-9_-]{${len}}$`;\n }\n }\n\n // enum (from PrimitiveValidator.in / .enum)\n const inOpts = getRuleOptions(this.rules, \"in\");\n if (inOpts?.values && Array.isArray(inOpts.values)) {\n schema.enum = inOpts.values;\n }\n\n if (this.isNullable) applyNullable(schema, target);\n\n return schema;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"string-validator.mjs","names":[],"sources":["../../../../../../../../packages/seal/src/validators/string-validator.ts"],"sourcesContent":["import {\n alphaOnlyMutator,\n alphanumericOnlyMutator,\n appendMutator,\n base64DecodeMutator,\n base64EncodeMutator,\n camelCaseMutator,\n capitalizeMutator,\n htmlEscapeMutator,\n kebabCaseMutator,\n lowercaseMutator,\n ltrimMutator,\n maskMutator,\n padEndMutator,\n padStartMutator,\n pascalCaseMutator,\n prependMutator,\n removeNumbersMutator,\n removeSpecialCharactersMutator,\n repeatMutator,\n replaceAllMutator,\n replaceMutator,\n reverseMutator,\n rtrimMutator,\n slugMutator,\n snakeCaseMutator,\n stringifyMutator,\n stripTagsMutator,\n titleCaseMutator,\n trimMultipleWhitespaceMutator,\n trimMutator,\n truncateMutator,\n unescapeHtmlMutator,\n uppercaseMutator,\n urlDecodeMutator,\n urlEncodeMutator,\n} from \"../mutators/string-mutators\";\nimport { alphaNumericRule, alphaRule, isNumericRule } from \"../rules/string/alpha\";\nimport { isCreditCardRule } from \"../rules/string/credit-card\";\nimport { emailRule } from \"../rules/string/email\";\nimport { cuidRule, nanoidRule, ulidRule, uuidRule } from \"../rules/string/id-formats\";\nimport { ip4Rule, ip6Rule, ipRule } from \"../rules/string/ip\";\nimport {\n containsRule,\n endsWithRule,\n notContainsRule,\n startsWithRule,\n} from \"../rules/string/string-comparison\";\nimport { patternRule } from \"../rules/string/pattern\";\nimport { strongPasswordRule } from \"../rules/string/strong-password-rule\";\nimport { urlRule } from \"../rules/string/url\";\nimport { withoutWhitespaceRule } from \"../rules/string/without-whitespace\";\nimport type { UUIDVersion } from \"../rules/string/id-formats\";\nimport {\n betweenLengthRule,\n lengthRule,\n maxLengthRule,\n maxWordsRule,\n minLengthRule,\n minWordsRule,\n wordsRule,\n} from \"../rules/length\";\nimport {\n colorRule,\n darkColorRule,\n hexColorRule,\n hslColorRule,\n lightColorRule,\n rgbColorRule,\n rgbaColorRule,\n} from \"../rules/color\";\nimport { stringRule } from \"../rules/common/type-rules\";\nimport { PrimitiveValidator } from \"./primitive-validator\";\nimport { applyNullable, getRuleOptions } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * String validator class\n */\nexport class StringValidator extends PrimitiveValidator {\n public constructor(errorMessage?: string) {\n super();\n this.addMutableRule(stringRule, errorMessage);\n }\n\n /**\n * Check if value is a string type\n */\n public matchesType(value: any): boolean {\n return typeof value === \"string\";\n }\n\n // ==================== Mutators ====================\n\n /**\n * Stringify the value if not a string\n */\n public toString() {\n return this.addMutator(stringifyMutator);\n }\n\n /** Convert string to uppercase */\n public uppercase() {\n return this.addMutator(uppercaseMutator);\n }\n\n /** Convert string to lowercase */\n public lowercase() {\n return this.addMutator(lowercaseMutator);\n }\n\n /** Capitalize only the first letter of the string */\n public capitalize() {\n return this.addMutator(capitalizeMutator);\n }\n\n /** Capitalize the first letter of each word (Title Case) */\n public titleCase() {\n return this.addMutator(titleCaseMutator);\n }\n\n /** Convert to camelCase */\n public camelCase() {\n return this.addMutator(camelCaseMutator);\n }\n\n /** Convert to PascalCase */\n public pascalCase() {\n return this.addMutator(pascalCaseMutator);\n }\n\n /** Convert to snake_case */\n public snakeCase() {\n return this.addMutator(snakeCaseMutator);\n }\n\n /** Convert to kebab-case */\n public kebabCase() {\n return this.addMutator(kebabCaseMutator);\n }\n\n /**\n * Trim the given needle from the string\n * If no needle is provided, the default is a single space\n */\n public trim(needle?: string) {\n return this.addMutator(trimMutator, { needle });\n }\n\n /** Trim from the left/start */\n public ltrim(needle?: string) {\n return this.addMutator(ltrimMutator, { needle });\n }\n\n /** Trim from the right/end */\n public rtrim(needle?: string) {\n return this.addMutator(rtrimMutator, { needle });\n }\n\n /** Trim multiple whitespace into single space */\n public trimMultipleWhitespace() {\n return this.addMutator(trimMultipleWhitespaceMutator);\n }\n\n /** Pad string from the start to reach target length */\n public padStart(length: number, char = \" \") {\n return this.addMutator(padStartMutator, { length, char });\n }\n\n /** Pad string from the end to reach target length */\n public padEnd(length: number, char = \" \") {\n return this.addMutator(padEndMutator, { length, char });\n }\n\n /**\n * Strip HTML tags with a naive `<...>` regex.\n *\n * This is a **tag stripper, not an XSS sanitizer**: it is not a parser,\n * so malformed/nested markup or content re-introduced later in a\n * pipeline can defeat it. Do not rely on this alone to make untrusted\n * rich text safe to render — use a real parser-based sanitizer (e.g.\n * DOMPurify / sanitize-html) for that.\n */\n public stripTags() {\n return this.addMutator(stripTagsMutator);\n }\n\n /**\n * @deprecated Renamed to {@link StringValidator.stripTags} — the old\n * name implied XSS safety this tag-stripping regex does not provide.\n * Kept as an alias for backward compatibility; switch to `.stripTags()`.\n */\n public safeHtml() {\n return this.stripTags();\n }\n\n /** HTML escape special characters */\n public htmlEscape() {\n return this.addMutator(htmlEscapeMutator);\n }\n\n /** Unescape HTML entities */\n public unescapeHtml() {\n return this.addMutator(unescapeHtmlMutator);\n }\n\n /**\n * Remove special characters\n * This will remove all characters that are not alphanumeric or whitespace\n */\n public removeSpecialCharacters() {\n return this.addMutator(removeSpecialCharactersMutator);\n }\n\n /** Convert to only alphabetic characters */\n public toAlpha() {\n return this.addMutator(alphaOnlyMutator);\n }\n\n /** Convert to only alphanumeric characters */\n public toAlphanumeric() {\n return this.addMutator(alphanumericOnlyMutator);\n }\n\n /** Remove all numeric characters */\n public removeNumbers() {\n return this.addMutator(removeNumbersMutator);\n }\n\n /** URL decode */\n public urlDecode() {\n return this.addMutator(urlDecodeMutator);\n }\n\n /** URL encode */\n public urlEncode() {\n return this.addMutator(urlEncodeMutator);\n }\n\n /** Convert to URL-friendly slug */\n public slug() {\n return this.addMutator(slugMutator);\n }\n\n /** Base64 encode */\n public base64Encode() {\n return this.addMutator(base64EncodeMutator);\n }\n\n /** Base64 decode */\n public base64Decode() {\n return this.addMutator(base64DecodeMutator);\n }\n\n /** Replace substring or pattern */\n public replace(search: string | RegExp, replace: string) {\n return this.addMutator(replaceMutator, { search, replace });\n }\n\n /** Replace all occurrences of substring or pattern */\n public replaceAll(search: string | RegExp, replace: string) {\n return this.addMutator(replaceAllMutator, { search, replace });\n }\n\n /** Append/suffix text to the end */\n public append(suffix: string) {\n return this.addMutator(appendMutator, { suffix });\n }\n\n /** Prepend/prefix text to the beginning */\n public prepend(prefix: string) {\n return this.addMutator(prependMutator, { prefix });\n }\n\n /** Reverse the string */\n public reverse() {\n return this.addMutator(reverseMutator);\n }\n\n /** Truncate to a maximum length */\n public truncate(maxLength: number, suffix = \"...\") {\n return this.addMutator(truncateMutator, { maxLength, suffix });\n }\n\n /** Repeat string N times */\n public repeat(count: number) {\n return this.addMutator(repeatMutator, { count });\n }\n\n /** Mask part of string */\n public mask(start: number, end?: number, char = \"*\") {\n return this.addMutator(maskMutator, { start, end, char });\n }\n\n // ==================== Validation Rules ====================\n\n /** Value must be a valid email */\n public email(errorMessage?: string) {\n return this.addRule(emailRule, errorMessage);\n }\n\n /** Value must be a valid URL */\n public url(errorMessage?: string) {\n return this.addRule(urlRule, errorMessage);\n }\n\n /** Value can not have whitespace */\n public withoutWhitespace(errorMessage?: string) {\n return this.addRule(withoutWhitespaceRule, errorMessage);\n }\n\n /** Value must match the given pattern */\n public pattern(pattern: RegExp, errorMessage?: string) {\n return this.addRule(patternRule, errorMessage, { pattern });\n }\n\n /**\n * Value must be a strong password\n * Requirements:\n * - At least 8 characters\n * - At least 1 uppercase letter\n * - At least 1 lowercase letter\n * - At least 1 number\n * - At least 1 special character\n */\n public strongPassword(minLength?: number, errorMessage?: string) {\n return this.addRule(strongPasswordRule, errorMessage, { minLength });\n }\n\n /** Value must be exactly the given number of words */\n public words(words: number, errorMessage?: string) {\n return this.addRule(wordsRule, errorMessage, { words });\n }\n\n /** Value must be at least the given number of words */\n public minWords(words: number, errorMessage?: string) {\n return this.addRule(minWordsRule, errorMessage, { minWords: words });\n }\n\n /** Value must be at most the given number of words */\n public maxWords(words: number, errorMessage?: string) {\n return this.addRule(maxWordsRule, errorMessage, { maxWords: words });\n }\n\n /** Value length must be greater than the given length */\n public minLength(length: number, errorMessage?: string) {\n return this.addRule(minLengthRule, errorMessage, { minLength: length });\n }\n\n /** @alias minLength */\n public min(min: number, errorMessage?: string) {\n return this.minLength(min, errorMessage);\n }\n\n /** Value length must be less than the given length */\n public maxLength(length: number, errorMessage?: string) {\n return this.addRule(maxLengthRule, errorMessage, { maxLength: length });\n }\n\n /** @alias maxLength */\n public max(max: number, errorMessage?: string) {\n return this.maxLength(max, errorMessage);\n }\n\n /** Value must be of the given length */\n public length(length: number, errorMessage?: string) {\n return this.addRule(lengthRule, errorMessage, { length });\n }\n\n /**\n * String length must be between min and max (inclusive)\n *\n * @param min - Minimum length (inclusive)\n * @param max - Maximum length (inclusive)\n *\n * @example\n * ```ts\n * v.string().between(5, 10) // Length: 5 to 10 characters\n * v.string().lengthBetween(8, 20) // Same using alias\n * ```\n *\n * @category Validation Rule\n */\n public lengthBetween(min: number, max: number, errorMessage?: string) {\n return this.addRule(betweenLengthRule, errorMessage, {\n minLength: min,\n maxLength: max,\n });\n }\n\n /** Allow only alphabetic characters */\n public alpha(errorMessage?: string) {\n return this.addRule(alphaRule, errorMessage);\n }\n\n /** Allow only alphanumeric characters */\n public alphanumeric(errorMessage?: string) {\n return this.addRule(alphaNumericRule, errorMessage);\n }\n\n /** Allow only numeric characters */\n public numeric(errorMessage?: string) {\n return this.addRule(isNumericRule, errorMessage);\n }\n\n /** Value must starts with the given string */\n public startsWith(value: string, errorMessage?: string) {\n return this.addRule(startsWithRule, errorMessage, { value });\n }\n\n /** Value must ends with the given string */\n public endsWith(value: string, errorMessage?: string) {\n return this.addRule(endsWithRule, errorMessage, { value });\n }\n\n /** Value must contain the given string */\n public contains(value: string, errorMessage?: string) {\n return this.addRule(containsRule, errorMessage, { value });\n }\n\n /** Value must not contain the given string */\n public notContains(value: string, errorMessage?: string) {\n return this.addRule(notContainsRule, errorMessage, { value });\n }\n\n /** Value must be a valid IP address */\n public ip(errorMessage?: string) {\n return this.addRule(ipRule, errorMessage);\n }\n\n /** Value must be a valid IPv4 address */\n public ip4(errorMessage?: string) {\n return this.addRule(ip4Rule, errorMessage);\n }\n\n /** Value must be a valid IPv6 address */\n public ip6(errorMessage?: string) {\n return this.addRule(ip6Rule, errorMessage);\n }\n\n /** Check if the string matches a credit card number */\n public creditCard(errorMessage?: string) {\n return this.addRule(isCreditCardRule, errorMessage);\n }\n\n /** Determine if the value is a valid color */\n public color(errorMessage?: string) {\n return this.addRule(colorRule, errorMessage);\n }\n\n /** Determine if the value is a valid hex color */\n public hexColor(errorMessage?: string) {\n return this.addRule(hexColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid HSL color */\n public hslColor(errorMessage?: string) {\n return this.addRule(hslColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid RGB color */\n public rgbColor(errorMessage?: string) {\n return this.addRule(rgbColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid RGBA color */\n public rgbaColor(errorMessage?: string) {\n return this.addRule(rgbaColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid light color */\n public lightColor(errorMessage?: string) {\n return this.addRule(lightColorRule, errorMessage);\n }\n\n /** Determine if the value is a valid dark color */\n public darkColor(errorMessage?: string) {\n return this.addRule(darkColorRule, errorMessage);\n }\n\n // ==================== ID Format Rules ====================\n\n /**\n * Value must be a valid UUID. Optionally restrict to a specific version.\n *\n * @example\n * v.string().uuid() // any RFC 4122 UUID\n * v.string().uuid(4) // only v4 (random)\n * v.string().uuid(7) // only v7 (timestamp-ordered)\n */\n public uuid(version?: UUIDVersion, errorMessage?: string) {\n return this.addRule(uuidRule, errorMessage, { version });\n }\n\n /**\n * Value must be a valid CUID. Defaults to CUID2; pass `{ version: 1 }` for legacy.\n *\n * @example\n * v.string().cuid() // CUID2\n * v.string().cuid({ version: 1 }) // legacy CUID1\n */\n public cuid(options?: { version?: 1 | 2; errorMessage?: string }) {\n const { errorMessage, version } = options ?? {};\n return this.addRule(cuidRule, errorMessage, { version });\n }\n\n /** Value must be a valid ULID (26 chars, Crockford base32). */\n public ulid(errorMessage?: string) {\n return this.addRule(ulidRule, errorMessage);\n }\n\n /**\n * Value must be a valid nanoid string. Default length is 21.\n *\n * @example\n * v.string().nanoid() // 21 chars (default)\n * v.string().nanoid(10) // 10 chars\n */\n public nanoid(length?: number, errorMessage?: string) {\n return this.addRule(nanoidRule, errorMessage, { length });\n }\n\n /**\n * @inheritdoc\n *\n * Maps String-specific rule options to JSON Schema keywords.\n * Non-representable rules (cross-field, refine, color rules, etc.) are silently omitted.\n *\n * @example\n * ```ts\n * v.string().min(2).max(100).email().toJsonSchema(\"draft-2020-12\")\n * // → { type: \"string\", minLength: 2, maxLength: 100, format: \"email\" }\n * ```\n */\n public override toJsonSchema(target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n const schema: JsonSchemaResult = { type: \"string\" };\n\n // minLength / min\n const minOpts = getRuleOptions(this.rules, \"minLength\");\n if (minOpts?.minLength !== undefined) schema.minLength = minOpts.minLength;\n\n // maxLength / max\n const maxOpts = getRuleOptions(this.rules, \"maxLength\");\n if (maxOpts?.maxLength !== undefined) schema.maxLength = maxOpts.maxLength;\n\n // betweenLength covers both min and max in one rule\n const betweenOpts = getRuleOptions(this.rules, \"betweenLength\");\n if (betweenOpts) {\n if (betweenOpts.minLength !== undefined) schema.minLength = betweenOpts.minLength;\n if (betweenOpts.maxLength !== undefined) schema.maxLength = betweenOpts.maxLength;\n }\n\n // exact length\n const lengthOpts = getRuleOptions(this.rules, \"length\");\n if (lengthOpts?.length !== undefined) {\n schema.minLength = lengthOpts.length;\n schema.maxLength = lengthOpts.length;\n }\n\n // pattern (regex)\n const patternOpts = getRuleOptions(this.rules, \"pattern\");\n if (patternOpts?.pattern instanceof RegExp) {\n schema.pattern = patternOpts.pattern.source;\n }\n\n // format hints\n if (\n getRuleOptions(this.rules, \"email\") !== undefined ||\n this.rules.some((r) => r.name === \"email\")\n ) {\n schema.format = \"email\";\n } else if (this.rules.some((r) => r.name === \"url\")) {\n schema.format = \"uri\";\n } else if (this.rules.some((r) => r.name === \"ip\")) {\n schema.format = \"ipv4\";\n } else if (this.rules.some((r) => r.name === \"ip4\")) {\n schema.format = \"ipv4\";\n } else if (this.rules.some((r) => r.name === \"ip6\")) {\n schema.format = \"ipv6\";\n } else if (this.rules.some((r) => r.name === \"uuid\")) {\n schema.format = \"uuid\";\n } else if (this.rules.some((r) => r.name === \"hexColor\")) {\n schema.format = \"color\";\n }\n\n // CUID / ULID / nanoid don't have widely-supported format keywords —\n // fall back to pattern so JSON Schema validators still enforce shape.\n if (!schema.format) {\n const cuidOpts = getRuleOptions(this.rules, \"cuid\");\n if (cuidOpts) {\n schema.pattern = cuidOpts.version === 1 ? \"^c[a-z0-9]{24,}$\" : \"^[a-z][a-z0-9]{23}$\";\n }\n if (this.rules.some((r) => r.name === \"ulid\")) {\n schema.pattern = \"^[0-9A-HJKMNP-TV-Z]{26}$\";\n }\n const nanoidOpts = getRuleOptions(this.rules, \"nanoid\");\n if (nanoidOpts) {\n const len = (nanoidOpts.length as number | undefined) ?? 21;\n schema.pattern = `^[A-Za-z0-9_-]{${len}}$`;\n }\n }\n\n // enum (from PrimitiveValidator.in / .enum)\n const inOpts = getRuleOptions(this.rules, \"in\");\n if (inOpts?.values && Array.isArray(inOpts.values)) {\n schema.enum = inOpts.values;\n }\n\n if (this.isNullable) applyNullable(schema, target);\n\n return schema;\n }\n}\n"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { SchemaContext } from "../types/context-types.mjs";
3
3
  import { ValidationResult } from "../types/result-types.mjs";
4
4
  import { BaseValidator } from "./base-validator.mjs";
5
5
 
6
- //#region ../seal/src/validators/tuple-validator.d.ts
6
+ //#region ../../packages/seal/src/validators/tuple-validator.d.ts
7
7
  /**
8
8
  * Tuple validator class - validates fixed-length arrays with position-specific types
9
9
  *
@@ -1 +1 @@
1
- {"version":3,"file":"tuple-validator.d.mts","names":[],"sources":["../../../../../../../seal/src/validators/tuple-validator.ts"],"mappings":";;;;;;;;;;AAsBA;;;;;;;;;;;cAAa,cAAA,SAAuB,aAAA;EAEzB,UAAA,EAAY,aAAA;cAAZ,UAAA,EAAY,aAAA,IACnB,YAAA;EADO;;;EAUF,WAAA,CAAY,KAAA;EAVV;;;EAiBO,KAAA;EAAA;;;;;;;;EAcH,QAAA,CAAS,IAAA,OAAW,OAAA,EAAS,aAAA,GAAgB,OAAA,CAAQ,gBAAA;EAgFrC;;;AAA6D;;;;;;;;;;;;;;;;;EAA1E,YAAA,CAAa,MAAA,GAAQ,gBAAA,GAAqC,gBAAA;AAAA"}
1
+ {"version":3,"file":"tuple-validator.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/validators/tuple-validator.ts"],"mappings":";;;;;;;;;AAsBA;;;;;;;;;;;;cAAa,cAAA,SAAuB,aAAA;EAEzB,UAAA,EAAY,aAAA;cAAZ,UAAA,EAAY,aAAA,IACnB,YAAA;EADmB;;;EAUd,WAAA,CAAY,KAAA;EATjB;;;EAgBc,KAAA;EAcH;;;;;;;;EAAA,QAAA,CAAS,IAAA,OAAW,OAAA,EAAS,aAAA,GAAgB,OAAA,CAAQ,gBAAA;EAgFQ;;AAAgB;;;;;;;;;;;;;;;;;;EAA1E,YAAA,CAAa,MAAA,GAAQ,gBAAA,GAAqC,gBAAA;AAAA"}
@@ -5,7 +5,7 @@ import { BaseValidator } from "./base-validator.mjs";
5
5
  import { arrayRule } from "../rules/common/type-rules.mjs";
6
6
  import "../rules/index.mjs";
7
7
 
8
- //#region ../seal/src/validators/tuple-validator.ts
8
+ //#region ../../packages/seal/src/validators/tuple-validator.ts
9
9
  /**
10
10
  * Tuple validator class - validates fixed-length arrays with position-specific types
11
11
  *
@@ -1 +1 @@
1
- {"version":3,"file":"tuple-validator.mjs","names":[],"sources":["../../../../../../../seal/src/validators/tuple-validator.ts"],"sourcesContent":["import { setKeyPath } from \"../helpers\";\nimport { arrayRule } from \"../rules\";\nimport type { SchemaContext, ValidationResult } from \"../types\";\nimport { BaseValidator } from \"./base-validator\";\nimport { applyNullable } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * Tuple validator class - validates fixed-length arrays with position-specific types\n *\n * @example\n * ```ts\n * // RGB color tuple\n * v.tuple([v.number(), v.number(), v.number()])\n * // Valid: [255, 128, 0]\n * // Invalid: [255, 128] (too short)\n *\n * // Mixed types\n * v.tuple([v.string(), v.int(), v.boolean()])\n * // Valid: [\"John\", 25, true]\n * ```\n */\nexport class TupleValidator extends BaseValidator {\n public constructor(\n public validators: BaseValidator[],\n errorMessage?: string,\n ) {\n super();\n this.addMutableRule(arrayRule, errorMessage);\n }\n\n /**\n * Check if value is an array type\n */\n public matchesType(value: any): boolean {\n return Array.isArray(value);\n }\n\n /**\n * Clone the validator\n */\n public override clone(): this {\n const cloned = super.clone();\n cloned.validators = this.validators.map((v) => v.clone());\n return cloned;\n }\n\n /**\n * Validate tuple - check length then validate each position\n *\n * Absent input (and absent without `.default()`) propagates as `data: undefined`\n * so the parent ObjectValidator can omit the key. Without this, optional tuple\n * fields would silently materialise as `[]` in the validated output and then\n * fail the length check.\n */\n public async validate(data: any, context: SchemaContext): Promise<ValidationResult> {\n // Apply default when absent, then mutate. Mirrors BaseValidator's\n // `valueForRules = data ?? this.getDefaultValue()` so `.default([...])`\n // works on tuples too.\n const valueForRules = data ?? this.getDefaultValue();\n const mutatedData = await this.mutate(valueForRules, context);\n\n const result = await super.validate(data, context);\n\n if (result.isValid === false) return result;\n\n // Nothing to iterate for absent (no default) or null (nullable) inputs —\n // propagate so the parent ObjectValidator can omit the key.\n if (mutatedData === undefined || mutatedData === null) return result;\n\n // Defensive: type rule (arrayRule) should have failed for non-arrays.\n if (!Array.isArray(mutatedData)) return result;\n\n const errors: ValidationResult[\"errors\"] = [];\n\n // Tuple-specific: length validation\n if (mutatedData.length !== this.validators.length) {\n errors.push({\n type: \"tuple\",\n input: context.key || \"value\",\n error: `Expected exactly ${this.validators.length} items, but got ${mutatedData.length}`,\n });\n return { isValid: false, errors, data: mutatedData };\n }\n\n // Validate each position with its specific validator in parallel\n const validationPromises = this.validators.map(async (validator, index) => {\n const childContext: SchemaContext = {\n ...context,\n parent: mutatedData,\n value: mutatedData[index],\n key: index.toString(),\n path: setKeyPath(context.path, index.toString()),\n };\n\n const childResult = await validator.validate(mutatedData[index], childContext);\n\n // Update mutated data with validated result\n mutatedData[index] = childResult.data;\n\n // Collect errors from this element\n if (childResult.isValid === false) {\n errors.push(...childResult.errors);\n }\n });\n\n await Promise.all(validationPromises);\n\n return {\n isValid: errors.length === 0,\n errors,\n data: await this.startTransformationPipeline(mutatedData, context),\n };\n }\n\n /**\n * @inheritdoc\n *\n * Tuple keyword diverges between targets:\n * - `draft-2020-12` → `prefixItems` + `items: false` (exact length enforced)\n * - `draft-07` → `items` as array + `additionalItems: false`\n * - `openapi-3.0` → same as draft-07 (OpenAPI 3.0 is based on draft-07)\n *\n * @example\n * ```ts\n * v.tuple([v.string(), v.int(), v.boolean()]).toJsonSchema(\"draft-2020-12\")\n * // → {\n * // type: \"array\",\n * // prefixItems: [{ type: \"string\" }, { type: \"integer\" }, { type: \"boolean\" }],\n * // items: false,\n * // minItems: 3,\n * // maxItems: 3\n * // }\n * ```\n */\n public override toJsonSchema(target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n const itemSchemas = this.validators.map(v => v.toJsonSchema(target));\n const length = this.validators.length;\n\n const schema: JsonSchemaResult = {\n type: \"array\",\n minItems: length,\n maxItems: length,\n };\n\n if (target === \"draft-2020-12\") {\n // prefixItems is the draft-2020-12 keyword for positional tuple items\n schema.prefixItems = itemSchemas;\n schema.items = false; // no additional items beyond the tuple\n } else {\n // draft-07 and openapi-3.0: items as array + additionalItems: false\n schema.items = itemSchemas;\n schema.additionalItems = false;\n }\n\n if (this.isNullable) applyNullable(schema, target);\n\n return schema;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAsBA,IAAa,iBAAb,cAAoC,cAAc;CAChD,AAAO,YACL,AAAO,YACP,cACA;EACA,MAAM;EAHC;EAIP,KAAK,eAAe,WAAW,YAAY;CAC7C;;;;CAKA,AAAO,YAAY,OAAqB;EACtC,OAAO,MAAM,QAAQ,KAAK;CAC5B;;;;CAKA,AAAgB,QAAc;EAC5B,MAAM,SAAS,MAAM,MAAM;EAC3B,OAAO,aAAa,KAAK,WAAW,KAAK,MAAM,EAAE,MAAM,CAAC;EACxD,OAAO;CACT;;;;;;;;;CAUA,MAAa,SAAS,MAAW,SAAmD;EAIlF,MAAM,gBAAgB,QAAQ,KAAK,gBAAgB;EACnD,MAAM,cAAc,MAAM,KAAK,OAAO,eAAe,OAAO;EAE5D,MAAM,SAAS,MAAM,MAAM,SAAS,MAAM,OAAO;EAEjD,IAAI,OAAO,YAAY,OAAO,OAAO;EAIrC,IAAI,gBAAgB,UAAa,gBAAgB,MAAM,OAAO;EAG9D,IAAI,CAAC,MAAM,QAAQ,WAAW,GAAG,OAAO;EAExC,MAAM,SAAqC,CAAC;EAG5C,IAAI,YAAY,WAAW,KAAK,WAAW,QAAQ;GACjD,OAAO,KAAK;IACV,MAAM;IACN,OAAO,QAAQ,OAAO;IACtB,OAAO,oBAAoB,KAAK,WAAW,OAAO,kBAAkB,YAAY;GAClF,CAAC;GACD,OAAO;IAAE,SAAS;IAAO;IAAQ,MAAM;GAAY;EACrD;EAGA,MAAM,qBAAqB,KAAK,WAAW,IAAI,OAAO,WAAW,UAAU;GACzE,MAAM,eAA8B;IAClC,GAAG;IACH,QAAQ;IACR,OAAO,YAAY;IACnB,KAAK,MAAM,SAAS;IACpB,MAAM,WAAW,QAAQ,MAAM,MAAM,SAAS,CAAC;GACjD;GAEA,MAAM,cAAc,MAAM,UAAU,SAAS,YAAY,QAAQ,YAAY;GAG7E,YAAY,SAAS,YAAY;GAGjC,IAAI,YAAY,YAAY,OAC1B,OAAO,KAAK,GAAG,YAAY,MAAM;EAErC,CAAC;EAED,MAAM,QAAQ,IAAI,kBAAkB;EAEpC,OAAO;GACL,SAAS,OAAO,WAAW;GAC3B;GACA,MAAM,MAAM,KAAK,4BAA4B,aAAa,OAAO;EACnE;CACF;;;;;;;;;;;;;;;;;;;;;CAsBA,AAAgB,aAAa,SAA2B,iBAAmC;EACzF,MAAM,cAAc,KAAK,WAAW,KAAI,MAAK,EAAE,aAAa,MAAM,CAAC;EACnE,MAAM,SAAS,KAAK,WAAW;EAE/B,MAAM,SAA2B;GAC/B,MAAM;GACN,UAAU;GACV,UAAU;EACZ;EAEA,IAAI,WAAW,iBAAiB;GAE9B,OAAO,cAAc;GACrB,OAAO,QAAQ;EACjB,OAAO;GAEL,OAAO,QAAQ;GACf,OAAO,kBAAkB;EAC3B;EAEA,IAAI,KAAK,YAAY,cAAc,QAAQ,MAAM;EAEjD,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"tuple-validator.mjs","names":[],"sources":["../../../../../../../../packages/seal/src/validators/tuple-validator.ts"],"sourcesContent":["import { setKeyPath } from \"../helpers\";\nimport { arrayRule } from \"../rules\";\nimport type { SchemaContext, ValidationResult } from \"../types\";\nimport { BaseValidator } from \"./base-validator\";\nimport { applyNullable } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * Tuple validator class - validates fixed-length arrays with position-specific types\n *\n * @example\n * ```ts\n * // RGB color tuple\n * v.tuple([v.number(), v.number(), v.number()])\n * // Valid: [255, 128, 0]\n * // Invalid: [255, 128] (too short)\n *\n * // Mixed types\n * v.tuple([v.string(), v.int(), v.boolean()])\n * // Valid: [\"John\", 25, true]\n * ```\n */\nexport class TupleValidator extends BaseValidator {\n public constructor(\n public validators: BaseValidator[],\n errorMessage?: string,\n ) {\n super();\n this.addMutableRule(arrayRule, errorMessage);\n }\n\n /**\n * Check if value is an array type\n */\n public matchesType(value: any): boolean {\n return Array.isArray(value);\n }\n\n /**\n * Clone the validator\n */\n public override clone(): this {\n const cloned = super.clone();\n cloned.validators = this.validators.map((v) => v.clone());\n return cloned;\n }\n\n /**\n * Validate tuple - check length then validate each position\n *\n * Absent input (and absent without `.default()`) propagates as `data: undefined`\n * so the parent ObjectValidator can omit the key. Without this, optional tuple\n * fields would silently materialise as `[]` in the validated output and then\n * fail the length check.\n */\n public async validate(data: any, context: SchemaContext): Promise<ValidationResult> {\n // Apply default when absent, then mutate. Mirrors BaseValidator's\n // `valueForRules = data ?? this.getDefaultValue()` so `.default([...])`\n // works on tuples too.\n const valueForRules = data ?? this.getDefaultValue();\n const mutatedData = await this.mutate(valueForRules, context);\n\n const result = await super.validate(data, context);\n\n if (result.isValid === false) return result;\n\n // Nothing to iterate for absent (no default) or null (nullable) inputs —\n // propagate so the parent ObjectValidator can omit the key.\n if (mutatedData === undefined || mutatedData === null) return result;\n\n // Defensive: type rule (arrayRule) should have failed for non-arrays.\n if (!Array.isArray(mutatedData)) return result;\n\n const errors: ValidationResult[\"errors\"] = [];\n\n // Tuple-specific: length validation\n if (mutatedData.length !== this.validators.length) {\n errors.push({\n type: \"tuple\",\n input: context.key || \"value\",\n error: `Expected exactly ${this.validators.length} items, but got ${mutatedData.length}`,\n });\n return { isValid: false, errors, data: mutatedData };\n }\n\n // Validate each position with its specific validator in parallel\n const validationPromises = this.validators.map(async (validator, index) => {\n const childContext: SchemaContext = {\n ...context,\n parent: mutatedData,\n value: mutatedData[index],\n key: index.toString(),\n path: setKeyPath(context.path, index.toString()),\n };\n\n const childResult = await validator.validate(mutatedData[index], childContext);\n\n // Update mutated data with validated result\n mutatedData[index] = childResult.data;\n\n // Collect errors from this element\n if (childResult.isValid === false) {\n errors.push(...childResult.errors);\n }\n });\n\n await Promise.all(validationPromises);\n\n return {\n isValid: errors.length === 0,\n errors,\n data: await this.startTransformationPipeline(mutatedData, context),\n };\n }\n\n /**\n * @inheritdoc\n *\n * Tuple keyword diverges between targets:\n * - `draft-2020-12` → `prefixItems` + `items: false` (exact length enforced)\n * - `draft-07` → `items` as array + `additionalItems: false`\n * - `openapi-3.0` → same as draft-07 (OpenAPI 3.0 is based on draft-07)\n *\n * @example\n * ```ts\n * v.tuple([v.string(), v.int(), v.boolean()]).toJsonSchema(\"draft-2020-12\")\n * // → {\n * // type: \"array\",\n * // prefixItems: [{ type: \"string\" }, { type: \"integer\" }, { type: \"boolean\" }],\n * // items: false,\n * // minItems: 3,\n * // maxItems: 3\n * // }\n * ```\n */\n public override toJsonSchema(target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n const itemSchemas = this.validators.map(v => v.toJsonSchema(target));\n const length = this.validators.length;\n\n const schema: JsonSchemaResult = {\n type: \"array\",\n minItems: length,\n maxItems: length,\n };\n\n if (target === \"draft-2020-12\") {\n // prefixItems is the draft-2020-12 keyword for positional tuple items\n schema.prefixItems = itemSchemas;\n schema.items = false; // no additional items beyond the tuple\n } else {\n // draft-07 and openapi-3.0: items as array + additionalItems: false\n schema.items = itemSchemas;\n schema.additionalItems = false;\n }\n\n if (this.isNullable) applyNullable(schema, target);\n\n return schema;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAsBA,IAAa,iBAAb,cAAoC,cAAc;CAChD,AAAO,YACL,AAAO,YACP,cACA;EACA,MAAM;EAHC;EAIP,KAAK,eAAe,WAAW,YAAY;CAC7C;;;;CAKA,AAAO,YAAY,OAAqB;EACtC,OAAO,MAAM,QAAQ,KAAK;CAC5B;;;;CAKA,AAAgB,QAAc;EAC5B,MAAM,SAAS,MAAM,MAAM;EAC3B,OAAO,aAAa,KAAK,WAAW,KAAK,MAAM,EAAE,MAAM,CAAC;EACxD,OAAO;CACT;;;;;;;;;CAUA,MAAa,SAAS,MAAW,SAAmD;EAIlF,MAAM,gBAAgB,QAAQ,KAAK,gBAAgB;EACnD,MAAM,cAAc,MAAM,KAAK,OAAO,eAAe,OAAO;EAE5D,MAAM,SAAS,MAAM,MAAM,SAAS,MAAM,OAAO;EAEjD,IAAI,OAAO,YAAY,OAAO,OAAO;EAIrC,IAAI,gBAAgB,UAAa,gBAAgB,MAAM,OAAO;EAG9D,IAAI,CAAC,MAAM,QAAQ,WAAW,GAAG,OAAO;EAExC,MAAM,SAAqC,CAAC;EAG5C,IAAI,YAAY,WAAW,KAAK,WAAW,QAAQ;GACjD,OAAO,KAAK;IACV,MAAM;IACN,OAAO,QAAQ,OAAO;IACtB,OAAO,oBAAoB,KAAK,WAAW,OAAO,kBAAkB,YAAY;GAClF,CAAC;GACD,OAAO;IAAE,SAAS;IAAO;IAAQ,MAAM;GAAY;EACrD;EAGA,MAAM,qBAAqB,KAAK,WAAW,IAAI,OAAO,WAAW,UAAU;GACzE,MAAM,eAA8B;IAClC,GAAG;IACH,QAAQ;IACR,OAAO,YAAY;IACnB,KAAK,MAAM,SAAS;IACpB,MAAM,WAAW,QAAQ,MAAM,MAAM,SAAS,CAAC;GACjD;GAEA,MAAM,cAAc,MAAM,UAAU,SAAS,YAAY,QAAQ,YAAY;GAG7E,YAAY,SAAS,YAAY;GAGjC,IAAI,YAAY,YAAY,OAC1B,OAAO,KAAK,GAAG,YAAY,MAAM;EAErC,CAAC;EAED,MAAM,QAAQ,IAAI,kBAAkB;EAEpC,OAAO;GACL,SAAS,OAAO,WAAW;GAC3B;GACA,MAAM,MAAM,KAAK,4BAA4B,aAAa,OAAO;EACnE;CACF;;;;;;;;;;;;;;;;;;;;;CAsBA,AAAgB,aAAa,SAA2B,iBAAmC;EACzF,MAAM,cAAc,KAAK,WAAW,KAAI,MAAK,EAAE,aAAa,MAAM,CAAC;EACnE,MAAM,SAAS,KAAK,WAAW;EAE/B,MAAM,SAA2B;GAC/B,MAAM;GACN,UAAU;GACV,UAAU;EACZ;EAEA,IAAI,WAAW,iBAAiB;GAE9B,OAAO,cAAc;GACrB,OAAO,QAAQ;EACjB,OAAO;GAEL,OAAO,QAAQ;GACf,OAAO,kBAAkB;EAC3B;EAEA,IAAI,KAAK,YAAY,cAAc,QAAQ,MAAM;EAEjD,OAAO;CACT;AACF"}
@@ -1,7 +1,7 @@
1
1
  import { JsonSchemaResult, JsonSchemaTarget } from "../standard-schema/json-schema.mjs";
2
2
  import { BaseValidator } from "./base-validator.mjs";
3
3
 
4
- //#region ../seal/src/validators/union-validator.d.ts
4
+ //#region ../../packages/seal/src/validators/union-validator.d.ts
5
5
  /**
6
6
  * Union validator class - validates value against multiple validator types
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"union-validator.d.mts","names":[],"sources":["../../../../../../../seal/src/validators/union-validator.ts"],"mappings":";;;;;;AA6BA;;;;;;;;;;;;;;;;;;;AA6B4F;;;cA7B/E,cAAA,SAAuB,aAAA;;;;;;;;;;;;;;EAc3B,KAAA,CAAM,UAAA,EAAY,aAAA,IAAiB,YAAA;;;;;;;;;;;;EAe1B,YAAA,CAAa,MAAA,GAAQ,gBAAA,GAAqC,gBAAA;AAAA"}
1
+ {"version":3,"file":"union-validator.d.mts","names":[],"sources":["../../../../../../../../packages/seal/src/validators/union-validator.ts"],"mappings":";;;;;;AA6BA;;;;;;;;;;;;;;;;;;;AA6B4F;;;cA7B/E,cAAA,SAAuB,aAAA;;;;;;;;;;;;;;EAc3B,KAAA,CAAM,UAAA,EAAY,aAAA,IAAiB,YAAA;;;;;;;;;;;;EAe1B,YAAA,CAAa,MAAA,GAAQ,gBAAA,GAAqC,gBAAA;AAAA"}
@@ -3,7 +3,7 @@ import { BaseValidator } from "./base-validator.mjs";
3
3
  import { unionRule } from "../rules/core/union.mjs";
4
4
  import "../rules/index.mjs";
5
5
 
6
- //#region ../seal/src/validators/union-validator.ts
6
+ //#region ../../packages/seal/src/validators/union-validator.ts
7
7
  /**
8
8
  * Union validator class - validates value against multiple validator types
9
9
  *
@@ -1 +1 @@
1
- {"version":3,"file":"union-validator.mjs","names":[],"sources":["../../../../../../../seal/src/validators/union-validator.ts"],"sourcesContent":["import { unionRule } from \"../rules\";\nimport { BaseValidator } from \"./base-validator\";\nimport { getRuleOptions } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * Union validator class - validates value against multiple validator types\n *\n * Tries each validator in order until one passes. If a validator's matchesType()\n * returns false, it's skipped for optimization. First validator that both matches\n * the type and passes validation wins.\n *\n * @example\n * ```ts\n * // Accept email or username\n * const identifier = v.union([\n * v.string().email(),\n * v.string().alphanumeric().min(3).max(20)\n * ]);\n *\n * // Accept different types\n * const customValue = v.union([\n * v.string().required(),\n * v.number().required(),\n * v.boolean().required(),\n * v.file().required()\n * ]);\n * ```\n */\nexport class UnionValidator extends BaseValidator {\n /**\n * Set the validators to try for union validation\n *\n * @param validators - Array of validators to try\n * @param errorMessage - Optional custom error message if all validators fail\n * @returns This validator for chaining\n *\n * @example\n * ```ts\n * new UnionValidator()\n * .union([v.string(), v.number()], 'Must be string or number');\n * ```\n */\n public union(validators: BaseValidator[], errorMessage?: string) {\n return this.addRule(unionRule, errorMessage, { validators });\n }\n\n /**\n * @inheritdoc\n *\n * Generates `{ oneOf: [...] }` by mapping each sub-validator to its JSON Schema.\n *\n * @example\n * ```ts\n * v.union([v.string(), v.number()]).toJsonSchema(\"draft-2020-12\")\n * // → { oneOf: [{ type: \"string\" }, { type: \"number\" }] }\n * ```\n */\n public override toJsonSchema(target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n const opts = getRuleOptions(this.rules, \"union\");\n const validators = (opts?.validators ?? []) as BaseValidator[];\n\n return {\n oneOf: validators.map(v => v.toJsonSchema(target)),\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,IAAa,iBAAb,cAAoC,cAAc;;;;;;;;;;;;;;CAchD,AAAO,MAAM,YAA6B,cAAuB;EAC/D,OAAO,KAAK,QAAQ,WAAW,cAAc,EAAE,WAAW,CAAC;CAC7D;;;;;;;;;;;;CAaA,AAAgB,aAAa,SAA2B,iBAAmC;EAIzF,OAAO,EACL,QAJW,eAAe,KAAK,OAAO,OACjB,CAAC,EAAE,cAAc,CAAC,EAGtB,CAAC,KAAI,MAAK,EAAE,aAAa,MAAM,CAAC,EACnD;CACF;AACF"}
1
+ {"version":3,"file":"union-validator.mjs","names":[],"sources":["../../../../../../../../packages/seal/src/validators/union-validator.ts"],"sourcesContent":["import { unionRule } from \"../rules\";\nimport { BaseValidator } from \"./base-validator\";\nimport { getRuleOptions } from \"../standard-schema/json-schema\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * Union validator class - validates value against multiple validator types\n *\n * Tries each validator in order until one passes. If a validator's matchesType()\n * returns false, it's skipped for optimization. First validator that both matches\n * the type and passes validation wins.\n *\n * @example\n * ```ts\n * // Accept email or username\n * const identifier = v.union([\n * v.string().email(),\n * v.string().alphanumeric().min(3).max(20)\n * ]);\n *\n * // Accept different types\n * const customValue = v.union([\n * v.string().required(),\n * v.number().required(),\n * v.boolean().required(),\n * v.file().required()\n * ]);\n * ```\n */\nexport class UnionValidator extends BaseValidator {\n /**\n * Set the validators to try for union validation\n *\n * @param validators - Array of validators to try\n * @param errorMessage - Optional custom error message if all validators fail\n * @returns This validator for chaining\n *\n * @example\n * ```ts\n * new UnionValidator()\n * .union([v.string(), v.number()], 'Must be string or number');\n * ```\n */\n public union(validators: BaseValidator[], errorMessage?: string) {\n return this.addRule(unionRule, errorMessage, { validators });\n }\n\n /**\n * @inheritdoc\n *\n * Generates `{ oneOf: [...] }` by mapping each sub-validator to its JSON Schema.\n *\n * @example\n * ```ts\n * v.union([v.string(), v.number()]).toJsonSchema(\"draft-2020-12\")\n * // → { oneOf: [{ type: \"string\" }, { type: \"number\" }] }\n * ```\n */\n public override toJsonSchema(target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n const opts = getRuleOptions(this.rules, \"union\");\n const validators = (opts?.validators ?? []) as BaseValidator[];\n\n return {\n oneOf: validators.map(v => v.toJsonSchema(target)),\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,IAAa,iBAAb,cAAoC,cAAc;;;;;;;;;;;;;;CAchD,AAAO,MAAM,YAA6B,cAAuB;EAC/D,OAAO,KAAK,QAAQ,WAAW,cAAc,EAAE,WAAW,CAAC;CAC7D;;;;;;;;;;;;CAaA,AAAgB,aAAa,SAA2B,iBAAmC;EAIzF,OAAO,EACL,QAJW,eAAe,KAAK,OAAO,OACjB,CAAC,EAAE,cAAc,CAAC,EAGtB,CAAC,KAAI,MAAK,EAAE,aAAa,MAAM,CAAC,EACnD;CACF;AACF"}
package/llms-full.txt CHANGED
@@ -1171,14 +1171,12 @@ description: 'Read `ValidationResult` — `isValid`, `errors[]`, `data`. Branch
1171
1171
 
1172
1172
  # `ValidationResult` — reading errors
1173
1173
 
1174
- `validate(schema, data)` never throws. It returns a `ValidationResult`:
1174
+ `validate(schema, data)` never throws. It returns a result narrowed on `isValid`:
1175
1175
 
1176
1176
  ```ts
1177
- type ValidationResult = {
1178
- isValid: boolean;
1179
- data: any; // shape after mutators + transformers (the validated value)
1180
- errors: ValidationError[];
1181
- };
1177
+ type TypedValidationResult<TData> =
1178
+ | { isValid: true; data: TData; errors: ValidationError[] } // TData = Infer.Output<typeof schema>
1179
+ | { isValid: false; data: undefined; errors: ValidationError[] };
1182
1180
 
1183
1181
  type ValidationError = {
1184
1182
  type: string; // rule type that failed — "required", "email", "min", "string", ...
@@ -1475,6 +1473,10 @@ That distinction matters wherever "empty" and "absent" mean different things —
1475
1473
  Before 4.9.2 `v.literal("")` always failed with *"is required"*, and `.optional()` looked like a workaround while actually disabling the literal check — accepting `""`, `null`, and a missing key alike. `v.literal(0)` and `v.literal(false)` were never affected.
1476
1474
  :::
1477
1475
 
1476
+ :::note[Fixed again in 5.30]
1477
+ 5.25 made a blank form value count as missing for literal and enum sets, so an unselected `<select>` reads as absent. That rule also caught `v.literal("")` from 5.25 to 5.29: the required literal rejected `""` and `.optional()` dropped it from the data. Since 5.30 a literal set that lists a blank string keeps `""` as a value in its default (implicit) required state and under `.present()`, `.optional()` and `.nullable()`; a set without one still reads a blank value as missing. An explicit `.required()` (or `requiredIf` and the other conditional rules) puts back the strict non-empty rule and rejects `""` — leave the default state in place when `""` is a valid value.
1478
+ :::
1479
+
1478
1480
  `v.instanceof(Ctor)` for File/Buffer/Uint8Array/custom classes. Returns `{}` from `toJsonSchema()` (not representable). For OpenAPI `File`, attach `{ type: "string", format: "binary" }` manually after generation.
1479
1481
 
1480
1482
  ## `v.any` — escape hatch
@@ -2218,7 +2220,7 @@ The 12 things that are true in every seal use:
2218
2220
  2. **Every factory return is a `StandardSchemaV1<Infer.Output<T>>`.** Pass seal schemas straight into `StandardSchemaV1<T>`-typed slots — no casts.
2219
2221
  3. **Two inference helpers — `Infer.Input<T>` and `Infer.Output<T>`.** Bare `Infer<T>` is an alias for `Infer.Input<T>` (the dominant usage: HTTP bodies, DTOs, form payloads). Use `Infer.Output<T>` for validated state (Cascade `Model<>` params, post-`validate()` data). See [the rules below](#inferinput-vs-inferoutput).
2220
2222
  4. **Fields are required by default.** Mark optional explicitly: `.optional()`. Skip `.required()` — canonical seal style omits the redundant call; inferred types already show what's required.
2221
- 5. **`validate(schema, data)` never throws.** Returns `Promise<ValidationResult>` with `{ isValid, data, errors }` — the validated value is `result.data`. See the `handle-seal-errors` topic.
2223
+ 5. **`validate(schema, data)` never throws.** Returns `{ isValid, data, errors }`, narrowed on `isValid`: on success `data` is `Infer.Output<typeof schema>`, on failure it is `undefined` (a bare `BaseValidator`/`ObjectValidator` annotation keeps `data: any`). See the `handle-seal-errors` topic.
2222
2224
  6. **Validators are immutable by default.** Every chain method (`.min(3)`, `.email()`, `.optional()`, …) returns a clone. Toggle with the `.mutable` getter.
2223
2225
  7. **Two pipelines: mutators (pre-validation), transformers (post-validation).** Order: `default → mutators → required check → required-condition rule → other rules → transformers → data`. `.catch(fallback)` rescues any failure on leaf validators.
2224
2226
  8. **Cross-field rules need a `v.object` parent.** Standalone scalar validators have no siblings to resolve against.
package/package.json CHANGED
@@ -11,7 +11,8 @@
11
11
  },
12
12
  "repository": {
13
13
  "type": "git",
14
- "url": "https://github.com/warlockjs/seal"
14
+ "url": "git+https://github.com/warlockjs/framework.git",
15
+ "directory": "packages/seal"
15
16
  },
16
17
  "keywords": [
17
18
  "validation",
@@ -22,7 +23,7 @@
22
23
  ],
23
24
  "author": "hassanzohdy",
24
25
  "license": "MIT",
25
- "version": "5.29.0",
26
+ "version": "5.30.0",
26
27
  "main": "./cjs/index.cjs",
27
28
  "module": "./esm/index.mjs",
28
29
  "types": "./esm/index.d.mts",
@@ -5,14 +5,12 @@ description: 'Read `ValidationResult` — `isValid`, `errors[]`, `data`. Branch
5
5
 
6
6
  # `ValidationResult` — reading errors
7
7
 
8
- `validate(schema, data)` never throws. It returns a `ValidationResult`:
8
+ `validate(schema, data)` never throws. It returns a result narrowed on `isValid`:
9
9
 
10
10
  ```ts
11
- type ValidationResult = {
12
- isValid: boolean;
13
- data: any; // shape after mutators + transformers (the validated value)
14
- errors: ValidationError[];
15
- };
11
+ type TypedValidationResult<TData> =
12
+ | { isValid: true; data: TData; errors: ValidationError[] } // TData = Infer.Output<typeof schema>
13
+ | { isValid: false; data: undefined; errors: ValidationError[] };
16
14
 
17
15
  type ValidationError = {
18
16
  type: string; // rule type that failed — "required", "email", "min", "string", ...
@@ -81,6 +81,10 @@ That distinction matters wherever "empty" and "absent" mean different things —
81
81
  Before 4.9.2 `v.literal("")` always failed with *"is required"*, and `.optional()` looked like a workaround while actually disabling the literal check — accepting `""`, `null`, and a missing key alike. `v.literal(0)` and `v.literal(false)` were never affected.
82
82
  :::
83
83
 
84
+ :::note[Fixed again in 5.30]
85
+ 5.25 made a blank form value count as missing for literal and enum sets, so an unselected `<select>` reads as absent. That rule also caught `v.literal("")` from 5.25 to 5.29: the required literal rejected `""` and `.optional()` dropped it from the data. Since 5.30 a literal set that lists a blank string keeps `""` as a value in its default (implicit) required state and under `.present()`, `.optional()` and `.nullable()`; a set without one still reads a blank value as missing. An explicit `.required()` (or `requiredIf` and the other conditional rules) puts back the strict non-empty rule and rejects `""` — leave the default state in place when `""` is a valid value.
86
+ :::
87
+
84
88
  `v.instanceof(Ctor)` for File/Buffer/Uint8Array/custom classes. Returns `{}` from `toJsonSchema()` (not representable). For OpenAPI `File`, attach `{ type: "string", format: "binary" }` manually after generation.
85
89
 
86
90
  ## `v.any` — escape hatch
@@ -69,7 +69,7 @@ The 12 things that are true in every seal use:
69
69
  2. **Every factory return is a `StandardSchemaV1<Infer.Output<T>>`.** Pass seal schemas straight into `StandardSchemaV1<T>`-typed slots — no casts.
70
70
  3. **Two inference helpers — `Infer.Input<T>` and `Infer.Output<T>`.** Bare `Infer<T>` is an alias for `Infer.Input<T>` (the dominant usage: HTTP bodies, DTOs, form payloads). Use `Infer.Output<T>` for validated state (Cascade `Model<>` params, post-`validate()` data). See [the rules below](#inferinput-vs-inferoutput).
71
71
  4. **Fields are required by default.** Mark optional explicitly: `.optional()`. Skip `.required()` — canonical seal style omits the redundant call; inferred types already show what's required.
72
- 5. **`validate(schema, data)` never throws.** Returns `Promise<ValidationResult>` with `{ isValid, data, errors }` — the validated value is `result.data`. See the `handle-seal-errors` topic.
72
+ 5. **`validate(schema, data)` never throws.** Returns `{ isValid, data, errors }`, narrowed on `isValid`: on success `data` is `Infer.Output<typeof schema>`, on failure it is `undefined` (a bare `BaseValidator`/`ObjectValidator` annotation keeps `data: any`). See the `handle-seal-errors` topic.
73
73
  6. **Validators are immutable by default.** Every chain method (`.min(3)`, `.email()`, `.optional()`, …) returns a clone. Toggle with the `.mutable` getter.
74
74
  7. **Two pipelines: mutators (pre-validation), transformers (post-validation).** Order: `default → mutators → required check → required-condition rule → other rules → transformers → data`. `.catch(fallback)` rescues any failure on leaf validators.
75
75
  8. **Cross-field rules need a `v.object` parent.** Standalone scalar validators have no siblings to resolve against.