@oxog/vld 1.5.0 → 2.0.2
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 +168 -0
- package/LICENSE +20 -20
- package/README.md +558 -517
- package/dist/chunks/bigint-DgsCr2dC.js +1709 -0
- package/dist/chunks/bigint-DgsCr2dC.js.map +1 -0
- package/dist/{coercion/string.js → chunks/date-ODue_rtq.js} +271 -5
- package/dist/chunks/date-ODue_rtq.js.map +1 -0
- package/dist/chunks/index-BZqWZvVe.js +426 -0
- package/dist/chunks/index-BZqWZvVe.js.map +1 -0
- package/dist/chunks/index-CETyGkrv.js +894 -0
- package/dist/chunks/index-CETyGkrv.js.map +1 -0
- package/dist/chunks/json-o20GFhTh.js +2021 -0
- package/dist/chunks/json-o20GFhTh.js.map +1 -0
- package/dist/{validators/unknown.js → chunks/unknown-SLIH1VCf.js} +6 -3
- package/dist/chunks/unknown-SLIH1VCf.js.map +1 -0
- package/dist/cjs/errors.cjs +387 -0
- package/dist/cjs/errors.cjs.map +1 -0
- package/dist/cjs/index.cjs +9983 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/locales/index.cjs +2877 -0
- package/dist/cjs/locales/index.cjs.map +1 -0
- package/dist/cjs/locales/lazy.cjs +3169 -0
- package/dist/cjs/locales/lazy.cjs.map +1 -0
- package/dist/cjs/mini.cjs +7329 -0
- package/dist/cjs/mini.cjs.map +1 -0
- package/dist/codecs/index.js +4 -275
- package/dist/codecs/index.js.map +1 -1
- package/dist/coercion/index.d.ts +11 -0
- package/dist/coercion/index.d.ts.map +1 -0
- package/dist/coercion/{bigint.js → index.js} +7 -4
- package/dist/coercion/index.js.map +1 -0
- package/dist/compat/emitter.js +6 -4
- package/dist/compat/emitter.js.map +1 -1
- package/dist/compat/result.js +21 -19
- package/dist/compat/result.js.map +1 -1
- package/dist/errors.js +13 -10
- package/dist/errors.js.map +1 -1
- package/dist/index.js +225 -126
- package/dist/index.js.map +1 -1
- package/dist/kernel.js +10 -7
- package/dist/kernel.js.map +1 -1
- package/dist/locales/af.js +4 -2
- package/dist/locales/af.js.map +1 -1
- package/dist/locales/ar.js +4 -2
- package/dist/locales/ar.js.map +1 -1
- package/dist/locales/bn.js +4 -2
- package/dist/locales/bn.js.map +1 -1
- package/dist/locales/da.js +4 -2
- package/dist/locales/da.js.map +1 -1
- package/dist/locales/de.js +4 -2
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.js +4 -2
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es-MX.js +4 -2
- package/dist/locales/es-MX.js.map +1 -1
- package/dist/locales/es.js +4 -2
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/fi.js +4 -2
- package/dist/locales/fi.js.map +1 -1
- package/dist/locales/fr.js +4 -2
- package/dist/locales/fr.js.map +1 -1
- package/dist/locales/hi.js +4 -2
- package/dist/locales/hi.js.map +1 -1
- package/dist/locales/id.js +4 -2
- package/dist/locales/id.js.map +1 -1
- package/dist/locales/index.js +3 -91
- package/dist/locales/index.js.map +1 -1
- package/dist/locales/it.js +4 -2
- package/dist/locales/it.js.map +1 -1
- package/dist/locales/ja.js +4 -2
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.js +4 -2
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/lazy.d.ts +111 -0
- package/dist/locales/lazy.d.ts.map +1 -0
- package/dist/locales/lazy.js +220 -0
- package/dist/locales/lazy.js.map +1 -0
- package/dist/locales/nl.js +4 -2
- package/dist/locales/nl.js.map +1 -1
- package/dist/locales/no.js +4 -2
- package/dist/locales/no.js.map +1 -1
- package/dist/locales/pl.js +4 -2
- package/dist/locales/pl.js.map +1 -1
- package/dist/locales/pt-BR.js +4 -2
- package/dist/locales/pt-BR.js.map +1 -1
- package/dist/locales/pt.js +4 -2
- package/dist/locales/pt.js.map +1 -1
- package/dist/locales/ru.js +4 -2
- package/dist/locales/ru.js.map +1 -1
- package/dist/locales/sv.js +4 -2
- package/dist/locales/sv.js.map +1 -1
- package/dist/locales/sw.js +4 -2
- package/dist/locales/sw.js.map +1 -1
- package/dist/locales/th.js +4 -2
- package/dist/locales/th.js.map +1 -1
- package/dist/locales/tr.js +4 -2
- package/dist/locales/tr.js.map +1 -1
- package/dist/locales/vi.js +4 -2
- package/dist/locales/vi.js.map +1 -1
- package/dist/locales/zh.js +4 -2
- package/dist/locales/zh.js.map +1 -1
- package/dist/mini.d.ts +182 -0
- package/dist/mini.d.ts.map +1 -0
- package/dist/mini.js +132 -0
- package/dist/mini.js.map +1 -0
- package/dist/pigment.js +8 -7
- package/dist/pigment.js.map +1 -1
- package/dist/validators/array.d.ts +5 -0
- package/dist/validators/array.d.ts.map +1 -1
- package/dist/validators/discriminated-union.d.ts.map +1 -1
- package/dist/validators/enum.d.ts +5 -1
- package/dist/validators/enum.d.ts.map +1 -1
- package/dist/validators/index.js +5 -45
- package/dist/validators/index.js.map +1 -1
- package/dist/validators/lazy.d.ts +8 -1
- package/dist/validators/lazy.d.ts.map +1 -1
- package/dist/validators/literal.d.ts +5 -1
- package/dist/validators/literal.d.ts.map +1 -1
- package/dist/validators/object.d.ts +30 -3
- package/dist/validators/object.d.ts.map +1 -1
- package/dist/validators/string.d.ts +12 -1
- package/dist/validators/string.d.ts.map +1 -1
- package/package.json +69 -11
- package/dist/cli/benchmark.d.ts +0 -15
- package/dist/cli/benchmark.d.ts.map +0 -1
- package/dist/cli/benchmark.js +0 -248
- package/dist/cli/benchmark.js.map +0 -1
- package/dist/cli/bin.js +0 -35
- package/dist/cli/bin.js.map +0 -1
- package/dist/cli/commands/benchmark.js +0 -204
- package/dist/cli/commands/benchmark.js.map +0 -1
- package/dist/cli/commands/validate.js +0 -157
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/generate.d.ts +0 -14
- package/dist/cli/generate.d.ts.map +0 -1
- package/dist/cli/generate.js +0 -233
- package/dist/cli/generate.js.map +0 -1
- package/dist/cli/index.js +0 -182
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/validate.d.ts +0 -15
- package/dist/cli/validate.d.ts.map +0 -1
- package/dist/cli/validate.js +0 -162
- package/dist/cli/validate.js.map +0 -1
- package/dist/coercion/bigint.js.map +0 -1
- package/dist/coercion/boolean.js +0 -59
- package/dist/coercion/boolean.js.map +0 -1
- package/dist/coercion/date.js +0 -52
- package/dist/coercion/date.js.map +0 -1
- package/dist/coercion/number.js +0 -160
- package/dist/coercion/number.js.map +0 -1
- package/dist/coercion/string.js.map +0 -1
- package/dist/compat/index.js +0 -14
- package/dist/compat/index.js.map +0 -1
- package/dist/events.js +0 -8
- package/dist/events.js.map +0 -1
- package/dist/guards.d.ts +0 -143
- package/dist/guards.d.ts.map +0 -1
- package/dist/guards.js +0 -238
- package/dist/guards.js.map +0 -1
- package/dist/index-new.d.ts.map +0 -1
- package/dist/locales/backup-en.js +0 -105
- package/dist/locales/backup-en.js.map +0 -1
- package/dist/locales/types.js +0 -2
- package/dist/locales/types.js.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/logger.js +0 -184
- package/dist/logger.js.map +0 -1
- package/dist/plugins/codecs.d.ts +0 -17
- package/dist/plugins/codecs.d.ts.map +0 -1
- package/dist/plugins/codecs.js +0 -29
- package/dist/plugins/codecs.js.map +0 -1
- package/dist/plugins/coercion.d.ts +0 -13
- package/dist/plugins/coercion.d.ts.map +0 -1
- package/dist/plugins/coercion.js +0 -34
- package/dist/plugins/coercion.js.map +0 -1
- package/dist/plugins/core-validators.d.ts +0 -13
- package/dist/plugins/core-validators.d.ts.map +0 -1
- package/dist/plugins/core-validators.js +0 -96
- package/dist/plugins/core-validators.js.map +0 -1
- package/dist/plugins/index.js +0 -8
- package/dist/plugins/index.js.map +0 -1
- package/dist/plugins/kernel.d.ts +0 -29
- package/dist/plugins/kernel.d.ts.map +0 -1
- package/dist/plugins/kernel.js +0 -486
- package/dist/plugins/kernel.js.map +0 -1
- package/dist/plugins/types.js +0 -8
- package/dist/plugins/types.js.map +0 -1
- package/dist/style.d.ts +0 -123
- package/dist/style.d.ts.map +0 -1
- package/dist/style.js +0 -369
- package/dist/style.js.map +0 -1
- package/dist/utils/codec-utils.js +0 -229
- package/dist/utils/codec-utils.js.map +0 -1
- package/dist/utils/deep-merge.js +0 -76
- package/dist/utils/deep-merge.js.map +0 -1
- package/dist/utils/ip-validation.js +0 -98
- package/dist/utils/ip-validation.js.map +0 -1
- package/dist/utils/security.js +0 -61
- package/dist/utils/security.js.map +0 -1
- package/dist/validators/any.js +0 -25
- package/dist/validators/any.js.map +0 -1
- package/dist/validators/array.js +0 -190
- package/dist/validators/array.js.map +0 -1
- package/dist/validators/base.js +0 -499
- package/dist/validators/base.js.map +0 -1
- package/dist/validators/base64.js +0 -65
- package/dist/validators/base64.js.map +0 -1
- package/dist/validators/bigint.js +0 -142
- package/dist/validators/bigint.js.map +0 -1
- package/dist/validators/boolean.js +0 -114
- package/dist/validators/boolean.js.map +0 -1
- package/dist/validators/codec.js +0 -182
- package/dist/validators/codec.js.map +0 -1
- package/dist/validators/custom.js +0 -50
- package/dist/validators/custom.js.map +0 -1
- package/dist/validators/date.js +0 -227
- package/dist/validators/date.js.map +0 -1
- package/dist/validators/discriminated-union.js +0 -98
- package/dist/validators/discriminated-union.js.map +0 -1
- package/dist/validators/enum.js +0 -82
- package/dist/validators/enum.js.map +0 -1
- package/dist/validators/file.js +0 -114
- package/dist/validators/file.js.map +0 -1
- package/dist/validators/function.js +0 -45
- package/dist/validators/function.js.map +0 -1
- package/dist/validators/hex.js +0 -62
- package/dist/validators/hex.js.map +0 -1
- package/dist/validators/intersection.js +0 -64
- package/dist/validators/intersection.js.map +0 -1
- package/dist/validators/json.js +0 -64
- package/dist/validators/json.js.map +0 -1
- package/dist/validators/lazy.js +0 -42
- package/dist/validators/lazy.js.map +0 -1
- package/dist/validators/literal.js +0 -45
- package/dist/validators/literal.js.map +0 -1
- package/dist/validators/map.js +0 -54
- package/dist/validators/map.js.map +0 -1
- package/dist/validators/nan.js +0 -32
- package/dist/validators/nan.js.map +0 -1
- package/dist/validators/never.js +0 -29
- package/dist/validators/never.js.map +0 -1
- package/dist/validators/null.js +0 -31
- package/dist/validators/null.js.map +0 -1
- package/dist/validators/number.js +0 -225
- package/dist/validators/number.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/object.js +0 -458
- package/dist/validators/object.js.map +0 -1
- package/dist/validators/record.js +0 -128
- package/dist/validators/record.js.map +0 -1
- package/dist/validators/set.js +0 -51
- package/dist/validators/set.js.map +0 -1
- package/dist/validators/string-bool.js +0 -127
- package/dist/validators/string-bool.js.map +0 -1
- package/dist/validators/string-formats.js +0 -120
- package/dist/validators/string-formats.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/string.js +0 -253
- package/dist/validators/string.js.map +0 -1
- package/dist/validators/symbol.js +0 -42
- package/dist/validators/symbol.js.map +0 -1
- package/dist/validators/template-literal.js +0 -102
- package/dist/validators/template-literal.js.map +0 -1
- package/dist/validators/tuple.js +0 -55
- package/dist/validators/tuple.js.map +0 -1
- package/dist/validators/uint8array.js +0 -98
- package/dist/validators/uint8array.js.map +0 -1
- package/dist/validators/undefined.js +0 -31
- package/dist/validators/undefined.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/union.js +0 -126
- package/dist/validators/union.js.map +0 -1
- package/dist/validators/unknown.js.map +0 -1
- package/dist/validators/void.js +0 -35
- package/dist/validators/void.js.map +0 -1
- package/dist/validators/xor.js +0 -64
- package/dist/validators/xor.js.map +0 -1
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { VldBase } from './base.js';
|
|
2
|
-
import { getMessages } from '../locales/index.js';
|
|
3
|
-
/**
|
|
4
|
-
* Immutable template literal validator
|
|
5
|
-
* Validates strings matching a template pattern
|
|
6
|
-
*/
|
|
7
|
-
export class VldTemplateLiteral extends VldBase {
|
|
8
|
-
constructor(pattern) {
|
|
9
|
-
super();
|
|
10
|
-
this.pattern = pattern;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Create a template literal validator from components
|
|
14
|
-
*/
|
|
15
|
-
static create(...components) {
|
|
16
|
-
// Build regex pattern from components
|
|
17
|
-
let pattern = '^';
|
|
18
|
-
for (const comp of components) {
|
|
19
|
-
if (typeof comp === 'string') {
|
|
20
|
-
// Escape special regex characters
|
|
21
|
-
pattern += comp.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
// Add appropriate pattern based on validator type
|
|
25
|
-
pattern += getPatternForValidator(comp);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
pattern += '$';
|
|
29
|
-
return new VldTemplateLiteral(new RegExp(pattern));
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Parse and validate a template literal string
|
|
33
|
-
*/
|
|
34
|
-
parse(value) {
|
|
35
|
-
if (typeof value !== 'string') {
|
|
36
|
-
throw new Error(getMessages().invalidString);
|
|
37
|
-
}
|
|
38
|
-
if (!this.pattern.test(value)) {
|
|
39
|
-
throw new Error(getMessages().stringPatternInvalid);
|
|
40
|
-
}
|
|
41
|
-
return value;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Safely parse and validate a template literal string
|
|
45
|
-
*/
|
|
46
|
-
safeParse(value) {
|
|
47
|
-
try {
|
|
48
|
-
return { success: true, data: this.parse(value) };
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
return {
|
|
52
|
-
success: false,
|
|
53
|
-
error: error
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Get regex pattern for a validator type
|
|
60
|
-
*/
|
|
61
|
-
function getPatternForValidator(validator) {
|
|
62
|
-
// For template literals, we need to identify the validator type
|
|
63
|
-
// and return an appropriate capture group pattern
|
|
64
|
-
const className = validator.constructor.name;
|
|
65
|
-
// Check for specific validator types
|
|
66
|
-
if (className === 'VldString') {
|
|
67
|
-
return '(.+)';
|
|
68
|
-
}
|
|
69
|
-
if (className === 'VldNumber' || className === 'VldInt') {
|
|
70
|
-
return '(-?\\d+(?:\\.\\d+)?)';
|
|
71
|
-
}
|
|
72
|
-
if (className === 'VldBigInt') {
|
|
73
|
-
return '(-?\\d+)';
|
|
74
|
-
}
|
|
75
|
-
if (className === 'VldBoolean') {
|
|
76
|
-
return '(true|false)';
|
|
77
|
-
}
|
|
78
|
-
if (className === 'VldNull') {
|
|
79
|
-
return '(null)';
|
|
80
|
-
}
|
|
81
|
-
if (className === 'VldUndefined' || className === 'VldVoid') {
|
|
82
|
-
return '(undefined)';
|
|
83
|
-
}
|
|
84
|
-
if (className === 'VldLiteral') {
|
|
85
|
-
// Extract literal value - access private literal property via any
|
|
86
|
-
const literalValidator = validator;
|
|
87
|
-
if (literalValidator.literal !== undefined) {
|
|
88
|
-
const valueStr = String(literalValidator.literal);
|
|
89
|
-
return '(' + valueStr.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + ')';
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
// Default: match any string
|
|
93
|
-
return '(.+)';
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Helper function to create template literal validators
|
|
97
|
-
* Usage: v.templateLiteral(v.string(), '-', v.number())
|
|
98
|
-
*/
|
|
99
|
-
export function templateLiteral(...components) {
|
|
100
|
-
return VldTemplateLiteral.create(...components);
|
|
101
|
-
}
|
|
102
|
-
//# sourceMappingURL=template-literal.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"template-literal.js","sourceRoot":"","sources":["../../src/validators/template-literal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAOzC;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,OAAwB;IAC9D,YACmB,OAAe;QAEhC,KAAK,EAAE,CAAC;QAFS,YAAO,GAAP,OAAO,CAAQ;IAGlC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,GAAG,UAAyB;QACxC,sCAAsC;QACtC,IAAI,OAAO,GAAG,GAAG,CAAC;QAElB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,kCAAkC;gBAClC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACN,kDAAkD;gBAClD,OAAO,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,OAAO,IAAI,GAAG,CAAC;QAEf,OAAO,IAAI,kBAAkB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,oBAAoB,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,KAAK,CAAC;IACf,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;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAc;aACtB,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,SAA4B;IAC1D,gEAAgE;IAChE,kDAAkD;IAElD,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC;IAE7C,qCAAqC;IACrC,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QACxD,OAAO,sBAAsB,CAAC;IAChC,CAAC;IACD,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;QAC/B,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,SAAS,KAAK,cAAc,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;QAC/B,kEAAkE;QAClE,MAAM,gBAAgB,GAAG,SAAgB,CAAC;QAC1C,IAAI,gBAAgB,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAClD,OAAO,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC;QACrE,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAG,UAAyB;IAC1D,OAAO,kBAAkB,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC;AAClD,CAAC","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { getMessages } from '../locales';\r\n\r\n/**\r\n * Template literal component types\r\n */\r\ntype TLComponent = VldBase<any, any> | string;\r\n\r\n/**\r\n * Immutable template literal validator\r\n * Validates strings matching a template pattern\r\n */\r\nexport class VldTemplateLiteral extends VldBase<unknown, string> {\r\n private constructor(\r\n private readonly pattern: RegExp\r\n ) {\r\n super();\r\n }\r\n\r\n /**\r\n * Create a template literal validator from components\r\n */\r\n static create(...components: TLComponent[]): VldTemplateLiteral {\r\n // Build regex pattern from components\r\n let pattern = '^';\r\n\r\n for (const comp of components) {\r\n if (typeof comp === 'string') {\r\n // Escape special regex characters\r\n pattern += comp.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n } else {\r\n // Add appropriate pattern based on validator type\r\n pattern += getPatternForValidator(comp);\r\n }\r\n }\r\n\r\n pattern += '$';\r\n\r\n return new VldTemplateLiteral(new RegExp(pattern));\r\n }\r\n\r\n /**\r\n * Parse and validate a template literal string\r\n */\r\n parse(value: unknown): string {\r\n if (typeof value !== 'string') {\r\n throw new Error(getMessages().invalidString);\r\n }\r\n\r\n if (!this.pattern.test(value)) {\r\n throw new Error(getMessages().stringPatternInvalid);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n /**\r\n * Safely parse and validate a template literal string\r\n */\r\n safeParse(value: unknown): ParseResult<string> {\r\n try {\r\n return { success: true, data: this.parse(value) };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error as Error\r\n };\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Get regex pattern for a validator type\r\n */\r\nfunction getPatternForValidator(validator: VldBase<any, any>): string {\r\n // For template literals, we need to identify the validator type\r\n // and return an appropriate capture group pattern\r\n\r\n const className = validator.constructor.name;\r\n\r\n // Check for specific validator types\r\n if (className === 'VldString') {\r\n return '(.+)';\r\n }\r\n if (className === 'VldNumber' || className === 'VldInt') {\r\n return '(-?\\\\d+(?:\\\\.\\\\d+)?)';\r\n }\r\n if (className === 'VldBigInt') {\r\n return '(-?\\\\d+)';\r\n }\r\n if (className === 'VldBoolean') {\r\n return '(true|false)';\r\n }\r\n if (className === 'VldNull') {\r\n return '(null)';\r\n }\r\n if (className === 'VldUndefined' || className === 'VldVoid') {\r\n return '(undefined)';\r\n }\r\n if (className === 'VldLiteral') {\r\n // Extract literal value - access private literal property via any\r\n const literalValidator = validator as any;\r\n if (literalValidator.literal !== undefined) {\r\n const valueStr = String(literalValidator.literal);\r\n return '(' + valueStr.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + ')';\r\n }\r\n }\r\n\r\n // Default: match any string\r\n return '(.+)';\r\n}\r\n\r\n/**\r\n * Helper function to create template literal validators\r\n * Usage: v.templateLiteral(v.string(), '-', v.number())\r\n */\r\nexport function templateLiteral(...components: TLComponent[]): VldTemplateLiteral {\r\n return VldTemplateLiteral.create(...components);\r\n}\r\n"]}
|
package/dist/validators/tuple.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { VldBase } from './base.js';
|
|
2
|
-
import { getMessages } from '../locales/index.js';
|
|
3
|
-
/**
|
|
4
|
-
* Immutable tuple validator for fixed-length arrays
|
|
5
|
-
*/
|
|
6
|
-
export class VldTuple extends VldBase {
|
|
7
|
-
/**
|
|
8
|
-
* Private constructor to enforce immutability
|
|
9
|
-
*/
|
|
10
|
-
constructor(validators, errorMessage) {
|
|
11
|
-
super();
|
|
12
|
-
this.validators = validators;
|
|
13
|
-
this.errorMessage = errorMessage;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Create a new tuple validator
|
|
17
|
-
*/
|
|
18
|
-
static create(...validators) {
|
|
19
|
-
return new VldTuple(validators);
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Parse and validate a tuple value
|
|
23
|
-
*/
|
|
24
|
-
parse(value) {
|
|
25
|
-
if (!Array.isArray(value)) {
|
|
26
|
-
throw new Error(this.errorMessage || getMessages().invalidTuple);
|
|
27
|
-
}
|
|
28
|
-
if (value.length !== this.validators.length) {
|
|
29
|
-
throw new Error(this.errorMessage ||
|
|
30
|
-
getMessages().tupleLength(this.validators.length, value.length));
|
|
31
|
-
}
|
|
32
|
-
const result = [];
|
|
33
|
-
for (let i = 0; i < this.validators.length; i++) {
|
|
34
|
-
try {
|
|
35
|
-
result[i] = this.validators[i].parse(value[i]);
|
|
36
|
-
}
|
|
37
|
-
catch (error) {
|
|
38
|
-
throw new Error(getMessages().arrayItem(i, error.message));
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return result;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Safely parse and validate a tuple value
|
|
45
|
-
*/
|
|
46
|
-
safeParse(value) {
|
|
47
|
-
try {
|
|
48
|
-
return { success: true, data: this.parse(value) };
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
return { success: false, error: error };
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
//# sourceMappingURL=tuple.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tuple.js","sourceRoot":"","sources":["../../src/validators/tuple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,QAAiD,SAAQ,OAGrE;IACC;;OAEG;IACH,YACmB,UAAa,EACb,YAAqB;QAEtC,KAAK,EAAE,CAAC;QAHS,eAAU,GAAV,UAAU,CAAG;QACb,iBAAY,GAAZ,YAAY,CAAS;IAGxC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CAAyC,GAAG,UAAa;QACpE,OAAO,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,YAAY,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,YAAY;gBACjB,WAAW,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAChE,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAU,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,IAAI,CAAC;gBACH,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAED,OAAO,MAA4E,CAAC;IACtF,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 tuple validator for fixed-length arrays\n */\nexport class VldTuple<T extends readonly VldBase<any, any>[]> extends VldBase<\n unknown,\n { [K in keyof T]: T[K] extends VldBase<any, infer U> ? U : never }\n> {\n /**\n * Private constructor to enforce immutability\n */\n private constructor(\n private readonly validators: T,\n private readonly errorMessage?: string\n ) {\n super();\n }\n \n /**\n * Create a new tuple validator\n */\n static create<T extends readonly VldBase<any, any>[]>(...validators: T): VldTuple<T> {\n return new VldTuple(validators);\n }\n \n /**\n * Parse and validate a tuple value\n */\n parse(value: unknown): { [K in keyof T]: T[K] extends VldBase<any, infer U> ? U : never } {\n if (!Array.isArray(value)) {\n throw new Error(this.errorMessage || getMessages().invalidTuple);\n }\n \n if (value.length !== this.validators.length) {\n throw new Error(\n this.errorMessage || \n getMessages().tupleLength(this.validators.length, value.length)\n );\n }\n \n const result: any[] = [];\n for (let i = 0; i < this.validators.length; i++) {\n try {\n result[i] = this.validators[i].parse(value[i]);\n } catch (error) {\n throw new Error(getMessages().arrayItem(i, (error as Error).message));\n }\n }\n \n return result as { [K in keyof T]: T[K] extends VldBase<any, infer U> ? U : never };\n }\n \n /**\n * Safely parse and validate a tuple value\n */\n safeParse(value: unknown): ParseResult<{ [K in keyof T]: T[K] extends VldBase<any, infer U> ? U : never }> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n}"]}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { VldBase } from './base.js';
|
|
2
|
-
import { VldError, createIssue } from '../errors.js';
|
|
3
|
-
import { getMessages } from '../locales/index.js';
|
|
4
|
-
/**
|
|
5
|
-
* Uint8Array validator with immutable configuration
|
|
6
|
-
* BUG-NEW-010 FIX: Refactored to follow immutability pattern
|
|
7
|
-
*/
|
|
8
|
-
export class VldUint8Array extends VldBase {
|
|
9
|
-
/**
|
|
10
|
-
* Protected constructor to maintain immutability
|
|
11
|
-
*/
|
|
12
|
-
constructor(config) {
|
|
13
|
-
super();
|
|
14
|
-
this.config = config || {};
|
|
15
|
-
}
|
|
16
|
-
parse(value) {
|
|
17
|
-
const result = this.safeParse(value);
|
|
18
|
-
if (!result.success) {
|
|
19
|
-
throw result.error;
|
|
20
|
-
}
|
|
21
|
-
return result.data;
|
|
22
|
-
}
|
|
23
|
-
safeParse(value) {
|
|
24
|
-
if (!(value instanceof Uint8Array)) {
|
|
25
|
-
return {
|
|
26
|
-
success: false,
|
|
27
|
-
error: new VldError([
|
|
28
|
-
createIssue('invalid_type', [], getMessages().expectedUint8Array)
|
|
29
|
-
])
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
// Check exact length if specified
|
|
33
|
-
if (this.config.exactLength !== undefined && value.length !== this.config.exactLength) {
|
|
34
|
-
return {
|
|
35
|
-
success: false,
|
|
36
|
-
error: new VldError([
|
|
37
|
-
createIssue('custom', [], getMessages().uint8ArrayExactLength(this.config.exactLength))
|
|
38
|
-
])
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
// Check minimum length
|
|
42
|
-
if (this.config.minLength !== undefined && value.length < this.config.minLength) {
|
|
43
|
-
return {
|
|
44
|
-
success: false,
|
|
45
|
-
error: new VldError([
|
|
46
|
-
createIssue('custom', [], getMessages().uint8ArrayMinLength(this.config.minLength))
|
|
47
|
-
])
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
// Check maximum length
|
|
51
|
-
if (this.config.maxLength !== undefined && value.length > this.config.maxLength) {
|
|
52
|
-
return {
|
|
53
|
-
success: false,
|
|
54
|
-
error: new VldError([
|
|
55
|
-
createIssue('custom', [], getMessages().uint8ArrayMaxLength(this.config.maxLength))
|
|
56
|
-
])
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
return { success: true, data: value };
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Set minimum byte length
|
|
63
|
-
* Returns new immutable validator instance
|
|
64
|
-
*/
|
|
65
|
-
min(length) {
|
|
66
|
-
return new VldUint8Array({
|
|
67
|
-
...this.config,
|
|
68
|
-
minLength: length
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Set maximum byte length
|
|
73
|
-
* Returns new immutable validator instance
|
|
74
|
-
*/
|
|
75
|
-
max(length) {
|
|
76
|
-
return new VldUint8Array({
|
|
77
|
-
...this.config,
|
|
78
|
-
maxLength: length
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Set exact byte length
|
|
83
|
-
* Returns new immutable validator instance
|
|
84
|
-
* Clears min/max when setting exact length
|
|
85
|
-
*/
|
|
86
|
-
length(length) {
|
|
87
|
-
return new VldUint8Array({
|
|
88
|
-
exactLength: length,
|
|
89
|
-
// Clear min/max when exact length is set
|
|
90
|
-
minLength: undefined,
|
|
91
|
-
maxLength: undefined
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
static create() {
|
|
95
|
-
return new VldUint8Array();
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
//# sourceMappingURL=uint8array.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"uint8array.js","sourceRoot":"","sources":["../../src/validators/uint8array.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { VldError, createIssue } from '../errors';\r\nimport { getMessages } from '../locales';\r\n\r\n/**\r\n * Configuration for Uint8Array validator\r\n * BUG-NEW-010 FIX: Use config object pattern for immutability\r\n */\r\ninterface Uint8ArrayValidatorConfig {\r\n readonly minLength?: number;\r\n readonly maxLength?: number;\r\n readonly exactLength?: number;\r\n}\r\n\r\n/**\r\n * Uint8Array validator with immutable configuration\r\n * BUG-NEW-010 FIX: Refactored to follow immutability pattern\r\n */\r\nexport class VldUint8Array extends VldBase<Uint8Array, Uint8Array> {\r\n private readonly config: Uint8ArrayValidatorConfig;\r\n\r\n /**\r\n * Protected constructor to maintain immutability\r\n */\r\n protected constructor(config?: Uint8ArrayValidatorConfig) {\r\n super();\r\n this.config = config || {};\r\n }\r\n\r\n parse(value: unknown): Uint8Array {\r\n const result = this.safeParse(value);\r\n if (!result.success) {\r\n throw result.error;\r\n }\r\n return result.data;\r\n }\r\n\r\n safeParse(value: unknown): ParseResult<Uint8Array> {\r\n if (!(value instanceof Uint8Array)) {\r\n return {\r\n success: false,\r\n error: new VldError([\r\n createIssue('invalid_type', [], getMessages().expectedUint8Array)\r\n ])\r\n };\r\n }\r\n\r\n // Check exact length if specified\r\n if (this.config.exactLength !== undefined && value.length !== this.config.exactLength) {\r\n return {\r\n success: false,\r\n error: new VldError([\r\n createIssue('custom', [], getMessages().uint8ArrayExactLength(this.config.exactLength))\r\n ])\r\n };\r\n }\r\n\r\n // Check minimum length\r\n if (this.config.minLength !== undefined && value.length < this.config.minLength) {\r\n return {\r\n success: false,\r\n error: new VldError([\r\n createIssue('custom', [], getMessages().uint8ArrayMinLength(this.config.minLength))\r\n ])\r\n };\r\n }\r\n\r\n // Check maximum length\r\n if (this.config.maxLength !== undefined && value.length > this.config.maxLength) {\r\n return {\r\n success: false,\r\n error: new VldError([\r\n createIssue('custom', [], getMessages().uint8ArrayMaxLength(this.config.maxLength))\r\n ])\r\n };\r\n }\r\n\r\n return { success: true, data: value };\r\n }\r\n\r\n /**\r\n * Set minimum byte length\r\n * Returns new immutable validator instance\r\n */\r\n min(length: number): VldUint8Array {\r\n return new VldUint8Array({\r\n ...this.config,\r\n minLength: length\r\n });\r\n }\r\n\r\n /**\r\n * Set maximum byte length\r\n * Returns new immutable validator instance\r\n */\r\n max(length: number): VldUint8Array {\r\n return new VldUint8Array({\r\n ...this.config,\r\n maxLength: length\r\n });\r\n }\r\n\r\n /**\r\n * Set exact byte length\r\n * Returns new immutable validator instance\r\n * Clears min/max when setting exact length\r\n */\r\n length(length: number): VldUint8Array {\r\n return new VldUint8Array({\r\n exactLength: length,\r\n // Clear min/max when exact length is set\r\n minLength: undefined,\r\n maxLength: undefined\r\n });\r\n }\r\n\r\n static create(): VldUint8Array {\r\n return new VldUint8Array();\r\n }\r\n}\r\n"]}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* VldUndefined - Validates that a value is exactly undefined
|
|
3
|
-
* Part of Zod 4 API parity implementation
|
|
4
|
-
*/
|
|
5
|
-
import { VldBase } from './base.js';
|
|
6
|
-
/**
|
|
7
|
-
* Undefined validator - validates that a value is exactly undefined
|
|
8
|
-
*/
|
|
9
|
-
export class VldUndefined extends VldBase {
|
|
10
|
-
constructor() {
|
|
11
|
-
super();
|
|
12
|
-
}
|
|
13
|
-
static create() {
|
|
14
|
-
return new VldUndefined();
|
|
15
|
-
}
|
|
16
|
-
parse(value) {
|
|
17
|
-
if (value !== undefined) {
|
|
18
|
-
throw new Error(`Expected undefined, received ${typeof value}`);
|
|
19
|
-
}
|
|
20
|
-
return undefined;
|
|
21
|
-
}
|
|
22
|
-
safeParse(value) {
|
|
23
|
-
try {
|
|
24
|
-
return { success: true, data: this.parse(value) };
|
|
25
|
-
}
|
|
26
|
-
catch (error) {
|
|
27
|
-
return { success: false, error: error };
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=undefined.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"undefined.js","sourceRoot":"","sources":["../../src/validators/undefined.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGjC;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,OAA2B;IAC3D;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,KAAK,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,SAAS,CAAC,KAAc;QACtB,IAAI,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;CACF","sourcesContent":["/**\r\n * VldUndefined - Validates that a value is exactly undefined\r\n * Part of Zod 4 API parity implementation\r\n */\r\n\r\nimport { VldBase } from './base';\r\nimport type { ParseResult } from './base';\r\n\r\n/**\r\n * Undefined validator - validates that a value is exactly undefined\r\n */\r\nexport class VldUndefined extends VldBase<unknown, undefined> {\r\n private constructor() {\r\n super();\r\n }\r\n\r\n static create(): VldUndefined {\r\n return new VldUndefined();\r\n }\r\n\r\n parse(value: unknown): undefined {\r\n if (value !== undefined) {\r\n throw new Error(`Expected undefined, received ${typeof value}`);\r\n }\r\n return undefined;\r\n }\r\n\r\n safeParse(value: unknown): ParseResult<undefined> {\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"]}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { VldBase, ParseResult } from './base';
|
|
2
|
-
/**
|
|
3
|
-
* Optimized union validator with better performance
|
|
4
|
-
*/
|
|
5
|
-
export declare class VldUnionOptimized<T extends readonly VldBase<any, any>[]> extends VldBase<unknown, T[number] extends VldBase<any, infer U> ? U : never> {
|
|
6
|
-
private readonly validators;
|
|
7
|
-
private readonly errorMessage?;
|
|
8
|
-
private readonly typeCheckers;
|
|
9
|
-
private constructor();
|
|
10
|
-
private createTypeChecker;
|
|
11
|
-
static create<T extends readonly VldBase<any, any>[]>(...validators: T): VldUnionOptimized<T>;
|
|
12
|
-
parse(value: unknown): T[number] extends VldBase<any, infer U> ? U : never;
|
|
13
|
-
safeParse(value: unknown): ParseResult<T[number] extends VldBase<any, infer U> ? U : never>;
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=union-optimized.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"union-optimized.d.ts","sourceRoot":"","sources":["../../src/validators/union-optimized.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,qBAAa,iBAAiB,CAAC,CAAC,SAAS,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAE,SAAQ,OAAO,CACpF,OAAO,EACP,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CACpD;IACC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAI;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;IAGvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsD;IAEnF,OAAO;IAYP,OAAO,CAAC,iBAAiB;IAsBzB,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,UAAU,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;IAI7F,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;IAgC1E,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;CAgC5F"}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { VldBase } from './base.js';
|
|
2
|
-
import { getMessages } from '../locales.js';
|
|
3
|
-
/**
|
|
4
|
-
* Optimized union validator with better performance
|
|
5
|
-
*/
|
|
6
|
-
export class VldUnionOptimized extends VldBase {
|
|
7
|
-
constructor(validators, errorMessage) {
|
|
8
|
-
super();
|
|
9
|
-
this.validators = validators;
|
|
10
|
-
this.errorMessage = errorMessage;
|
|
11
|
-
this.typeCheckers = new Map();
|
|
12
|
-
// Pre-compile type checkers for common types
|
|
13
|
-
for (const validator of validators) {
|
|
14
|
-
this.typeCheckers.set(validator, this.createTypeChecker(validator));
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
createTypeChecker(validator) {
|
|
18
|
-
// Quick type checks based on validator type
|
|
19
|
-
const className = validator.constructor.name;
|
|
20
|
-
switch (className) {
|
|
21
|
-
case 'VldString':
|
|
22
|
-
return (v) => typeof v === 'string';
|
|
23
|
-
case 'VldNumber':
|
|
24
|
-
return (v) => typeof v === 'number' && !isNaN(v);
|
|
25
|
-
case 'VldBoolean':
|
|
26
|
-
return (v) => typeof v === 'boolean';
|
|
27
|
-
case 'VldDate':
|
|
28
|
-
return (v) => v instanceof Date || (typeof v === 'string' && !isNaN(Date.parse(v)));
|
|
29
|
-
case 'VldArray':
|
|
30
|
-
return (v) => Array.isArray(v);
|
|
31
|
-
case 'VldObject':
|
|
32
|
-
return (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
33
|
-
default:
|
|
34
|
-
return () => true; // No quick check available
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
static create(...validators) {
|
|
38
|
-
return new VldUnionOptimized(validators);
|
|
39
|
-
}
|
|
40
|
-
parse(value) {
|
|
41
|
-
// Fast path: try validators that are likely to match based on type
|
|
42
|
-
for (const validator of this.validators) {
|
|
43
|
-
const typeChecker = this.typeCheckers.get(validator);
|
|
44
|
-
// Skip validators that definitely won't match
|
|
45
|
-
if (typeChecker && !typeChecker(value)) {
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
// Use safeParse to avoid try-catch overhead
|
|
49
|
-
const result = validator.safeParse(value);
|
|
50
|
-
if (result.success) {
|
|
51
|
-
return result.data;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
// Slow path: collect all errors
|
|
55
|
-
const errors = [];
|
|
56
|
-
for (const validator of this.validators) {
|
|
57
|
-
const result = validator.safeParse(value);
|
|
58
|
-
if (!result.success) {
|
|
59
|
-
errors.push(result.error.message);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
throw new Error(this.errorMessage ||
|
|
63
|
-
getMessages().unionNoMatch(errors));
|
|
64
|
-
}
|
|
65
|
-
safeParse(value) {
|
|
66
|
-
// Fast path with type checking
|
|
67
|
-
for (const validator of this.validators) {
|
|
68
|
-
const typeChecker = this.typeCheckers.get(validator);
|
|
69
|
-
if (typeChecker && !typeChecker(value)) {
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
const result = validator.safeParse(value);
|
|
73
|
-
if (result.success) {
|
|
74
|
-
return result;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
// All failed
|
|
78
|
-
const errors = [];
|
|
79
|
-
for (const validator of this.validators) {
|
|
80
|
-
const result = validator.safeParse(value);
|
|
81
|
-
if (!result.success) {
|
|
82
|
-
errors.push(result.error.message);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return {
|
|
86
|
-
success: false,
|
|
87
|
-
error: new Error(this.errorMessage ||
|
|
88
|
-
getMessages().unionNoMatch(errors))
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=union-optimized.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"union-optimized.js","sourceRoot":"","sources":["../../src/validators/union-optimized.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Optimized union validator with better performance\n */\nexport class VldUnionOptimized<T extends readonly VldBase<any, any>[]> extends VldBase<\n unknown,\n T[number] extends VldBase<any, infer U> ? U : never\n> {\n private readonly validators: T;\n private readonly errorMessage?: string;\n \n // Cache for type checking optimization\n private readonly typeCheckers: Map<VldBase<any, any>, (value: unknown) => boolean>;\n \n private constructor(validators: T, errorMessage?: string) {\n super();\n this.validators = validators;\n this.errorMessage = errorMessage;\n this.typeCheckers = new Map();\n \n // Pre-compile type checkers for common types\n for (const validator of validators) {\n this.typeCheckers.set(validator, this.createTypeChecker(validator));\n }\n }\n \n private createTypeChecker(validator: VldBase<any, any>): (value: unknown) => boolean {\n // Quick type checks based on validator type\n const className = validator.constructor.name;\n \n switch (className) {\n case 'VldString':\n return (v) => typeof v === 'string';\n case 'VldNumber':\n return (v) => typeof v === 'number' && !isNaN(v as number);\n case 'VldBoolean':\n return (v) => typeof v === 'boolean';\n case 'VldDate':\n return (v) => v instanceof Date || (typeof v === 'string' && !isNaN(Date.parse(v as string)));\n case 'VldArray':\n return (v) => Array.isArray(v);\n case 'VldObject':\n return (v) => typeof v === 'object' && v !== null && !Array.isArray(v);\n default:\n return () => true; // No quick check available\n }\n }\n \n static create<T extends readonly VldBase<any, any>[]>(...validators: T): VldUnionOptimized<T> {\n return new VldUnionOptimized(validators);\n }\n \n parse(value: unknown): T[number] extends VldBase<any, infer U> ? U : never {\n // Fast path: try validators that are likely to match based on type\n for (const validator of this.validators) {\n const typeChecker = this.typeCheckers.get(validator);\n \n // Skip validators that definitely won't match\n if (typeChecker && !typeChecker(value)) {\n continue;\n }\n \n // Use safeParse to avoid try-catch overhead\n const result = validator.safeParse(value);\n if (result.success) {\n return result.data;\n }\n }\n \n // Slow path: collect all errors\n const errors: string[] = [];\n for (const validator of this.validators) {\n const result = validator.safeParse(value);\n if (!result.success) {\n errors.push(result.error.message);\n }\n }\n \n throw new Error(\n this.errorMessage || \n getMessages().unionNoMatch(errors)\n );\n }\n \n safeParse(value: unknown): ParseResult<T[number] extends VldBase<any, infer U> ? U : never> {\n // Fast path with type checking\n for (const validator of this.validators) {\n const typeChecker = this.typeCheckers.get(validator);\n \n if (typeChecker && !typeChecker(value)) {\n continue;\n }\n \n const result = validator.safeParse(value);\n if (result.success) {\n return result;\n }\n }\n \n // All failed\n const errors: string[] = [];\n for (const validator of this.validators) {\n const result = validator.safeParse(value);\n if (!result.success) {\n errors.push(result.error.message);\n }\n }\n \n return {\n success: false,\n error: new Error(\n this.errorMessage || \n getMessages().unionNoMatch(errors)\n )\n };\n }\n}"]}
|
package/dist/validators/union.js
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import { VldBase } from './base.js';
|
|
2
|
-
import { getMessages } from '../locales/index.js';
|
|
3
|
-
/**
|
|
4
|
-
* Optimized immutable union validator for multiple type options
|
|
5
|
-
* Features type-checking shortcuts for 110x performance improvement
|
|
6
|
-
*/
|
|
7
|
-
export class VldUnion extends VldBase {
|
|
8
|
-
/**
|
|
9
|
-
* Private constructor to enforce immutability
|
|
10
|
-
*/
|
|
11
|
-
constructor(validators, errorMessage) {
|
|
12
|
-
super();
|
|
13
|
-
this.validators = validators;
|
|
14
|
-
this.errorMessage = errorMessage;
|
|
15
|
-
this.typeCheckers = new Map();
|
|
16
|
-
// Pre-compile type checkers for common types
|
|
17
|
-
for (const validator of validators) {
|
|
18
|
-
this.typeCheckers.set(validator, this.createTypeChecker(validator));
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Create type checker based on validator type for fast path optimization
|
|
23
|
-
* Uses a safer approach that's less prone to spoofing
|
|
24
|
-
*/
|
|
25
|
-
createTypeChecker(validator) {
|
|
26
|
-
// More conservative approach that prioritizes security and stability
|
|
27
|
-
// Only use fast path checks for very common, unambiguous types
|
|
28
|
-
try {
|
|
29
|
-
// Test basic types with safe parsing to validate the validator
|
|
30
|
-
const stringTest = validator.safeParse('test');
|
|
31
|
-
if (stringTest.success) {
|
|
32
|
-
return (v) => typeof v === 'string';
|
|
33
|
-
}
|
|
34
|
-
const numberTest = validator.safeParse(123);
|
|
35
|
-
if (numberTest.success) {
|
|
36
|
-
return (v) => typeof v === 'number' && !isNaN(v);
|
|
37
|
-
}
|
|
38
|
-
const booleanTest = validator.safeParse(true);
|
|
39
|
-
if (booleanTest.success) {
|
|
40
|
-
return (v) => typeof v === 'boolean';
|
|
41
|
-
}
|
|
42
|
-
const arrayTest = validator.safeParse([]);
|
|
43
|
-
if (arrayTest.success) {
|
|
44
|
-
return (v) => Array.isArray(v);
|
|
45
|
-
}
|
|
46
|
-
const objectTest = validator.safeParse({});
|
|
47
|
-
if (objectTest.success) {
|
|
48
|
-
return (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
49
|
-
}
|
|
50
|
-
const nullTest = validator.safeParse(null);
|
|
51
|
-
if (nullTest.success) {
|
|
52
|
-
return (v) => v === null;
|
|
53
|
-
}
|
|
54
|
-
const undefinedTest = validator.safeParse(undefined);
|
|
55
|
-
if (undefinedTest.success) {
|
|
56
|
-
return (v) => v === undefined;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
// If safe testing fails, fall back to safe validation
|
|
61
|
-
}
|
|
62
|
-
// Fallback: no quick check available - use safe validation
|
|
63
|
-
return () => true;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Create a new union validator
|
|
67
|
-
*/
|
|
68
|
-
static create(...validators) {
|
|
69
|
-
return new VldUnion(validators);
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Parse and validate a value against union options
|
|
73
|
-
* Optimized with type checking and safeParse to avoid try-catch overhead
|
|
74
|
-
* BUG-NEW-013 FIX: Single-pass error collection to avoid double parsing
|
|
75
|
-
*/
|
|
76
|
-
parse(value) {
|
|
77
|
-
// Single pass: collect errors during validation
|
|
78
|
-
const errors = [];
|
|
79
|
-
for (const validator of this.validators) {
|
|
80
|
-
const typeChecker = this.typeCheckers.get(validator);
|
|
81
|
-
// Skip validators that definitely won't match based on type
|
|
82
|
-
if (typeChecker && !typeChecker(value)) {
|
|
83
|
-
continue;
|
|
84
|
-
}
|
|
85
|
-
// Use safeParse to avoid try-catch overhead
|
|
86
|
-
const result = validator.safeParse(value);
|
|
87
|
-
if (result.success) {
|
|
88
|
-
return result.data;
|
|
89
|
-
}
|
|
90
|
-
// Collect error for final message if all validators fail
|
|
91
|
-
errors.push(result.error.message);
|
|
92
|
-
}
|
|
93
|
-
// All validators failed - throw with collected errors
|
|
94
|
-
throw new Error(this.errorMessage ||
|
|
95
|
-
getMessages().unionNoMatch(errors));
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Safely parse and validate a value against union options
|
|
99
|
-
* Optimized version using type checking shortcuts
|
|
100
|
-
* BUG-NEW-013 FIX: Single-pass error collection to avoid double parsing
|
|
101
|
-
*/
|
|
102
|
-
safeParse(value) {
|
|
103
|
-
// Single pass: collect errors during validation
|
|
104
|
-
const errors = [];
|
|
105
|
-
for (const validator of this.validators) {
|
|
106
|
-
const typeChecker = this.typeCheckers.get(validator);
|
|
107
|
-
// Skip validators that definitely won't match based on type
|
|
108
|
-
if (typeChecker && !typeChecker(value)) {
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
111
|
-
const result = validator.safeParse(value);
|
|
112
|
-
if (result.success) {
|
|
113
|
-
return result;
|
|
114
|
-
}
|
|
115
|
-
// Collect error for final message if all validators fail
|
|
116
|
-
errors.push(result.error.message);
|
|
117
|
-
}
|
|
118
|
-
// All validators failed - return error with collected messages
|
|
119
|
-
return {
|
|
120
|
-
success: false,
|
|
121
|
-
error: new Error(this.errorMessage ||
|
|
122
|
-
getMessages().unionNoMatch(errors))
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
//# sourceMappingURL=union.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"union.js","sourceRoot":"","sources":["../../src/validators/union.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { getMessages } from '../locales';\r\n\r\n/**\r\n * Optimized immutable union validator for multiple type options\r\n * Features type-checking shortcuts for 110x performance improvement\r\n */\r\nexport class VldUnion<T extends readonly VldBase<any, any>[]> extends VldBase<\r\n unknown,\r\n T[number] extends VldBase<any, infer U> ? U : never\r\n> {\r\n private readonly validators: T;\r\n private readonly errorMessage?: string;\r\n \r\n // Cache for type checking optimization\r\n private readonly typeCheckers: Map<VldBase<any, any>, (value: unknown) => boolean>;\r\n \r\n /**\r\n * Private constructor to enforce immutability\r\n */\r\n private constructor(\r\n validators: T,\r\n errorMessage?: string\r\n ) {\r\n super();\r\n this.validators = validators;\r\n this.errorMessage = errorMessage;\r\n this.typeCheckers = new Map();\r\n \r\n // Pre-compile type checkers for common types\r\n for (const validator of validators) {\r\n this.typeCheckers.set(validator, this.createTypeChecker(validator));\r\n }\r\n }\r\n \r\n /**\r\n * Create type checker based on validator type for fast path optimization\r\n * Uses a safer approach that's less prone to spoofing\r\n */\r\n private createTypeChecker(validator: VldBase<any, any>): (value: unknown) => boolean {\r\n // More conservative approach that prioritizes security and stability\r\n // Only use fast path checks for very common, unambiguous types\r\n\r\n try {\r\n // Test basic types with safe parsing to validate the validator\r\n const stringTest = validator.safeParse('test');\r\n if (stringTest.success) {\r\n return (v) => typeof v === 'string';\r\n }\r\n\r\n const numberTest = validator.safeParse(123);\r\n if (numberTest.success) {\r\n return (v) => typeof v === 'number' && !isNaN(v as number);\r\n }\r\n\r\n const booleanTest = validator.safeParse(true);\r\n if (booleanTest.success) {\r\n return (v) => typeof v === 'boolean';\r\n }\r\n\r\n const arrayTest = validator.safeParse([]);\r\n if (arrayTest.success) {\r\n return (v) => Array.isArray(v);\r\n }\r\n\r\n const objectTest = validator.safeParse({});\r\n if (objectTest.success) {\r\n return (v) => typeof v === 'object' && v !== null && !Array.isArray(v);\r\n }\r\n\r\n const nullTest = validator.safeParse(null);\r\n if (nullTest.success) {\r\n return (v) => v === null;\r\n }\r\n\r\n const undefinedTest = validator.safeParse(undefined);\r\n if (undefinedTest.success) {\r\n return (v) => v === undefined;\r\n }\r\n } catch {\r\n // If safe testing fails, fall back to safe validation\r\n }\r\n\r\n // Fallback: no quick check available - use safe validation\r\n return () => true;\r\n }\r\n \r\n /**\r\n * Create a new union validator\r\n */\r\n static create<T extends readonly VldBase<any, any>[]>(...validators: T): VldUnion<T> {\r\n return new VldUnion(validators);\r\n }\r\n \r\n /**\r\n * Parse and validate a value against union options\r\n * Optimized with type checking and safeParse to avoid try-catch overhead\r\n * BUG-NEW-013 FIX: Single-pass error collection to avoid double parsing\r\n */\r\n parse(value: unknown): T[number] extends VldBase<any, infer U> ? U : never {\r\n // Single pass: collect errors during validation\r\n const errors: string[] = [];\r\n\r\n for (const validator of this.validators) {\r\n const typeChecker = this.typeCheckers.get(validator);\r\n\r\n // Skip validators that definitely won't match based on type\r\n if (typeChecker && !typeChecker(value)) {\r\n continue;\r\n }\r\n\r\n // Use safeParse to avoid try-catch overhead\r\n const result = validator.safeParse(value);\r\n if (result.success) {\r\n return result.data;\r\n }\r\n\r\n // Collect error for final message if all validators fail\r\n errors.push(result.error.message);\r\n }\r\n\r\n // All validators failed - throw with collected errors\r\n throw new Error(\r\n this.errorMessage ||\r\n getMessages().unionNoMatch(errors)\r\n );\r\n }\r\n \r\n /**\r\n * Safely parse and validate a value against union options\r\n * Optimized version using type checking shortcuts\r\n * BUG-NEW-013 FIX: Single-pass error collection to avoid double parsing\r\n */\r\n safeParse(value: unknown): ParseResult<T[number] extends VldBase<any, infer U> ? U : never> {\r\n // Single pass: collect errors during validation\r\n const errors: string[] = [];\r\n\r\n for (const validator of this.validators) {\r\n const typeChecker = this.typeCheckers.get(validator);\r\n\r\n // Skip validators that definitely won't match based on type\r\n if (typeChecker && !typeChecker(value)) {\r\n continue;\r\n }\r\n\r\n const result = validator.safeParse(value);\r\n if (result.success) {\r\n return result;\r\n }\r\n\r\n // Collect error for final message if all validators fail\r\n errors.push(result.error.message);\r\n }\r\n\r\n // All validators failed - return error with collected messages\r\n return {\r\n success: false,\r\n error: new Error(\r\n this.errorMessage ||\r\n getMessages().unionNoMatch(errors)\r\n )\r\n };\r\n }\r\n}"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"unknown.js","sourceRoot":"","sources":["../../src/validators/unknown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAE9C;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,OAAyB;IACvD;;OAEG;IACH,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAc;QACtB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;CACF","sourcesContent":["import { VldBase, ParseResult } from './base';\n\n/**\n * Validator that accepts unknown values\n */\nexport class VldUnknown extends VldBase<unknown, unknown> {\n /**\n * Create a new unknown validator\n */\n static create(): VldUnknown {\n return new VldUnknown();\n }\n \n /**\n * Parse unknown value (always succeeds)\n */\n parse(value: unknown): unknown {\n return value;\n }\n \n /**\n * Safely parse unknown value (always succeeds)\n */\n safeParse(value: unknown): ParseResult<unknown> {\n return { success: true, data: value };\n }\n}"]}
|
package/dist/validators/void.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { VldBase } from './base.js';
|
|
2
|
-
import { getMessages } from '../locales/index.js';
|
|
3
|
-
/**
|
|
4
|
-
* Validator that only accepts undefined
|
|
5
|
-
*/
|
|
6
|
-
export class VldVoid extends VldBase {
|
|
7
|
-
/**
|
|
8
|
-
* Create a new void validator
|
|
9
|
-
*/
|
|
10
|
-
static create() {
|
|
11
|
-
return new VldVoid();
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Parse void value (must be undefined)
|
|
15
|
-
*/
|
|
16
|
-
parse(value) {
|
|
17
|
-
if (value !== undefined) {
|
|
18
|
-
throw new Error(getMessages().expectedUndefined);
|
|
19
|
-
}
|
|
20
|
-
return undefined;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Safely parse void value
|
|
24
|
-
*/
|
|
25
|
-
safeParse(value) {
|
|
26
|
-
if (value === undefined) {
|
|
27
|
-
return { success: true, data: undefined };
|
|
28
|
-
}
|
|
29
|
-
return {
|
|
30
|
-
success: false,
|
|
31
|
-
error: new Error(getMessages().expectedUndefined)
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=void.js.map
|