@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 date validator with chainable methods
5
5
  */
@@ -40,8 +40,8 @@ export class VldDate extends VldBase {
40
40
  }
41
41
  // Apply all checks
42
42
  for (const check of this.config.checks) {
43
- if (!check(date)) {
44
- throw new Error(this.config.errorMessage || getMessages().invalidDate);
43
+ if (!check.fn(date)) {
44
+ throw new Error(check.message);
45
45
  }
46
46
  }
47
47
  return date;
@@ -59,65 +59,110 @@ export class VldDate extends VldBase {
59
59
  }
60
60
  /**
61
61
  * Create a new validator with minimum date constraint
62
+ * BUG-NEW-009 FIX: Validate that min date is valid before creating validator
62
63
  */
63
64
  min(date, message) {
64
65
  const minDate = date instanceof Date ? date : new Date(date);
66
+ // Validate that minDate is valid
67
+ if (isNaN(minDate.getTime())) {
68
+ throw new Error(`Invalid date provided to min(): ${date}`);
69
+ }
65
70
  return new VldDate({
66
- checks: [...this.config.checks, (v) => v >= minDate],
67
- errorMessage: message || getMessages().dateMin(minDate)
71
+ ...this.config,
72
+ checks: [...this.config.checks, {
73
+ fn: (v) => v >= minDate,
74
+ message: message || getMessages().dateMin(minDate)
75
+ }]
68
76
  });
69
77
  }
70
78
  /**
71
79
  * Create a new validator with maximum date constraint
80
+ * BUG-NEW-009 FIX: Validate that max date is valid before creating validator
72
81
  */
73
82
  max(date, message) {
74
83
  const maxDate = date instanceof Date ? date : new Date(date);
84
+ // Validate that maxDate is valid
85
+ if (isNaN(maxDate.getTime())) {
86
+ throw new Error(`Invalid date provided to max(): ${date}`);
87
+ }
75
88
  return new VldDate({
76
- checks: [...this.config.checks, (v) => v <= maxDate],
77
- errorMessage: message || getMessages().dateMax(maxDate)
89
+ ...this.config,
90
+ checks: [...this.config.checks, {
91
+ fn: (v) => v <= maxDate,
92
+ message: message || getMessages().dateMax(maxDate)
93
+ }]
78
94
  });
79
95
  }
80
96
  /**
81
97
  * Create a new validator with a range constraint
98
+ * BUG-NEW-019 FIX: Validate that min/max dates are valid before creating validator
82
99
  */
83
100
  between(min, max, message) {
84
101
  const minDate = min instanceof Date ? min : new Date(min);
85
102
  const maxDate = max instanceof Date ? max : new Date(max);
103
+ // Validate that both dates are valid
104
+ if (isNaN(minDate.getTime())) {
105
+ throw new Error(`Invalid min date provided to between(): ${min}`);
106
+ }
107
+ if (isNaN(maxDate.getTime())) {
108
+ throw new Error(`Invalid max date provided to between(): ${max}`);
109
+ }
86
110
  return new VldDate({
87
- checks: [...this.config.checks, (v) => v >= minDate && v <= maxDate],
88
- errorMessage: message || `Date must be between ${minDate.toISOString()} and ${maxDate.toISOString()}`
111
+ ...this.config,
112
+ checks: [...this.config.checks, {
113
+ fn: (v) => v >= minDate && v <= maxDate,
114
+ message: message || `Date must be between ${minDate.toISOString()} and ${maxDate.toISOString()}`
115
+ }]
89
116
  });
90
117
  }
91
118
  /**
92
119
  * Create a new validator that checks if date is in the past
120
+ * BUG-NEW-006 FIX: Capture reference date at validator creation time for deterministic behavior
93
121
  */
94
122
  past(message) {
123
+ const referenceDate = new Date(); // Capture NOW at validator creation time
95
124
  return new VldDate({
96
- checks: [...this.config.checks, (v) => v < new Date()],
97
- errorMessage: message || 'Date must be in the past'
125
+ ...this.config,
126
+ checks: [...this.config.checks, {
127
+ fn: (v) => v < referenceDate,
128
+ message: message || 'Date must be in the past'
129
+ }]
98
130
  });
99
131
  }
100
132
  /**
101
133
  * Create a new validator that checks if date is in the future
134
+ * BUG-NEW-006 FIX: Capture reference date at validator creation time for deterministic behavior
102
135
  */
103
136
  future(message) {
137
+ const referenceDate = new Date(); // Capture NOW at validator creation time
104
138
  return new VldDate({
105
- checks: [...this.config.checks, (v) => v > new Date()],
106
- errorMessage: message || 'Date must be in the future'
139
+ ...this.config,
140
+ checks: [...this.config.checks, {
141
+ fn: (v) => v > referenceDate,
142
+ message: message || 'Date must be in the future'
143
+ }]
107
144
  });
108
145
  }
109
146
  /**
110
147
  * Create a new validator that checks if date is today
148
+ * BUG-NEW-008 FIX: Capture reference date at validator creation time for deterministic behavior
111
149
  */
112
150
  today(message) {
151
+ // Capture the reference date (today) at validator creation time
152
+ const referenceDate = new Date();
153
+ const refYear = referenceDate.getFullYear();
154
+ const refMonth = referenceDate.getMonth();
155
+ const refDate = referenceDate.getDate();
113
156
  return new VldDate({
114
- checks: [...this.config.checks, (v) => {
115
- const today = new Date();
116
- return v.getFullYear() === today.getFullYear() &&
117
- v.getMonth() === today.getMonth() &&
118
- v.getDate() === today.getDate();
119
- }],
120
- errorMessage: message || 'Date must be today'
157
+ ...this.config,
158
+ checks: [...this.config.checks, {
159
+ fn: (v) => {
160
+ return v.getFullYear() === refYear &&
161
+ v.getMonth() === refMonth &&
162
+ v.getDate() === refDate;
163
+ },
164
+ message: message || 'Date must be today'
165
+ }]
121
166
  });
122
167
  }
123
168
  /**
@@ -125,11 +170,14 @@ export class VldDate extends VldBase {
125
170
  */
126
171
  weekday(message) {
127
172
  return new VldDate({
128
- checks: [...this.config.checks, (v) => {
129
- const day = v.getDay();
130
- return day >= 1 && day <= 5;
131
- }],
132
- errorMessage: message || 'Date must be a weekday'
173
+ ...this.config,
174
+ checks: [...this.config.checks, {
175
+ fn: (v) => {
176
+ const day = v.getDay();
177
+ return day >= 1 && day <= 5;
178
+ },
179
+ message: message || 'Date must be a weekday'
180
+ }]
133
181
  });
134
182
  }
135
183
  /**
@@ -137,11 +185,42 @@ export class VldDate extends VldBase {
137
185
  */
138
186
  weekend(message) {
139
187
  return new VldDate({
140
- checks: [...this.config.checks, (v) => {
141
- const day = v.getDay();
142
- return day === 0 || day === 6;
143
- }],
144
- errorMessage: message || 'Date must be a weekend'
188
+ ...this.config,
189
+ checks: [...this.config.checks, {
190
+ fn: (v) => {
191
+ const day = v.getDay();
192
+ return day === 0 || day === 6;
193
+ },
194
+ message: message || 'Date must be a weekend'
195
+ }]
196
+ });
197
+ }
198
+ /**
199
+ * Create a new validator with strict greater than constraint
200
+ * Zod 4 API parity - strictly greater than (not equal to)
201
+ */
202
+ gt(value, message) {
203
+ const compareDate = value instanceof Date ? value : new Date(value);
204
+ return new VldDate({
205
+ ...this.config,
206
+ checks: [...this.config.checks, {
207
+ fn: (v) => v.getTime() > compareDate.getTime(),
208
+ message: message || `Date must be greater than ${compareDate.toISOString()}`
209
+ }]
210
+ });
211
+ }
212
+ /**
213
+ * Create a new validator with strict less than constraint
214
+ * Zod 4 API parity - strictly less than (not equal to)
215
+ */
216
+ lt(value, message) {
217
+ const compareDate = value instanceof Date ? value : new Date(value);
218
+ return new VldDate({
219
+ ...this.config,
220
+ checks: [...this.config.checks, {
221
+ fn: (v) => v.getTime() < compareDate.getTime(),
222
+ message: message || `Date must be less than ${compareDate.toISOString()}`
223
+ }]
145
224
  });
146
225
  }
147
226
  }
@@ -1 +1 @@
1
- {"version":3,"file":"date.js","sourceRoot":"","sources":["../../src/validators/date.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Type for date validation check functions\n */\ntype DateCheck = (value: Date) => boolean;\n\n/**\n * Configuration for date validator\n */\ninterface DateValidatorConfig {\n readonly checks: ReadonlyArray<DateCheck>;\n readonly errorMessage?: string;\n}\n\n/**\n * Immutable date validator with chainable methods\n */\nexport class VldDate extends VldBase<Date, Date> {\n private readonly config: DateValidatorConfig;\n \n /**\n * Protected constructor to allow extension while maintaining immutability\n */\n protected constructor(config?: Partial<DateValidatorConfig>) {\n super();\n this.config = {\n checks: config?.checks || [],\n errorMessage: config?.errorMessage\n };\n }\n \n /**\n * Create a new date validator\n */\n static create(): VldDate {\n return new VldDate();\n }\n \n /**\n * Parse and validate a date value\n */\n parse(value: unknown): Date {\n let date: Date;\n \n if (value instanceof Date) {\n date = value;\n } else if (typeof value === 'string' || typeof value === 'number') {\n date = new Date(value);\n } else {\n throw new Error(this.config.errorMessage || getMessages().invalidDate);\n }\n \n // Check if the date is valid\n if (isNaN(date.getTime())) {\n throw new Error(this.config.errorMessage || getMessages().invalidDate);\n }\n \n // Apply all checks\n for (const check of this.config.checks) {\n if (!check(date)) {\n throw new Error(this.config.errorMessage || getMessages().invalidDate);\n }\n }\n \n return date;\n }\n \n /**\n * Safely parse and validate a date value\n */\n safeParse(value: unknown): ParseResult<Date> {\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 date constraint\n */\n min(date: Date | string | number, message?: string): VldDate {\n const minDate = date instanceof Date ? date : new Date(date);\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => v >= minDate],\n errorMessage: message || getMessages().dateMin(minDate)\n });\n }\n \n /**\n * Create a new validator with maximum date constraint\n */\n max(date: Date | string | number, message?: string): VldDate {\n const maxDate = date instanceof Date ? date : new Date(date);\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => v <= maxDate],\n errorMessage: message || getMessages().dateMax(maxDate)\n });\n }\n \n /**\n * Create a new validator with a range constraint\n */\n between(\n min: Date | string | number,\n max: Date | string | number,\n message?: string\n ): VldDate {\n const minDate = min instanceof Date ? min : new Date(min);\n const maxDate = max instanceof Date ? max : new Date(max);\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => v >= minDate && v <= maxDate],\n errorMessage: message || `Date must be between ${minDate.toISOString()} and ${maxDate.toISOString()}`\n });\n }\n \n /**\n * Create a new validator that checks if date is in the past\n */\n past(message?: string): VldDate {\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => v < new Date()],\n errorMessage: message || 'Date must be in the past'\n });\n }\n \n /**\n * Create a new validator that checks if date is in the future\n */\n future(message?: string): VldDate {\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => v > new Date()],\n errorMessage: message || 'Date must be in the future'\n });\n }\n \n /**\n * Create a new validator that checks if date is today\n */\n today(message?: string): VldDate {\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => {\n const today = new Date();\n return v.getFullYear() === today.getFullYear() &&\n v.getMonth() === today.getMonth() &&\n v.getDate() === today.getDate();\n }],\n errorMessage: message || 'Date must be today'\n });\n }\n \n /**\n * Create a new validator that checks if date is a weekday\n */\n weekday(message?: string): VldDate {\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => {\n const day = v.getDay();\n return day >= 1 && day <= 5;\n }],\n errorMessage: message || 'Date must be a weekday'\n });\n }\n \n /**\n * Create a new validator that checks if date is a weekend\n */\n weekend(message?: string): VldDate {\n return new VldDate({\n checks: [...this.config.checks, (v: Date) => {\n const day = v.getDay();\n return day === 0 || day === 6;\n }],\n errorMessage: message || 'Date must be a weekend'\n });\n }\n}"]}
1
+ {"version":3,"file":"date.js","sourceRoot":"","sources":["../../src/validators/date.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 date validation check functions\r\n */\r\ntype DateCheckFn = (value: Date) => boolean;\r\n\r\ninterface DateCheck {\r\n fn: DateCheckFn;\r\n message: string;\r\n}\r\n\r\n/**\r\n * Configuration for date validator\r\n */\r\ninterface DateValidatorConfig {\r\n readonly checks: ReadonlyArray<DateCheck>;\r\n readonly errorMessage?: string;\r\n}\r\n\r\n/**\r\n * Immutable date validator with chainable methods\r\n */\r\nexport class VldDate extends VldBase<Date, Date> {\r\n private readonly config: DateValidatorConfig;\r\n\r\n /**\r\n * Protected constructor to allow extension while maintaining immutability\r\n */\r\n protected constructor(config?: Partial<DateValidatorConfig>) {\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 date validator\r\n */\r\n static create(): VldDate {\r\n return new VldDate();\r\n }\r\n\r\n /**\r\n * Parse and validate a date value\r\n */\r\n parse(value: unknown): Date {\r\n let date: Date;\r\n\r\n if (value instanceof Date) {\r\n date = value;\r\n } else if (typeof value === 'string' || typeof value === 'number') {\r\n date = new Date(value);\r\n } else {\r\n throw new Error(this.config.errorMessage || getMessages().invalidDate);\r\n }\r\n\r\n // Check if the date is valid\r\n if (isNaN(date.getTime())) {\r\n throw new Error(this.config.errorMessage || getMessages().invalidDate);\r\n }\r\n\r\n // Apply all checks\r\n for (const check of this.config.checks) {\r\n if (!check.fn(date)) {\r\n throw new Error(check.message);\r\n }\r\n }\r\n\r\n return date;\r\n }\r\n\r\n /**\r\n * Safely parse and validate a date value\r\n */\r\n safeParse(value: unknown): ParseResult<Date> {\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 date constraint\r\n * BUG-NEW-009 FIX: Validate that min date is valid before creating validator\r\n */\r\n min(date: Date | string | number, message?: string): VldDate {\r\n const minDate = date instanceof Date ? date : new Date(date);\r\n\r\n // Validate that minDate is valid\r\n if (isNaN(minDate.getTime())) {\r\n throw new Error(`Invalid date provided to min(): ${date}`);\r\n }\r\n\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => v >= minDate,\r\n message: message || getMessages().dateMin(minDate)\r\n }]\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator with maximum date constraint\r\n * BUG-NEW-009 FIX: Validate that max date is valid before creating validator\r\n */\r\n max(date: Date | string | number, message?: string): VldDate {\r\n const maxDate = date instanceof Date ? date : new Date(date);\r\n\r\n // Validate that maxDate is valid\r\n if (isNaN(maxDate.getTime())) {\r\n throw new Error(`Invalid date provided to max(): ${date}`);\r\n }\r\n\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => v <= maxDate,\r\n message: message || getMessages().dateMax(maxDate)\r\n }]\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator with a range constraint\r\n * BUG-NEW-019 FIX: Validate that min/max dates are valid before creating validator\r\n */\r\n between(\r\n min: Date | string | number,\r\n max: Date | string | number,\r\n message?: string\r\n ): VldDate {\r\n const minDate = min instanceof Date ? min : new Date(min);\r\n const maxDate = max instanceof Date ? max : new Date(max);\r\n\r\n // Validate that both dates are valid\r\n if (isNaN(minDate.getTime())) {\r\n throw new Error(`Invalid min date provided to between(): ${min}`);\r\n }\r\n if (isNaN(maxDate.getTime())) {\r\n throw new Error(`Invalid max date provided to between(): ${max}`);\r\n }\r\n\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => v >= minDate && v <= maxDate,\r\n message: message || `Date must be between ${minDate.toISOString()} and ${maxDate.toISOString()}`\r\n }]\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator that checks if date is in the past\r\n * BUG-NEW-006 FIX: Capture reference date at validator creation time for deterministic behavior\r\n */\r\n past(message?: string): VldDate {\r\n const referenceDate = new Date(); // Capture NOW at validator creation time\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => v < referenceDate,\r\n message: message || 'Date must be in the past'\r\n }]\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator that checks if date is in the future\r\n * BUG-NEW-006 FIX: Capture reference date at validator creation time for deterministic behavior\r\n */\r\n future(message?: string): VldDate {\r\n const referenceDate = new Date(); // Capture NOW at validator creation time\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => v > referenceDate,\r\n message: message || 'Date must be in the future'\r\n }]\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator that checks if date is today\r\n * BUG-NEW-008 FIX: Capture reference date at validator creation time for deterministic behavior\r\n */\r\n today(message?: string): VldDate {\r\n // Capture the reference date (today) at validator creation time\r\n const referenceDate = new Date();\r\n const refYear = referenceDate.getFullYear();\r\n const refMonth = referenceDate.getMonth();\r\n const refDate = referenceDate.getDate();\r\n\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => {\r\n return v.getFullYear() === refYear &&\r\n v.getMonth() === refMonth &&\r\n v.getDate() === refDate;\r\n },\r\n message: message || 'Date must be today'\r\n }]\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator that checks if date is a weekday\r\n */\r\n weekday(message?: string): VldDate {\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => {\r\n const day = v.getDay();\r\n return day >= 1 && day <= 5;\r\n },\r\n message: message || 'Date must be a weekday'\r\n }]\r\n });\r\n }\r\n\r\n /**\r\n * Create a new validator that checks if date is a weekend\r\n */\r\n weekend(message?: string): VldDate {\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => {\r\n const day = v.getDay();\r\n return day === 0 || day === 6;\r\n },\r\n message: message || 'Date must be a weekend'\r\n }]\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: Date | number, message?: string): VldDate {\r\n const compareDate = value instanceof Date ? value : new Date(value);\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => v.getTime() > compareDate.getTime(),\r\n message: message || `Date must be greater than ${compareDate.toISOString()}`\r\n }]\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: Date | number, message?: string): VldDate {\r\n const compareDate = value instanceof Date ? value : new Date(value);\r\n return new VldDate({\r\n ...this.config,\r\n checks: [...this.config.checks, {\r\n fn: (v: Date) => v.getTime() < compareDate.getTime(),\r\n message: message || `Date must be less than ${compareDate.toISOString()}`\r\n }]\r\n });\r\n }\r\n}"]}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * VldDiscriminatedUnion - Fast union validation using discriminator field
3
+ * Part of Zod 4 API parity implementation
4
+ * Provides O(1) lookup performance by using a discriminator key
5
+ */
6
+ import { VldBase } from './base';
7
+ import type { ParseResult } from './base';
8
+ /**
9
+ * Discriminated union validator - validates union based on discriminator key
10
+ * Much faster than regular union when you have a discriminator field
11
+ */
12
+ export declare class VldDiscriminatedUnion<K extends string, Options extends VldBase<any, any>[]> extends VldBase<unknown, Options[number] extends VldBase<any, infer T> ? T : never> {
13
+ private readonly _discriminator;
14
+ private readonly _options;
15
+ private readonly _discriminatorMap;
16
+ constructor(_discriminator: K, _options: Options);
17
+ static create<K extends string, Options extends VldBase<any, any>[]>(discriminator: K, options: Options): VldDiscriminatedUnion<K, Options>;
18
+ parse(value: unknown): Options[number] extends VldBase<any, infer T> ? T : never;
19
+ safeParse(value: unknown): ParseResult<Options[number] extends VldBase<any, infer T> ? T : never>;
20
+ /**
21
+ * Get the discriminator key
22
+ */
23
+ getDiscriminator(): K;
24
+ /**
25
+ * Get all options
26
+ */
27
+ getOptions(): Options;
28
+ }
29
+ //# sourceMappingURL=discriminated-union.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discriminated-union.d.ts","sourceRoot":"","sources":["../../src/validators/discriminated-union.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAIjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAgB1C;;;GAGG;AACH,qBAAa,qBAAqB,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CACtF,SAAQ,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAKjF,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJ3B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAkC;gBAGjD,cAAc,EAAE,CAAC,EACjB,QAAQ,EAAE,OAAO;IA4BpC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EACjE,aAAa,EAAE,CAAC,EAChB,OAAO,EAAE,OAAO,GACf,qBAAqB,CAAC,CAAC,EAAE,OAAO,CAAC;IAIpC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;IAQhF,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAiCjG;;OAEG;IACH,gBAAgB,IAAI,CAAC;IAIrB;;OAEG;IACH,UAAU,IAAI,OAAO;CAGtB"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * VldDiscriminatedUnion - Fast union validation using discriminator field
3
+ * Part of Zod 4 API parity implementation
4
+ * Provides O(1) lookup performance by using a discriminator key
5
+ */
6
+ import { VldBase } from './base.js';
7
+ import { VldObject } from './object.js';
8
+ import { VldLiteral } from './literal.js';
9
+ import { VldEnum } from './enum.js';
10
+ /**
11
+ * Extract literal values from a schema
12
+ */
13
+ function extractLiteralValues(schema) {
14
+ if (schema instanceof VldLiteral) {
15
+ const value = schema.literal;
16
+ return [value];
17
+ }
18
+ if (schema instanceof VldEnum) {
19
+ return schema.values;
20
+ }
21
+ throw new Error('Discriminator must be a literal or enum schema');
22
+ }
23
+ /**
24
+ * Discriminated union validator - validates union based on discriminator key
25
+ * Much faster than regular union when you have a discriminator field
26
+ */
27
+ export class VldDiscriminatedUnion extends VldBase {
28
+ constructor(_discriminator, _options) {
29
+ super();
30
+ this._discriminator = _discriminator;
31
+ this._options = _options;
32
+ // Build discriminator map for O(1) lookup
33
+ this._discriminatorMap = new Map();
34
+ for (const option of _options) {
35
+ if (!(option instanceof VldObject)) {
36
+ throw new Error('All options in a discriminated union must be objects');
37
+ }
38
+ const discriminatorSchema = option.config?.shape?.[this._discriminator];
39
+ if (!discriminatorSchema) {
40
+ throw new Error(`Missing discriminator key "${this._discriminator}" in one of the options`);
41
+ }
42
+ const values = extractLiteralValues(discriminatorSchema);
43
+ for (const value of values) {
44
+ if (this._discriminatorMap.has(value)) {
45
+ throw new Error(`Duplicate discriminator value "${String(value)}" found in discriminated union`);
46
+ }
47
+ this._discriminatorMap.set(value, option);
48
+ }
49
+ }
50
+ }
51
+ static create(discriminator, options) {
52
+ return new VldDiscriminatedUnion(discriminator, options);
53
+ }
54
+ parse(value) {
55
+ const result = this.safeParse(value);
56
+ if (!result.success) {
57
+ throw result.error;
58
+ }
59
+ return result.data;
60
+ }
61
+ safeParse(value) {
62
+ // Check if input is an object
63
+ if (typeof value !== 'object' || value === null) {
64
+ return {
65
+ success: false,
66
+ error: new Error(`Expected object, received ${value === null ? 'null' : typeof value}`)
67
+ };
68
+ }
69
+ // Get discriminator value
70
+ const discriminatorValue = value[this._discriminator];
71
+ // Look up matching schema
72
+ const matchedSchema = this._discriminatorMap.get(discriminatorValue);
73
+ if (!matchedSchema) {
74
+ const validValues = Array.from(this._discriminatorMap.keys());
75
+ return {
76
+ success: false,
77
+ error: new Error(`Invalid discriminator value for "${this._discriminator}". ` +
78
+ `Expected one of: ${JSON.stringify(validValues)}, ` +
79
+ `received: ${JSON.stringify(discriminatorValue)}`)
80
+ };
81
+ }
82
+ // Validate against matched schema
83
+ return matchedSchema.safeParse(value);
84
+ }
85
+ /**
86
+ * Get the discriminator key
87
+ */
88
+ getDiscriminator() {
89
+ return this._discriminator;
90
+ }
91
+ /**
92
+ * Get all options
93
+ */
94
+ getOptions() {
95
+ return this._options;
96
+ }
97
+ }
98
+ //# sourceMappingURL=discriminated-union.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discriminated-union.js","sourceRoot":"","sources":["../../src/validators/discriminated-union.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * VldDiscriminatedUnion - Fast union validation using discriminator field\n * Part of Zod 4 API parity implementation\n * Provides O(1) lookup performance by using a discriminator key\n */\n\nimport { VldBase } from './base';\nimport { VldObject } from './object';\nimport { VldLiteral } from './literal';\nimport { VldEnum } from './enum';\nimport type { ParseResult } from './base';\n\n/**\n * Extract literal values from a schema\n */\nfunction extractLiteralValues(schema: VldBase<unknown, any>): unknown[] {\n if (schema instanceof VldLiteral) {\n const value = (schema as any).literal;\n return [value];\n }\n if (schema instanceof VldEnum) {\n return (schema as any).values as unknown[];\n }\n throw new Error('Discriminator must be a literal or enum schema');\n}\n\n/**\n * Discriminated union validator - validates union based on discriminator key\n * Much faster than regular union when you have a discriminator field\n */\nexport class VldDiscriminatedUnion<K extends string, Options extends VldBase<any, any>[]>\n extends VldBase<unknown, Options[number] extends VldBase<any, infer T> ? T : never> {\n\n private readonly _discriminatorMap: Map<unknown, VldBase<any, any>>;\n\n constructor(\n private readonly _discriminator: K,\n private readonly _options: Options\n ) {\n super();\n\n // Build discriminator map for O(1) lookup\n this._discriminatorMap = new Map();\n\n for (const option of _options) {\n if (!(option instanceof VldObject)) {\n throw new Error('All options in a discriminated union must be objects');\n }\n\n const discriminatorSchema = (option as any).config?.shape?.[this._discriminator];\n if (!discriminatorSchema) {\n throw new Error(`Missing discriminator key \"${this._discriminator}\" in one of the options`);\n }\n\n const values = extractLiteralValues(discriminatorSchema);\n\n for (const value of values) {\n if (this._discriminatorMap.has(value)) {\n throw new Error(`Duplicate discriminator value \"${String(value)}\" found in discriminated union`);\n }\n this._discriminatorMap.set(value, option);\n }\n }\n }\n\n static create<K extends string, Options extends VldBase<any, any>[]>(\n discriminator: K,\n options: Options\n ): VldDiscriminatedUnion<K, Options> {\n return new VldDiscriminatedUnion(discriminator, options);\n }\n\n parse(value: unknown): Options[number] extends VldBase<any, infer T> ? T : never {\n const result = this.safeParse(value);\n if (!result.success) {\n throw result.error;\n }\n return result.data;\n }\n\n safeParse(value: unknown): ParseResult<Options[number] extends VldBase<any, infer T> ? T : never> {\n // Check if input is an object\n if (typeof value !== 'object' || value === null) {\n return {\n success: false,\n error: new Error(\n `Expected object, received ${value === null ? 'null' : typeof value}`\n )\n };\n }\n\n // Get discriminator value\n const discriminatorValue = (value as any)[this._discriminator];\n\n // Look up matching schema\n const matchedSchema = this._discriminatorMap.get(discriminatorValue);\n\n if (!matchedSchema) {\n const validValues = Array.from(this._discriminatorMap.keys());\n return {\n success: false,\n error: new Error(\n `Invalid discriminator value for \"${this._discriminator}\". ` +\n `Expected one of: ${JSON.stringify(validValues)}, ` +\n `received: ${JSON.stringify(discriminatorValue)}`\n )\n };\n }\n\n // Validate against matched schema\n return matchedSchema.safeParse(value) as ParseResult<Options[number] extends VldBase<any, infer T> ? T : never>;\n }\n\n /**\n * Get the discriminator key\n */\n getDiscriminator(): K {\n return this._discriminator;\n }\n\n /**\n * Get all options\n */\n getOptions(): Options {\n return this._options;\n }\n}\n"]}
@@ -21,5 +21,15 @@ export declare class VldEnum<T extends readonly [string, ...string[]]> extends V
21
21
  * Safely parse and validate an enum value
22
22
  */
23
23
  safeParse(value: unknown): ParseResult<T[number]>;
24
+ /**
25
+ * Exclude specific values from the enum
26
+ * Creates a new enum validator without the specified values
27
+ */
28
+ exclude<const E extends readonly string[]>(...excludeValues: E): VldEnum<T[number] extends E[number] ? never : T[number] extends Exclude<T[number], E[number]> ? T : Exclude<T, E>>;
29
+ /**
30
+ * Extract specific values from the enum
31
+ * Creates a new enum validator with only the specified values
32
+ */
33
+ extract<const E extends readonly string[]>(...extractValues: E): VldEnum<[string, ...string[]]>;
24
34
  }
25
35
  //# sourceMappingURL=enum.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"enum.d.ts","sourceRoot":"","sources":["../../src/validators/enum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,qBAAa,OAAO,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAE,SAAQ,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAK7F,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IALhC;;OAEG;IACH,OAAO;IAOP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI9E;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;IAUhC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;CAYlD"}
1
+ {"version":3,"file":"enum.d.ts","sourceRoot":"","sources":["../../src/validators/enum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,qBAAa,OAAO,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAE,SAAQ,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAK7F,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IALhC;;OAEG;IACH,OAAO;IAOP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI9E;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;IAiBhC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAuBjD;;;OAGG;IACH,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,aAAa,EAAE,CAAC,GAAG,OAAO,CACtE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAC1G;IASD;;;OAGG;IACH,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,aAAa,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;CAQhG"}
@@ -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 enum validator for string enum values
5
5
  */
@@ -22,6 +22,11 @@ export class VldEnum extends VldBase {
22
22
  * Parse and validate an enum value
23
23
  */
24
24
  parse(value) {
25
+ // BUG-002 FIX: Add type check before includes() to prevent type confusion
26
+ if (typeof value !== 'string') {
27
+ throw new Error(this.errorMessage ||
28
+ getMessages().enumExpected([...this.values], JSON.stringify(value)));
29
+ }
25
30
  if (!this.values.includes(value)) {
26
31
  throw new Error(this.errorMessage ||
27
32
  getMessages().enumExpected([...this.values], JSON.stringify(value)));
@@ -32,6 +37,14 @@ export class VldEnum extends VldBase {
32
37
  * Safely parse and validate an enum value
33
38
  */
34
39
  safeParse(value) {
40
+ // BUG-002 FIX: Add type check before includes() to prevent type confusion
41
+ if (typeof value !== 'string') {
42
+ return {
43
+ success: false,
44
+ error: new Error(this.errorMessage ||
45
+ getMessages().enumExpected([...this.values], JSON.stringify(value)))
46
+ };
47
+ }
35
48
  if (this.values.includes(value)) {
36
49
  return { success: true, data: value };
37
50
  }
@@ -41,5 +54,29 @@ export class VldEnum extends VldBase {
41
54
  getMessages().enumExpected([...this.values], JSON.stringify(value)))
42
55
  };
43
56
  }
57
+ /**
58
+ * Exclude specific values from the enum
59
+ * Creates a new enum validator without the specified values
60
+ */
61
+ exclude(...excludeValues) {
62
+ const filtered = this.values.filter(v => !excludeValues.includes(v));
63
+ if (filtered.length === 0) {
64
+ throw new Error('Cannot exclude all enum values');
65
+ }
66
+ // Type assertion needed because TypeScript can't guarantee the filtered array maintains the required type
67
+ return new VldEnum(filtered, this.errorMessage);
68
+ }
69
+ /**
70
+ * Extract specific values from the enum
71
+ * Creates a new enum validator with only the specified values
72
+ */
73
+ extract(...extractValues) {
74
+ const extracted = this.values.filter(v => extractValues.includes(v));
75
+ if (extracted.length === 0) {
76
+ throw new Error('Cannot extract non-existent enum values');
77
+ }
78
+ // Type assertion needed because TypeScript can't guarantee the extracted array has the required type
79
+ return new VldEnum(extracted, this.errorMessage);
80
+ }
44
81
  }
45
82
  //# sourceMappingURL=enum.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"enum.js","sourceRoot":"","sources":["../../src/validators/enum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,OAAkD,SAAQ,OAA0B;IAC/F;;OAEG;IACH,YACmB,MAAS,EACT,YAAqB;QAEtC,KAAK,EAAE,CAAC;QAHS,WAAM,GAAN,MAAM,CAAG;QACT,iBAAY,GAAZ,YAAY,CAAS;IAGxC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CAA2C,MAAS;QAC/D,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAe,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,YAAY;gBACjB,WAAW,EAAE,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACpE,CAAC;QACJ,CAAC;QACD,OAAO,KAAkB,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAc;QACtB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAe,CAAC,EAAE,CAAC;YAC1C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAkB,EAAE,CAAC;QACrD,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,KAAK,CACd,IAAI,CAAC,YAAY;gBACjB,WAAW,EAAE,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACpE;SACF,CAAC;IACJ,CAAC;CACF","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Immutable enum validator for string enum values\n */\nexport class VldEnum<T extends readonly [string, ...string[]]> extends VldBase<string, T[number]> {\n /**\n * Private constructor to enforce immutability\n */\n private constructor(\n private readonly values: T,\n private readonly errorMessage?: string\n ) {\n super();\n }\n \n /**\n * Create a new enum validator\n */\n static create<T extends readonly [string, ...string[]]>(values: T): VldEnum<T> {\n return new VldEnum(values);\n }\n \n /**\n * Parse and validate an enum value\n */\n parse(value: unknown): T[number] {\n if (!this.values.includes(value as string)) {\n throw new Error(\n this.errorMessage || \n getMessages().enumExpected([...this.values], JSON.stringify(value))\n );\n }\n return value as T[number];\n }\n \n /**\n * Safely parse and validate an enum value\n */\n safeParse(value: unknown): ParseResult<T[number]> {\n if (this.values.includes(value as string)) {\n return { success: true, data: value as T[number] };\n }\n return { \n success: false, \n error: new Error(\n this.errorMessage || \n getMessages().enumExpected([...this.values], JSON.stringify(value))\n )\n };\n }\n}"]}
1
+ {"version":3,"file":"enum.js","sourceRoot":"","sources":["../../src/validators/enum.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { getMessages } from '../locales';\r\n\r\n/**\r\n * Immutable enum validator for string enum values\r\n */\r\nexport class VldEnum<T extends readonly [string, ...string[]]> extends VldBase<string, T[number]> {\r\n /**\r\n * Private constructor to enforce immutability\r\n */\r\n private constructor(\r\n private readonly values: T,\r\n private readonly errorMessage?: string\r\n ) {\r\n super();\r\n }\r\n \r\n /**\r\n * Create a new enum validator\r\n */\r\n static create<T extends readonly [string, ...string[]]>(values: T): VldEnum<T> {\r\n return new VldEnum(values);\r\n }\r\n \r\n /**\r\n * Parse and validate an enum value\r\n */\r\n parse(value: unknown): T[number] {\r\n // BUG-002 FIX: Add type check before includes() to prevent type confusion\r\n if (typeof value !== 'string') {\r\n throw new Error(\r\n this.errorMessage ||\r\n getMessages().enumExpected([...this.values], JSON.stringify(value))\r\n );\r\n }\r\n if (!this.values.includes(value)) {\r\n throw new Error(\r\n this.errorMessage ||\r\n getMessages().enumExpected([...this.values], JSON.stringify(value))\r\n );\r\n }\r\n return value as T[number];\r\n }\r\n\r\n /**\r\n * Safely parse and validate an enum value\r\n */\r\n safeParse(value: unknown): ParseResult<T[number]> {\r\n // BUG-002 FIX: Add type check before includes() to prevent type confusion\r\n if (typeof value !== 'string') {\r\n return {\r\n success: false,\r\n error: new Error(\r\n this.errorMessage ||\r\n getMessages().enumExpected([...this.values], JSON.stringify(value))\r\n )\r\n };\r\n }\r\n if (this.values.includes(value)) {\r\n return { success: true, data: value as T[number] };\r\n }\r\n return {\r\n success: false,\r\n error: new Error(\r\n this.errorMessage ||\r\n getMessages().enumExpected([...this.values], JSON.stringify(value))\r\n )\r\n };\r\n }\r\n\r\n /**\r\n * Exclude specific values from the enum\r\n * Creates a new enum validator without the specified values\r\n */\r\n exclude<const E extends readonly string[]>(...excludeValues: E): VldEnum<\r\n T[number] extends E[number] ? never : T[number] extends Exclude<T[number], E[number]> ? T : Exclude<T, E>\r\n > {\r\n const filtered = this.values.filter(v => !excludeValues.includes(v));\r\n if (filtered.length === 0) {\r\n throw new Error('Cannot exclude all enum values');\r\n }\r\n // Type assertion needed because TypeScript can't guarantee the filtered array maintains the required type\r\n return new VldEnum(filtered as any, this.errorMessage);\r\n }\r\n\r\n /**\r\n * Extract specific values from the enum\r\n * Creates a new enum validator with only the specified values\r\n */\r\n extract<const E extends readonly string[]>(...extractValues: E): VldEnum<[string, ...string[]]> {\r\n const extracted = this.values.filter(v => extractValues.includes(v));\r\n if (extracted.length === 0) {\r\n throw new Error('Cannot extract non-existent enum values');\r\n }\r\n // Type assertion needed because TypeScript can't guarantee the extracted array has the required type\r\n return new VldEnum(extracted as any, this.errorMessage);\r\n }\r\n}"]}
@@ -0,0 +1,57 @@
1
+ import { VldBase, ParseResult } from './base';
2
+ /**
3
+ * File representation for validation
4
+ * In browsers: File object
5
+ * In Node.js: Object with size and type properties
6
+ */
7
+ export type VldFileValue = File | {
8
+ size: number;
9
+ type: string;
10
+ name?: string;
11
+ };
12
+ /**
13
+ * Immutable file validator for file uploads
14
+ * Supports size and MIME type validation
15
+ */
16
+ export declare class VldFile extends VldBase<unknown, VldFileValue> {
17
+ private readonly checks;
18
+ private constructor();
19
+ /**
20
+ * Create a new file validator
21
+ */
22
+ static create(): VldFile;
23
+ /**
24
+ * Parse and validate a file value
25
+ */
26
+ parse(value: unknown): VldFileValue;
27
+ /**
28
+ * Run all validation checks on the file
29
+ */
30
+ private runChecks;
31
+ /**
32
+ * Safely parse and validate a file value
33
+ */
34
+ safeParse(value: unknown): ParseResult<VldFileValue>;
35
+ /**
36
+ * Set minimum file size in bytes
37
+ */
38
+ min(bytes: number, message?: string): VldFile;
39
+ /**
40
+ * Set maximum file size in bytes
41
+ */
42
+ max(bytes: number, message?: string): VldFile;
43
+ /**
44
+ * Set allowed MIME types
45
+ */
46
+ mime(types: string | string[], message?: string): VldFile;
47
+ /**
48
+ * Set both minimum and maximum file size
49
+ */
50
+ size(min: number, max: number, message?: string): VldFile;
51
+ }
52
+ /**
53
+ * Helper function to create file validators
54
+ * Usage: v.file().min(1024).max(10485760).mime(['image/jpeg', 'image/png'])
55
+ */
56
+ export declare function file(): VldFile;
57
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/validators/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAW9C;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF;;;GAGG;AACH,qBAAa,OAAQ,SAAQ,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC;IAEvD,OAAO,CAAC,QAAQ,CAAC,MAAM;IADzB,OAAO;IAMP;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,OAAO;IAIxB;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY;IA2BnC;;OAEG;IACH,OAAO,CAAC,SAAS;IAqCjB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,YAAY,CAAC;IAQpD;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAI7C;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAI7C;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAKzD;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;CAG1D;AAED;;;GAGG;AACH,wBAAgB,IAAI,IAAI,OAAO,CAE9B"}