@warlock.js/seal 5.30.0 → 5.32.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 (318) hide show
  1. package/CHANGELOG.md +46 -7
  2. package/README.md +57 -9
  3. package/cjs/index.cjs +41 -29
  4. package/cjs/index.cjs.map +1 -1
  5. package/cjs/{object--LXRt5RF.cjs → object-BoVGJ68E.cjs} +43 -24
  6. package/cjs/object-BoVGJ68E.cjs.map +1 -0
  7. package/cjs/object.cjs +2 -2
  8. package/cjs/{required-methods-DYsRO9aZ.cjs → required-methods-BJlnLnwa.cjs} +343 -258
  9. package/cjs/required-methods-BJlnLnwa.cjs.map +1 -0
  10. package/cjs/{string-DsqnKoSB.cjs → string-CM8x0u2w.cjs} +46 -44
  11. package/cjs/string-CM8x0u2w.cjs.map +1 -0
  12. package/cjs/string.cjs +2 -2
  13. package/esm/config.d.mts +7 -8
  14. package/esm/config.d.mts.map +1 -1
  15. package/esm/config.mjs.map +1 -1
  16. package/esm/factory/index.d.mts +2 -1
  17. package/esm/factory/index.mjs +1 -1
  18. package/esm/factory/validate.d.mts +3 -6
  19. package/esm/factory/validate.d.mts.map +1 -1
  20. package/esm/factory/validators.d.mts +16 -13
  21. package/esm/factory/validators.d.mts.map +1 -1
  22. package/esm/factory/validators.mjs +7 -1
  23. package/esm/factory/validators.mjs.map +1 -1
  24. package/esm/helpers/date-helpers.d.mts +1 -2
  25. package/esm/helpers/date-helpers.d.mts.map +1 -1
  26. package/esm/helpers/file.utils.d.mts +2 -4
  27. package/esm/helpers/file.utils.d.mts.map +1 -1
  28. package/esm/helpers/get-field-value.d.mts +2 -3
  29. package/esm/helpers/get-field-value.d.mts.map +1 -1
  30. package/esm/helpers/get-field-value.mjs +2 -1
  31. package/esm/helpers/get-field-value.mjs.map +1 -1
  32. package/esm/helpers/index.d.mts +6 -0
  33. package/esm/helpers/index.mjs +1 -1
  34. package/esm/helpers/path-helpers.d.mts +1 -2
  35. package/esm/helpers/path-helpers.d.mts.map +1 -1
  36. package/esm/helpers/validation-helpers.d.mts +4 -10
  37. package/esm/helpers/validation-helpers.d.mts.map +1 -1
  38. package/esm/index.d.mts +7 -0
  39. package/esm/mutators/array-mutators.d.mts +6 -7
  40. package/esm/mutators/array-mutators.d.mts.map +1 -1
  41. package/esm/mutators/boolean-mutators.d.mts +3 -4
  42. package/esm/mutators/boolean-mutators.d.mts.map +1 -1
  43. package/esm/mutators/date-mutators.d.mts +18 -19
  44. package/esm/mutators/date-mutators.d.mts.map +1 -1
  45. package/esm/mutators/index.d.mts +8 -0
  46. package/esm/mutators/index.mjs +1 -1
  47. package/esm/mutators/number-mutators.d.mts +10 -11
  48. package/esm/mutators/number-mutators.d.mts.map +1 -1
  49. package/esm/mutators/object-mutators.d.mts +4 -5
  50. package/esm/mutators/object-mutators.d.mts.map +1 -1
  51. package/esm/mutators/object-mutators.mjs +5 -4
  52. package/esm/mutators/object-mutators.mjs.map +1 -1
  53. package/esm/mutators/scalar-mutators.d.mts +2 -3
  54. package/esm/mutators/scalar-mutators.d.mts.map +1 -1
  55. package/esm/mutators/string-mutators.d.mts +37 -38
  56. package/esm/mutators/string-mutators.d.mts.map +1 -1
  57. package/esm/mutators/string-mutators.mjs +5 -3
  58. package/esm/mutators/string-mutators.mjs.map +1 -1
  59. package/esm/object.d.mts +3 -5
  60. package/esm/object.d.mts.map +1 -1
  61. package/esm/object.mjs.map +1 -1
  62. package/esm/plugins/plugin-system.d.mts +11 -9
  63. package/esm/plugins/plugin-system.d.mts.map +1 -1
  64. package/esm/rules/array/array-rules.d.mts +3 -4
  65. package/esm/rules/array/array-rules.d.mts.map +1 -1
  66. package/esm/rules/array/index.d.mts +2 -0
  67. package/esm/rules/array/index.mjs +1 -1
  68. package/esm/rules/color/color-rules.d.mts +8 -9
  69. package/esm/rules/color/color-rules.d.mts.map +1 -1
  70. package/esm/rules/color/index.d.mts +2 -0
  71. package/esm/rules/color/index.mjs +1 -1
  72. package/esm/rules/common/enum.d.mts +5 -6
  73. package/esm/rules/common/enum.d.mts.map +1 -1
  74. package/esm/rules/common/equals-field-rules.d.mts +3 -4
  75. package/esm/rules/common/equals-field-rules.d.mts.map +1 -1
  76. package/esm/rules/common/index.d.mts +7 -0
  77. package/esm/rules/common/index.mjs +1 -1
  78. package/esm/rules/common/instanceof.d.mts +2 -3
  79. package/esm/rules/common/instanceof.d.mts.map +1 -1
  80. package/esm/rules/common/literal.d.mts +2 -3
  81. package/esm/rules/common/literal.d.mts.map +1 -1
  82. package/esm/rules/common/literal.mjs.map +1 -1
  83. package/esm/rules/common/type-rules.d.mts +10 -11
  84. package/esm/rules/common/type-rules.d.mts.map +1 -1
  85. package/esm/rules/common/unknown-key.d.mts +2 -3
  86. package/esm/rules/common/unknown-key.d.mts.map +1 -1
  87. package/esm/rules/conditional/forbidden-if-rules.d.mts +7 -8
  88. package/esm/rules/conditional/forbidden-if-rules.d.mts.map +1 -1
  89. package/esm/rules/conditional/index.d.mts +11 -0
  90. package/esm/rules/conditional/index.mjs +1 -1
  91. package/esm/rules/conditional/present-if-rules.d.mts +6 -7
  92. package/esm/rules/conditional/present-if-rules.d.mts.map +1 -1
  93. package/esm/rules/conditional/present-unless-rules.d.mts +2 -3
  94. package/esm/rules/conditional/present-unless-rules.d.mts.map +1 -1
  95. package/esm/rules/conditional/present-with-rules.d.mts +4 -5
  96. package/esm/rules/conditional/present-with-rules.d.mts.map +1 -1
  97. package/esm/rules/conditional/present-without-rules.d.mts +4 -5
  98. package/esm/rules/conditional/present-without-rules.d.mts.map +1 -1
  99. package/esm/rules/conditional/required-if-rules.d.mts +10 -11
  100. package/esm/rules/conditional/required-if-rules.d.mts.map +1 -1
  101. package/esm/rules/conditional/required-unless-rules.d.mts +2 -3
  102. package/esm/rules/conditional/required-unless-rules.d.mts.map +1 -1
  103. package/esm/rules/conditional/required-when-rule.d.mts +2 -3
  104. package/esm/rules/conditional/required-when-rule.d.mts.map +1 -1
  105. package/esm/rules/conditional/required-with-rules.d.mts +4 -5
  106. package/esm/rules/conditional/required-with-rules.d.mts.map +1 -1
  107. package/esm/rules/conditional/required-without-rules.d.mts +4 -5
  108. package/esm/rules/conditional/required-without-rules.d.mts.map +1 -1
  109. package/esm/rules/core/equal.d.mts +2 -3
  110. package/esm/rules/core/equal.d.mts.map +1 -1
  111. package/esm/rules/core/forbidden.d.mts +2 -3
  112. package/esm/rules/core/forbidden.d.mts.map +1 -1
  113. package/esm/rules/core/index.d.mts +6 -0
  114. package/esm/rules/core/index.mjs +1 -1
  115. package/esm/rules/core/required.d.mts +3 -4
  116. package/esm/rules/core/required.d.mts.map +1 -1
  117. package/esm/rules/core/union.d.mts +10 -4
  118. package/esm/rules/core/union.d.mts.map +1 -1
  119. package/esm/rules/core/union.mjs +56 -10
  120. package/esm/rules/core/union.mjs.map +1 -1
  121. package/esm/rules/core/when.d.mts +2 -3
  122. package/esm/rules/core/when.d.mts.map +1 -1
  123. package/esm/rules/core/when.mjs.map +1 -1
  124. package/esm/rules/date/date-comparison-rules.d.mts +6 -7
  125. package/esm/rules/date/date-comparison-rules.d.mts.map +1 -1
  126. package/esm/rules/date/date-day-rules.d.mts +5 -6
  127. package/esm/rules/date/date-day-rules.d.mts.map +1 -1
  128. package/esm/rules/date/date-field-comparison-rules.d.mts +4 -5
  129. package/esm/rules/date/date-field-comparison-rules.d.mts.map +1 -1
  130. package/esm/rules/date/date-field-comparison-rules.mjs +6 -3
  131. package/esm/rules/date/date-field-comparison-rules.mjs.map +1 -1
  132. package/esm/rules/date/date-period-rules.d.mts +16 -16
  133. package/esm/rules/date/date-period-rules.d.mts.map +1 -1
  134. package/esm/rules/date/date-period-rules.mjs +24 -12
  135. package/esm/rules/date/date-period-rules.mjs.map +1 -1
  136. package/esm/rules/date/date-relative-rules.d.mts +4 -5
  137. package/esm/rules/date/date-relative-rules.d.mts.map +1 -1
  138. package/esm/rules/date/date-relative-rules.mjs +3 -3
  139. package/esm/rules/date/date-relative-rules.mjs.map +1 -1
  140. package/esm/rules/date/date-special-rules.d.mts +4 -5
  141. package/esm/rules/date/date-special-rules.d.mts.map +1 -1
  142. package/esm/rules/date/date.d.mts +16 -17
  143. package/esm/rules/date/date.d.mts.map +1 -1
  144. package/esm/rules/date/date.mjs +4 -2
  145. package/esm/rules/date/date.mjs.map +1 -1
  146. package/esm/rules/date/index.d.mts +8 -0
  147. package/esm/rules/date/index.mjs +1 -1
  148. package/esm/rules/file/dimensions.d.mts +5 -6
  149. package/esm/rules/file/dimensions.d.mts.map +1 -1
  150. package/esm/rules/file/file-size.d.mts +3 -4
  151. package/esm/rules/file/file-size.d.mts.map +1 -1
  152. package/esm/rules/file/index.d.mts +3 -0
  153. package/esm/rules/file/index.mjs +1 -1
  154. package/esm/rules/index.d.mts +56 -0
  155. package/esm/rules/index.mjs +1 -1
  156. package/esm/rules/length/index.d.mts +2 -0
  157. package/esm/rules/length/index.mjs +1 -1
  158. package/esm/rules/length/length-rules.d.mts +8 -9
  159. package/esm/rules/length/length-rules.d.mts.map +1 -1
  160. package/esm/rules/number/index.d.mts +2 -0
  161. package/esm/rules/number/index.mjs +1 -1
  162. package/esm/rules/number/number-rules.d.mts +11 -12
  163. package/esm/rules/number/number-rules.d.mts.map +1 -1
  164. package/esm/rules/number/number-rules.mjs +12 -6
  165. package/esm/rules/number/number-rules.mjs.map +1 -1
  166. package/esm/rules/scalar/index.mjs +1 -1
  167. package/esm/rules/string/alpha.d.mts +4 -5
  168. package/esm/rules/string/alpha.d.mts.map +1 -1
  169. package/esm/rules/string/credit-card.d.mts +2 -3
  170. package/esm/rules/string/credit-card.d.mts.map +1 -1
  171. package/esm/rules/string/email.d.mts +2 -3
  172. package/esm/rules/string/email.d.mts.map +1 -1
  173. package/esm/rules/string/id-formats.d.mts +6 -7
  174. package/esm/rules/string/id-formats.d.mts.map +1 -1
  175. package/esm/rules/string/index.d.mts +12 -0
  176. package/esm/rules/string/index.mjs +1 -1
  177. package/esm/rules/string/ip.d.mts +7 -8
  178. package/esm/rules/string/ip.d.mts.map +1 -1
  179. package/esm/rules/string/matches.d.mts +2 -3
  180. package/esm/rules/string/matches.d.mts.map +1 -1
  181. package/esm/rules/string/pattern.d.mts +2 -3
  182. package/esm/rules/string/pattern.d.mts.map +1 -1
  183. package/esm/rules/string/string-comparison.d.mts +5 -6
  184. package/esm/rules/string/string-comparison.d.mts.map +1 -1
  185. package/esm/rules/string/strong-password-rule.d.mts +2 -3
  186. package/esm/rules/string/strong-password-rule.d.mts.map +1 -1
  187. package/esm/rules/string/url.d.mts +2 -3
  188. package/esm/rules/string/url.d.mts.map +1 -1
  189. package/esm/rules/string/without-whitespace.d.mts +2 -3
  190. package/esm/rules/string/without-whitespace.d.mts.map +1 -1
  191. package/esm/standard-schema/index.d.mts +4 -0
  192. package/esm/standard-schema/json-schema.d.mts +5 -7
  193. package/esm/standard-schema/json-schema.d.mts.map +1 -1
  194. package/esm/standard-schema/json-schema.mjs.map +1 -1
  195. package/esm/standard-schema/map-result.d.mts +2 -3
  196. package/esm/standard-schema/map-result.d.mts.map +1 -1
  197. package/esm/standard-schema/map-result.mjs.map +1 -1
  198. package/esm/standard-schema/types.d.mts +4 -5
  199. package/esm/standard-schema/types.d.mts.map +1 -1
  200. package/esm/string.d.mts +2 -3
  201. package/esm/string.d.mts.map +1 -1
  202. package/esm/types/conditional-types.d.mts +8 -6
  203. package/esm/types/conditional-types.d.mts.map +1 -1
  204. package/esm/types/context-types.d.mts +24 -15
  205. package/esm/types/context-types.d.mts.map +1 -1
  206. package/esm/types/data-transformer-types.d.mts +3 -5
  207. package/esm/types/data-transformer-types.d.mts.map +1 -1
  208. package/esm/types/date-types.d.mts +2 -3
  209. package/esm/types/date-types.d.mts.map +1 -1
  210. package/esm/types/file.types.d.mts +1 -2
  211. package/esm/types/file.types.d.mts.map +1 -1
  212. package/esm/types/index.d.mts +11 -0
  213. package/esm/types/inference-types.d.mts +15 -14
  214. package/esm/types/inference-types.d.mts.map +1 -1
  215. package/esm/types/mutator-types.d.mts +9 -7
  216. package/esm/types/mutator-types.d.mts.map +1 -1
  217. package/esm/types/result-types.d.mts +12 -7
  218. package/esm/types/result-types.d.mts.map +1 -1
  219. package/esm/types/rule-types.d.mts +33 -15
  220. package/esm/types/rule-types.d.mts.map +1 -1
  221. package/esm/types/schema-types.d.mts +1 -3
  222. package/esm/types/schema-types.d.mts.map +1 -1
  223. package/esm/validators/any-validator.d.mts +1 -3
  224. package/esm/validators/any-validator.d.mts.map +1 -1
  225. package/esm/validators/array-validator.d.mts +2 -3
  226. package/esm/validators/array-validator.d.mts.map +1 -1
  227. package/esm/validators/array-validator.mjs +3 -3
  228. package/esm/validators/array-validator.mjs.map +1 -1
  229. package/esm/validators/base-validator.d.mts +10 -11
  230. package/esm/validators/base-validator.d.mts.map +1 -1
  231. package/esm/validators/base-validator.mjs +52 -21
  232. package/esm/validators/base-validator.mjs.map +1 -1
  233. package/esm/validators/boolean-validator.d.mts +1 -3
  234. package/esm/validators/boolean-validator.d.mts.map +1 -1
  235. package/esm/validators/computed-validator.d.mts +3 -4
  236. package/esm/validators/computed-validator.d.mts.map +1 -1
  237. package/esm/validators/computed-validator.mjs +4 -4
  238. package/esm/validators/computed-validator.mjs.map +1 -1
  239. package/esm/validators/date-validator.d.mts +2 -3
  240. package/esm/validators/date-validator.d.mts.map +1 -1
  241. package/esm/validators/discriminated-union-validator.d.mts +3 -3
  242. package/esm/validators/discriminated-union-validator.d.mts.map +1 -1
  243. package/esm/validators/discriminated-union-validator.mjs +1 -1
  244. package/esm/validators/discriminated-union-validator.mjs.map +1 -1
  245. package/esm/validators/float-validator.d.mts +1 -3
  246. package/esm/validators/float-validator.d.mts.map +1 -1
  247. package/esm/validators/index.d.mts +2 -1
  248. package/esm/validators/index.mjs +1 -1
  249. package/esm/validators/instanceof-validator.d.mts +1 -3
  250. package/esm/validators/instanceof-validator.d.mts.map +1 -1
  251. package/esm/validators/int-validator.d.mts +1 -3
  252. package/esm/validators/int-validator.d.mts.map +1 -1
  253. package/esm/validators/lazy-validator.d.mts +2 -3
  254. package/esm/validators/lazy-validator.d.mts.map +1 -1
  255. package/esm/validators/lazy-validator.mjs +1 -1
  256. package/esm/validators/lazy-validator.mjs.map +1 -1
  257. package/esm/validators/literal-validator.d.mts +1 -3
  258. package/esm/validators/literal-validator.d.mts.map +1 -1
  259. package/esm/validators/managed-validator.d.mts +3 -4
  260. package/esm/validators/managed-validator.d.mts.map +1 -1
  261. package/esm/validators/methods/equality-conditional-methods.d.mts +3 -4
  262. package/esm/validators/methods/equality-conditional-methods.d.mts.map +1 -1
  263. package/esm/validators/methods/forbidden-methods.d.mts +2 -3
  264. package/esm/validators/methods/forbidden-methods.d.mts.map +1 -1
  265. package/esm/validators/methods/present-methods.d.mts +2 -3
  266. package/esm/validators/methods/present-methods.d.mts.map +1 -1
  267. package/esm/validators/methods/required-methods.d.mts +3 -4
  268. package/esm/validators/methods/required-methods.d.mts.map +1 -1
  269. package/esm/validators/number-validator.d.mts +1 -3
  270. package/esm/validators/number-validator.d.mts.map +1 -1
  271. package/esm/validators/number-validator.mjs +12 -8
  272. package/esm/validators/number-validator.mjs.map +1 -1
  273. package/esm/validators/numeric-validator.d.mts +1 -3
  274. package/esm/validators/numeric-validator.d.mts.map +1 -1
  275. package/esm/validators/object-validator.d.mts +2 -3
  276. package/esm/validators/object-validator.d.mts.map +1 -1
  277. package/esm/validators/object-validator.mjs +9 -7
  278. package/esm/validators/object-validator.mjs.map +1 -1
  279. package/esm/validators/primitive-validator.d.mts +1 -3
  280. package/esm/validators/primitive-validator.d.mts.map +1 -1
  281. package/esm/validators/record-validator.d.mts +2 -3
  282. package/esm/validators/record-validator.d.mts.map +1 -1
  283. package/esm/validators/record-validator.mjs +3 -3
  284. package/esm/validators/record-validator.mjs.map +1 -1
  285. package/esm/validators/scalar-validator.d.mts +1 -3
  286. package/esm/validators/scalar-validator.d.mts.map +1 -1
  287. package/esm/validators/scalar-validator.mjs.map +1 -1
  288. package/esm/validators/string-validator.d.mts +1 -3
  289. package/esm/validators/string-validator.d.mts.map +1 -1
  290. package/esm/validators/tuple-validator.d.mts +2 -3
  291. package/esm/validators/tuple-validator.d.mts.map +1 -1
  292. package/esm/validators/tuple-validator.mjs +3 -3
  293. package/esm/validators/tuple-validator.mjs.map +1 -1
  294. package/esm/validators/union-validator.d.mts +4 -4
  295. package/esm/validators/union-validator.d.mts.map +1 -1
  296. package/esm/validators/union-validator.mjs +3 -1
  297. package/esm/validators/union-validator.mjs.map +1 -1
  298. package/llms-full.txt +656 -527
  299. package/llms.txt +1 -1
  300. package/package.json +1 -1
  301. package/skills/bridge-standard-schema/SKILL.md +60 -36
  302. package/skills/compose-seal-modifiers/SKILL.md +89 -53
  303. package/skills/define-structural-shape/SKILL.md +41 -27
  304. package/skills/define-structural-shape/array-methods.md +27 -27
  305. package/skills/define-structural-shape/object-methods.md +38 -30
  306. package/skills/extend-seal-with-plugins/SKILL.md +39 -5
  307. package/skills/generate-json-schema/SKILL.md +13 -13
  308. package/skills/handle-seal-errors/SKILL.md +23 -23
  309. package/skills/index.md +4 -1
  310. package/skills/overview/SKILL.md +10 -2
  311. package/skills/pick-seal-primitive/SKILL.md +45 -45
  312. package/skills/pick-seal-primitive/date-methods.md +96 -96
  313. package/skills/pick-seal-primitive/number-methods.md +55 -55
  314. package/skills/pick-seal-primitive/string-methods.md +107 -102
  315. package/skills/seal-basics/SKILL.md +14 -14
  316. package/cjs/object--LXRt5RF.cjs.map +0 -1
  317. package/cjs/required-methods-DYsRO9aZ.cjs.map +0 -1
  318. package/cjs/string-DsqnKoSB.cjs.map +0 -1
@@ -6,164 +6,169 @@ For the picking guide (`v.string` vs `v.scalar` vs `v.literal`), see the `pick-s
6
6
 
7
7
  ## Length
8
8
 
9
- | Method | Args | JSON Schema | Example |
10
- |---|---|---|---|
11
- | `.min(n, msg?)` | min length, inclusive | `minLength: n` | `v.string().min(3)` |
12
- | `.minLength(n, msg?)` | alias for `.min()` | `minLength: n` | `v.string().minLength(3)` |
13
- | `.max(n, msg?)` | max length, inclusive | `maxLength: n` | `v.string().max(120)` |
14
- | `.maxLength(n, msg?)` | alias for `.max()` | `maxLength: n` | `v.string().maxLength(120)` |
15
- | `.length(n, msg?)` | exact length | `minLength=maxLength=n` | `v.string().length(10)` |
16
- | `.lengthBetween(a, b, msg?)` | min and max length | `minLength: a, maxLength: b` | `v.string().lengthBetween(5, 30)` |
9
+ | Method | Args | JSON Schema | Example |
10
+ | ---------------------------- | --------------------- | ---------------------------- | --------------------------------- |
11
+ | `.min(n, msg?)` | min length, inclusive | `minLength: n` | `v.string().min(3)` |
12
+ | `.minLength(n, msg?)` | alias for `.min()` | `minLength: n` | `v.string().minLength(3)` |
13
+ | `.max(n, msg?)` | max length, inclusive | `maxLength: n` | `v.string().max(120)` |
14
+ | `.maxLength(n, msg?)` | alias for `.max()` | `maxLength: n` | `v.string().maxLength(120)` |
15
+ | `.length(n, msg?)` | exact length | `minLength=maxLength=n` | `v.string().length(10)` |
16
+ | `.lengthBetween(a, b, msg?)` | min and max length | `minLength: a, maxLength: b` | `v.string().lengthBetween(5, 30)` |
17
17
 
18
18
  ## Format
19
19
 
20
- | Method | Pattern | JSON Schema | Example |
21
- |---|---|---|---|
22
- | `.email(msg?)` | RFC-flavored regex | `format: "email"` | `v.string().email()` |
23
- | `.url(msg?)` | http/https URL | `format: "uri"` | `v.string().url()` |
24
- | `.pattern(re, msg?)` | custom regex | `pattern: re.source` | `v.string().pattern(/^[A-Z]/)` |
25
- | `.alpha(msg?)` | letters only | — | `v.string().alpha()` |
26
- | `.alphanumeric(msg?)` | letters + digits | — | `v.string().alphanumeric()` |
27
- | `.numeric(msg?)` | digits only (string) | — | `v.string().numeric()` |
28
- | `.withoutWhitespace(msg?)` | no spaces/tabs/newlines | — | `v.string().withoutWhitespace()` |
29
- | `.creditCard(msg?)` | credit-card-shaped | — | `v.string().creditCard()` |
30
- | `.ip(msg?)` | IPv4 or IPv6 | `format: "ipv4"` | `v.string().ip()` |
31
- | `.ip4(msg?)` | IPv4 only | `format: "ipv4"` | `v.string().ip4()` |
32
- | `.ip6(msg?)` | IPv6 only | `format: "ipv6"` | `v.string().ip6()` |
33
- | `.strongPassword(minLen?, msg?)` | 8+ chars, upper+lower+digit+symbol | — | `v.string().strongPassword(12)` |
20
+ | Method | Pattern | JSON Schema | Example |
21
+ | -------------------------------- | ---------------------------------- | -------------------- | -------------------------------- |
22
+ | `.email(msg?)` | RFC-flavored regex | `format: "email"` | `v.string().email()` |
23
+ | `.url(msg?)` | http/https URL | `format: "uri"` | `v.string().url()` |
24
+ | `.pattern(re, msg?)` | custom regex | `pattern: re.source` | `v.string().pattern(/^[A-Z]/)` |
25
+ | `.alpha(msg?)` | letters only | — | `v.string().alpha()` |
26
+ | `.alphanumeric(msg?)` | letters + digits | — | `v.string().alphanumeric()` |
27
+ | `.numeric(msg?)` | digits only (string) | — | `v.string().numeric()` |
28
+ | `.withoutWhitespace(msg?)` | no spaces/tabs/newlines | — | `v.string().withoutWhitespace()` |
29
+ | `.creditCard(msg?)` | credit-card-shaped | — | `v.string().creditCard()` |
30
+ | `.ip(msg?)` | IPv4 or IPv6 | `format: "ipv4"` | `v.string().ip()` |
31
+ | `.ip4(msg?)` | IPv4 only | `format: "ipv4"` | `v.string().ip4()` |
32
+ | `.ip6(msg?)` | IPv6 only | `format: "ipv6"` | `v.string().ip6()` |
33
+ | `.strongPassword(minLen?, msg?)` | 8+ chars, upper+lower+digit+symbol | — | `v.string().strongPassword(12)` |
34
34
 
35
35
  ## ID formats
36
36
 
37
- | Method | Args | JSON Schema | Example |
38
- |---|---|---|---|
39
- | `.uuid(version?, msg?)` | UUID, any version or restrict to 1/3/4/5/6/7 | `format: "uuid"` | `v.string().uuid(4)` |
40
- | `.cuid({ version?: 1\|2 }?)` | CUID2 default (24 chars, lowercase); v1 legacy | `pattern: …` | `v.string().cuid()` |
41
- | `.ulid(msg?)` | 26 chars, Crockford base32 (no I/L/O/U) | `pattern: …` | `v.string().ulid()` |
42
- | `.nanoid(length?, msg?)` | URL-safe alphabet, default length 21 | `pattern: …` | `v.string().nanoid(21)` |
37
+ | Method | Args | JSON Schema | Example |
38
+ | ---------------------------- | ---------------------------------------------- | ---------------- | ----------------------- |
39
+ | `.uuid(version?, msg?)` | UUID, any version or restrict to 1/3/4/5/6/7 | `format: "uuid"` | `v.string().uuid(4)` |
40
+ | `.cuid({ version?: 1\|2 }?)` | CUID2 default (24 chars, lowercase); v1 legacy | `pattern: …` | `v.string().cuid()` |
41
+ | `.ulid(msg?)` | 26 chars, Crockford base32 (no I/L/O/U) | `pattern: …` | `v.string().ulid()` |
42
+ | `.nanoid(length?, msg?)` | URL-safe alphabet, default length 21 | `pattern: …` | `v.string().nanoid(21)` |
43
43
 
44
44
  UUID validation is RFC 4122 strict — the variant nibble (8/9/a/b at position 17) is checked, so "looks-like-UUID-but-not-valid" inputs are rejected. CUID defaults to **CUID2** since CUID1 is deprecated by its original author; pass `{ version: 1 }` only for legacy data. nanoid's alphabet is fixed (`A-Za-z0-9_-`) — for custom alphabets use `.pattern()` directly.
45
45
 
46
46
  ## Word count
47
47
 
48
- | Method | Args | Example |
49
- |---|---|---|
50
- | `.words(n, msg?)` | exact word count | `v.string().words(5)` |
51
- | `.minWords(n, msg?)` | min words | `v.string().minWords(3)` |
52
- | `.maxWords(n, msg?)` | max words | `v.string().maxWords(50)` |
48
+ | Method | Args | Example |
49
+ | -------------------- | ---------------- | ------------------------- |
50
+ | `.words(n, msg?)` | exact word count | `v.string().words(5)` |
51
+ | `.minWords(n, msg?)` | min words | `v.string().minWords(3)` |
52
+ | `.maxWords(n, msg?)` | max words | `v.string().maxWords(50)` |
53
53
 
54
54
  ## Content
55
55
 
56
- | Method | Args | Example |
57
- |---|---|---|
58
- | `.startsWith(s, msg?)` | prefix check | `v.string().startsWith("https://")` |
59
- | `.endsWith(s, msg?)` | suffix check | `v.string().endsWith(".pdf")` |
60
- | `.contains(s, msg?)` | substring check | `v.string().contains("@")` |
56
+ | Method | Args | Example |
57
+ | ----------------------- | ----------------- | --------------------------------------- |
58
+ | `.startsWith(s, msg?)` | prefix check | `v.string().startsWith("https://")` |
59
+ | `.endsWith(s, msg?)` | suffix check | `v.string().endsWith(".pdf")` |
60
+ | `.contains(s, msg?)` | substring check | `v.string().contains("@")` |
61
61
  | `.notContains(s, msg?)` | inverse substring | `v.string().notContains("javascript:")` |
62
62
 
63
63
  ## Color
64
64
 
65
- | Method | Accepts | Example |
66
- |---|---|---|
67
- | `.color(msg?)` | any valid CSS color | `v.string().color()` |
68
- | `.hexColor(msg?)` | `#rgb`, `#rrggbb` | `v.string().hexColor()` |
69
- | `.rgbColor(msg?)` | `rgb(r,g,b)` | — |
70
- | `.rgbaColor(msg?)` | `rgba(r,g,b,a)` | — |
71
- | `.hslColor(msg?)` | `hsl(h,s,l)` | — |
72
- | `.lightColor(msg?)` | luminance-based | — |
73
- | `.darkColor(msg?)` | luminance-based | — |
65
+ | Method | Accepts | Example |
66
+ | ------------------- | ------------------- | ----------------------- |
67
+ | `.color(msg?)` | any valid CSS color | `v.string().color()` |
68
+ | `.hexColor(msg?)` | `#rgb`, `#rrggbb` | `v.string().hexColor()` |
69
+ | `.rgbColor(msg?)` | `rgb(r,g,b)` | — |
70
+ | `.rgbaColor(msg?)` | `rgba(r,g,b,a)` | — |
71
+ | `.hslColor(msg?)` | `hsl(h,s,l)` | — |
72
+ | `.lightColor(msg?)` | luminance-based | — |
73
+ | `.darkColor(msg?)` | luminance-based | — |
74
74
 
75
75
  JSON Schema: `format: "color"` for `.hexColor()`; the others map to `format: "color"` only via `.hexColor()` — for OpenAPI consumers expecting strict format, prefer `.hexColor()`.
76
76
 
77
77
  ## Case mutators (pre-validation)
78
78
 
79
- | Method | Effect | Example |
80
- |---|---|---|
81
- | `.uppercase()` | "Hello" → "HELLO" | `v.string().uppercase()` |
82
- | `.lowercase()` | "Hello" → "hello" | — |
83
- | `.capitalize()` | "hello world" → "Hello world" | — |
84
- | `.titleCase()` | "hello world" → "Hello World" | — |
85
- | `.camelCase()` | "hello world" → "helloWorld" | — |
86
- | `.pascalCase()` | "hello world" → "HelloWorld" | — |
87
- | `.snakeCase()` | "hello world" → "hello_world" | — |
88
- | `.kebabCase()` | "hello world" → "hello-world" | — |
79
+ | Method | Effect | Example |
80
+ | --------------- | ----------------------------- | ------------------------ |
81
+ | `.uppercase()` | "Hello" → "HELLO" | `v.string().uppercase()` |
82
+ | `.lowercase()` | "Hello" → "hello" | — |
83
+ | `.capitalize()` | "hello world" → "Hello world" | — |
84
+ | `.titleCase()` | "hello world" → "Hello World" | — |
85
+ | `.camelCase()` | "hello world" → "helloWorld" | — |
86
+ | `.pascalCase()` | "hello world" → "HelloWorld" | — |
87
+ | `.snakeCase()` | "hello world" → "hello_world" | — |
88
+ | `.kebabCase()` | "hello world" → "hello-world" | — |
89
89
 
90
90
  ## Trim & whitespace mutators
91
91
 
92
- | Method | Args | Effect |
93
- |---|---|---|
94
- | `.trim(needle?)` | default = space | trim both ends |
95
- | `.ltrim(needle?)` | — | trim left only |
96
- | `.rtrim(needle?)` | — | trim right only |
97
- | `.trimMultipleWhitespace()` | — | "a b" → "a b" |
98
- | `.padStart(len, char?)` | char default = " " | left-pad to length |
99
- | `.padEnd(len, char?)` | char default = " " | right-pad to length |
92
+ | Method | Args | Effect |
93
+ | --------------------------- | ------------------ | ------------------- |
94
+ | `.trim(needle?)` | default = space | trim both ends |
95
+ | `.ltrim(needle?)` | — | trim left only |
96
+ | `.rtrim(needle?)` | — | trim right only |
97
+ | `.trimMultipleWhitespace()` | — | "a b" → "a b" |
98
+ | `.padStart(len, char?)` | char default = " " | left-pad to length |
99
+ | `.padEnd(len, char?)` | char default = " " | right-pad to length |
100
100
 
101
101
  ## Replace, append, modify mutators
102
102
 
103
- | Method | Args | Example |
104
- |---|---|---|
105
- | `.replace(search, replace)` | string or RegExp + string | — |
106
- | `.replaceAll(search, replace)` | string or RegExp + string | — |
107
- | `.append(suffix)` | string | "foo" → "foobar" via `.append("bar")` |
108
- | `.prepend(prefix)` | string | "foo" → "barfoo" via `.prepend("bar")` |
109
- | `.reverse()` | — | "abc" → "cba" |
110
- | `.repeat(count)` | number | "ab" → "ababab" via `.repeat(3)` |
111
- | `.truncate(maxLen, suffix?)` | suffix default = "…" | "long text" → "long…" |
112
- | `.mask(start, end?, char?)` | char default = "*" | "1234567890" → "12******90" |
103
+ | Method | Args | Example |
104
+ | ------------------------------ | ------------------------- | -------------------------------------- |
105
+ | `.replace(search, replace)` | string or RegExp + string | — |
106
+ | `.replaceAll(search, replace)` | string or RegExp + string | — |
107
+ | `.append(suffix)` | string | "foo" → "foobar" via `.append("bar")` |
108
+ | `.prepend(prefix)` | string | "foo" → "barfoo" via `.prepend("bar")` |
109
+ | `.reverse()` | — | "abc" → "cba" |
110
+ | `.repeat(count)` | number | "ab" → "ababab" via `.repeat(3)` |
111
+ | `.truncate(maxLen, suffix?)` | suffix default = "…" | "long text" → "long…" |
112
+ | `.mask(start, end?, char?)` | char default = "*" | "1234567890" → "12******90" |
113
113
 
114
114
  ## Filter mutators
115
115
 
116
- | Method | Effect |
117
- |---|---|
118
- | `.toAlpha()` | strip non-letters |
119
- | `.toAlphanumeric()` | strip non-alphanumerics |
120
- | `.removeSpecialCharacters()` | keep alphanumerics + whitespace |
121
- | `.removeNumbers()` | strip digits |
122
- | `.stripTags()` | strip HTML tags via a naive `<...>` regex — **not** an XSS sanitizer; `.safeHtml()` is a deprecated alias |
123
- | `.htmlEscape()` | `<` → `&lt;` etc |
124
- | `.unescapeHtml()` | reverse `htmlEscape()` |
116
+ | Method | Effect |
117
+ | ---------------------------- | --------------------------------------------------------------------------------------------------------- |
118
+ | `.toAlpha()` | strip non-letters |
119
+ | `.toAlphanumeric()` | strip non-alphanumerics |
120
+ | `.removeSpecialCharacters()` | keep alphanumerics + whitespace |
121
+ | `.removeNumbers()` | strip digits |
122
+ | `.stripTags()` | strip HTML tags via a naive `<...>` regex — **not** an XSS sanitizer; `.safeHtml()` is a deprecated alias |
123
+ | `.htmlEscape()` | `<` → `&lt;` etc |
124
+ | `.unescapeHtml()` | reverse `htmlEscape()` |
125
125
 
126
126
  ## Encoding mutators
127
127
 
128
- | Method | Effect |
129
- |---|---|
130
- | `.base64Encode()` | utf8 → base64 |
131
- | `.base64Decode()` | base64 → utf8 |
132
- | `.urlEncode()` | percent-encode |
133
- | `.urlDecode()` | percent-decode |
134
- | `.slug()` | "Hello World!" → "hello-world" |
135
- | `.toString()` | coerce non-string input to string |
128
+ | Method | Effect |
129
+ | ----------------- | --------------------------------- |
130
+ | `.base64Encode()` | utf8 → base64 |
131
+ | `.base64Decode()` | base64 → utf8 |
132
+ | `.urlEncode()` | percent-encode |
133
+ | `.urlDecode()` | percent-decode |
134
+ | `.slug()` | "Hello World!" → "hello-world" |
135
+ | `.toString()` | coerce non-string input to string |
136
136
 
137
137
  ## Mutator vs transformer
138
138
 
139
- The methods above are **all mutators** — they reshape the value *before* validation rules run. If you want post-validation reshaping, attach via `.addTransformer(fn)` (see the `compose-seal-modifiers` topic).
139
+ The methods above are **all mutators** — they reshape the value _before_ validation rules run. If you want post-validation reshaping, attach via `.addTransformer(fn)` (see the `compose-seal-modifiers` topic).
140
140
 
141
- Practical implication: `v.string().min(3).trim()` runs `min(3)` against the *un-trimmed* input. To check trimmed length, mutate first: `v.string().trim().min(3)`.
141
+ Practical implication: `v.string().min(3).trim()` runs `min(3)` against the _un-trimmed_ input. To check trimmed length, mutate first: `v.string().trim().min(3)`.
142
142
 
143
143
  ## Common chains
144
144
 
145
145
  ```ts
146
146
  // Email field
147
- v.string().email()
147
+ v.string().email();
148
148
 
149
149
  // Username
150
- v.string().min(3).max(30).alphanumeric().lowercase()
150
+ v.string().min(3).max(30).alphanumeric().lowercase();
151
151
 
152
152
  // Slug from title
153
- v.string().slug()
153
+ v.string().slug();
154
154
 
155
155
  // Strong password
156
- v.string().strongPassword(12)
156
+ v.string().strongPassword(12);
157
157
 
158
158
  // URL with strict format
159
- v.string().url().startsWith("https://")
159
+ v.string().url().startsWith("https://");
160
160
 
161
161
  // Tag-stripped HTML body (not XSS-safe — sanitize with DOMPurify/sanitize-html before rendering untrusted rich text)
162
- v.string().stripTags().min(1)
162
+ v.string().stripTags().min(1);
163
163
 
164
164
  // Masked phone for response
165
- v.string().pattern(/^\+\d{8,}$/).mask(3, -2)
165
+ v.string()
166
+ .pattern(/^\+\d{8,}$/)
167
+ .mask(3, -2);
166
168
 
167
169
  // Optional with default
168
- v.string().email().default("guest@example.com").optional()
170
+ v.string().email().default("guest@example.com").optional();
169
171
  ```
172
+
173
+ The standalone `replaceMutator` and `replaceAllMutator` preserve the stringified
174
+ value when called without a context or replacement options.
@@ -5,7 +5,7 @@ description: "Start here for @warlock.js/seal schemas, validation, parsing, and
5
5
 
6
6
  # Validate with seal
7
7
 
8
- Schema-first validation. Single entry point: the `v` factory. Every validator chains, composes, and infers. Schemas double as runtime validators *and* type-level shapes via `Infer<typeof schema>`, and ship `~standard` so any Standard-Schema-aware consumer accepts them directly.
8
+ Schema-first validation. Single entry point: the `v` factory. Every validator chains, composes, and infers. Schemas double as runtime validators _and_ type-level shapes via `Infer<typeof schema>`, and ship `~standard` so any Standard-Schema-aware consumer accepts them directly.
9
9
 
10
10
  > This skill is the seal **map** — read it first, then load the specific skill for the task.
11
11
 
@@ -33,9 +33,9 @@ type User = Infer<typeof userSchema>;
33
33
 
34
34
  const result = await validate(userSchema, input);
35
35
  if (result.isValid) {
36
- result.data; // typed, post-transformer
36
+ result.data; // typed, post-transformer
37
37
  } else {
38
- result.errors; // [{ type, error, input }, ...]
38
+ result.errors; // [{ type, error, input }, ...]
39
39
  }
40
40
  ```
41
41
 
@@ -91,13 +91,13 @@ const schema = v.object({
91
91
  status: v.enum(Status).optional().default(Status.ACTIVE),
92
92
  });
93
93
 
94
- type In = Infer.Input<typeof schema>;
94
+ type In = Infer.Input<typeof schema>;
95
95
  // { email?: string; status?: Status } ← caller may omit both
96
96
 
97
97
  type Out = Infer.Output<typeof schema>;
98
98
  // { email?: string; status: Status } ← default fired for status
99
99
 
100
- type Default = Infer<typeof schema>; // alias for Infer.Input
100
+ type Default = Infer<typeof schema>; // alias for Infer.Input
101
101
  ```
102
102
 
103
103
  Both flavours widen with `| null` when `.nullable()` is set.
@@ -109,15 +109,15 @@ Both flavours widen with `| null` when `.nullable()` is set.
109
109
 
110
110
  ## Pick a skill
111
111
 
112
- | If the task is about… | Load |
113
- | --- | --- |
114
- | Picking the right primitive (`v.string` vs `v.scalar`, `v.literal` vs `v.enum`, `v.date` vs `v.instanceof(Date)`) | The `pick-seal-primitive` topic |
115
- | Building object / array / record / tuple / union schemas, discriminated unions, recursive schemas | The `define-structural-shape` topic |
116
- | Modifiers — `.required` / `.optional` / `.nullable` / `.default` / `.catch` / `.omit`, transformer vs mutator pipelines, membership rules | The `compose-seal-modifiers` topic |
117
- | Reading `ValidationResult`, branching on `error.type`, error message customization, translation | The `handle-seal-errors` topic |
118
- | Generating JSON Schema for OpenAI strict / OpenAPI / draft-07 | The `generate-json-schema` topic |
119
- | Why a `StandardSchemaV1<T>` slot accepts/rejects a schema, the phantom-intersection design, `Result<unknown>` errors | The `bridge-standard-schema` topic |
120
- | Authoring custom seal plugins to add validator methods | The `extend-seal-with-plugins` topic |
112
+ | If the task is about… | Load |
113
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |
114
+ | Picking the right primitive (`v.string` vs `v.scalar`, `v.literal` vs `v.enum`, `v.date` vs `v.instanceof(Date)`) | The `pick-seal-primitive` topic |
115
+ | Building object / array / record / tuple / union schemas, discriminated unions, recursive schemas | The `define-structural-shape` topic |
116
+ | Modifiers — `.required` / `.optional` / `.nullable` / `.default` / `.catch` / `.omit`, transformer vs mutator pipelines, membership rules | The `compose-seal-modifiers` topic |
117
+ | Reading `ValidationResult`, branching on `error.type`, error message customization, translation | The `handle-seal-errors` topic |
118
+ | Generating JSON Schema for OpenAI strict / OpenAPI / draft-07 | The `generate-json-schema` topic |
119
+ | Why a `StandardSchemaV1<T>` slot accepts/rejects a schema, object input/output class parameters and primitive factory intersections, `Result<unknown>` errors | The `bridge-standard-schema` topic |
120
+ | Authoring custom seal plugins to add validator methods | The `extend-seal-with-plugins` topic |
121
121
 
122
122
  ## Things NOT to do
123
123
 
@@ -1 +0,0 @@
1
- {"version":3,"file":"object--LXRt5RF.cjs","names":["BaseValidator","BaseValidator","objectRule","unknownKeyRule","setKeyPath","wrapNullableStrict"],"sources":["../../../../../../../packages/seal/src/mutators/object-mutators.ts","../../../../../../../packages/seal/src/validators/computed-validator.ts","../../../../../../../packages/seal/src/validators/object-validator.ts","../../../../../../../packages/seal/src/object.ts"],"sourcesContent":["import { trim } from \"@mongez/reinforcements\";\nimport { isPlainObject } from \"@mongez/supportive-is\";\nimport type { Mutator } from \"../types\";\n\n/** Strip unknown keys from object */\nexport const stripUnknownMutator: Mutator = async (value, context) => {\n const allowedKeys = [\n ...(context?.ctx.schema ? Object.keys(context.ctx.schema) : []),\n ...(context?.options.allowedKeys ?? []),\n ];\n\n const result: Record<string, any> = {};\n\n for (const key in value) {\n if (allowedKeys.includes(key)) {\n result[key] = value[key];\n }\n }\n\n return result;\n};\n\n/** Trim all string values in object */\nexport const objectTrimMutator: Mutator = async (value, context) => {\n if (!isPlainObject(value)) return value;\n\n const result: Record<string, any> = {};\n const recursive = context?.options.recursive ?? false;\n\n for (const key in value) {\n const item = value[key];\n\n if (recursive) {\n if (Array.isArray(item)) {\n result[key] = await Promise.all(\n item.map(async (i: any) =>\n typeof i === \"string\" ? trim(i) : await objectTrimMutator(i, context),\n ),\n );\n } else if (isPlainObject(item)) {\n result[key] = await objectTrimMutator(item, context);\n } else {\n result[key] = typeof item === \"string\" ? trim(item) : item;\n }\n } else {\n result[key] = typeof item === \"string\" ? trim(item) : item;\n }\n }\n\n return result;\n};\n\n/** Parse JSON string */\nexport const jsonMutator: Mutator = async (value) => {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n};\n","import type { SchemaContext, ValidationResult } from \"../types\";\nimport { BaseValidator } from \"./base-validator\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\n\n/**\n * Callback function for computed fields\n * Receives validated & mutated data and full schema context\n */\nexport type ComputedCallback<TResult = any> = (\n data: any,\n context: SchemaContext,\n) => TResult | Promise<TResult>;\n\n/**\n * Computed field validator\n *\n * Computes a value based on other validated fields in the schema.\n * The computed value is persisted and can optionally be validated.\n *\n * @example\n * ```ts\n * // Basic computed field\n * const schema = v.object({\n * title: v.string().required(),\n * slug: v.computed(data => slugify(data.title)),\n * });\n *\n * // With result validation\n * const schema = v.object({\n * title: v.string().required(),\n * slug: v.computed(\n * data => slugify(data.title),\n * v.string().minLength(3)\n * ),\n * });\n *\n * // Async computation\n * const schema = v.object({\n * image: v.string().url(),\n * thumbnail: v.computed(async data => {\n * return await generateThumbnail(data.image);\n * }),\n * });\n * ```\n */\nexport class ComputedValidator<TResult = any> extends BaseValidator {\n /**\n * Create a new computed field validator\n *\n * @param callback - Function to compute the value from validated data\n * @param resultValidator - Optional validator to validate the computed result\n */\n public constructor(\n protected callback: ComputedCallback<TResult>,\n protected resultValidator?: BaseValidator,\n ) {\n super();\n }\n\n /**\n * Execute the callback and optionally validate the result\n */\n public async validate(data: any, context: SchemaContext): Promise<ValidationResult> {\n try {\n // Execute the callback with validated data\n const result = await this.callback(data, context);\n\n // Optionally validate the computed result\n if (this.resultValidator) {\n const validation = await this.resultValidator.validate(result, context);\n\n if (!validation.isValid) {\n return {\n isValid: false,\n errors: validation.errors,\n data: undefined,\n };\n }\n\n return {\n isValid: true,\n errors: [],\n data: validation.data,\n };\n }\n\n // No validation - return computed result directly\n return {\n isValid: true,\n errors: [],\n data: result,\n };\n } catch (error) {\n // Handle callback execution errors\n return {\n isValid: false,\n errors: [\n {\n type: \"computed\",\n error: error instanceof Error ? error.message : \"Computed field callback failed\",\n input: context.path,\n },\n ],\n data: undefined,\n };\n }\n }\n\n /**\n * Clone this validator with all its configuration\n * Critical for ObjectValidator.clone(), extend(), merge(), etc.\n */\n public override clone(): this {\n const cloned = super.clone();\n\n // Copy ComputedValidator-specific properties\n cloned.callback = this.callback; // Functions are safe to copy by reference\n cloned.resultValidator = this.resultValidator?.clone(); // Deep clone validator\n\n return cloned;\n }\n\n /**\n * Computed fields don't have a specific type to match\n */\n public matchesType(value: any): boolean {\n return true; // Computed fields accept any input (they generate their own value)\n }\n\n /**\n * @inheritdoc\n *\n * Computed fields are server-side runtime values — they have no input schema\n * and cannot be represented in JSON Schema. Calling this method is always a\n * programming error.\n *\n * @throws Error Always throws — computed/managed fields have no JSON Schema representation.\n */\n public override toJsonSchema(_target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n throw new Error(\n `[Seal] toJsonSchema() is not supported on ComputedValidator / ManagedValidator. ` +\n `Computed fields are runtime-only and have no input JSON Schema representation. ` +\n `ObjectValidator.toJsonSchema() automatically skips computed fields — ` +\n `do not call toJsonSchema() on a computed validator directly.`,\n );\n }\n}\n","import { except } from \"@mongez/reinforcements\";\nimport { isPlainObject } from \"@mongez/supportive-is\";\nimport { setKeyPath } from \"../helpers/path-helpers\";\nimport { objectTrimMutator, stripUnknownMutator } from \"../mutators/object-mutators\";\nimport { objectRule } from \"../rules/common/type-rules\";\nimport { unknownKeyRule } from \"../rules/common/unknown-key\";\nimport type { JsonSchemaResult, JsonSchemaTarget } from \"../standard-schema/json-schema\";\nimport { applyNullable, wrapNullableStrict } from \"../standard-schema/json-schema\";\nimport type { Schema, SchemaContext, ValidationResult } from \"../types\";\nimport type { InferInputObjectShape, InferOutputObjectShape } from \"../types/inference-types\";\nimport { BaseValidator } from \"./base-validator\";\nimport { ComputedValidator } from \"./computed-validator\";\n\n/**\n * Object validator class with generic schema type for proper type inference.\n *\n * Threads two distinct inferred shapes into `BaseValidator`'s `TInput`/`TOutput`:\n *\n * - `TInput` = `InferInputObjectShape<TSchema>` — what `~standard.validate()`\n * accepts (caller's pre-validation payload; defaults/catches make\n * keys optional)\n * - `TOutput` = `InferOutputObjectShape<TSchema>` — what `~standard.validate()`\n * returns on success (post-default, post-catch shape; guaranteed\n * keys are required)\n *\n * Both helpers are used directly (not the full `Infer.*` walker) to avoid a\n * recursive class-base evaluation that would otherwise occur when the\n * brand-aware widening tries to inspect the class type.\n */\nexport class ObjectValidator<TSchema extends Schema = Schema> extends BaseValidator<\n InferInputObjectShape<TSchema>,\n InferOutputObjectShape<TSchema>\n> {\n protected shouldAllowUnknown = false;\n protected allowedKeys: string[] = [];\n protected hasUnknownKeyRule = false;\n\n public constructor(\n public schema: TSchema,\n errorMessage?: string,\n ) {\n super();\n this.addMutableRule(objectRule, errorMessage);\n }\n\n /**\n * Check if value is an object type (plain object, not array or date)\n */\n public matchesType(value: any): boolean {\n return isPlainObject(value);\n }\n\n /** Strip unknown keys from the data */\n public stripUnknown() {\n const validator = this.instance;\n return validator.addMutator(stripUnknownMutator, {\n get allowedKeys() {\n return validator.allowedKeys;\n },\n });\n }\n\n /** Add list of allowed keys that could be in the data but not necessarily validated */\n public allow(...keys: string[]) {\n const validator = this.instance;\n validator.allowedKeys.push(...keys);\n return validator;\n }\n\n /** Trim values of the object properties */\n public trim(recursive = true) {\n const validator = this.instance;\n return validator.addMutator(objectTrimMutator, { recursive });\n }\n\n /** Whether to allow unknown properties\n * Please note it will allow only unknown direct children keys, not nested children keys\n */\n public allowUnknown(allow = true) {\n const validator = this.instance;\n validator.shouldAllowUnknown = allow;\n return validator;\n }\n\n /**\n * Create a copy of this object validator with the same configuration\n * Copies schema, rules, mutators, transformers, and object-specific settings\n *\n * @returns A new ObjectValidator instance with copied configuration\n *\n * @example\n * ```ts\n * const baseUser = v.object({ name: v.string() }).allowUnknown();\n * const userCopy = baseUser.clone();\n * // userCopy has the same schema and allowUnknown setting\n * ```\n */\n public override clone(keys?: string[]): this {\n // Get cloned instance with all BaseValidator properties\n const cloned = super.clone();\n\n // Clone schema with deep copy of validators\n const newSchema = {} as TSchema;\n for (const [key, validator] of Object.entries(this.schema)) {\n if (keys && !keys.includes(key)) continue;\n (newSchema as Schema)[key] = validator.clone();\n }\n\n cloned.schema = newSchema;\n\n // Add ObjectValidator-specific properties\n cloned.shouldAllowUnknown = this.shouldAllowUnknown;\n cloned.allowedKeys = [...this.allowedKeys];\n // NOTE: hasUnknownKeyRule is intentionally NOT copied.\n // Each clone must add its own unknownKeyRule on first validate()\n // so it holds references to its own schema/allowedKeys, not the original's.\n\n return cloned;\n }\n\n /**\n * Extend this schema with additional fields\n * Clones the current validator and adds new fields to the schema\n * **Keeps original configuration** (allowUnknown, stripUnknown, etc.)\n *\n * If an ObjectValidator is provided, only its schema is used - its configuration is ignored.\n * This is useful for creating reusable field collections that can be added to different schemas.\n *\n * @param schemaOrValidator - Plain schema object or ObjectValidator to extend with\n * @returns A new ObjectValidator with merged schema and original configuration\n *\n * @example\n * ```ts\n * // Extend with plain schema\n * const baseUser = v.object({\n * name: v.string().required(),\n * email: v.string().email().required()\n * }).allowUnknown();\n *\n * const adminUser = baseUser.extend({\n * role: v.string().in(['admin', 'superadmin']).required()\n * });\n * // adminUser has: name, email, role\n * // adminUser keeps: allowUnknown() from base ✅\n *\n * // Extend with ObjectValidator (only schema is used)\n * const auditFields = v.object({\n * createdAt: v.date().required(),\n * updatedAt: v.date().required()\n * }).stripUnknown(); // This config is ignored!\n *\n * const fullUser = baseUser.extend(auditFields);\n * // fullUser has: name, email, createdAt, updatedAt\n * // fullUser keeps: allowUnknown() from base (NOT stripUnknown from auditFields) ✅\n *\n * // Chain multiple extends\n * const complexSchema = baseUser\n * .extend(auditFields)\n * .extend({ metadata: v.object({}) });\n * ```\n */\n public extend<TExtension extends Schema>(\n schemaOrValidator: TExtension | ObjectValidator<TExtension>,\n ): ObjectValidator<TSchema & TExtension> {\n // Clone current validator to preserve original\n const extended = this.clone() as any;\n\n // Extract schema from parameter\n const schemaToAdd =\n schemaOrValidator instanceof ObjectValidator ? schemaOrValidator.schema : schemaOrValidator;\n\n // Merge schemas with cloned validators (later fields override earlier ones)\n for (const [key, validator] of Object.entries(schemaToAdd)) {\n (extended.schema as Schema)[key] = validator.clone();\n }\n\n return extended as ObjectValidator<TSchema & TExtension>;\n }\n\n /**\n * Merge with another ObjectValidator\n * Clones current validator, merges schemas, and **overrides configuration** with other validator's config\n *\n * Unlike extend(), merge() combines both schemas AND configurations.\n * The other validator's configuration (allowUnknown, stripUnknown, etc.) takes precedence.\n *\n * @param validator - Another ObjectValidator to merge with\n * @returns A new ObjectValidator with merged schema and configuration\n *\n * @example\n * ```ts\n * const baseUser = v.object({\n * name: v.string().required()\n * }).allowUnknown();\n *\n * const timestamps = v.object({\n * createdAt: v.date().required(),\n * updatedAt: v.date().required()\n * }).stripUnknown();\n *\n * const merged = baseUser.merge(timestamps);\n * // merged has: name, createdAt, updatedAt\n * // merged config: stripUnknown() from timestamps (overrides allowUnknown) ✅\n *\n * // Chain multiple merges\n * const full = baseUser.merge(timestamps).merge(softDeleteSchema);\n * ```\n */\n public merge<TMerge extends Schema>(\n validator: ObjectValidator<TMerge>,\n ): ObjectValidator<TSchema & TMerge> {\n // Clone current validator\n const merged = this.clone() as any;\n\n // Merge schemas with cloned validators (later fields override earlier ones)\n for (const [key, schemaValidator] of Object.entries(validator.schema)) {\n (merged.schema as Schema)[key] = schemaValidator.clone();\n }\n\n // Override configuration with other validator's config\n merged.shouldAllowUnknown = validator.shouldAllowUnknown;\n merged.allowedKeys = [...merged.allowedKeys, ...validator.allowedKeys];\n\n // Append rules, mutators, transformers from other validator\n merged.rules.push(...validator.rules);\n merged.mutators.push(...validator.mutators);\n merged.dataTransformers.push(...validator.dataTransformers);\n\n // Merge attributes text (later wins)\n merged.attributesText = {\n ...merged.attributesText,\n ...validator.attributesText,\n };\n\n merged.translatedAttributes = {\n ...merged.translatedAttributes,\n ...validator.translatedAttributes,\n };\n\n return merged as ObjectValidator<TSchema & TMerge>;\n }\n\n /**\n * Create a new schema with only the specified fields\n * Clones the current validator and keeps only the selected fields\n * **Preserves all configuration** (allowUnknown, stripUnknown, etc.)\n *\n * @param keys - Field names to keep in the schema\n * @returns A new ObjectValidator with only the picked fields\n *\n * @example\n * ```ts\n * const fullUser = v.object({\n * id: v.int().required(),\n * name: v.string().required(),\n * email: v.string().email().required(),\n * password: v.string().required(),\n * role: v.string()\n * }).allowUnknown();\n *\n * // For login - only need email and password\n * const loginSchema = fullUser.pick('email', 'password');\n * // loginSchema has: { email, password }\n * // loginSchema keeps: allowUnknown() ✅\n *\n * // For public profile\n * const publicSchema = fullUser.pick('id', 'name', 'role');\n * // publicSchema has: { id, name, role }\n * ```\n */\n public pick<K extends keyof TSchema>(...keys: K[]): ObjectValidator<Pick<TSchema, K>> {\n // Clone current validator\n const picked = this.clone() as any;\n\n // Create new schema with only picked keys\n const newSchema = {} as Pick<TSchema, K>;\n for (const key of keys) {\n if (key in picked.schema) {\n (newSchema as any)[key] = picked.schema[key];\n }\n }\n\n picked.schema = newSchema;\n\n return picked as ObjectValidator<Pick<TSchema, K>>;\n }\n\n /**\n * Mark all or the given schema fields as optional\n */\n public partial<K extends keyof TSchema>(...keys: K[]) {\n const validationSchema = this.clone();\n\n if (keys.length === 0) {\n keys = Object.keys(validationSchema.schema) as K[];\n }\n\n for (const [key, validator] of Object.entries(validationSchema.schema)) {\n if (keys.length === 0 || keys.includes(key as K)) {\n (validationSchema.schema as Schema)[key] = validator.optional();\n }\n }\n\n return validationSchema;\n }\n\n /**\n * Make the all or the given fields as required\n */\n public requiredFields<K extends keyof TSchema>(...keys: K[]) {\n const validationSchema = this.clone();\n\n if (keys.length === 0) {\n keys = Object.keys(validationSchema.schema) as K[];\n }\n\n for (const [key, validator] of Object.entries(validationSchema.schema)) {\n if (keys.length === 0 || keys.includes(key as K)) {\n (validationSchema.schema as Schema)[key] = validator.required();\n }\n }\n\n return validationSchema;\n }\n\n /**\n * Create a new schema excluding the specified fields\n * Clones the current validator and removes the specified fields\n * **Preserves all configuration** (allowUnknown, stripUnknown, etc.)\n *\n * @param keys - Field names to exclude from the schema\n * @returns A new ObjectValidator without the excluded fields\n *\n * @example\n * ```ts\n * const fullUser = v.object({\n * id: v.int().required(),\n * name: v.string().required(),\n * email: v.string().email().required(),\n * password: v.string().required(),\n * role: v.string()\n * }).allowUnknown();\n *\n * // For updates - exclude id\n * const updateSchema = fullUser.without('id');\n * // updateSchema has: { name, email, password, role }\n * // updateSchema keeps: allowUnknown() ✅\n *\n * // For public API - exclude sensitive fields\n * const publicSchema = fullUser.without('password', 'role');\n * // publicSchema has: { id, name, email }\n *\n * // Combine with other methods\n * const patchSchema = fullUser.without('id', 'password');\n * // patchSchema has: { name, email, role }\n * ```\n */\n public without<K extends keyof TSchema>(...keys: K[]): ObjectValidator<Omit<TSchema, K>> {\n // Clone current validator\n const filtered = this.clone() as any;\n\n // Create new schema excluding specified keys\n const newSchema = {} as Omit<TSchema, K>;\n for (const key in filtered.schema) {\n if (!keys.includes(key as any)) {\n (newSchema as any)[key] = filtered.schema[key];\n }\n }\n\n filtered.schema = newSchema;\n\n return filtered as ObjectValidator<Omit<TSchema, K>>;\n }\n\n /** Mutate the data */\n public mutate(data: any, context: SchemaContext) {\n if (!isPlainObject(data)) return data;\n return super.mutate({ ...data }, context);\n }\n\n /** Validate the data */\n public async validate(\n data: any,\n context: SchemaContext = { path: \"\" } as SchemaContext,\n ): Promise<ValidationResult> {\n context.schema = this.schema;\n const mutatedData = await this.mutate(data, context);\n\n // Check for unknown properties\n if (this.shouldAllowUnknown === false && !this.hasUnknownKeyRule) {\n this.hasUnknownKeyRule = true;\n const rule = this.addMutableRule(unknownKeyRule, undefined, {\n allowedKeys: this.allowedKeys,\n schema: this.schema,\n });\n\n this.setRuleAttributesList(rule);\n }\n\n const result = await super.validate(mutatedData, context);\n\n if (result.isValid === false) return result;\n\n // Absent (no default) or null (nullable) inputs short-circuit here —\n // BaseValidator.validate already resolved the outcome, so recursing into\n // the shape below would wrongly re-run required checks against `undefined`.\n if (mutatedData === undefined || mutatedData === null) return result;\n\n // ═══════════════════════════════════════════════════════════\n // PHASE 1: Validate user input fields (skip computed/managed)\n // ═══════════════════════════════════════════════════════════\n const errors: ValidationResult[\"errors\"] = [];\n const validatedData: any = {};\n\n // Child validators settle in completion order, so errors are collected per\n // field and flattened in declared schema order for deterministic output.\n const fieldErrors: Array<ValidationResult[\"errors\"]> = [];\n\n const userInputEntries = Object.entries(this.schema).filter(\n ([, validator]) => !this.isComputedValidator(validator),\n );\n\n const validationPromises = userInputEntries.map(async ([key, validator], index) => {\n const isPresent = mutatedData?.[key] !== undefined;\n const value = isPresent ? mutatedData[key] : validator.getDefaultValue();\n\n const childContext: SchemaContext = {\n ...context,\n parent: mutatedData,\n value,\n key,\n path: setKeyPath(context.path, key),\n valueIsDefault: !isPresent && value !== undefined,\n };\n\n const childResult = await validator.validate(value, childContext);\n\n // Only include in validated data if not omitted\n if (childResult.data !== undefined && !validator.isOmitted()) {\n validatedData[key] = childResult.data;\n }\n\n if (childResult.isValid === false) {\n fieldErrors[index] = childResult.errors;\n }\n });\n\n await Promise.all(validationPromises);\n\n for (const childErrors of fieldErrors) {\n if (childErrors) {\n errors.push(...childErrors);\n }\n }\n\n // If Phase 1 failed, return early\n if (errors.length > 0) {\n return {\n isValid: false,\n errors,\n data: undefined,\n };\n }\n\n // ═══════════════════════════════════════════════════════════\n // PHASE 2: Execute computed/managed fields with validated data\n // ═══════════════════════════════════════════════════════════\n const computedFields = this.getComputedFields();\n\n const computedErrors: Array<ValidationResult[\"errors\"]> = [];\n\n const computedPromises = Object.entries(computedFields).map(async ([key, validator], index) => {\n const childContext: SchemaContext = {\n ...context,\n parent: validatedData,\n value: undefined, // Computed fields don't have input value\n };\n\n // Execute computed callback with validated data\n const childResult = await validator.validate(validatedData, childContext);\n\n // Only include in final data if not omitted\n if (childResult.data !== undefined && !validator.isOmitted()) {\n validatedData[key] = childResult.data;\n }\n\n if (childResult.isValid === false) {\n computedErrors[index] = childResult.errors;\n }\n });\n\n await Promise.all(computedPromises);\n\n for (const childErrors of computedErrors) {\n if (childErrors) {\n errors.push(...childErrors);\n }\n }\n\n // If Phase 2 failed, return early\n if (errors.length > 0) {\n return {\n isValid: false,\n errors,\n data: undefined,\n };\n }\n\n // Fields were assigned in the order their validators finished; re-emit\n // them in declared schema order so the output shape is deterministic.\n const orderedData: any = {};\n\n for (const key of Object.keys(this.schema)) {\n if (key in validatedData) {\n orderedData[key] = validatedData[key];\n }\n }\n\n // Remove undefined values\n const cleanedData = removeUndefinedValues(orderedData);\n\n const transformedData = await this.startTransformationPipeline(cleanedData, context);\n\n const output =\n this.shouldAllowUnknown === false\n ? transformedData\n : {\n ...transformedData,\n ...except(mutatedData, Object.keys(this.schema)),\n };\n\n return {\n isValid: true,\n errors: [],\n data: output,\n };\n }\n\n /**\n * Check if a validator is a computed or managed field\n * ManagedValidator extends ComputedValidator, so instanceof catches both\n */\n private isComputedValidator(validator: BaseValidator): boolean {\n return validator instanceof ComputedValidator;\n }\n\n /**\n * Get all computed/managed fields from the schema\n */\n private getComputedFields(): Record<string, ComputedValidator> {\n const computed: Record<string, ComputedValidator> = {};\n\n for (const [key, validator] of Object.entries(this.schema)) {\n if (validator instanceof ComputedValidator) {\n computed[key] = validator;\n }\n }\n\n return computed;\n }\n\n /**\n * @inheritdoc\n *\n * Recursively generates JSON Schema for all input fields in the schema.\n * Computed/managed fields are skipped — they have no input representation.\n *\n * **Standard targets** (`draft-2020-12`, `draft-07`, `openapi-3.0`):\n * - Fields marked `.optional()` are excluded from `required`.\n *\n * **`openai-strict` target** (OpenAI Structured Outputs):\n * - ALL fields appear in `required` — OpenAI rejects schemas with optional fields.\n * - Optional fields are instead expressed as nullable types:\n * `{ type: [\"string\", \"null\"] }` so the model can output `null` for them.\n * - Recursively applies `openai-strict` to all nested objects.\n *\n * @example\n * ```ts\n * v.object({\n * name: v.string().required(),\n * age: v.int().optional(),\n * }).toJsonSchema(\"draft-2020-12\")\n * // → { type: \"object\",\n * // properties: { name: { type: \"string\" }, age: { type: \"integer\" } },\n * // required: [\"name\"], additionalProperties: false }\n *\n * v.object({\n * name: v.string().required(),\n * age: v.int().optional(),\n * }).toJsonSchema(\"openai-strict\")\n * // → { type: \"object\",\n * // properties: { name: { type: \"string\" }, age: { type: [\"integer\", \"null\"] } },\n * // required: [\"name\", \"age\"], ← all fields\n * // additionalProperties: false }\n * ```\n */\n public override toJsonSchema(target: JsonSchemaTarget = \"draft-2020-12\"): JsonSchemaResult {\n const properties: Record<string, JsonSchemaResult> = {};\n const required: string[] = [];\n const isOpenAIStrict = target === \"openai-strict\";\n\n for (const [key, validator] of Object.entries(this.schema)) {\n // Skip computed/managed — runtime-only, no input schema\n if (validator instanceof ComputedValidator) continue;\n\n let fieldSchema = validator.toJsonSchema(target);\n\n if (isOpenAIStrict) {\n // OpenAI strict: every field must be in required.\n // Optional fields are expressed as nullable rather than absent.\n if (validator.isOptional) {\n fieldSchema = wrapNullableStrict(fieldSchema);\n }\n required.push(key);\n } else {\n // Standard JSON Schema: only non-optional fields go in required\n if (!validator.isOptional) {\n required.push(key);\n }\n }\n\n properties[key] = fieldSchema;\n }\n\n const schema: JsonSchemaResult = { type: \"object\", properties };\n\n if (required.length > 0) schema.required = required;\n if (!this.shouldAllowUnknown) schema.additionalProperties = false;\n if (this.isNullable) applyNullable(schema, target);\n\n return schema;\n }\n}\n\n/** Recursively remove undefined values from an object */\nfunction removeUndefinedValues(obj: any, visited = new WeakMap<object, any>()): any {\n // Handle primitives and null\n if (obj === null) {\n return obj;\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj.map((item) => removeUndefinedValues(item, visited));\n }\n\n // Skip non-plain objects (class instances, Dates, Buffers, etc.)\n if (!isPlainObject(obj)) {\n return obj;\n }\n\n // Handle circular references - return already processed result\n if (visited.has(obj)) {\n return visited.get(obj);\n }\n\n // Process plain objects\n const result: any = {};\n visited.set(obj, result); // Mark as processing BEFORE recursion\n\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n result[key] = removeUndefinedValues(value, visited);\n }\n }\n\n return result;\n}\n","import type { StandardSchemaV1 } from \"./standard-schema/types\";\nimport type { Schema } from \"./types\";\nimport type { Infer } from \"./types/inference-types\";\nimport { ObjectValidator } from \"./validators/object-validator\";\n\n// Keep both runtime chain methods and their declaration augmentations in\n// this standalone entry, without loading the complete validator factory.\nexport { equalityConditionalMethodsApplied } from \"./validators/methods/equality-conditional-methods\";\nexport { forbiddenMethodsApplied } from \"./validators/methods/forbidden-methods\";\nexport { presentMethodsApplied } from \"./validators/methods/present-methods\";\nexport { requiredMethodsApplied } from \"./validators/methods/required-methods\";\nexport { ObjectValidator };\n\n/** Create an object schema without importing the complete `v` factory. */\nexport const object = <T extends Schema>(schema: T, errorMessage?: string) =>\n new ObjectValidator<T>(schema, errorMessage) as ObjectValidator<T> &\n StandardSchemaV1<Infer<ObjectValidator<T>>>;\n"],"mappings":"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"}