@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.
- package/CHANGELOG.md +122 -0
- package/README.md +61 -43
- package/dist/coercion/bigint.js +1 -1
- package/dist/coercion/boolean.d.ts.map +1 -1
- package/dist/coercion/boolean.js +7 -3
- package/dist/coercion/boolean.js.map +1 -1
- package/dist/coercion/date.js +1 -1
- package/dist/coercion/number.d.ts.map +1 -1
- package/dist/coercion/number.js +20 -4
- package/dist/coercion/number.js.map +1 -1
- package/dist/coercion/string.d.ts.map +1 -1
- package/dist/coercion/string.js +84 -12
- package/dist/coercion/string.js.map +1 -1
- package/dist/index.d.ts +593 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +76 -5
- package/dist/index.js.map +1 -1
- package/dist/locales/af.d.ts.map +1 -1
- package/dist/locales/af.js +21 -4
- package/dist/locales/af.js.map +1 -1
- package/dist/locales/ar.d.ts.map +1 -1
- package/dist/locales/ar.js +21 -4
- package/dist/locales/ar.js.map +1 -1
- package/dist/locales/backup-en.d.ts +3 -0
- package/dist/locales/backup-en.d.ts.map +1 -0
- package/dist/locales/backup-en.js +105 -0
- package/dist/locales/backup-en.js.map +1 -0
- package/dist/locales/bn.d.ts.map +1 -1
- package/dist/locales/bn.js +21 -4
- package/dist/locales/bn.js.map +1 -1
- package/dist/locales/da.d.ts.map +1 -1
- package/dist/locales/da.js +21 -4
- package/dist/locales/da.js.map +1 -1
- package/dist/locales/de.d.ts.map +1 -1
- package/dist/locales/de.js +21 -4
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.d.ts.map +1 -1
- package/dist/locales/en.js +21 -4
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es-MX.d.ts.map +1 -1
- package/dist/locales/es-MX.js +20 -4
- package/dist/locales/es-MX.js.map +1 -1
- package/dist/locales/es.d.ts.map +1 -1
- package/dist/locales/es.js +21 -4
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/fi.d.ts.map +1 -1
- package/dist/locales/fi.js +21 -4
- package/dist/locales/fi.js.map +1 -1
- package/dist/locales/fr.d.ts.map +1 -1
- package/dist/locales/fr.js +21 -4
- package/dist/locales/fr.js.map +1 -1
- package/dist/locales/hi.d.ts.map +1 -1
- package/dist/locales/hi.js +21 -4
- package/dist/locales/hi.js.map +1 -1
- package/dist/locales/id.d.ts.map +1 -1
- package/dist/locales/id.js +21 -4
- package/dist/locales/id.js.map +1 -1
- package/dist/locales/it.d.ts.map +1 -1
- package/dist/locales/it.js +21 -4
- package/dist/locales/it.js.map +1 -1
- package/dist/locales/ja.d.ts.map +1 -1
- package/dist/locales/ja.js +21 -4
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.d.ts.map +1 -1
- package/dist/locales/ko.js +21 -4
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/nl.d.ts.map +1 -1
- package/dist/locales/nl.js +21 -4
- package/dist/locales/nl.js.map +1 -1
- package/dist/locales/no.d.ts.map +1 -1
- package/dist/locales/no.js +21 -4
- package/dist/locales/no.js.map +1 -1
- package/dist/locales/pl.d.ts.map +1 -1
- package/dist/locales/pl.js +21 -4
- package/dist/locales/pl.js.map +1 -1
- package/dist/locales/pt-BR.d.ts.map +1 -1
- package/dist/locales/pt-BR.js +21 -4
- package/dist/locales/pt-BR.js.map +1 -1
- package/dist/locales/pt.d.ts.map +1 -1
- package/dist/locales/pt.js +21 -4
- package/dist/locales/pt.js.map +1 -1
- package/dist/locales/ru.d.ts.map +1 -1
- package/dist/locales/ru.js +21 -4
- package/dist/locales/ru.js.map +1 -1
- package/dist/locales/sv.d.ts.map +1 -1
- package/dist/locales/sv.js +21 -4
- package/dist/locales/sv.js.map +1 -1
- package/dist/locales/sw.d.ts.map +1 -1
- package/dist/locales/sw.js +21 -4
- package/dist/locales/sw.js.map +1 -1
- package/dist/locales/th.d.ts.map +1 -1
- package/dist/locales/th.js +21 -4
- package/dist/locales/th.js.map +1 -1
- package/dist/locales/tr.d.ts.map +1 -1
- package/dist/locales/tr.js +21 -4
- package/dist/locales/tr.js.map +1 -1
- package/dist/locales/types.d.ts +16 -3
- package/dist/locales/types.d.ts.map +1 -1
- package/dist/locales/types.js.map +1 -1
- package/dist/locales/vi.d.ts.map +1 -1
- package/dist/locales/vi.js +21 -4
- package/dist/locales/vi.js.map +1 -1
- package/dist/locales/zh.d.ts.map +1 -1
- package/dist/locales/zh.js +21 -4
- package/dist/locales/zh.js.map +1 -1
- package/dist/utils/codec-utils.d.ts +3 -1
- package/dist/utils/codec-utils.d.ts.map +1 -1
- package/dist/utils/codec-utils.js +110 -5
- package/dist/utils/codec-utils.js.map +1 -1
- package/dist/utils/deep-merge.d.ts +3 -0
- package/dist/utils/deep-merge.d.ts.map +1 -1
- package/dist/utils/deep-merge.js +30 -22
- package/dist/utils/deep-merge.js.map +1 -1
- package/dist/utils/ip-validation.d.ts +11 -0
- package/dist/utils/ip-validation.d.ts.map +1 -0
- package/dist/utils/ip-validation.js +78 -0
- package/dist/utils/ip-validation.js.map +1 -0
- package/dist/utils/security.d.ts +12 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +61 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/validators/array.d.ts +7 -0
- package/dist/validators/array.d.ts.map +1 -1
- package/dist/validators/array.js +57 -2
- package/dist/validators/array.js.map +1 -1
- package/dist/validators/base.d.ts +131 -0
- package/dist/validators/base.d.ts.map +1 -1
- package/dist/validators/base.js +247 -1
- package/dist/validators/base.js.map +1 -1
- package/dist/validators/base64.d.ts.map +1 -1
- package/dist/validators/base64.js +6 -3
- package/dist/validators/base64.js.map +1 -1
- package/dist/validators/bigint.d.ts +20 -0
- package/dist/validators/bigint.d.ts.map +1 -1
- package/dist/validators/bigint.js +39 -1
- package/dist/validators/bigint.js.map +1 -1
- package/dist/validators/boolean.js +29 -1
- package/dist/validators/boolean.js.map +1 -1
- package/dist/validators/codec.js +1 -1
- package/dist/validators/custom.d.ts +47 -0
- package/dist/validators/custom.d.ts.map +1 -0
- package/dist/validators/custom.js +50 -0
- package/dist/validators/custom.js.map +1 -0
- package/dist/validators/date.d.ts +21 -1
- package/dist/validators/date.d.ts.map +1 -1
- package/dist/validators/date.js +109 -30
- package/dist/validators/date.js.map +1 -1
- package/dist/validators/discriminated-union.d.ts +29 -0
- package/dist/validators/discriminated-union.d.ts.map +1 -0
- package/dist/validators/discriminated-union.js +98 -0
- package/dist/validators/discriminated-union.js.map +1 -0
- package/dist/validators/enum.d.ts +10 -0
- package/dist/validators/enum.d.ts.map +1 -1
- package/dist/validators/enum.js +38 -1
- package/dist/validators/enum.js.map +1 -1
- package/dist/validators/file.d.ts +57 -0
- package/dist/validators/file.d.ts.map +1 -0
- package/dist/validators/file.js +114 -0
- package/dist/validators/file.js.map +1 -0
- package/dist/validators/function.d.ts +26 -0
- package/dist/validators/function.d.ts.map +1 -0
- package/dist/validators/function.js +45 -0
- package/dist/validators/function.js.map +1 -0
- package/dist/validators/hex.d.ts.map +1 -1
- package/dist/validators/hex.js +3 -2
- package/dist/validators/hex.js.map +1 -1
- package/dist/validators/index.d.ts +18 -1
- package/dist/validators/index.d.ts.map +1 -1
- package/dist/validators/index.js +16 -1
- package/dist/validators/index.js.map +1 -1
- package/dist/validators/intersection.d.ts.map +1 -1
- package/dist/validators/intersection.js +15 -8
- package/dist/validators/intersection.js.map +1 -1
- package/dist/validators/json.d.ts +26 -0
- package/dist/validators/json.d.ts.map +1 -0
- package/dist/validators/json.js +64 -0
- package/dist/validators/json.js.map +1 -0
- package/dist/validators/lazy.d.ts +28 -0
- package/dist/validators/lazy.d.ts.map +1 -0
- package/dist/validators/lazy.js +42 -0
- package/dist/validators/lazy.js.map +1 -0
- package/dist/validators/literal.js +1 -1
- package/dist/validators/map.js +1 -1
- package/dist/validators/nan.d.ts +17 -0
- package/dist/validators/nan.d.ts.map +1 -0
- package/dist/validators/nan.js +32 -0
- package/dist/validators/nan.js.map +1 -0
- package/dist/validators/never.js +1 -1
- package/dist/validators/null.d.ts +16 -0
- package/dist/validators/null.d.ts.map +1 -0
- package/dist/validators/null.js +31 -0
- package/dist/validators/null.js.map +1 -0
- package/dist/validators/number.d.ts +22 -0
- package/dist/validators/number.d.ts.map +1 -1
- package/dist/validators/number.js +56 -4
- package/dist/validators/number.js.map +1 -1
- package/dist/validators/object.d.ts +37 -0
- package/dist/validators/object.d.ts.map +1 -1
- package/dist/validators/object.js +183 -14
- package/dist/validators/object.js.map +1 -1
- package/dist/validators/record.d.ts +15 -2
- package/dist/validators/record.d.ts.map +1 -1
- package/dist/validators/record.js +77 -1
- package/dist/validators/record.js.map +1 -1
- package/dist/validators/set.js +1 -1
- package/dist/validators/string-bool.d.ts +61 -0
- package/dist/validators/string-bool.d.ts.map +1 -0
- package/dist/validators/string-bool.js +127 -0
- package/dist/validators/string-bool.js.map +1 -0
- package/dist/validators/string-formats.d.ts +97 -0
- package/dist/validators/string-formats.d.ts.map +1 -0
- package/dist/validators/string-formats.js +120 -0
- package/dist/validators/string-formats.js.map +1 -0
- package/dist/validators/string.d.ts.map +1 -1
- package/dist/validators/string.js +16 -5
- package/dist/validators/string.js.map +1 -1
- package/dist/validators/symbol.js +1 -1
- package/dist/validators/template-literal.d.ts +32 -0
- package/dist/validators/template-literal.d.ts.map +1 -0
- package/dist/validators/template-literal.js +101 -0
- package/dist/validators/template-literal.js.map +1 -0
- package/dist/validators/tuple.js +1 -1
- package/dist/validators/uint8array.d.ts +21 -4
- package/dist/validators/uint8array.d.ts.map +1 -1
- package/dist/validators/uint8array.js +34 -23
- package/dist/validators/uint8array.js.map +1 -1
- package/dist/validators/undefined.d.ts +16 -0
- package/dist/validators/undefined.d.ts.map +1 -0
- package/dist/validators/undefined.js +31 -0
- package/dist/validators/undefined.js.map +1 -0
- package/dist/validators/union.d.ts +3 -0
- package/dist/validators/union.d.ts.map +1 -1
- package/dist/validators/union.js +46 -41
- package/dist/validators/union.js.map +1 -1
- package/dist/validators/void.js +1 -1
- package/dist/validators/xor.d.ts +23 -0
- package/dist/validators/xor.d.ts.map +1 -0
- package/dist/validators/xor.js +64 -0
- package/dist/validators/xor.js.map +1 -0
- package/package.json +2 -2
- package/dist/index-new.d.ts.map +0 -1
- package/dist/locales.d.ts +0 -54
- package/dist/locales.d.ts.map +0 -1
- package/dist/locales.js +0 -732
- package/dist/locales.js.map +0 -1
- package/dist/validators/object-optimized.d.ts +0 -23
- package/dist/validators/object-optimized.d.ts.map +0 -1
- package/dist/validators/object-optimized.js +0 -179
- package/dist/validators/object-optimized.js.map +0 -1
- package/dist/validators/object-ultra.d.ts +0 -34
- package/dist/validators/object-ultra.d.ts.map +0 -1
- package/dist/validators/object-ultra.js +0 -175
- package/dist/validators/object-ultra.js.map +0 -1
- package/dist/validators/string-ultra.d.ts +0 -49
- package/dist/validators/string-ultra.d.ts.map +0 -1
- package/dist/validators/string-ultra.js +0 -217
- package/dist/validators/string-ultra.js.map +0 -1
- package/dist/validators/union-optimized.d.ts +0 -15
- package/dist/validators/union-optimized.d.ts.map +0 -1
- package/dist/validators/union-optimized.js +0 -92
- package/dist/validators/union-optimized.js.map +0 -1
package/dist/validators/date.js
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
67
|
-
|
|
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
|
-
|
|
77
|
-
|
|
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
|
-
|
|
88
|
-
|
|
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
|
-
|
|
97
|
-
|
|
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
|
-
|
|
106
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
v.
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAezC;;GAEG;AACH,MAAM,OAAO,OAAQ,SAAQ,OAAmB;IAG9C;;OAEG;IACH,YAAsB,MAAqC;QACzD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG;YACZ,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE;YAC5B,YAAY,EAAE,MAAM,EAAE,YAAY;SACnC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,OAAO,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,IAAU,CAAC;QAEf,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,IAAI,GAAG,KAAK,CAAC;QACf,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAClE,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,WAAW,CAAC,CAAC;QACzE,CAAC;QAED,6BAA6B;QAC7B,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,WAAW,CAAC,CAAC;QACzE,CAAC;QAED,mBAAmB;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,WAAW,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,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;IAED;;OAEG;IACH,GAAG,CAAC,IAA4B,EAAE,OAAgB;QAChD,MAAM,OAAO,GAAG,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,IAAI,OAAO,CAAC;YACjB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC;YAC1D,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAA4B,EAAE,OAAgB;QAChD,MAAM,OAAO,GAAG,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,IAAI,OAAO,CAAC;YACjB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC;YAC1D,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,OAAO,CACL,GAA2B,EAC3B,GAA2B,EAC3B,OAAgB;QAEhB,MAAM,OAAO,GAAG,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1D,OAAO,IAAI,OAAO,CAAC;YACjB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,CAAC;YAC1E,YAAY,EAAE,OAAO,IAAI,wBAAwB,OAAO,CAAC,WAAW,EAAE,QAAQ,OAAO,CAAC,WAAW,EAAE,EAAE;SACtG,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAgB;QACnB,OAAO,IAAI,OAAO,CAAC;YACjB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;YAC5D,YAAY,EAAE,OAAO,IAAI,0BAA0B;SACpD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAgB;QACrB,OAAO,IAAI,OAAO,CAAC;YACjB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;YAC5D,YAAY,EAAE,OAAO,IAAI,4BAA4B;SACtD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAgB;QACpB,OAAO,IAAI,OAAO,CAAC;YACjB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAO,EAAE,EAAE;oBAC1C,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;oBACzB,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE;wBACvC,CAAC,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,QAAQ,EAAE;wBACjC,CAAC,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;gBACzC,CAAC,CAAC;YACF,YAAY,EAAE,OAAO,IAAI,oBAAoB;SAC9C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,OAAgB;QACtB,OAAO,IAAI,OAAO,CAAC;YACjB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAO,EAAE,EAAE;oBAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;oBACvB,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;gBAC9B,CAAC,CAAC;YACF,YAAY,EAAE,OAAO,IAAI,wBAAwB;SAClD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,OAAgB;QACtB,OAAO,IAAI,OAAO,CAAC;YACjB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAO,EAAE,EAAE;oBAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;oBACvB,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;gBAChC,CAAC,CAAC;YACF,YAAY,EAAE,OAAO,IAAI,wBAAwB;SAClD,CAAC,CAAC;IACL,CAAC;CACF","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;
|
|
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"}
|
package/dist/validators/enum.js
CHANGED
|
@@ -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,
|
|
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"}
|