@oxog/vld 1.0.0 → 1.1.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 +97 -103
- package/README.md +78 -13
- package/dist/coercion/bigint.d.ts +27 -0
- package/dist/coercion/bigint.d.ts.map +1 -0
- package/dist/coercion/bigint.js +108 -0
- package/dist/coercion/bigint.js.map +1 -0
- package/dist/coercion/boolean.d.ts +20 -0
- package/dist/coercion/boolean.d.ts.map +1 -0
- package/dist/coercion/boolean.js +63 -0
- package/dist/coercion/boolean.js.map +1 -0
- package/dist/coercion/date.d.ts +20 -0
- package/dist/coercion/date.d.ts.map +1 -0
- package/dist/coercion/date.js +52 -0
- package/dist/coercion/date.js.map +1 -0
- package/dist/coercion/number.d.ts +35 -0
- package/dist/coercion/number.d.ts.map +1 -0
- package/dist/coercion/number.js +144 -0
- package/dist/coercion/number.js.map +1 -0
- package/dist/coercion/string.d.ts +38 -0
- package/dist/coercion/string.d.ts.map +1 -0
- package/dist/coercion/string.js +168 -0
- package/dist/coercion/string.js.map +1 -0
- package/dist/index-new.d.ts.map +1 -0
- package/dist/index.d.ts +64 -257
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -1164
- package/dist/index.js.map +1 -1
- package/dist/utils/deep-merge.d.ts +18 -0
- package/dist/utils/deep-merge.d.ts.map +1 -0
- package/dist/utils/deep-merge.js +68 -0
- package/dist/utils/deep-merge.js.map +1 -0
- package/dist/validators/any.d.ts +19 -0
- package/dist/validators/any.d.ts.map +1 -0
- package/dist/validators/any.js +25 -0
- package/dist/validators/any.js.map +1 -0
- package/dist/validators/array.d.ts +48 -0
- package/dist/validators/array.d.ts.map +1 -0
- package/dist/validators/array.js +135 -0
- package/dist/validators/array.js.map +1 -0
- package/dist/validators/base.d.ts +155 -0
- package/dist/validators/base.d.ts.map +1 -0
- package/dist/validators/base.js +245 -0
- package/dist/validators/base.js.map +1 -0
- package/dist/validators/bigint.d.ts +60 -0
- package/dist/validators/bigint.d.ts.map +1 -0
- package/dist/validators/bigint.js +104 -0
- package/dist/validators/bigint.js.map +1 -0
- package/dist/validators/boolean.d.ts +32 -0
- package/dist/validators/boolean.d.ts.map +1 -0
- package/dist/validators/boolean.js +86 -0
- package/dist/validators/boolean.js.map +1 -0
- package/dist/validators/date.d.ts +68 -0
- package/dist/validators/date.d.ts.map +1 -0
- package/dist/validators/date.js +148 -0
- package/dist/validators/date.js.map +1 -0
- package/dist/validators/enum.d.ts +25 -0
- package/dist/validators/enum.d.ts.map +1 -0
- package/dist/validators/enum.js +45 -0
- package/dist/validators/enum.js.map +1 -0
- package/dist/validators/index.d.ts +27 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +30 -0
- package/dist/validators/index.js.map +1 -0
- package/dist/validators/intersection.d.ts +25 -0
- package/dist/validators/intersection.d.ts.map +1 -0
- package/dist/validators/intersection.js +57 -0
- package/dist/validators/intersection.js.map +1 -0
- package/dist/validators/literal.d.ts +25 -0
- package/dist/validators/literal.d.ts.map +1 -0
- package/dist/validators/literal.js +45 -0
- package/dist/validators/literal.js.map +1 -0
- package/dist/validators/map.d.ts +26 -0
- package/dist/validators/map.d.ts.map +1 -0
- package/dist/validators/map.js +54 -0
- package/dist/validators/map.js.map +1 -0
- package/dist/validators/never.d.ts +19 -0
- package/dist/validators/never.d.ts.map +1 -0
- package/dist/validators/never.js +29 -0
- package/dist/validators/never.js.map +1 -0
- package/dist/validators/number.d.ts +92 -0
- package/dist/validators/number.d.ts.map +1 -0
- package/dist/validators/number.js +173 -0
- package/dist/validators/number.js.map +1 -0
- package/dist/validators/object-optimized.d.ts +23 -0
- package/dist/validators/object-optimized.d.ts.map +1 -0
- package/dist/validators/object-optimized.js +179 -0
- package/dist/validators/object-optimized.js.map +1 -0
- package/dist/validators/object-ultra.d.ts +34 -0
- package/dist/validators/object-ultra.d.ts.map +1 -0
- package/dist/validators/object-ultra.js +175 -0
- package/dist/validators/object-ultra.js.map +1 -0
- package/dist/validators/object.d.ts +73 -0
- package/dist/validators/object.d.ts.map +1 -0
- package/dist/validators/object.js +285 -0
- package/dist/validators/object.js.map +1 -0
- package/dist/validators/record.d.ts +25 -0
- package/dist/validators/record.d.ts.map +1 -0
- package/dist/validators/record.js +52 -0
- package/dist/validators/record.js.map +1 -0
- package/dist/validators/set.d.ts +25 -0
- package/dist/validators/set.d.ts.map +1 -0
- package/dist/validators/set.js +51 -0
- package/dist/validators/set.js.map +1 -0
- package/dist/validators/string-ultra.d.ts +49 -0
- package/dist/validators/string-ultra.d.ts.map +1 -0
- package/dist/validators/string-ultra.js +217 -0
- package/dist/validators/string-ultra.js.map +1 -0
- package/dist/validators/string.d.ts +109 -0
- package/dist/validators/string.d.ts.map +1 -0
- package/dist/validators/string.js +242 -0
- package/dist/validators/string.js.map +1 -0
- package/dist/validators/symbol.d.ts +24 -0
- package/dist/validators/symbol.d.ts.map +1 -0
- package/dist/validators/symbol.js +42 -0
- package/dist/validators/symbol.js.map +1 -0
- package/dist/validators/tuple.d.ts +31 -0
- package/dist/validators/tuple.d.ts.map +1 -0
- package/dist/validators/tuple.js +55 -0
- package/dist/validators/tuple.js.map +1 -0
- package/dist/validators/union-optimized.d.ts +15 -0
- package/dist/validators/union-optimized.d.ts.map +1 -0
- package/dist/validators/union-optimized.js +92 -0
- package/dist/validators/union-optimized.js.map +1 -0
- package/dist/validators/union.d.ts +33 -0
- package/dist/validators/union.d.ts.map +1 -0
- package/dist/validators/union.js +121 -0
- package/dist/validators/union.js.map +1 -0
- package/dist/validators/unknown.d.ts +19 -0
- package/dist/validators/unknown.d.ts.map +1 -0
- package/dist/validators/unknown.js +25 -0
- package/dist/validators/unknown.js.map +1 -0
- package/dist/validators/void.d.ts +19 -0
- package/dist/validators/void.d.ts.map +1 -0
- package/dist/validators/void.js +35 -0
- package/dist/validators/void.js.map +1 -0
- package/package.json +12 -6
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { VldBase, VldOptional } from './base.js';
|
|
2
|
+
import { getMessages } from '../locales.js';
|
|
3
|
+
/**
|
|
4
|
+
* Optimized immutable object validator with chainable methods
|
|
5
|
+
* Features pre-computed keys and Set-based lookups for better performance
|
|
6
|
+
*/
|
|
7
|
+
export class VldObject extends VldBase {
|
|
8
|
+
/**
|
|
9
|
+
* Private constructor to enforce immutability
|
|
10
|
+
*/
|
|
11
|
+
constructor(config) {
|
|
12
|
+
super();
|
|
13
|
+
this.config = config;
|
|
14
|
+
// Pre-compute shape keys for faster access
|
|
15
|
+
this.shapeKeys = Object.keys(config.shape);
|
|
16
|
+
this.shapeKeysSet = new Set(this.shapeKeys);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create a new object validator
|
|
20
|
+
*/
|
|
21
|
+
static create(shape) {
|
|
22
|
+
return new VldObject({ shape });
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Parse and validate an object value
|
|
26
|
+
* Ultra-optimized with inline type checks and minimal overhead
|
|
27
|
+
*/
|
|
28
|
+
parse(value) {
|
|
29
|
+
// Fast type check
|
|
30
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
31
|
+
throw new Error(this.config.errorMessage || getMessages().invalidObject);
|
|
32
|
+
}
|
|
33
|
+
const obj = value;
|
|
34
|
+
const result = {};
|
|
35
|
+
// Ultra-optimized field validation with inline fast paths
|
|
36
|
+
for (let i = 0; i < this.shapeKeys.length; i++) {
|
|
37
|
+
const key = this.shapeKeys[i];
|
|
38
|
+
const validator = this.config.shape[key];
|
|
39
|
+
const fieldValue = obj[key];
|
|
40
|
+
// Inline fast-path validation for common types
|
|
41
|
+
const validatorType = validator.constructor.name;
|
|
42
|
+
if (validatorType === 'VldString') {
|
|
43
|
+
// For string with validations, use safeParse to handle email, regex etc.
|
|
44
|
+
const parseResult = validator.safeParse(fieldValue);
|
|
45
|
+
if (!parseResult.success) {
|
|
46
|
+
throw new Error(getMessages().objectField(key, parseResult.error.message));
|
|
47
|
+
}
|
|
48
|
+
result[key] = parseResult.data;
|
|
49
|
+
}
|
|
50
|
+
else if (validatorType === 'VldNumber') {
|
|
51
|
+
if (typeof fieldValue !== 'number' || isNaN(fieldValue)) {
|
|
52
|
+
throw new Error(getMessages().objectField(key, getMessages().invalidNumber));
|
|
53
|
+
}
|
|
54
|
+
result[key] = fieldValue;
|
|
55
|
+
}
|
|
56
|
+
else if (validatorType === 'VldBoolean') {
|
|
57
|
+
if (typeof fieldValue !== 'boolean') {
|
|
58
|
+
throw new Error(getMessages().objectField(key, getMessages().invalidBoolean));
|
|
59
|
+
}
|
|
60
|
+
result[key] = fieldValue;
|
|
61
|
+
}
|
|
62
|
+
else if (validatorType === 'VldDate') {
|
|
63
|
+
// Use the actual validator for Date parsing (handles string conversion)
|
|
64
|
+
const parseResult = validator.safeParse(fieldValue);
|
|
65
|
+
if (!parseResult.success) {
|
|
66
|
+
throw new Error(getMessages().objectField(key, parseResult.error.message));
|
|
67
|
+
}
|
|
68
|
+
result[key] = parseResult.data;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// Fallback to safeParse for complex validators
|
|
72
|
+
const parseResult = validator.safeParse(fieldValue);
|
|
73
|
+
if (!parseResult.success) {
|
|
74
|
+
throw new Error(getMessages().objectField(key, parseResult.error.message));
|
|
75
|
+
}
|
|
76
|
+
result[key] = parseResult.data;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Handle strict mode - optimized with Set
|
|
80
|
+
if (this.config.strict) {
|
|
81
|
+
const objKeys = Object.keys(obj);
|
|
82
|
+
const extraKeys = [];
|
|
83
|
+
for (let i = 0; i < objKeys.length; i++) {
|
|
84
|
+
if (!this.shapeKeysSet.has(objKeys[i])) {
|
|
85
|
+
extraKeys.push(objKeys[i]);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (extraKeys.length > 0) {
|
|
89
|
+
throw new Error(getMessages().unexpectedKeys(extraKeys));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Handle passthrough mode - optimized
|
|
93
|
+
if (this.config.passthrough) {
|
|
94
|
+
const objKeys = Object.keys(obj);
|
|
95
|
+
for (let i = 0; i < objKeys.length; i++) {
|
|
96
|
+
const key = objKeys[i];
|
|
97
|
+
if (!this.shapeKeysSet.has(key)) {
|
|
98
|
+
result[key] = obj[key];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Safely parse and validate an object value
|
|
106
|
+
* Optimized version using pre-computed keys
|
|
107
|
+
*/
|
|
108
|
+
safeParse(value) {
|
|
109
|
+
// Fast type check
|
|
110
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
111
|
+
return {
|
|
112
|
+
success: false,
|
|
113
|
+
error: new Error(this.config.errorMessage || getMessages().invalidObject)
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const obj = value;
|
|
117
|
+
const result = {};
|
|
118
|
+
// Validate all fields
|
|
119
|
+
for (let i = 0; i < this.shapeKeys.length; i++) {
|
|
120
|
+
const key = this.shapeKeys[i];
|
|
121
|
+
const validator = this.config.shape[key];
|
|
122
|
+
const fieldValue = obj[key];
|
|
123
|
+
const parseResult = validator.safeParse(fieldValue);
|
|
124
|
+
if (parseResult.success) {
|
|
125
|
+
result[key] = parseResult.data;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
return {
|
|
129
|
+
success: false,
|
|
130
|
+
error: new Error(getMessages().objectField(key, parseResult.error.message))
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Handle strict mode
|
|
135
|
+
if (this.config.strict) {
|
|
136
|
+
const objKeys = Object.keys(obj);
|
|
137
|
+
const extraKeys = [];
|
|
138
|
+
for (let i = 0; i < objKeys.length; i++) {
|
|
139
|
+
if (!this.shapeKeysSet.has(objKeys[i])) {
|
|
140
|
+
extraKeys.push(objKeys[i]);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (extraKeys.length > 0) {
|
|
144
|
+
return {
|
|
145
|
+
success: false,
|
|
146
|
+
error: new Error(getMessages().unexpectedKeys(extraKeys))
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Handle passthrough mode
|
|
151
|
+
if (this.config.passthrough) {
|
|
152
|
+
const objKeys = Object.keys(obj);
|
|
153
|
+
for (let i = 0; i < objKeys.length; i++) {
|
|
154
|
+
const key = objKeys[i];
|
|
155
|
+
if (!this.shapeKeysSet.has(key)) {
|
|
156
|
+
result[key] = obj[key];
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return { success: true, data: result };
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Create a new validator in strict mode (no extra keys allowed)
|
|
164
|
+
*/
|
|
165
|
+
strict(message) {
|
|
166
|
+
return new VldObject({
|
|
167
|
+
...this.config,
|
|
168
|
+
strict: true,
|
|
169
|
+
passthrough: false,
|
|
170
|
+
errorMessage: message
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Create a new validator in passthrough mode (extra keys are preserved)
|
|
175
|
+
*/
|
|
176
|
+
passthrough() {
|
|
177
|
+
return new VldObject({
|
|
178
|
+
...this.config,
|
|
179
|
+
strict: false,
|
|
180
|
+
passthrough: true
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Create a new validator with all fields optional
|
|
185
|
+
*/
|
|
186
|
+
partial() {
|
|
187
|
+
const partialShape = {};
|
|
188
|
+
for (const key in this.config.shape) {
|
|
189
|
+
partialShape[key] = new VldOptional(this.config.shape[key]);
|
|
190
|
+
}
|
|
191
|
+
return new VldObject({
|
|
192
|
+
...this.config,
|
|
193
|
+
shape: partialShape
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Create a new validator with deep partial (nested objects also partial)
|
|
198
|
+
*/
|
|
199
|
+
deepPartial() {
|
|
200
|
+
const deepPartialShape = {};
|
|
201
|
+
for (const key in this.config.shape) {
|
|
202
|
+
const validator = this.config.shape[key];
|
|
203
|
+
if (validator instanceof VldObject) {
|
|
204
|
+
deepPartialShape[key] = new VldOptional(validator.deepPartial());
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
deepPartialShape[key] = new VldOptional(validator);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return new VldObject({
|
|
211
|
+
...this.config,
|
|
212
|
+
shape: deepPartialShape
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Create a new validator with only specified keys
|
|
217
|
+
*/
|
|
218
|
+
pick(...keys) {
|
|
219
|
+
const pickedShape = {};
|
|
220
|
+
for (const key of keys) {
|
|
221
|
+
if (key in this.config.shape) {
|
|
222
|
+
pickedShape[key] = this.config.shape[key];
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return new VldObject({
|
|
226
|
+
...this.config,
|
|
227
|
+
shape: pickedShape
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Create a new validator without specified keys
|
|
232
|
+
*/
|
|
233
|
+
omit(...keys) {
|
|
234
|
+
const omittedShape = {};
|
|
235
|
+
const keysToOmit = new Set(keys);
|
|
236
|
+
for (const key in this.config.shape) {
|
|
237
|
+
if (!keysToOmit.has(key)) {
|
|
238
|
+
omittedShape[key] = this.config.shape[key];
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return new VldObject({
|
|
242
|
+
...this.config,
|
|
243
|
+
shape: omittedShape
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Create a new validator with additional fields
|
|
248
|
+
*/
|
|
249
|
+
extend(extension) {
|
|
250
|
+
return new VldObject({
|
|
251
|
+
...this.config,
|
|
252
|
+
shape: { ...this.config.shape, ...extension }
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Create a new validator by merging with another object validator
|
|
257
|
+
*/
|
|
258
|
+
merge(other) {
|
|
259
|
+
return new VldObject({
|
|
260
|
+
...this.config,
|
|
261
|
+
shape: { ...this.config.shape, ...other.config.shape }
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Create a new validator with all fields required (removes optional)
|
|
266
|
+
*/
|
|
267
|
+
required() {
|
|
268
|
+
const requiredShape = {};
|
|
269
|
+
for (const key in this.config.shape) {
|
|
270
|
+
const validator = this.config.shape[key];
|
|
271
|
+
// If it's optional, unwrap it
|
|
272
|
+
if (validator instanceof VldOptional) {
|
|
273
|
+
requiredShape[key] = validator.baseValidator;
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
requiredShape[key] = validator;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return new VldObject({
|
|
280
|
+
...this.config,
|
|
281
|
+
shape: requiredShape
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/validators/object.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult, VldOptional } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Configuration for object validator\n */\ninterface ObjectValidatorConfig<T extends Record<string, any>> {\n readonly shape: { readonly [K in keyof T]: VldBase<unknown, T[K]> };\n readonly strict?: boolean;\n readonly passthrough?: boolean;\n readonly errorMessage?: string;\n}\n\n/**\n * Optimized immutable object validator with chainable methods\n * Features pre-computed keys and Set-based lookups for better performance\n */\nexport class VldObject<T extends Record<string, any>> extends VldBase<unknown, T> {\n private readonly config: ObjectValidatorConfig<T>;\n private readonly shapeKeys: string[];\n private readonly shapeKeysSet: Set<string>;\n \n /**\n * Private constructor to enforce immutability\n */\n private constructor(config: ObjectValidatorConfig<T>) {\n super();\n this.config = config;\n // Pre-compute shape keys for faster access\n this.shapeKeys = Object.keys(config.shape);\n this.shapeKeysSet = new Set(this.shapeKeys);\n }\n \n /**\n * Create a new object validator\n */\n static create<T extends Record<string, any>>(\n shape: { [K in keyof T]: VldBase<unknown, T[K]> }\n ): VldObject<T> {\n return new VldObject({ shape });\n }\n \n /**\n * Parse and validate an object value\n * Ultra-optimized with inline type checks and minimal overhead\n */\n parse(value: unknown): T {\n // Fast type check\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(this.config.errorMessage || getMessages().invalidObject);\n }\n \n const obj = value as Record<string, unknown>;\n const result: any = {};\n \n // Ultra-optimized field validation with inline fast paths\n for (let i = 0; i < this.shapeKeys.length; i++) {\n const key = this.shapeKeys[i];\n const validator = this.config.shape[key];\n const fieldValue = obj[key];\n \n // Inline fast-path validation for common types\n const validatorType = validator.constructor.name;\n \n if (validatorType === 'VldString') {\n // For string with validations, use safeParse to handle email, regex etc.\n const parseResult = validator.safeParse(fieldValue);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n } else if (validatorType === 'VldNumber') {\n if (typeof fieldValue !== 'number' || isNaN(fieldValue)) {\n throw new Error(getMessages().objectField(key, getMessages().invalidNumber));\n }\n result[key] = fieldValue;\n } else if (validatorType === 'VldBoolean') {\n if (typeof fieldValue !== 'boolean') {\n throw new Error(getMessages().objectField(key, getMessages().invalidBoolean));\n }\n result[key] = fieldValue;\n } else if (validatorType === 'VldDate') {\n // Use the actual validator for Date parsing (handles string conversion)\n const parseResult = validator.safeParse(fieldValue);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n } else {\n // Fallback to safeParse for complex validators\n const parseResult = validator.safeParse(fieldValue);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n }\n }\n \n // Handle strict mode - optimized with Set\n if (this.config.strict) {\n const objKeys = Object.keys(obj);\n const extraKeys: string[] = [];\n \n for (let i = 0; i < objKeys.length; i++) {\n if (!this.shapeKeysSet.has(objKeys[i])) {\n extraKeys.push(objKeys[i]);\n }\n }\n \n if (extraKeys.length > 0) {\n throw new Error(getMessages().unexpectedKeys(extraKeys));\n }\n }\n \n // Handle passthrough mode - optimized\n if (this.config.passthrough) {\n const objKeys = Object.keys(obj);\n for (let i = 0; i < objKeys.length; i++) {\n const key = objKeys[i];\n if (!this.shapeKeysSet.has(key)) {\n result[key] = obj[key];\n }\n }\n }\n \n return result as T;\n }\n \n /**\n * Safely parse and validate an object value\n * Optimized version using pre-computed keys\n */\n safeParse(value: unknown): ParseResult<T> {\n // Fast type check\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return {\n success: false,\n error: new Error(this.config.errorMessage || getMessages().invalidObject)\n };\n }\n \n const obj = value as Record<string, unknown>;\n const result: any = {};\n \n // Validate all fields\n for (let i = 0; i < this.shapeKeys.length; i++) {\n const key = this.shapeKeys[i];\n const validator = this.config.shape[key];\n const fieldValue = obj[key];\n \n const parseResult = validator.safeParse(fieldValue);\n \n if (parseResult.success) {\n result[key] = parseResult.data;\n } else {\n return {\n success: false,\n error: new Error(getMessages().objectField(key, parseResult.error.message))\n };\n }\n }\n \n // Handle strict mode\n if (this.config.strict) {\n const objKeys = Object.keys(obj);\n const extraKeys: string[] = [];\n \n for (let i = 0; i < objKeys.length; i++) {\n if (!this.shapeKeysSet.has(objKeys[i])) {\n extraKeys.push(objKeys[i]);\n }\n }\n \n if (extraKeys.length > 0) {\n return {\n success: false,\n error: new Error(getMessages().unexpectedKeys(extraKeys))\n };\n }\n }\n \n // Handle passthrough mode\n if (this.config.passthrough) {\n const objKeys = Object.keys(obj);\n for (let i = 0; i < objKeys.length; i++) {\n const key = objKeys[i];\n if (!this.shapeKeysSet.has(key)) {\n result[key] = obj[key];\n }\n }\n }\n \n return { success: true, data: result as T };\n }\n \n /**\n * Create a new validator in strict mode (no extra keys allowed)\n */\n strict(message?: string): VldObject<T> {\n return new VldObject({\n ...this.config,\n strict: true,\n passthrough: false,\n errorMessage: message\n });\n }\n \n /**\n * Create a new validator in passthrough mode (extra keys are preserved)\n */\n passthrough(): VldObject<T> {\n return new VldObject({\n ...this.config,\n strict: false,\n passthrough: true\n });\n }\n \n /**\n * Create a new validator with all fields optional\n */\n partial(): VldObject<{ [K in keyof T]?: T[K] }> {\n const partialShape: any = {};\n for (const key in this.config.shape) {\n partialShape[key] = new VldOptional(this.config.shape[key]);\n }\n return new VldObject({ \n ...this.config, \n shape: partialShape \n }) as any;\n }\n \n /**\n * Create a new validator with deep partial (nested objects also partial)\n */\n deepPartial(): VldObject<any> {\n const deepPartialShape: any = {};\n for (const key in this.config.shape) {\n const validator = this.config.shape[key];\n if (validator instanceof VldObject) {\n deepPartialShape[key] = new VldOptional(validator.deepPartial());\n } else {\n deepPartialShape[key] = new VldOptional(validator);\n }\n }\n return new VldObject({ \n ...this.config, \n shape: deepPartialShape \n });\n }\n \n /**\n * Create a new validator with only specified keys\n */\n pick<K extends keyof T>(...keys: K[]): VldObject<Pick<T, K>> {\n const pickedShape: any = {};\n for (const key of keys) {\n if (key in this.config.shape) {\n pickedShape[key] = this.config.shape[key];\n }\n }\n return new VldObject({ \n ...this.config, \n shape: pickedShape \n });\n }\n \n /**\n * Create a new validator without specified keys\n */\n omit<K extends keyof T>(...keys: K[]): VldObject<Omit<T, K>> {\n const omittedShape: any = {};\n const keysToOmit = new Set(keys);\n for (const key in this.config.shape) {\n if (!keysToOmit.has(key as any)) {\n omittedShape[key] = this.config.shape[key];\n }\n }\n return new VldObject({ \n ...this.config, \n shape: omittedShape \n });\n }\n \n /**\n * Create a new validator with additional fields\n */\n extend<U extends Record<string, any>>(\n extension: { [K in keyof U]: VldBase<unknown, U[K]> }\n ): VldObject<T & U> {\n return new VldObject({\n ...this.config,\n shape: { ...this.config.shape, ...extension } as any\n });\n }\n \n /**\n * Create a new validator by merging with another object validator\n */\n merge<U extends Record<string, any>>(\n other: VldObject<U>\n ): VldObject<T & U> {\n return new VldObject({\n ...this.config,\n shape: { ...this.config.shape, ...other.config.shape } as any\n });\n }\n \n /**\n * Create a new validator with all fields required (removes optional)\n */\n required(): VldObject<{ [K in keyof T]-?: T[K] }> {\n const requiredShape: any = {};\n for (const key in this.config.shape) {\n const validator = this.config.shape[key];\n // If it's optional, unwrap it\n if (validator instanceof VldOptional) {\n requiredShape[key] = (validator as any).baseValidator;\n } else {\n requiredShape[key] = validator;\n }\n }\n return new VldObject({ \n ...this.config, \n shape: requiredShape \n }) as any;\n }\n}"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { VldBase, ParseResult } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* Immutable record validator for key-value pairs
|
|
4
|
+
*/
|
|
5
|
+
export declare class VldRecord<T> extends VldBase<unknown, Record<string, T>> {
|
|
6
|
+
private readonly valueValidator;
|
|
7
|
+
private readonly errorMessage?;
|
|
8
|
+
/**
|
|
9
|
+
* Private constructor to enforce immutability
|
|
10
|
+
*/
|
|
11
|
+
private constructor();
|
|
12
|
+
/**
|
|
13
|
+
* Create a new record validator
|
|
14
|
+
*/
|
|
15
|
+
static create<T>(valueValidator: VldBase<unknown, T>): VldRecord<T>;
|
|
16
|
+
/**
|
|
17
|
+
* Parse and validate a record value
|
|
18
|
+
*/
|
|
19
|
+
parse(value: unknown): Record<string, T>;
|
|
20
|
+
/**
|
|
21
|
+
* Safely parse and validate a record value
|
|
22
|
+
*/
|
|
23
|
+
safeParse(value: unknown): ParseResult<Record<string, T>>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/validators/record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,qBAAa,SAAS,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAKjE,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IALhC;;OAEG;IACH,OAAO;IAOP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAInE;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAmBxC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;CAO1D"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { VldBase } from './base.js';
|
|
2
|
+
import { getMessages } from '../locales.js';
|
|
3
|
+
/**
|
|
4
|
+
* Immutable record validator for key-value pairs
|
|
5
|
+
*/
|
|
6
|
+
export class VldRecord extends VldBase {
|
|
7
|
+
/**
|
|
8
|
+
* Private constructor to enforce immutability
|
|
9
|
+
*/
|
|
10
|
+
constructor(valueValidator, errorMessage) {
|
|
11
|
+
super();
|
|
12
|
+
this.valueValidator = valueValidator;
|
|
13
|
+
this.errorMessage = errorMessage;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create a new record validator
|
|
17
|
+
*/
|
|
18
|
+
static create(valueValidator) {
|
|
19
|
+
return new VldRecord(valueValidator);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Parse and validate a record value
|
|
23
|
+
*/
|
|
24
|
+
parse(value) {
|
|
25
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
26
|
+
throw new Error(this.errorMessage || getMessages().invalidRecord);
|
|
27
|
+
}
|
|
28
|
+
const result = {};
|
|
29
|
+
const obj = value;
|
|
30
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
31
|
+
try {
|
|
32
|
+
result[key] = this.valueValidator.parse(val);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
throw new Error(getMessages().objectField(key, error.message));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Safely parse and validate a record value
|
|
42
|
+
*/
|
|
43
|
+
safeParse(value) {
|
|
44
|
+
try {
|
|
45
|
+
return { success: true, data: this.parse(value) };
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return { success: false, error: error };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/validators/record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,SAAa,SAAQ,OAAmC;IACnE;;OAEG;IACH,YACmB,cAAmC,EACnC,YAAqB;QAEtC,KAAK,EAAE,CAAC;QAHS,mBAAc,GAAd,cAAc,CAAqB;QACnC,iBAAY,GAAZ,YAAY,CAAS;IAGxC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CAAI,cAAmC;QAClD,OAAO,IAAI,SAAS,CAAC,cAAc,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,KAAgC,CAAC;QAE7C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,GAAG,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,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;CACF","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Immutable record validator for key-value pairs\n */\nexport class VldRecord<T> extends VldBase<unknown, Record<string, T>> {\n /**\n * Private constructor to enforce immutability\n */\n private constructor(\n private readonly valueValidator: VldBase<unknown, T>,\n private readonly errorMessage?: string\n ) {\n super();\n }\n \n /**\n * Create a new record validator\n */\n static create<T>(valueValidator: VldBase<unknown, T>): VldRecord<T> {\n return new VldRecord(valueValidator);\n }\n \n /**\n * Parse and validate a record value\n */\n parse(value: unknown): Record<string, T> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(this.errorMessage || getMessages().invalidRecord);\n }\n \n const result: Record<string, T> = {};\n const obj = value as Record<string, unknown>;\n \n for (const [key, val] of Object.entries(obj)) {\n try {\n result[key] = this.valueValidator.parse(val);\n } catch (error) {\n throw new Error(getMessages().objectField(key, (error as Error).message));\n }\n }\n \n return result;\n }\n \n /**\n * Safely parse and validate a record value\n */\n safeParse(value: unknown): ParseResult<Record<string, T>> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n}"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { VldBase, ParseResult } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* Immutable Set validator
|
|
4
|
+
*/
|
|
5
|
+
export declare class VldSet<T> extends VldBase<unknown, Set<T>> {
|
|
6
|
+
private readonly itemValidator;
|
|
7
|
+
private readonly errorMessage?;
|
|
8
|
+
/**
|
|
9
|
+
* Private constructor to enforce immutability
|
|
10
|
+
*/
|
|
11
|
+
private constructor();
|
|
12
|
+
/**
|
|
13
|
+
* Create a new Set validator
|
|
14
|
+
*/
|
|
15
|
+
static create<T>(itemValidator: VldBase<unknown, T>): VldSet<T>;
|
|
16
|
+
/**
|
|
17
|
+
* Parse and validate a Set value
|
|
18
|
+
*/
|
|
19
|
+
parse(value: unknown): Set<T>;
|
|
20
|
+
/**
|
|
21
|
+
* Safely parse and validate a Set value
|
|
22
|
+
*/
|
|
23
|
+
safeParse(value: unknown): ParseResult<Set<T>>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../src/validators/set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,qBAAa,MAAM,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAKnD,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IALhC;;OAEG;IACH,OAAO;IAOP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAI/D;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;IAiB7B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAO/C"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { VldBase } from './base.js';
|
|
2
|
+
import { getMessages } from '../locales.js';
|
|
3
|
+
/**
|
|
4
|
+
* Immutable Set validator
|
|
5
|
+
*/
|
|
6
|
+
export class VldSet extends VldBase {
|
|
7
|
+
/**
|
|
8
|
+
* Private constructor to enforce immutability
|
|
9
|
+
*/
|
|
10
|
+
constructor(itemValidator, errorMessage) {
|
|
11
|
+
super();
|
|
12
|
+
this.itemValidator = itemValidator;
|
|
13
|
+
this.errorMessage = errorMessage;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create a new Set validator
|
|
17
|
+
*/
|
|
18
|
+
static create(itemValidator) {
|
|
19
|
+
return new VldSet(itemValidator);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Parse and validate a Set value
|
|
23
|
+
*/
|
|
24
|
+
parse(value) {
|
|
25
|
+
if (!(value instanceof Set)) {
|
|
26
|
+
throw new Error(this.errorMessage || getMessages().invalidSet);
|
|
27
|
+
}
|
|
28
|
+
const result = new Set();
|
|
29
|
+
for (const item of value) {
|
|
30
|
+
try {
|
|
31
|
+
result.add(this.itemValidator.parse(item));
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
throw new Error(error.message);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Safely parse and validate a Set value
|
|
41
|
+
*/
|
|
42
|
+
safeParse(value) {
|
|
43
|
+
try {
|
|
44
|
+
return { success: true, data: this.parse(value) };
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
return { success: false, error: error };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../src/validators/set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,MAAU,SAAQ,OAAwB;IACrD;;OAEG;IACH,YACmB,aAAkC,EAClC,YAAqB;QAEtC,KAAK,EAAE,CAAC;QAHS,kBAAa,GAAb,aAAa,CAAqB;QAClC,iBAAY,GAAZ,YAAY,CAAS;IAGxC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CAAI,aAAkC;QACjD,OAAO,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAK,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,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;CACF","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Immutable Set validator\n */\nexport class VldSet<T> extends VldBase<unknown, Set<T>> {\n /**\n * Private constructor to enforce immutability\n */\n private constructor(\n private readonly itemValidator: VldBase<unknown, T>,\n private readonly errorMessage?: string\n ) {\n super();\n }\n \n /**\n * Create a new Set validator\n */\n static create<T>(itemValidator: VldBase<unknown, T>): VldSet<T> {\n return new VldSet(itemValidator);\n }\n \n /**\n * Parse and validate a Set value\n */\n parse(value: unknown): Set<T> {\n if (!(value instanceof Set)) {\n throw new Error(this.errorMessage || getMessages().invalidSet);\n }\n \n const result = new Set<T>();\n for (const item of value) {\n try {\n result.add(this.itemValidator.parse(item));\n } catch (error) {\n throw new Error((error as Error).message);\n }\n }\n \n return result;\n }\n \n /**\n * Safely parse and validate a Set value\n */\n safeParse(value: unknown): ParseResult<Set<T>> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n}"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { VldBase, ParseResult } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* Ultra-optimized string validator with pre-compiled validations
|
|
4
|
+
*/
|
|
5
|
+
export declare class VldStringUltra extends VldBase<unknown, string> {
|
|
6
|
+
private readonly minLength?;
|
|
7
|
+
private readonly maxLength?;
|
|
8
|
+
private readonly exactLength?;
|
|
9
|
+
private readonly pattern?;
|
|
10
|
+
private readonly isEmail?;
|
|
11
|
+
private readonly isUrl?;
|
|
12
|
+
private readonly transform?;
|
|
13
|
+
private readonly customValidations;
|
|
14
|
+
private static readonly EMAIL_REGEX;
|
|
15
|
+
private static readonly URL_REGEX;
|
|
16
|
+
private constructor();
|
|
17
|
+
static create(): VldStringUltra;
|
|
18
|
+
/**
|
|
19
|
+
* Ultra-fast string validation with minimal overhead
|
|
20
|
+
*/
|
|
21
|
+
parse(value: unknown): string;
|
|
22
|
+
safeParse(value: unknown): ParseResult<string>;
|
|
23
|
+
min(length: number): VldStringUltra;
|
|
24
|
+
max(length: number): VldStringUltra;
|
|
25
|
+
length(length: number): VldStringUltra;
|
|
26
|
+
/**
|
|
27
|
+
* Ultra-fast email validation using simplified regex
|
|
28
|
+
*/
|
|
29
|
+
email(): VldStringUltra;
|
|
30
|
+
/**
|
|
31
|
+
* Ultra-fast URL validation
|
|
32
|
+
*/
|
|
33
|
+
url(): VldStringUltra;
|
|
34
|
+
/**
|
|
35
|
+
* Pattern matching with custom regex
|
|
36
|
+
*/
|
|
37
|
+
regex(pattern: RegExp): VldStringUltra;
|
|
38
|
+
/**
|
|
39
|
+
* Transform string after validation
|
|
40
|
+
*/
|
|
41
|
+
trim(): VldStringUltra;
|
|
42
|
+
toLowerCase(): VldStringUltra;
|
|
43
|
+
toUpperCase(): VldStringUltra;
|
|
44
|
+
nonempty(): VldStringUltra;
|
|
45
|
+
startsWith(prefix: string): VldStringUltra;
|
|
46
|
+
endsWith(suffix: string): VldStringUltra;
|
|
47
|
+
includes(substring: string): VldStringUltra;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=string-ultra.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-ultra.d.ts","sourceRoot":"","sources":["../../src/validators/string-ultra.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,qBAAa,cAAe,SAAQ,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAA4B;IACvD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyC;IAG3E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAgC;IAGnE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAyB;IAE1D,OAAO;IAmBP,MAAM,CAAC,MAAM,IAAI,cAAc;IAI/B;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAwD7B,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;IAS9C,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAYnC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAYnC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAYtC;;OAEG;IACH,KAAK,IAAI,cAAc;IAYvB;;OAEG;IACH,GAAG,IAAI,cAAc;IAYrB;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAYtC;;OAEG;IACH,IAAI,IAAI,cAAc;IAetB,WAAW,IAAI,cAAc;IAe7B,WAAW,IAAI,cAAc;IAe7B,QAAQ,IAAI,cAAc;IAI1B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAK1C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAKxC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc;CAI5C"}
|