@oxog/vld 1.2.0 → 1.4.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 (261) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/README.md +61 -43
  3. package/dist/coercion/bigint.js +1 -1
  4. package/dist/coercion/boolean.d.ts.map +1 -1
  5. package/dist/coercion/boolean.js +7 -3
  6. package/dist/coercion/boolean.js.map +1 -1
  7. package/dist/coercion/date.js +1 -1
  8. package/dist/coercion/number.d.ts.map +1 -1
  9. package/dist/coercion/number.js +20 -4
  10. package/dist/coercion/number.js.map +1 -1
  11. package/dist/coercion/string.d.ts.map +1 -1
  12. package/dist/coercion/string.js +84 -12
  13. package/dist/coercion/string.js.map +1 -1
  14. package/dist/index.d.ts +593 -3
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +76 -5
  17. package/dist/index.js.map +1 -1
  18. package/dist/locales/af.d.ts.map +1 -1
  19. package/dist/locales/af.js +21 -4
  20. package/dist/locales/af.js.map +1 -1
  21. package/dist/locales/ar.d.ts.map +1 -1
  22. package/dist/locales/ar.js +21 -4
  23. package/dist/locales/ar.js.map +1 -1
  24. package/dist/locales/backup-en.d.ts +3 -0
  25. package/dist/locales/backup-en.d.ts.map +1 -0
  26. package/dist/locales/backup-en.js +105 -0
  27. package/dist/locales/backup-en.js.map +1 -0
  28. package/dist/locales/bn.d.ts.map +1 -1
  29. package/dist/locales/bn.js +21 -4
  30. package/dist/locales/bn.js.map +1 -1
  31. package/dist/locales/da.d.ts.map +1 -1
  32. package/dist/locales/da.js +21 -4
  33. package/dist/locales/da.js.map +1 -1
  34. package/dist/locales/de.d.ts.map +1 -1
  35. package/dist/locales/de.js +21 -4
  36. package/dist/locales/de.js.map +1 -1
  37. package/dist/locales/en.d.ts.map +1 -1
  38. package/dist/locales/en.js +21 -4
  39. package/dist/locales/en.js.map +1 -1
  40. package/dist/locales/es-MX.d.ts.map +1 -1
  41. package/dist/locales/es-MX.js +20 -4
  42. package/dist/locales/es-MX.js.map +1 -1
  43. package/dist/locales/es.d.ts.map +1 -1
  44. package/dist/locales/es.js +21 -4
  45. package/dist/locales/es.js.map +1 -1
  46. package/dist/locales/fi.d.ts.map +1 -1
  47. package/dist/locales/fi.js +21 -4
  48. package/dist/locales/fi.js.map +1 -1
  49. package/dist/locales/fr.d.ts.map +1 -1
  50. package/dist/locales/fr.js +21 -4
  51. package/dist/locales/fr.js.map +1 -1
  52. package/dist/locales/hi.d.ts.map +1 -1
  53. package/dist/locales/hi.js +21 -4
  54. package/dist/locales/hi.js.map +1 -1
  55. package/dist/locales/id.d.ts.map +1 -1
  56. package/dist/locales/id.js +21 -4
  57. package/dist/locales/id.js.map +1 -1
  58. package/dist/locales/it.d.ts.map +1 -1
  59. package/dist/locales/it.js +21 -4
  60. package/dist/locales/it.js.map +1 -1
  61. package/dist/locales/ja.d.ts.map +1 -1
  62. package/dist/locales/ja.js +21 -4
  63. package/dist/locales/ja.js.map +1 -1
  64. package/dist/locales/ko.d.ts.map +1 -1
  65. package/dist/locales/ko.js +21 -4
  66. package/dist/locales/ko.js.map +1 -1
  67. package/dist/locales/nl.d.ts.map +1 -1
  68. package/dist/locales/nl.js +21 -4
  69. package/dist/locales/nl.js.map +1 -1
  70. package/dist/locales/no.d.ts.map +1 -1
  71. package/dist/locales/no.js +21 -4
  72. package/dist/locales/no.js.map +1 -1
  73. package/dist/locales/pl.d.ts.map +1 -1
  74. package/dist/locales/pl.js +21 -4
  75. package/dist/locales/pl.js.map +1 -1
  76. package/dist/locales/pt-BR.d.ts.map +1 -1
  77. package/dist/locales/pt-BR.js +21 -4
  78. package/dist/locales/pt-BR.js.map +1 -1
  79. package/dist/locales/pt.d.ts.map +1 -1
  80. package/dist/locales/pt.js +21 -4
  81. package/dist/locales/pt.js.map +1 -1
  82. package/dist/locales/ru.d.ts.map +1 -1
  83. package/dist/locales/ru.js +21 -4
  84. package/dist/locales/ru.js.map +1 -1
  85. package/dist/locales/sv.d.ts.map +1 -1
  86. package/dist/locales/sv.js +21 -4
  87. package/dist/locales/sv.js.map +1 -1
  88. package/dist/locales/sw.d.ts.map +1 -1
  89. package/dist/locales/sw.js +21 -4
  90. package/dist/locales/sw.js.map +1 -1
  91. package/dist/locales/th.d.ts.map +1 -1
  92. package/dist/locales/th.js +21 -4
  93. package/dist/locales/th.js.map +1 -1
  94. package/dist/locales/tr.d.ts.map +1 -1
  95. package/dist/locales/tr.js +21 -4
  96. package/dist/locales/tr.js.map +1 -1
  97. package/dist/locales/types.d.ts +16 -3
  98. package/dist/locales/types.d.ts.map +1 -1
  99. package/dist/locales/types.js.map +1 -1
  100. package/dist/locales/vi.d.ts.map +1 -1
  101. package/dist/locales/vi.js +21 -4
  102. package/dist/locales/vi.js.map +1 -1
  103. package/dist/locales/zh.d.ts.map +1 -1
  104. package/dist/locales/zh.js +21 -4
  105. package/dist/locales/zh.js.map +1 -1
  106. package/dist/utils/codec-utils.d.ts +3 -1
  107. package/dist/utils/codec-utils.d.ts.map +1 -1
  108. package/dist/utils/codec-utils.js +110 -5
  109. package/dist/utils/codec-utils.js.map +1 -1
  110. package/dist/utils/deep-merge.d.ts +3 -0
  111. package/dist/utils/deep-merge.d.ts.map +1 -1
  112. package/dist/utils/deep-merge.js +30 -22
  113. package/dist/utils/deep-merge.js.map +1 -1
  114. package/dist/utils/ip-validation.d.ts +11 -0
  115. package/dist/utils/ip-validation.d.ts.map +1 -0
  116. package/dist/utils/ip-validation.js +78 -0
  117. package/dist/utils/ip-validation.js.map +1 -0
  118. package/dist/utils/security.d.ts +12 -0
  119. package/dist/utils/security.d.ts.map +1 -0
  120. package/dist/utils/security.js +61 -0
  121. package/dist/utils/security.js.map +1 -0
  122. package/dist/validators/array.d.ts +7 -0
  123. package/dist/validators/array.d.ts.map +1 -1
  124. package/dist/validators/array.js +57 -2
  125. package/dist/validators/array.js.map +1 -1
  126. package/dist/validators/base.d.ts +131 -0
  127. package/dist/validators/base.d.ts.map +1 -1
  128. package/dist/validators/base.js +247 -1
  129. package/dist/validators/base.js.map +1 -1
  130. package/dist/validators/base64.d.ts.map +1 -1
  131. package/dist/validators/base64.js +6 -3
  132. package/dist/validators/base64.js.map +1 -1
  133. package/dist/validators/bigint.d.ts +20 -0
  134. package/dist/validators/bigint.d.ts.map +1 -1
  135. package/dist/validators/bigint.js +39 -1
  136. package/dist/validators/bigint.js.map +1 -1
  137. package/dist/validators/boolean.js +29 -1
  138. package/dist/validators/boolean.js.map +1 -1
  139. package/dist/validators/codec.js +1 -1
  140. package/dist/validators/custom.d.ts +47 -0
  141. package/dist/validators/custom.d.ts.map +1 -0
  142. package/dist/validators/custom.js +50 -0
  143. package/dist/validators/custom.js.map +1 -0
  144. package/dist/validators/date.d.ts +21 -1
  145. package/dist/validators/date.d.ts.map +1 -1
  146. package/dist/validators/date.js +109 -30
  147. package/dist/validators/date.js.map +1 -1
  148. package/dist/validators/discriminated-union.d.ts +29 -0
  149. package/dist/validators/discriminated-union.d.ts.map +1 -0
  150. package/dist/validators/discriminated-union.js +98 -0
  151. package/dist/validators/discriminated-union.js.map +1 -0
  152. package/dist/validators/enum.d.ts +10 -0
  153. package/dist/validators/enum.d.ts.map +1 -1
  154. package/dist/validators/enum.js +38 -1
  155. package/dist/validators/enum.js.map +1 -1
  156. package/dist/validators/file.d.ts +57 -0
  157. package/dist/validators/file.d.ts.map +1 -0
  158. package/dist/validators/file.js +114 -0
  159. package/dist/validators/file.js.map +1 -0
  160. package/dist/validators/function.d.ts +26 -0
  161. package/dist/validators/function.d.ts.map +1 -0
  162. package/dist/validators/function.js +45 -0
  163. package/dist/validators/function.js.map +1 -0
  164. package/dist/validators/hex.d.ts.map +1 -1
  165. package/dist/validators/hex.js +3 -2
  166. package/dist/validators/hex.js.map +1 -1
  167. package/dist/validators/index.d.ts +18 -1
  168. package/dist/validators/index.d.ts.map +1 -1
  169. package/dist/validators/index.js +16 -1
  170. package/dist/validators/index.js.map +1 -1
  171. package/dist/validators/intersection.d.ts.map +1 -1
  172. package/dist/validators/intersection.js +15 -8
  173. package/dist/validators/intersection.js.map +1 -1
  174. package/dist/validators/json.d.ts +26 -0
  175. package/dist/validators/json.d.ts.map +1 -0
  176. package/dist/validators/json.js +64 -0
  177. package/dist/validators/json.js.map +1 -0
  178. package/dist/validators/lazy.d.ts +28 -0
  179. package/dist/validators/lazy.d.ts.map +1 -0
  180. package/dist/validators/lazy.js +42 -0
  181. package/dist/validators/lazy.js.map +1 -0
  182. package/dist/validators/literal.js +1 -1
  183. package/dist/validators/map.js +1 -1
  184. package/dist/validators/nan.d.ts +17 -0
  185. package/dist/validators/nan.d.ts.map +1 -0
  186. package/dist/validators/nan.js +32 -0
  187. package/dist/validators/nan.js.map +1 -0
  188. package/dist/validators/never.js +1 -1
  189. package/dist/validators/null.d.ts +16 -0
  190. package/dist/validators/null.d.ts.map +1 -0
  191. package/dist/validators/null.js +31 -0
  192. package/dist/validators/null.js.map +1 -0
  193. package/dist/validators/number.d.ts +22 -0
  194. package/dist/validators/number.d.ts.map +1 -1
  195. package/dist/validators/number.js +56 -4
  196. package/dist/validators/number.js.map +1 -1
  197. package/dist/validators/object.d.ts +37 -0
  198. package/dist/validators/object.d.ts.map +1 -1
  199. package/dist/validators/object.js +183 -14
  200. package/dist/validators/object.js.map +1 -1
  201. package/dist/validators/record.d.ts +15 -2
  202. package/dist/validators/record.d.ts.map +1 -1
  203. package/dist/validators/record.js +77 -1
  204. package/dist/validators/record.js.map +1 -1
  205. package/dist/validators/set.js +1 -1
  206. package/dist/validators/string-bool.d.ts +61 -0
  207. package/dist/validators/string-bool.d.ts.map +1 -0
  208. package/dist/validators/string-bool.js +127 -0
  209. package/dist/validators/string-bool.js.map +1 -0
  210. package/dist/validators/string-formats.d.ts +97 -0
  211. package/dist/validators/string-formats.d.ts.map +1 -0
  212. package/dist/validators/string-formats.js +120 -0
  213. package/dist/validators/string-formats.js.map +1 -0
  214. package/dist/validators/string.d.ts.map +1 -1
  215. package/dist/validators/string.js +16 -5
  216. package/dist/validators/string.js.map +1 -1
  217. package/dist/validators/symbol.js +1 -1
  218. package/dist/validators/template-literal.d.ts +32 -0
  219. package/dist/validators/template-literal.d.ts.map +1 -0
  220. package/dist/validators/template-literal.js +101 -0
  221. package/dist/validators/template-literal.js.map +1 -0
  222. package/dist/validators/tuple.js +1 -1
  223. package/dist/validators/uint8array.d.ts +21 -4
  224. package/dist/validators/uint8array.d.ts.map +1 -1
  225. package/dist/validators/uint8array.js +34 -23
  226. package/dist/validators/uint8array.js.map +1 -1
  227. package/dist/validators/undefined.d.ts +16 -0
  228. package/dist/validators/undefined.d.ts.map +1 -0
  229. package/dist/validators/undefined.js +31 -0
  230. package/dist/validators/undefined.js.map +1 -0
  231. package/dist/validators/union.d.ts +3 -0
  232. package/dist/validators/union.d.ts.map +1 -1
  233. package/dist/validators/union.js +46 -41
  234. package/dist/validators/union.js.map +1 -1
  235. package/dist/validators/void.js +1 -1
  236. package/dist/validators/xor.d.ts +23 -0
  237. package/dist/validators/xor.d.ts.map +1 -0
  238. package/dist/validators/xor.js +64 -0
  239. package/dist/validators/xor.js.map +1 -0
  240. package/package.json +2 -2
  241. package/dist/index-new.d.ts.map +0 -1
  242. package/dist/locales.d.ts +0 -54
  243. package/dist/locales.d.ts.map +0 -1
  244. package/dist/locales.js +0 -732
  245. package/dist/locales.js.map +0 -1
  246. package/dist/validators/object-optimized.d.ts +0 -23
  247. package/dist/validators/object-optimized.d.ts.map +0 -1
  248. package/dist/validators/object-optimized.js +0 -179
  249. package/dist/validators/object-optimized.js.map +0 -1
  250. package/dist/validators/object-ultra.d.ts +0 -34
  251. package/dist/validators/object-ultra.d.ts.map +0 -1
  252. package/dist/validators/object-ultra.js +0 -175
  253. package/dist/validators/object-ultra.js.map +0 -1
  254. package/dist/validators/string-ultra.d.ts +0 -49
  255. package/dist/validators/string-ultra.d.ts.map +0 -1
  256. package/dist/validators/string-ultra.js +0 -217
  257. package/dist/validators/string-ultra.js.map +0 -1
  258. package/dist/validators/union-optimized.d.ts +0 -15
  259. package/dist/validators/union-optimized.d.ts.map +0 -1
  260. package/dist/validators/union-optimized.js +0 -92
  261. package/dist/validators/union-optimized.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { VldBase } from './base.js';
2
- import { getMessages } from '../locales.js';
2
+ import { getMessages } from '../locales/index.js';
3
3
  /**
4
4
  * Immutable literal validator for exact value matching
5
5
  */
@@ -1,5 +1,5 @@
1
1
  import { VldBase } from './base.js';
2
- import { getMessages } from '../locales.js';
2
+ import { getMessages } from '../locales/index.js';
3
3
  /**
4
4
  * Immutable Map validator
5
5
  */
@@ -0,0 +1,17 @@
1
+ /**
2
+ * VldNan - Validates that a value is NaN (Not a Number)
3
+ * Part of Zod 4 API parity implementation
4
+ */
5
+ import { VldBase } from './base';
6
+ import type { ParseResult } from './base';
7
+ /**
8
+ * NaN validator - validates that a value is NaN
9
+ * Note: Uses Number.isNaN() which is more strict than global isNaN()
10
+ */
11
+ export declare class VldNan extends VldBase<unknown, number> {
12
+ private constructor();
13
+ static create(): VldNan;
14
+ parse(value: unknown): number;
15
+ safeParse(value: unknown): ParseResult<number>;
16
+ }
17
+ //# sourceMappingURL=nan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nan.d.ts","sourceRoot":"","sources":["../../src/validators/nan.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C;;;GAGG;AACH,qBAAa,MAAO,SAAQ,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC;IAClD,OAAO;IAIP,MAAM,CAAC,MAAM,IAAI,MAAM;IAIvB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAO7B,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;CAO/C"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * VldNan - Validates that a value is NaN (Not a Number)
3
+ * Part of Zod 4 API parity implementation
4
+ */
5
+ import { VldBase } from './base.js';
6
+ /**
7
+ * NaN validator - validates that a value is NaN
8
+ * Note: Uses Number.isNaN() which is more strict than global isNaN()
9
+ */
10
+ export class VldNan extends VldBase {
11
+ constructor() {
12
+ super();
13
+ }
14
+ static create() {
15
+ return new VldNan();
16
+ }
17
+ parse(value) {
18
+ if (typeof value !== 'number' || !Number.isNaN(value)) {
19
+ throw new Error(`Expected NaN, received ${typeof value === 'number' ? 'a valid number' : typeof value}`);
20
+ }
21
+ return value;
22
+ }
23
+ safeParse(value) {
24
+ try {
25
+ return { success: true, data: this.parse(value) };
26
+ }
27
+ catch (error) {
28
+ return { success: false, error: error };
29
+ }
30
+ }
31
+ }
32
+ //# sourceMappingURL=nan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nan.js","sourceRoot":"","sources":["../../src/validators/nan.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGjC;;;GAGG;AACH,MAAM,OAAO,MAAO,SAAQ,OAAwB;IAClD;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,MAAM,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;QAC3G,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,SAAS,CAAC,KAAc;QACtB,IAAI,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;CACF","sourcesContent":["/**\n * VldNan - Validates that a value is NaN (Not a Number)\n * Part of Zod 4 API parity implementation\n */\n\nimport { VldBase } from './base';\nimport type { ParseResult } from './base';\n\n/**\n * NaN validator - validates that a value is NaN\n * Note: Uses Number.isNaN() which is more strict than global isNaN()\n */\nexport class VldNan extends VldBase<unknown, number> {\n private constructor() {\n super();\n }\n\n static create(): VldNan {\n return new VldNan();\n }\n\n parse(value: unknown): number {\n if (typeof value !== 'number' || !Number.isNaN(value)) {\n throw new Error(`Expected NaN, received ${typeof value === 'number' ? 'a valid number' : typeof value}`);\n }\n return value;\n }\n\n safeParse(value: unknown): ParseResult<number> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { VldBase } from './base.js';
2
- import { getMessages } from '../locales.js';
2
+ import { getMessages } from '../locales/index.js';
3
3
  /**
4
4
  * Validator that never succeeds
5
5
  */
@@ -0,0 +1,16 @@
1
+ /**
2
+ * VldNull - Validates that a value is exactly null
3
+ * Part of Zod 4 API parity implementation
4
+ */
5
+ import { VldBase } from './base';
6
+ import type { ParseResult } from './base';
7
+ /**
8
+ * Null validator - validates that a value is exactly null
9
+ */
10
+ export declare class VldNull extends VldBase<unknown, null> {
11
+ private constructor();
12
+ static create(): VldNull;
13
+ parse(value: unknown): null;
14
+ safeParse(value: unknown): ParseResult<null>;
15
+ }
16
+ //# sourceMappingURL=null.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"null.d.ts","sourceRoot":"","sources":["../../src/validators/null.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C;;GAEG;AACH,qBAAa,OAAQ,SAAQ,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;IACjD,OAAO;IAIP,MAAM,CAAC,MAAM,IAAI,OAAO;IAIxB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAO3B,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC;CAO7C"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * VldNull - Validates that a value is exactly null
3
+ * Part of Zod 4 API parity implementation
4
+ */
5
+ import { VldBase } from './base.js';
6
+ /**
7
+ * Null validator - validates that a value is exactly null
8
+ */
9
+ export class VldNull extends VldBase {
10
+ constructor() {
11
+ super();
12
+ }
13
+ static create() {
14
+ return new VldNull();
15
+ }
16
+ parse(value) {
17
+ if (value !== null) {
18
+ throw new Error(`Expected null, received ${typeof value}`);
19
+ }
20
+ return null;
21
+ }
22
+ safeParse(value) {
23
+ try {
24
+ return { success: true, data: this.parse(value) };
25
+ }
26
+ catch (error) {
27
+ return { success: false, error: error };
28
+ }
29
+ }
30
+ }
31
+ //# sourceMappingURL=null.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"null.js","sourceRoot":"","sources":["../../src/validators/null.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGjC;;GAEG;AACH,MAAM,OAAO,OAAQ,SAAQ,OAAsB;IACjD;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,OAAO,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,KAAc;QACtB,IAAI,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;CACF","sourcesContent":["/**\n * VldNull - Validates that a value is exactly null\n * Part of Zod 4 API parity implementation\n */\n\nimport { VldBase } from './base';\nimport type { ParseResult } from './base';\n\n/**\n * Null validator - validates that a value is exactly null\n */\nexport class VldNull extends VldBase<unknown, null> {\n private constructor() {\n super();\n }\n\n static create(): VldNull {\n return new VldNull();\n }\n\n parse(value: unknown): null {\n if (value !== null) {\n throw new Error(`Expected null, received ${typeof value}`);\n }\n return null;\n }\n\n safeParse(value: unknown): ParseResult<null> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n}\n"]}
@@ -81,12 +81,34 @@ export declare class VldNumber extends VldBase<number, number> {
81
81
  between(min: number, max: number, message?: string): VldNumber;
82
82
  /**
83
83
  * Create a new validator that checks for even numbers
84
+ * BUG-011 FIX: Require integers for even/odd validation (more mathematically correct)
84
85
  */
85
86
  even(message?: string): VldNumber;
86
87
  /**
87
88
  * Create a new validator that checks for odd numbers
89
+ * BUG-011 FIX: Require integers for even/odd validation (more mathematically correct)
88
90
  */
89
91
  odd(message?: string): VldNumber;
92
+ /**
93
+ * Create a new validator with strict greater than constraint
94
+ * Zod 4 API parity - strictly greater than (not equal to)
95
+ */
96
+ gt(value: number, message?: string): VldNumber;
97
+ /**
98
+ * Create a new validator with strict less than constraint
99
+ * Zod 4 API parity - strictly less than (not equal to)
100
+ */
101
+ lt(value: number, message?: string): VldNumber;
102
+ /**
103
+ * Create a new validator with greater than or equal constraint
104
+ * Zod 4 API parity - alias for min()
105
+ */
106
+ gte(value: number, message?: string): VldNumber;
107
+ /**
108
+ * Create a new validator with less than or equal constraint
109
+ * Zod 4 API parity - alias for max()
110
+ */
111
+ lte(value: number, message?: string): VldNumber;
90
112
  }
91
113
  export {};
92
114
  //# sourceMappingURL=number.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/validators/number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,KAAK,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAE9C;;GAEG;AACH,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC5C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IAEjD;;OAEG;IACH,SAAS,aAAa,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAQ7D;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,SAAS;IAI1B;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAe7B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;IAQ9C;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAO/C;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAO/C;;OAEG;IACH,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOhC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOrC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOrC;;OAEG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOxC;;OAEG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOxC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOnC;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOjC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOtD;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAIhD;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAO9D;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOjC;;OAEG;IACH,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;CAMjC"}
1
+ {"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/validators/number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,KAAK,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAE9C;;GAEG;AACH,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC5C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IAEjD;;OAEG;IACH,SAAS,aAAa,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAQ7D;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,SAAS;IAI1B;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAe7B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;IAQ9C;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAO/C;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAO/C;;OAEG;IACH,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOhC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOrC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOrC;;OAEG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOxC;;OAEG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOxC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOnC;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOjC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAWtD;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAIhD;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAO9D;;;OAGG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAajC;;;OAGG;IACH,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAahC;;;OAGG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAO9C;;;OAGG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAO9C;;;OAGG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAI/C;;;OAGG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;CAGhD"}
@@ -1,5 +1,5 @@
1
1
  import { VldBase } from './base.js';
2
- import { getMessages } from '../locales.js';
2
+ import { getMessages } from '../locales/index.js';
3
3
  /**
4
4
  * Immutable number validator with chainable methods
5
5
  */
@@ -132,7 +132,11 @@ export class VldNumber extends VldBase {
132
132
  */
133
133
  multipleOf(value, message) {
134
134
  return new VldNumber({
135
- checks: [...this.config.checks, (v) => v % value === 0],
135
+ checks: [...this.config.checks, (v) => {
136
+ // Use epsilon comparison for floating point precision
137
+ const remainder = Math.abs(v % value);
138
+ return remainder < Number.EPSILON || Math.abs(remainder - Math.abs(value)) < Number.EPSILON;
139
+ }],
136
140
  errorMessage: message || getMessages().numberMultipleOf(value)
137
141
  });
138
142
  }
@@ -153,21 +157,69 @@ export class VldNumber extends VldBase {
153
157
  }
154
158
  /**
155
159
  * Create a new validator that checks for even numbers
160
+ * BUG-011 FIX: Require integers for even/odd validation (more mathematically correct)
156
161
  */
157
162
  even(message) {
158
163
  return new VldNumber({
159
- checks: [...this.config.checks, (v) => v % 2 === 0],
164
+ checks: [...this.config.checks, (v) => {
165
+ // Even/odd only makes sense for integers
166
+ if (!Number.isInteger(v)) {
167
+ return false;
168
+ }
169
+ return v % 2 === 0;
170
+ }],
160
171
  errorMessage: message || 'Number must be even'
161
172
  });
162
173
  }
163
174
  /**
164
175
  * Create a new validator that checks for odd numbers
176
+ * BUG-011 FIX: Require integers for even/odd validation (more mathematically correct)
165
177
  */
166
178
  odd(message) {
167
179
  return new VldNumber({
168
- checks: [...this.config.checks, (v) => v % 2 !== 0],
180
+ checks: [...this.config.checks, (v) => {
181
+ // Even/odd only makes sense for integers
182
+ if (!Number.isInteger(v)) {
183
+ return false;
184
+ }
185
+ return v % 2 !== 0;
186
+ }],
169
187
  errorMessage: message || 'Number must be odd'
170
188
  });
171
189
  }
190
+ /**
191
+ * Create a new validator with strict greater than constraint
192
+ * Zod 4 API parity - strictly greater than (not equal to)
193
+ */
194
+ gt(value, message) {
195
+ return new VldNumber({
196
+ checks: [...this.config.checks, (v) => v > value],
197
+ errorMessage: message || `Number must be greater than ${value}`
198
+ });
199
+ }
200
+ /**
201
+ * Create a new validator with strict less than constraint
202
+ * Zod 4 API parity - strictly less than (not equal to)
203
+ */
204
+ lt(value, message) {
205
+ return new VldNumber({
206
+ checks: [...this.config.checks, (v) => v < value],
207
+ errorMessage: message || `Number must be less than ${value}`
208
+ });
209
+ }
210
+ /**
211
+ * Create a new validator with greater than or equal constraint
212
+ * Zod 4 API parity - alias for min()
213
+ */
214
+ gte(value, message) {
215
+ return this.min(value, message);
216
+ }
217
+ /**
218
+ * Create a new validator with less than or equal constraint
219
+ * Zod 4 API parity - alias for max()
220
+ */
221
+ lte(value, message) {
222
+ return this.max(value, message);
223
+ }
172
224
  }
173
225
  //# sourceMappingURL=number.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/validators/number.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Type for number validation check functions\n */\ntype NumberCheck = (value: number) => boolean;\n\n/**\n * Configuration for number validator\n */\ninterface NumberValidatorConfig {\n readonly checks: ReadonlyArray<NumberCheck>;\n readonly errorMessage?: string;\n}\n\n/**\n * Immutable number validator with chainable methods\n */\nexport class VldNumber extends VldBase<number, number> {\n protected readonly config: NumberValidatorConfig;\n \n /**\n * Protected constructor to allow extension while maintaining immutability\n */\n protected constructor(config?: Partial<NumberValidatorConfig>) {\n super();\n this.config = {\n checks: config?.checks || [],\n errorMessage: config?.errorMessage\n };\n }\n \n /**\n * Create a new number validator\n */\n static create(): VldNumber {\n return new VldNumber();\n }\n \n /**\n * Parse and validate a number value\n */\n parse(value: unknown): number {\n if (typeof value !== 'number' || isNaN(value)) {\n throw new Error(this.config.errorMessage || getMessages().invalidNumber);\n }\n \n // Apply all checks\n for (const check of this.config.checks) {\n if (!check(value)) {\n throw new Error(this.config.errorMessage || getMessages().invalidNumber);\n }\n }\n \n return value;\n }\n \n /**\n * Safely parse and validate a number value\n */\n safeParse(value: unknown): ParseResult<number> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n \n /**\n * Create a new validator with minimum value constraint\n */\n min(value: number, message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v >= value],\n errorMessage: message || getMessages().numberMin(value)\n });\n }\n \n /**\n * Create a new validator with maximum value constraint\n */\n max(value: number, message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v <= value],\n errorMessage: message || getMessages().numberMax(value)\n });\n }\n \n /**\n * Create a new validator that checks for integer values\n */\n int(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => Number.isInteger(v)],\n errorMessage: message || getMessages().numberInt\n });\n }\n \n /**\n * Create a new validator that checks for positive values\n */\n positive(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v > 0],\n errorMessage: message || getMessages().numberPositive\n });\n }\n \n /**\n * Create a new validator that checks for negative values\n */\n negative(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v < 0],\n errorMessage: message || getMessages().numberNegative\n });\n }\n \n /**\n * Create a new validator that checks for non-negative values\n */\n nonnegative(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v >= 0],\n errorMessage: message || getMessages().numberNonnegative\n });\n }\n \n /**\n * Create a new validator that checks for non-positive values\n */\n nonpositive(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v <= 0],\n errorMessage: message || getMessages().numberNonpositive\n });\n }\n \n /**\n * Create a new validator that checks for finite values\n */\n finite(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => Number.isFinite(v)],\n errorMessage: message || getMessages().numberFinite\n });\n }\n \n /**\n * Create a new validator that checks for safe integer values\n */\n safe(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => Number.isSafeInteger(v)],\n errorMessage: message || getMessages().numberSafe\n });\n }\n \n /**\n * Create a new validator that checks if value is multiple of another\n */\n multipleOf(value: number, message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v % value === 0],\n errorMessage: message || getMessages().numberMultipleOf(value)\n });\n }\n \n /**\n * Alias for multipleOf\n */\n step(value: number, message?: string): VldNumber {\n return this.multipleOf(value, message);\n }\n \n /**\n * Create a new validator with a range constraint\n */\n between(min: number, max: number, message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v >= min && v <= max],\n errorMessage: message || `Number must be between ${min} and ${max}`\n });\n }\n \n /**\n * Create a new validator that checks for even numbers\n */\n even(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v % 2 === 0],\n errorMessage: message || 'Number must be even'\n });\n }\n \n /**\n * Create a new validator that checks for odd numbers\n */\n odd(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v % 2 !== 0],\n errorMessage: message || 'Number must be odd'\n });\n }\n}"]}
1
+ {"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/validators/number.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { getMessages } from '../locales';\r\n\r\n/**\r\n * Type for number validation check functions\r\n */\r\ntype NumberCheck = (value: number) => boolean;\r\n\r\n/**\r\n * Configuration for number validator\r\n */\r\ninterface NumberValidatorConfig {\r\n readonly checks: ReadonlyArray<NumberCheck>;\r\n readonly errorMessage?: string;\r\n}\r\n\r\n/**\r\n * Immutable number validator with chainable methods\r\n */\r\nexport class VldNumber extends VldBase<number, number> {\r\n protected readonly config: NumberValidatorConfig;\r\n \r\n /**\r\n * Protected constructor to allow extension while maintaining immutability\r\n */\r\n protected constructor(config?: Partial<NumberValidatorConfig>) {\r\n super();\r\n this.config = {\r\n checks: config?.checks || [],\r\n errorMessage: config?.errorMessage\r\n };\r\n }\r\n \r\n /**\r\n * Create a new number validator\r\n */\r\n static create(): VldNumber {\r\n return new VldNumber();\r\n }\r\n \r\n /**\r\n * Parse and validate a number value\r\n */\r\n parse(value: unknown): number {\r\n if (typeof value !== 'number' || isNaN(value)) {\r\n throw new Error(this.config.errorMessage || getMessages().invalidNumber);\r\n }\r\n \r\n // Apply all checks\r\n for (const check of this.config.checks) {\r\n if (!check(value)) {\r\n throw new Error(this.config.errorMessage || getMessages().invalidNumber);\r\n }\r\n }\r\n \r\n return value;\r\n }\r\n \r\n /**\r\n * Safely parse and validate a number value\r\n */\r\n safeParse(value: unknown): ParseResult<number> {\r\n try {\r\n return { success: true, data: this.parse(value) };\r\n } catch (error) {\r\n return { success: false, error: error as Error };\r\n }\r\n }\r\n \r\n /**\r\n * Create a new validator with minimum value constraint\r\n */\r\n min(value: number, message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v >= value],\r\n errorMessage: message || getMessages().numberMin(value)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with maximum value constraint\r\n */\r\n max(value: number, message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v <= value],\r\n errorMessage: message || getMessages().numberMax(value)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for integer values\r\n */\r\n int(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => Number.isInteger(v)],\r\n errorMessage: message || getMessages().numberInt\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for positive values\r\n */\r\n positive(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v > 0],\r\n errorMessage: message || getMessages().numberPositive\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for negative values\r\n */\r\n negative(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v < 0],\r\n errorMessage: message || getMessages().numberNegative\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for non-negative values\r\n */\r\n nonnegative(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v >= 0],\r\n errorMessage: message || getMessages().numberNonnegative\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for non-positive values\r\n */\r\n nonpositive(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v <= 0],\r\n errorMessage: message || getMessages().numberNonpositive\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for finite values\r\n */\r\n finite(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => Number.isFinite(v)],\r\n errorMessage: message || getMessages().numberFinite\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for safe integer values\r\n */\r\n safe(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => Number.isSafeInteger(v)],\r\n errorMessage: message || getMessages().numberSafe\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks if value is multiple of another\r\n */\r\n multipleOf(value: number, message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => {\r\n // Use epsilon comparison for floating point precision\r\n const remainder = Math.abs(v % value);\r\n return remainder < Number.EPSILON || Math.abs(remainder - Math.abs(value)) < Number.EPSILON;\r\n }],\r\n errorMessage: message || getMessages().numberMultipleOf(value)\r\n });\r\n }\r\n \r\n /**\r\n * Alias for multipleOf\r\n */\r\n step(value: number, message?: string): VldNumber {\r\n return this.multipleOf(value, message);\r\n }\r\n \r\n /**\r\n * Create a new validator with a range constraint\r\n */\r\n between(min: number, max: number, message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v >= min && v <= max],\r\n errorMessage: message || `Number must be between ${min} and ${max}`\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for even numbers\r\n * BUG-011 FIX: Require integers for even/odd validation (more mathematically correct)\r\n */\r\n even(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => {\r\n // Even/odd only makes sense for integers\r\n if (!Number.isInteger(v)) {\r\n return false;\r\n }\r\n return v % 2 === 0;\r\n }],\r\n errorMessage: message || 'Number must be even'\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator that checks for odd numbers\r\n * BUG-011 FIX: Require integers for even/odd validation (more mathematically correct)\r\n */\r\n odd(message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => {\r\n // Even/odd only makes sense for integers\r\n if (!Number.isInteger(v)) {\r\n return false;\r\n }\r\n return v % 2 !== 0;\r\n }],\r\n errorMessage: message || 'Number must be odd'\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator with strict greater than constraint\r\n * Zod 4 API parity - strictly greater than (not equal to)\r\n */\r\n gt(value: number, message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v > value],\r\n errorMessage: message || `Number must be greater than ${value}`\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator with strict less than constraint\r\n * Zod 4 API parity - strictly less than (not equal to)\r\n */\r\n lt(value: number, message?: string): VldNumber {\r\n return new VldNumber({\r\n checks: [...this.config.checks, (v: number) => v < value],\r\n errorMessage: message || `Number must be less than ${value}`\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator with greater than or equal constraint\r\n * Zod 4 API parity - alias for min()\r\n */\r\n gte(value: number, message?: string): VldNumber {\r\n return this.min(value, message);\r\n }\r\n\r\n /**\r\n * Create a new validator with less than or equal constraint\r\n * Zod 4 API parity - alias for max()\r\n */\r\n lte(value: number, message?: string): VldNumber {\r\n return this.max(value, message);\r\n }\r\n}"]}
@@ -1,4 +1,5 @@
1
1
  import { VldBase, ParseResult } from './base';
2
+ import { VldEnum } from './enum';
2
3
  /**
3
4
  * Optimized immutable object validator with chainable methods
4
5
  * Features pre-computed keys and Set-based lookups for better performance
@@ -27,6 +28,11 @@ export declare class VldObject<T extends Record<string, any>> extends VldBase<un
27
28
  * Optimized version using pre-computed keys
28
29
  */
29
30
  safeParse(value: unknown): ParseResult<T>;
31
+ /**
32
+ * Comprehensive prototype pollution protection
33
+ * Checks for dangerous keys that could modify Object.prototype
34
+ */
35
+ private isDangerousKey;
30
36
  /**
31
37
  * Create a new validator in strict mode (no extra keys allowed)
32
38
  */
@@ -69,5 +75,36 @@ export declare class VldObject<T extends Record<string, any>> extends VldBase<un
69
75
  required(): VldObject<{
70
76
  [K in keyof T]-?: T[K];
71
77
  }>;
78
+ /**
79
+ * Create a new validator with a catchall validator for extra keys
80
+ * Zod 4 API parity - validates unknown keys with provided schema
81
+ */
82
+ catchall<U>(schema: VldBase<unknown, U>): VldObject<any>;
83
+ /**
84
+ * Access the inner shape schemas
85
+ * Zod 4 API parity - returns the shape object
86
+ */
87
+ get shape(): {
88
+ readonly [K in keyof T]: VldBase<unknown, T[K]>;
89
+ };
90
+ /**
91
+ * Create an enum validator from object keys
92
+ * Zod 4 API parity - creates literal union of keys
93
+ */
94
+ keyof(): VldEnum<[string, ...string[]]>;
95
+ /**
96
+ * Type-safe extend that throws an error if any key already exists
97
+ * Zod 4 API parity - prevents accidental field override
98
+ * @param extension The extension shape to add
99
+ * @returns A new validator with extended shape
100
+ * @throws {Error} If any extension key already exists in the shape
101
+ * @example
102
+ * const base = v.object({ name: v.string() });
103
+ * const extended = base.safeExtend({ age: v.number() }); // OK
104
+ * const invalid = base.safeExtend({ name: v.number() }); // Throws error
105
+ */
106
+ safeExtend<U extends Record<string, any>>(extension: {
107
+ [K in keyof U]: VldBase<unknown, U[K]>;
108
+ }): VldObject<T & U>;
72
109
  }
73
110
  //# sourceMappingURL=object.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/validators/object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAe,MAAM,QAAQ,CAAC;AAa3D;;;GAGG;AACH,qBAAa,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAE,SAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAE3C;;OAEG;IACH,OAAO;IAQP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzC,KAAK,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GAChD,SAAS,CAAC,CAAC,CAAC;IAIf;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC;IAoFxB;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC;IAiEzC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAStC;;OAEG;IACH,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC;IAQ3B;;OAEG;IACH,OAAO,IAAI,SAAS,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;IAW/C;;OAEG;IACH,WAAW,IAAI,SAAS,CAAC,GAAG,CAAC;IAgB7B;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAa5D;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAc5D;;OAEG;IACH,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClC,SAAS,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GACpD,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;IAOnB;;OAEG;IACH,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAClB,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;IAOnB;;OAEG;IACH,QAAQ,IAAI,SAAS,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;CAgBlD"}
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/validators/object.ts"],"names":[],"mappings":"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"}