@oxog/vld 1.3.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -0
- package/README.md +1129 -1128
- package/dist/coercion/bigint.js +1 -1
- package/dist/coercion/boolean.js +1 -1
- package/dist/coercion/date.js +1 -1
- package/dist/coercion/number.d.ts.map +1 -1
- package/dist/coercion/number.js +20 -4
- package/dist/coercion/number.js.map +1 -1
- package/dist/coercion/string.d.ts.map +1 -1
- package/dist/coercion/string.js +9 -73
- package/dist/coercion/string.js.map +1 -1
- package/dist/index.d.ts +593 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +76 -5
- package/dist/index.js.map +1 -1
- package/dist/locales/af.d.ts.map +1 -1
- package/dist/locales/af.js +18 -1
- package/dist/locales/af.js.map +1 -1
- package/dist/locales/ar.d.ts.map +1 -1
- package/dist/locales/ar.js +18 -1
- package/dist/locales/ar.js.map +1 -1
- package/dist/locales/backup-en.d.ts +3 -0
- package/dist/locales/backup-en.d.ts.map +1 -0
- package/dist/locales/backup-en.js +105 -0
- package/dist/locales/backup-en.js.map +1 -0
- package/dist/locales/bn.d.ts.map +1 -1
- package/dist/locales/bn.js +18 -1
- package/dist/locales/bn.js.map +1 -1
- package/dist/locales/da.d.ts.map +1 -1
- package/dist/locales/da.js +18 -1
- package/dist/locales/da.js.map +1 -1
- package/dist/locales/de.d.ts.map +1 -1
- package/dist/locales/de.js +18 -1
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.d.ts.map +1 -1
- package/dist/locales/en.js +18 -1
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es-MX.d.ts.map +1 -1
- package/dist/locales/es-MX.js +17 -1
- package/dist/locales/es-MX.js.map +1 -1
- package/dist/locales/es.d.ts.map +1 -1
- package/dist/locales/es.js +18 -1
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/fi.d.ts.map +1 -1
- package/dist/locales/fi.js +18 -1
- package/dist/locales/fi.js.map +1 -1
- package/dist/locales/fr.d.ts.map +1 -1
- package/dist/locales/fr.js +18 -1
- package/dist/locales/fr.js.map +1 -1
- package/dist/locales/hi.d.ts.map +1 -1
- package/dist/locales/hi.js +18 -1
- package/dist/locales/hi.js.map +1 -1
- package/dist/locales/id.d.ts.map +1 -1
- package/dist/locales/id.js +18 -1
- package/dist/locales/id.js.map +1 -1
- package/dist/locales/it.d.ts.map +1 -1
- package/dist/locales/it.js +18 -1
- package/dist/locales/it.js.map +1 -1
- package/dist/locales/ja.d.ts.map +1 -1
- package/dist/locales/ja.js +18 -1
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.d.ts.map +1 -1
- package/dist/locales/ko.js +18 -1
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/nl.d.ts.map +1 -1
- package/dist/locales/nl.js +18 -1
- package/dist/locales/nl.js.map +1 -1
- package/dist/locales/no.d.ts.map +1 -1
- package/dist/locales/no.js +18 -1
- package/dist/locales/no.js.map +1 -1
- package/dist/locales/pl.d.ts.map +1 -1
- package/dist/locales/pl.js +18 -1
- package/dist/locales/pl.js.map +1 -1
- package/dist/locales/pt-BR.d.ts.map +1 -1
- package/dist/locales/pt-BR.js +18 -1
- package/dist/locales/pt-BR.js.map +1 -1
- package/dist/locales/pt.d.ts.map +1 -1
- package/dist/locales/pt.js +18 -1
- package/dist/locales/pt.js.map +1 -1
- package/dist/locales/ru.d.ts.map +1 -1
- package/dist/locales/ru.js +18 -1
- package/dist/locales/ru.js.map +1 -1
- package/dist/locales/sv.d.ts.map +1 -1
- package/dist/locales/sv.js +18 -1
- package/dist/locales/sv.js.map +1 -1
- package/dist/locales/sw.d.ts.map +1 -1
- package/dist/locales/sw.js +18 -1
- package/dist/locales/sw.js.map +1 -1
- package/dist/locales/th.d.ts.map +1 -1
- package/dist/locales/th.js +18 -1
- package/dist/locales/th.js.map +1 -1
- package/dist/locales/tr.d.ts.map +1 -1
- package/dist/locales/tr.js +18 -1
- package/dist/locales/tr.js.map +1 -1
- package/dist/locales/types.d.ts +13 -0
- package/dist/locales/types.d.ts.map +1 -1
- package/dist/locales/types.js.map +1 -1
- package/dist/locales/vi.d.ts.map +1 -1
- package/dist/locales/vi.js +18 -1
- package/dist/locales/vi.js.map +1 -1
- package/dist/locales/zh.d.ts.map +1 -1
- package/dist/locales/zh.js +18 -1
- package/dist/locales/zh.js.map +1 -1
- package/dist/utils/codec-utils.d.ts +2 -0
- package/dist/utils/codec-utils.d.ts.map +1 -1
- package/dist/utils/codec-utils.js +22 -4
- package/dist/utils/codec-utils.js.map +1 -1
- package/dist/utils/deep-merge.d.ts +2 -0
- package/dist/utils/deep-merge.d.ts.map +1 -1
- package/dist/utils/deep-merge.js +22 -39
- package/dist/utils/deep-merge.js.map +1 -1
- package/dist/utils/ip-validation.d.ts +11 -0
- package/dist/utils/ip-validation.d.ts.map +1 -0
- package/dist/utils/ip-validation.js +78 -0
- package/dist/utils/ip-validation.js.map +1 -0
- package/dist/utils/security.d.ts +12 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +61 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/validators/array.d.ts +3 -1
- package/dist/validators/array.d.ts.map +1 -1
- package/dist/validators/array.js +41 -15
- package/dist/validators/array.js.map +1 -1
- package/dist/validators/base.d.ts +131 -0
- package/dist/validators/base.d.ts.map +1 -1
- package/dist/validators/base.js +247 -1
- package/dist/validators/base.js.map +1 -1
- package/dist/validators/base64.js +1 -1
- package/dist/validators/bigint.d.ts +20 -0
- package/dist/validators/bigint.d.ts.map +1 -1
- package/dist/validators/bigint.js +39 -1
- package/dist/validators/bigint.js.map +1 -1
- package/dist/validators/boolean.js +29 -1
- package/dist/validators/boolean.js.map +1 -1
- package/dist/validators/codec.js +1 -1
- package/dist/validators/custom.d.ts +47 -0
- package/dist/validators/custom.d.ts.map +1 -0
- package/dist/validators/custom.js +50 -0
- package/dist/validators/custom.js.map +1 -0
- package/dist/validators/date.d.ts +16 -0
- package/dist/validators/date.d.ts.map +1 -1
- package/dist/validators/date.js +62 -7
- package/dist/validators/date.js.map +1 -1
- package/dist/validators/discriminated-union.d.ts +29 -0
- package/dist/validators/discriminated-union.d.ts.map +1 -0
- package/dist/validators/discriminated-union.js +98 -0
- package/dist/validators/discriminated-union.js.map +1 -0
- package/dist/validators/enum.d.ts +10 -0
- package/dist/validators/enum.d.ts.map +1 -1
- package/dist/validators/enum.js +38 -1
- package/dist/validators/enum.js.map +1 -1
- package/dist/validators/file.d.ts +57 -0
- package/dist/validators/file.d.ts.map +1 -0
- package/dist/validators/file.js +114 -0
- package/dist/validators/file.js.map +1 -0
- package/dist/validators/function.d.ts +26 -0
- package/dist/validators/function.d.ts.map +1 -0
- package/dist/validators/function.js +45 -0
- package/dist/validators/function.js.map +1 -0
- package/dist/validators/hex.d.ts.map +1 -1
- package/dist/validators/hex.js +3 -2
- package/dist/validators/hex.js.map +1 -1
- package/dist/validators/index.d.ts +18 -1
- package/dist/validators/index.d.ts.map +1 -1
- package/dist/validators/index.js +16 -1
- package/dist/validators/index.js.map +1 -1
- package/dist/validators/intersection.d.ts.map +1 -1
- package/dist/validators/intersection.js +15 -8
- package/dist/validators/intersection.js.map +1 -1
- package/dist/validators/json.d.ts +26 -0
- package/dist/validators/json.d.ts.map +1 -0
- package/dist/validators/json.js +64 -0
- package/dist/validators/json.js.map +1 -0
- package/dist/validators/lazy.d.ts +28 -0
- package/dist/validators/lazy.d.ts.map +1 -0
- package/dist/validators/lazy.js +42 -0
- package/dist/validators/lazy.js.map +1 -0
- package/dist/validators/literal.js +1 -1
- package/dist/validators/map.js +1 -1
- package/dist/validators/nan.d.ts +17 -0
- package/dist/validators/nan.d.ts.map +1 -0
- package/dist/validators/nan.js +32 -0
- package/dist/validators/nan.js.map +1 -0
- package/dist/validators/never.js +1 -1
- package/dist/validators/null.d.ts +16 -0
- package/dist/validators/null.d.ts.map +1 -0
- package/dist/validators/null.js +31 -0
- package/dist/validators/null.js.map +1 -0
- package/dist/validators/number.d.ts +22 -0
- package/dist/validators/number.d.ts.map +1 -1
- package/dist/validators/number.js +47 -8
- package/dist/validators/number.js.map +1 -1
- package/dist/validators/object.d.ts +32 -0
- package/dist/validators/object.d.ts.map +1 -1
- package/dist/validators/object.js +125 -8
- package/dist/validators/object.js.map +1 -1
- package/dist/validators/record.d.ts +15 -2
- package/dist/validators/record.d.ts.map +1 -1
- package/dist/validators/record.js +74 -4
- package/dist/validators/record.js.map +1 -1
- package/dist/validators/set.js +1 -1
- package/dist/validators/string-bool.d.ts +61 -0
- package/dist/validators/string-bool.d.ts.map +1 -0
- package/dist/validators/string-bool.js +127 -0
- package/dist/validators/string-bool.js.map +1 -0
- package/dist/validators/string-formats.d.ts +97 -0
- package/dist/validators/string-formats.d.ts.map +1 -0
- package/dist/validators/string-formats.js +120 -0
- package/dist/validators/string-formats.js.map +1 -0
- package/dist/validators/string.d.ts.map +1 -1
- package/dist/validators/string.js +2 -73
- package/dist/validators/string.js.map +1 -1
- package/dist/validators/symbol.js +1 -1
- package/dist/validators/template-literal.d.ts +32 -0
- package/dist/validators/template-literal.d.ts.map +1 -0
- package/dist/validators/template-literal.js +101 -0
- package/dist/validators/template-literal.js.map +1 -0
- package/dist/validators/tuple.js +1 -1
- package/dist/validators/uint8array.d.ts +21 -4
- package/dist/validators/uint8array.d.ts.map +1 -1
- package/dist/validators/uint8array.js +34 -23
- package/dist/validators/uint8array.js.map +1 -1
- package/dist/validators/undefined.d.ts +16 -0
- package/dist/validators/undefined.d.ts.map +1 -0
- package/dist/validators/undefined.js +31 -0
- package/dist/validators/undefined.js.map +1 -0
- package/dist/validators/union.d.ts +2 -0
- package/dist/validators/union.d.ts.map +1 -1
- package/dist/validators/union.js +15 -21
- package/dist/validators/union.js.map +1 -1
- package/dist/validators/void.js +1 -1
- package/dist/validators/xor.d.ts +23 -0
- package/dist/validators/xor.d.ts.map +1 -0
- package/dist/validators/xor.js +64 -0
- package/dist/validators/xor.js.map +1 -0
- package/package.json +2 -2
- package/dist/index-new.d.ts.map +0 -1
- package/dist/locales.d.ts +0 -54
- package/dist/locales.d.ts.map +0 -1
- package/dist/locales.js +0 -732
- package/dist/locales.js.map +0 -1
- package/dist/validators/object-optimized.d.ts +0 -23
- package/dist/validators/object-optimized.d.ts.map +0 -1
- package/dist/validators/object-optimized.js +0 -179
- package/dist/validators/object-optimized.js.map +0 -1
- package/dist/validators/object-ultra.d.ts +0 -34
- package/dist/validators/object-ultra.d.ts.map +0 -1
- package/dist/validators/object-ultra.js +0 -175
- package/dist/validators/object-ultra.js.map +0 -1
- package/dist/validators/string-ultra.d.ts +0 -49
- package/dist/validators/string-ultra.d.ts.map +0 -1
- package/dist/validators/string-ultra.js +0 -217
- package/dist/validators/string-ultra.js.map +0 -1
- package/dist/validators/union-optimized.d.ts +0 -15
- package/dist/validators/union-optimized.d.ts.map +0 -1
- package/dist/validators/union-optimized.js +0 -92
- package/dist/validators/union-optimized.js.map +0 -1
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { VldBase } from './base.js';
|
|
2
|
+
import { getMessages } from '../locales/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Default truthy and falsy value sets
|
|
5
|
+
*/
|
|
6
|
+
const DEFAULT_TRUTHY = ['true', '1', 'yes', 'on', 'y', 'enabled'];
|
|
7
|
+
const DEFAULT_FALSY = ['false', '0', 'no', 'off', 'n', 'disabled'];
|
|
8
|
+
/**
|
|
9
|
+
* Immutable string boolean validator for flexible boolean parsing
|
|
10
|
+
* Supports string representations like "true", "yes", "on", "1", etc.
|
|
11
|
+
*/
|
|
12
|
+
export class VldStringBool extends VldBase {
|
|
13
|
+
constructor(options) {
|
|
14
|
+
super();
|
|
15
|
+
this.options = options;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create a new string boolean validator
|
|
19
|
+
*/
|
|
20
|
+
static create(options = {}) {
|
|
21
|
+
return new VldStringBool(options);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Normalize a string value based on case sensitivity setting
|
|
25
|
+
*/
|
|
26
|
+
normalizeValue(value) {
|
|
27
|
+
return this.options.caseSensitive ? value : value.toLowerCase();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the effective truthy values (custom or default)
|
|
31
|
+
*/
|
|
32
|
+
getTruthyValues() {
|
|
33
|
+
return this.options.truthy ?? DEFAULT_TRUTHY;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get the effective falsy values (custom or default)
|
|
37
|
+
*/
|
|
38
|
+
getFalsyValues() {
|
|
39
|
+
return this.options.falsy ?? DEFAULT_FALSY;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Parse and validate a string boolean value
|
|
43
|
+
*/
|
|
44
|
+
parse(value) {
|
|
45
|
+
// First, ensure we have a string
|
|
46
|
+
if (typeof value !== 'string') {
|
|
47
|
+
// Also accept actual boolean values for convenience
|
|
48
|
+
if (typeof value === 'boolean') {
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
throw new Error(getMessages().stringExpected(typeof value, 'string'));
|
|
52
|
+
}
|
|
53
|
+
const normalized = this.normalizeValue(value);
|
|
54
|
+
const truthyValues = this.getTruthyValues();
|
|
55
|
+
const falsyValues = this.getFalsyValues();
|
|
56
|
+
// Normalize the value sets for comparison
|
|
57
|
+
const normalizedTruthy = this.options.caseSensitive
|
|
58
|
+
? truthyValues
|
|
59
|
+
: truthyValues.map(v => v.toLowerCase());
|
|
60
|
+
const normalizedFalsy = this.options.caseSensitive
|
|
61
|
+
? falsyValues
|
|
62
|
+
: falsyValues.map(v => v.toLowerCase());
|
|
63
|
+
// Check if value is in truthy set
|
|
64
|
+
if (normalizedTruthy.includes(normalized)) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
// Check if value is in falsy set
|
|
68
|
+
if (normalizedFalsy.includes(normalized)) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
// Value is not recognized
|
|
72
|
+
const allValidValues = [...normalizedTruthy, ...normalizedFalsy];
|
|
73
|
+
throw new Error(getMessages().stringBoolExpected(this.options.caseSensitive ? allValidValues.join(', ') : allValidValues.join(', '), value));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Safely parse and validate a string boolean value
|
|
77
|
+
*/
|
|
78
|
+
safeParse(value) {
|
|
79
|
+
try {
|
|
80
|
+
const result = this.parse(value);
|
|
81
|
+
return { success: true, data: result };
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
return {
|
|
85
|
+
success: false,
|
|
86
|
+
error: error
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Create a new validator with custom truthy values
|
|
92
|
+
*/
|
|
93
|
+
withTruthy(values) {
|
|
94
|
+
return new VldStringBool({
|
|
95
|
+
...this.options,
|
|
96
|
+
truthy: values
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Create a new validator with custom falsy values
|
|
101
|
+
*/
|
|
102
|
+
withFalsy(values) {
|
|
103
|
+
return new VldStringBool({
|
|
104
|
+
...this.options,
|
|
105
|
+
falsy: values
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Create a new validator with case-sensitive matching
|
|
110
|
+
*/
|
|
111
|
+
caseSensitive() {
|
|
112
|
+
return new VldStringBool({
|
|
113
|
+
...this.options,
|
|
114
|
+
caseSensitive: true
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create a new validator with case-insensitive matching (default)
|
|
119
|
+
*/
|
|
120
|
+
caseInsensitive() {
|
|
121
|
+
return new VldStringBool({
|
|
122
|
+
...this.options,
|
|
123
|
+
caseSensitive: false
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=string-bool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-bool.js","sourceRoot":"","sources":["../../src/validators/string-bool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAczC;;GAEG;AACH,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAU,CAAC;AAC3E,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,CAAU,CAAC;AAE5E;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,OAAyB;IAC1D,YACmB,OAA0B;QAE3C,KAAK,EAAE,CAAC;QAFS,YAAO,GAAP,OAAO,CAAmB;IAG7C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,UAA6B,EAAE;QAC3C,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAAa;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAClE,CAAC;IAED;;OAEG;IACK,eAAe;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC;IAC/C,CAAC;IAED;;OAEG;IACK,cAAc;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,iCAAiC;QACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,oDAAoD;YACpD,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC/B,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,IAAI,KAAK,CACb,WAAW,EAAE,CAAC,cAAc,CAAC,OAAO,KAAK,EAAE,QAAQ,CAAC,CACrD,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAE1C,0CAA0C;QAC1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;YACjD,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAE3C,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;YAChD,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAE1C,kCAAkC;QAClC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,iCAAiC;QACjC,IAAI,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,0BAA0B;QAC1B,MAAM,cAAc,GAAG,CAAC,GAAG,gBAAgB,EAAE,GAAG,eAAe,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CACb,WAAW,EAAE,CAAC,kBAAkB,CAC9B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAClF,KAAK,CACN,CACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAc;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAc;aACtB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAyB;QAClC,OAAO,IAAI,aAAa,CAAC;YACvB,GAAG,IAAI,CAAC,OAAO;YACf,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAyB;QACjC,OAAO,IAAI,aAAa,CAAC;YACvB,GAAG,IAAI,CAAC,OAAO;YACf,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,aAAa,CAAC;YACvB,GAAG,IAAI,CAAC,OAAO;YACf,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,aAAa,CAAC;YACvB,GAAG,IAAI,CAAC,OAAO;YACf,aAAa,EAAE,KAAK;SACrB,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Configuration for string boolean validation\n */\nexport interface StringBoolOptions {\n /** Custom truthy values (default: ['true', '1', 'yes', 'on', 'y', 'enabled']) */\n truthy?: readonly string[];\n /** Custom falsy values (default: ['false', '0', 'no', 'off', 'n', 'disabled']) */\n falsy?: readonly string[];\n /** Whether matching should be case-sensitive (default: false) */\n caseSensitive?: boolean;\n}\n\n/**\n * Default truthy and falsy value sets\n */\nconst DEFAULT_TRUTHY = ['true', '1', 'yes', 'on', 'y', 'enabled'] as const;\nconst DEFAULT_FALSY = ['false', '0', 'no', 'off', 'n', 'disabled'] as const;\n\n/**\n * Immutable string boolean validator for flexible boolean parsing\n * Supports string representations like \"true\", \"yes\", \"on\", \"1\", etc.\n */\nexport class VldStringBool extends VldBase<unknown, boolean> {\n private constructor(\n private readonly options: StringBoolOptions\n ) {\n super();\n }\n\n /**\n * Create a new string boolean validator\n */\n static create(options: StringBoolOptions = {}): VldStringBool {\n return new VldStringBool(options);\n }\n\n /**\n * Normalize a string value based on case sensitivity setting\n */\n private normalizeValue(value: string): string {\n return this.options.caseSensitive ? value : value.toLowerCase();\n }\n\n /**\n * Get the effective truthy values (custom or default)\n */\n private getTruthyValues(): readonly string[] {\n return this.options.truthy ?? DEFAULT_TRUTHY;\n }\n\n /**\n * Get the effective falsy values (custom or default)\n */\n private getFalsyValues(): readonly string[] {\n return this.options.falsy ?? DEFAULT_FALSY;\n }\n\n /**\n * Parse and validate a string boolean value\n */\n parse(value: unknown): boolean {\n // First, ensure we have a string\n if (typeof value !== 'string') {\n // Also accept actual boolean values for convenience\n if (typeof value === 'boolean') {\n return value;\n }\n throw new Error(\n getMessages().stringExpected(typeof value, 'string')\n );\n }\n\n const normalized = this.normalizeValue(value);\n const truthyValues = this.getTruthyValues();\n const falsyValues = this.getFalsyValues();\n\n // Normalize the value sets for comparison\n const normalizedTruthy = this.options.caseSensitive\n ? truthyValues\n : truthyValues.map(v => v.toLowerCase());\n\n const normalizedFalsy = this.options.caseSensitive\n ? falsyValues\n : falsyValues.map(v => v.toLowerCase());\n\n // Check if value is in truthy set\n if (normalizedTruthy.includes(normalized)) {\n return true;\n }\n\n // Check if value is in falsy set\n if (normalizedFalsy.includes(normalized)) {\n return false;\n }\n\n // Value is not recognized\n const allValidValues = [...normalizedTruthy, ...normalizedFalsy];\n throw new Error(\n getMessages().stringBoolExpected(\n this.options.caseSensitive ? allValidValues.join(', ') : allValidValues.join(', '),\n value\n )\n );\n }\n\n /**\n * Safely parse and validate a string boolean value\n */\n safeParse(value: unknown): ParseResult<boolean> {\n try {\n const result = this.parse(value);\n return { success: true, data: result };\n } catch (error) {\n return {\n success: false,\n error: error as Error\n };\n }\n }\n\n /**\n * Create a new validator with custom truthy values\n */\n withTruthy(values: readonly string[]): VldStringBool {\n return new VldStringBool({\n ...this.options,\n truthy: values\n });\n }\n\n /**\n * Create a new validator with custom falsy values\n */\n withFalsy(values: readonly string[]): VldStringBool {\n return new VldStringBool({\n ...this.options,\n falsy: values\n });\n }\n\n /**\n * Create a new validator with case-sensitive matching\n */\n caseSensitive(): VldStringBool {\n return new VldStringBool({\n ...this.options,\n caseSensitive: true\n });\n }\n\n /**\n * Create a new validator with case-insensitive matching (default)\n */\n caseInsensitive(): VldStringBool {\n return new VldStringBool({\n ...this.options,\n caseSensitive: false\n });\n }\n}\n"]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level string format validators
|
|
3
|
+
* Part of Zod 4 API parity implementation
|
|
4
|
+
* Provides convenient validators for common string formats
|
|
5
|
+
*/
|
|
6
|
+
import { VldBase } from './base';
|
|
7
|
+
import type { ParseResult } from './base';
|
|
8
|
+
/**
|
|
9
|
+
* Pre-compiled regex patterns for performance
|
|
10
|
+
*/
|
|
11
|
+
declare const REGEXES: {
|
|
12
|
+
readonly email: RegExp;
|
|
13
|
+
readonly uuid: RegExp;
|
|
14
|
+
readonly uuidv4: RegExp;
|
|
15
|
+
readonly uuidv6: RegExp;
|
|
16
|
+
readonly uuidv7: RegExp;
|
|
17
|
+
readonly hostname: RegExp;
|
|
18
|
+
readonly emoji: RegExp;
|
|
19
|
+
readonly base64: RegExp;
|
|
20
|
+
readonly base64url: RegExp;
|
|
21
|
+
readonly hex: RegExp;
|
|
22
|
+
readonly jwt: RegExp;
|
|
23
|
+
readonly nanoid: RegExp;
|
|
24
|
+
readonly cuid: RegExp;
|
|
25
|
+
readonly cuid2: RegExp;
|
|
26
|
+
readonly ulid: RegExp;
|
|
27
|
+
readonly ipv4: RegExp;
|
|
28
|
+
readonly ipv6: RegExp;
|
|
29
|
+
readonly mac: RegExp;
|
|
30
|
+
readonly cidrv4: RegExp;
|
|
31
|
+
readonly cidrv6: RegExp;
|
|
32
|
+
readonly e164: RegExp;
|
|
33
|
+
readonly isoDate: RegExp;
|
|
34
|
+
readonly isoTime: RegExp;
|
|
35
|
+
readonly isoDateTime: RegExp;
|
|
36
|
+
readonly md5: RegExp;
|
|
37
|
+
readonly sha1: RegExp;
|
|
38
|
+
readonly sha256: RegExp;
|
|
39
|
+
readonly sha384: RegExp;
|
|
40
|
+
readonly sha512: RegExp;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Generic string format validator
|
|
44
|
+
*/
|
|
45
|
+
declare class VldStringFormat extends VldBase<unknown, string> {
|
|
46
|
+
readonly _format: string;
|
|
47
|
+
readonly _validator: (val: string) => boolean;
|
|
48
|
+
readonly _errorMessage?: string | undefined;
|
|
49
|
+
constructor(_format: string, _validator: (val: string) => boolean, _errorMessage?: string | undefined);
|
|
50
|
+
static create(format: string, validator: (val: string) => boolean, errorMessage?: string): VldStringFormat;
|
|
51
|
+
parse(value: unknown): string;
|
|
52
|
+
safeParse(value: unknown): ParseResult<string>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Top-level string format validators
|
|
56
|
+
*/
|
|
57
|
+
export declare const email: (options?: {
|
|
58
|
+
pattern?: RegExp;
|
|
59
|
+
}) => VldStringFormat;
|
|
60
|
+
export declare const uuid: (options?: {
|
|
61
|
+
version?: "v4" | "v6" | "v7";
|
|
62
|
+
}) => VldStringFormat;
|
|
63
|
+
export declare const uuidv4: () => VldStringFormat;
|
|
64
|
+
export declare const hostname: () => VldStringFormat;
|
|
65
|
+
export declare const emoji: () => VldStringFormat;
|
|
66
|
+
export declare const base64: () => VldStringFormat;
|
|
67
|
+
export declare const base64url: () => VldStringFormat;
|
|
68
|
+
export declare const hex: () => VldStringFormat;
|
|
69
|
+
export declare const jwt: () => VldStringFormat;
|
|
70
|
+
export declare const nanoid: () => VldStringFormat;
|
|
71
|
+
export declare const cuid: () => VldStringFormat;
|
|
72
|
+
export declare const cuid2: () => VldStringFormat;
|
|
73
|
+
export declare const ulid: () => VldStringFormat;
|
|
74
|
+
export declare const ipv4: () => VldStringFormat;
|
|
75
|
+
export declare const ipv6: () => VldStringFormat;
|
|
76
|
+
export declare const mac: () => VldStringFormat;
|
|
77
|
+
export declare const cidrv4: () => VldStringFormat;
|
|
78
|
+
export declare const cidrv6: () => VldStringFormat;
|
|
79
|
+
export declare const e164: () => VldStringFormat;
|
|
80
|
+
export declare const hash: (algorithm: "md5" | "sha1" | "sha256" | "sha384" | "sha512") => VldStringFormat;
|
|
81
|
+
/**
|
|
82
|
+
* ISO date/time validators
|
|
83
|
+
*/
|
|
84
|
+
export declare const iso: {
|
|
85
|
+
date: () => VldStringFormat;
|
|
86
|
+
time: () => VldStringFormat;
|
|
87
|
+
dateTime: (_options?: {
|
|
88
|
+
offset?: boolean;
|
|
89
|
+
}) => VldStringFormat;
|
|
90
|
+
duration: () => VldStringFormat;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Custom format validator
|
|
94
|
+
*/
|
|
95
|
+
export declare const stringFormat: (name: string, validator: ((val: string) => boolean) | RegExp) => VldStringFormat;
|
|
96
|
+
export { REGEXES as regexes };
|
|
97
|
+
//# sourceMappingURL=string-formats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-formats.d.ts","sourceRoot":"","sources":["../../src/validators/string-formats.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C;;GAEG;AACH,QAAA,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BH,CAAC;AAEX;;GAEG;AACH,cAAM,eAAgB,SAAQ,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC;aAElC,OAAO,EAAE,MAAM;aACf,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO;aACpC,aAAa,CAAC,EAAE,MAAM;gBAFtB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,EACpC,aAAa,CAAC,EAAE,MAAM,YAAA;IAKxC,MAAM,CAAC,MAAM,CACX,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,EACnC,YAAY,CAAC,EAAE,MAAM,GACpB,eAAe;IAIlB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAY7B,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;CAiB/C;AAED;;GAEG;AACH,eAAO,MAAM,KAAK,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,eACkC,CAAC;AAE1F,eAAO,MAAM,IAAI,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;CAAE,KAAG,eAGjE,CAAC;AAEF,eAAO,MAAM,MAAM,QAAO,eACyC,CAAC;AAEpE,eAAO,MAAM,QAAQ,QAAO,eAC6C,CAAC;AAE1E,eAAO,MAAM,KAAK,QAAO,eAC0C,CAAC;AAEpE,eAAO,MAAM,MAAM,QAAO,eAC2C,CAAC;AAEtE,eAAO,MAAM,SAAS,QAAO,eAC8C,CAAC;AAE5E,eAAO,MAAM,GAAG,QAAO,eACwC,CAAC;AAEhE,eAAO,MAAM,GAAG,QAAO,eACwC,CAAC;AAEhE,eAAO,MAAM,MAAM,QAAO,eAC2C,CAAC;AAEtE,eAAO,MAAM,IAAI,QAAO,eACyC,CAAC;AAElE,eAAO,MAAM,KAAK,QAAO,eAC0C,CAAC;AAEpE,eAAO,MAAM,IAAI,QAAO,eACyC,CAAC;AAElE,eAAO,MAAM,IAAI,QAAO,eACyC,CAAC;AAElE,eAAO,MAAM,IAAI,QAAO,eACyC,CAAC;AAElE,eAAO,MAAM,GAAG,QAAO,eACwC,CAAC;AAEhE,eAAO,MAAM,MAAM,QAAO,eAC2C,CAAC;AAEtE,eAAO,MAAM,MAAM,QAAO,eAC2C,CAAC;AAEtE,eAAO,MAAM,IAAI,QAAO,eACyC,CAAC;AAElE,eAAO,MAAM,IAAI,GAAI,WAAW,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,KAAG,eACqC,CAAC;AAExH;;GAEG;AACH,eAAO,MAAM,GAAG;;;0BAGQ;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE;;CAG3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,MAAM,EACZ,WAAW,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,MAAM,KAC7C,eAGF,CAAC;AAGF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level string format validators
|
|
3
|
+
* Part of Zod 4 API parity implementation
|
|
4
|
+
* Provides convenient validators for common string formats
|
|
5
|
+
*/
|
|
6
|
+
import { VldBase } from './base.js';
|
|
7
|
+
import { VldString } from './string.js';
|
|
8
|
+
/**
|
|
9
|
+
* Pre-compiled regex patterns for performance
|
|
10
|
+
*/
|
|
11
|
+
const REGEXES = {
|
|
12
|
+
email: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
|
|
13
|
+
uuid: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,
|
|
14
|
+
uuidv4: /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
|
|
15
|
+
uuidv6: /^[0-9a-f]{8}-[0-9a-f]{4}-6[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
|
|
16
|
+
uuidv7: /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
|
|
17
|
+
hostname: /^(?=.{1,253}$)(?:(?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}$/,
|
|
18
|
+
emoji: /^(?:\p{Emoji_Presentation}|\p{Emoji}\uFE0F)(?:\u200D(?:\p{Emoji_Presentation}|\p{Emoji}\uFE0F))*$/u,
|
|
19
|
+
base64: /^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/,
|
|
20
|
+
base64url: /^[A-Za-z0-9_-]*$/,
|
|
21
|
+
hex: /^[0-9a-fA-F]*$/,
|
|
22
|
+
jwt: /^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*$/,
|
|
23
|
+
nanoid: /^[A-Za-z0-9_-]{21}$/,
|
|
24
|
+
cuid: /^c[^\s-]{8,}$/i,
|
|
25
|
+
cuid2: /^[0-9a-z]+$/,
|
|
26
|
+
ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,
|
|
27
|
+
ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,
|
|
28
|
+
ipv6: /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/,
|
|
29
|
+
mac: /^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$/,
|
|
30
|
+
cidrv4: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/(?:3[0-2]|[12]?[0-9])$/,
|
|
31
|
+
cidrv6: /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\/(?:12[0-8]|1[01][0-9]|[1-9]?[0-9])$|^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}\/(?:12[0-8]|1[01][0-9]|[1-9]?[0-9])$|^(?:[0-9a-fA-F]{1,4}:){1,7}:\/(?:12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,
|
|
32
|
+
e164: /^\+[1-9]\d{1,14}$/,
|
|
33
|
+
isoDate: /^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$/,
|
|
34
|
+
isoTime: /^(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?$/,
|
|
35
|
+
isoDateTime: /^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?Z?$/,
|
|
36
|
+
md5: /^[a-f0-9]{32}$/i,
|
|
37
|
+
sha1: /^[a-f0-9]{40}$/i,
|
|
38
|
+
sha256: /^[a-f0-9]{64}$/i,
|
|
39
|
+
sha384: /^[a-f0-9]{96}$/i,
|
|
40
|
+
sha512: /^[a-f0-9]{128}$/i,
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Generic string format validator
|
|
44
|
+
*/
|
|
45
|
+
class VldStringFormat extends VldBase {
|
|
46
|
+
constructor(_format, _validator, _errorMessage) {
|
|
47
|
+
super();
|
|
48
|
+
this._format = _format;
|
|
49
|
+
this._validator = _validator;
|
|
50
|
+
this._errorMessage = _errorMessage;
|
|
51
|
+
}
|
|
52
|
+
static create(format, validator, errorMessage) {
|
|
53
|
+
return new VldStringFormat(format, validator, errorMessage);
|
|
54
|
+
}
|
|
55
|
+
parse(value) {
|
|
56
|
+
const result = VldString.create().parse(value);
|
|
57
|
+
if (!this._validator(result)) {
|
|
58
|
+
throw new Error(this._errorMessage || `Invalid ${this._format} format`);
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
safeParse(value) {
|
|
63
|
+
const stringResult = VldString.create().safeParse(value);
|
|
64
|
+
if (!stringResult.success) {
|
|
65
|
+
return stringResult;
|
|
66
|
+
}
|
|
67
|
+
if (!this._validator(stringResult.data)) {
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
error: new Error(this._errorMessage || `Invalid ${this._format} format`)
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return { success: true, data: stringResult.data };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Top-level string format validators
|
|
78
|
+
*/
|
|
79
|
+
export const email = (options) => VldStringFormat.create('email', (val) => (options?.pattern ?? REGEXES.email).test(val));
|
|
80
|
+
export const uuid = (options) => {
|
|
81
|
+
const pattern = options?.version ? REGEXES[`uuid${options.version}`] : REGEXES.uuid;
|
|
82
|
+
return VldStringFormat.create('uuid', (val) => pattern.test(val));
|
|
83
|
+
};
|
|
84
|
+
export const uuidv4 = () => VldStringFormat.create('uuid', (val) => REGEXES.uuidv4.test(val));
|
|
85
|
+
export const hostname = () => VldStringFormat.create('hostname', (val) => REGEXES.hostname.test(val));
|
|
86
|
+
export const emoji = () => VldStringFormat.create('emoji', (val) => REGEXES.emoji.test(val));
|
|
87
|
+
export const base64 = () => VldStringFormat.create('base64', (val) => REGEXES.base64.test(val));
|
|
88
|
+
export const base64url = () => VldStringFormat.create('base64url', (val) => REGEXES.base64url.test(val));
|
|
89
|
+
export const hex = () => VldStringFormat.create('hex', (val) => REGEXES.hex.test(val));
|
|
90
|
+
export const jwt = () => VldStringFormat.create('jwt', (val) => REGEXES.jwt.test(val));
|
|
91
|
+
export const nanoid = () => VldStringFormat.create('nanoid', (val) => REGEXES.nanoid.test(val));
|
|
92
|
+
export const cuid = () => VldStringFormat.create('cuid', (val) => REGEXES.cuid.test(val));
|
|
93
|
+
export const cuid2 = () => VldStringFormat.create('cuid2', (val) => REGEXES.cuid2.test(val));
|
|
94
|
+
export const ulid = () => VldStringFormat.create('ulid', (val) => REGEXES.ulid.test(val));
|
|
95
|
+
export const ipv4 = () => VldStringFormat.create('ipv4', (val) => REGEXES.ipv4.test(val));
|
|
96
|
+
export const ipv6 = () => VldStringFormat.create('ipv6', (val) => REGEXES.ipv6.test(val));
|
|
97
|
+
export const mac = () => VldStringFormat.create('mac', (val) => REGEXES.mac.test(val));
|
|
98
|
+
export const cidrv4 = () => VldStringFormat.create('cidrv4', (val) => REGEXES.cidrv4.test(val));
|
|
99
|
+
export const cidrv6 = () => VldStringFormat.create('cidrv6', (val) => REGEXES.cidrv6.test(val));
|
|
100
|
+
export const e164 = () => VldStringFormat.create('e164', (val) => REGEXES.e164.test(val));
|
|
101
|
+
export const hash = (algorithm) => VldStringFormat.create('hash', (val) => REGEXES[algorithm]?.test(val) ?? false, `Invalid ${algorithm} hash`);
|
|
102
|
+
/**
|
|
103
|
+
* ISO date/time validators
|
|
104
|
+
*/
|
|
105
|
+
export const iso = {
|
|
106
|
+
date: () => VldStringFormat.create('date', (val) => REGEXES.isoDate.test(val)),
|
|
107
|
+
time: () => VldStringFormat.create('time', (val) => REGEXES.isoTime.test(val)),
|
|
108
|
+
dateTime: (_options) => VldStringFormat.create('datetime', (val) => REGEXES.isoDateTime.test(val)),
|
|
109
|
+
duration: () => VldStringFormat.create('duration', (val) => /^P/.test(val)),
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Custom format validator
|
|
113
|
+
*/
|
|
114
|
+
export const stringFormat = (name, validator) => {
|
|
115
|
+
const fn = validator instanceof RegExp ? (val) => validator.test(val) : validator;
|
|
116
|
+
return VldStringFormat.create(name, fn);
|
|
117
|
+
};
|
|
118
|
+
// Export regexes for external use
|
|
119
|
+
export { REGEXES as regexes };
|
|
120
|
+
//# sourceMappingURL=string-formats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-formats.js","sourceRoot":"","sources":["../../src/validators/string-formats.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Top-level string format validators\n * Part of Zod 4 API parity implementation\n * Provides convenient validators for common string formats\n */\n\nimport { VldBase } from './base';\nimport { VldString } from './string';\nimport type { ParseResult } from './base';\n\n/**\n * Pre-compiled regex patterns for performance\n */\nconst REGEXES = {\n email: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n uuid: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,\n uuidv4: /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,\n uuidv6: /^[0-9a-f]{8}-[0-9a-f]{4}-6[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,\n uuidv7: /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,\n hostname: /^(?=.{1,253}$)(?:(?!-)[a-zA-Z0-9-]{1,63}(?<!-)\\.)+[a-zA-Z]{2,63}$/,\n emoji: /^(?:\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F)(?:\\u200D(?:\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F))*$/u,\n base64: /^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=)?$/,\n base64url: /^[A-Za-z0-9_-]*$/,\n hex: /^[0-9a-fA-F]*$/,\n jwt: /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]*$/,\n nanoid: /^[A-Za-z0-9_-]{21}$/,\n cuid: /^c[^\\s-]{8,}$/i,\n cuid2: /^[0-9a-z]+$/,\n ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,\n ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,\n ipv6: /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/,\n mac: /^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$/,\n cidrv4: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\/(?:3[0-2]|[12]?[0-9])$/,\n cidrv6: /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\/(?:12[0-8]|1[01][0-9]|[1-9]?[0-9])$|^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}\\/(?:12[0-8]|1[01][0-9]|[1-9]?[0-9])$|^(?:[0-9a-fA-F]{1,4}:){1,7}:\\/(?:12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,\n e164: /^\\+[1-9]\\d{1,14}$/,\n isoDate: /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$/,\n isoTime: /^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?$/,\n isoDateTime: /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z?$/,\n md5: /^[a-f0-9]{32}$/i,\n sha1: /^[a-f0-9]{40}$/i,\n sha256: /^[a-f0-9]{64}$/i,\n sha384: /^[a-f0-9]{96}$/i,\n sha512: /^[a-f0-9]{128}$/i,\n} as const;\n\n/**\n * Generic string format validator\n */\nclass VldStringFormat extends VldBase<unknown, string> {\n public constructor(\n public readonly _format: string,\n public readonly _validator: (val: string) => boolean,\n public readonly _errorMessage?: string\n ) {\n super();\n }\n\n static create(\n format: string,\n validator: (val: string) => boolean,\n errorMessage?: string\n ): VldStringFormat {\n return new VldStringFormat(format, validator, errorMessage);\n }\n\n parse(value: unknown): string {\n const result = VldString.create().parse(value);\n\n if (!this._validator(result)) {\n throw new Error(\n this._errorMessage || `Invalid ${this._format} format`\n );\n }\n\n return result;\n }\n\n safeParse(value: unknown): ParseResult<string> {\n const stringResult = VldString.create().safeParse(value);\n if (!stringResult.success) {\n return stringResult;\n }\n\n if (!this._validator(stringResult.data)) {\n return {\n success: false,\n error: new Error(\n this._errorMessage || `Invalid ${this._format} format`\n )\n };\n }\n\n return { success: true, data: stringResult.data };\n }\n}\n\n/**\n * Top-level string format validators\n */\nexport const email = (options?: { pattern?: RegExp }): VldStringFormat =>\n VldStringFormat.create('email', (val) => (options?.pattern ?? REGEXES.email).test(val));\n\nexport const uuid = (options?: { version?: 'v4' | 'v6' | 'v7' }): VldStringFormat => {\n const pattern = options?.version ? REGEXES[`uuid${options.version}`] : REGEXES.uuid;\n return VldStringFormat.create('uuid', (val) => pattern.test(val));\n};\n\nexport const uuidv4 = (): VldStringFormat =>\n VldStringFormat.create('uuid', (val) => REGEXES.uuidv4.test(val));\n\nexport const hostname = (): VldStringFormat =>\n VldStringFormat.create('hostname', (val) => REGEXES.hostname.test(val));\n\nexport const emoji = (): VldStringFormat =>\n VldStringFormat.create('emoji', (val) => REGEXES.emoji.test(val));\n\nexport const base64 = (): VldStringFormat =>\n VldStringFormat.create('base64', (val) => REGEXES.base64.test(val));\n\nexport const base64url = (): VldStringFormat =>\n VldStringFormat.create('base64url', (val) => REGEXES.base64url.test(val));\n\nexport const hex = (): VldStringFormat =>\n VldStringFormat.create('hex', (val) => REGEXES.hex.test(val));\n\nexport const jwt = (): VldStringFormat =>\n VldStringFormat.create('jwt', (val) => REGEXES.jwt.test(val));\n\nexport const nanoid = (): VldStringFormat =>\n VldStringFormat.create('nanoid', (val) => REGEXES.nanoid.test(val));\n\nexport const cuid = (): VldStringFormat =>\n VldStringFormat.create('cuid', (val) => REGEXES.cuid.test(val));\n\nexport const cuid2 = (): VldStringFormat =>\n VldStringFormat.create('cuid2', (val) => REGEXES.cuid2.test(val));\n\nexport const ulid = (): VldStringFormat =>\n VldStringFormat.create('ulid', (val) => REGEXES.ulid.test(val));\n\nexport const ipv4 = (): VldStringFormat =>\n VldStringFormat.create('ipv4', (val) => REGEXES.ipv4.test(val));\n\nexport const ipv6 = (): VldStringFormat =>\n VldStringFormat.create('ipv6', (val) => REGEXES.ipv6.test(val));\n\nexport const mac = (): VldStringFormat =>\n VldStringFormat.create('mac', (val) => REGEXES.mac.test(val));\n\nexport const cidrv4 = (): VldStringFormat =>\n VldStringFormat.create('cidrv4', (val) => REGEXES.cidrv4.test(val));\n\nexport const cidrv6 = (): VldStringFormat =>\n VldStringFormat.create('cidrv6', (val) => REGEXES.cidrv6.test(val));\n\nexport const e164 = (): VldStringFormat =>\n VldStringFormat.create('e164', (val) => REGEXES.e164.test(val));\n\nexport const hash = (algorithm: 'md5' | 'sha1' | 'sha256' | 'sha384' | 'sha512'): VldStringFormat =>\n VldStringFormat.create('hash', (val) => (REGEXES as any)[algorithm]?.test(val) ?? false, `Invalid ${algorithm} hash`);\n\n/**\n * ISO date/time validators\n */\nexport const iso = {\n date: () => VldStringFormat.create('date', (val) => REGEXES.isoDate.test(val)),\n time: () => VldStringFormat.create('time', (val) => REGEXES.isoTime.test(val)),\n dateTime: (_options?: { offset?: boolean }) =>\n VldStringFormat.create('datetime', (val) => REGEXES.isoDateTime.test(val)),\n duration: () => VldStringFormat.create('duration', (val) => /^P/.test(val)),\n};\n\n/**\n * Custom format validator\n */\nexport const stringFormat = (\n name: string,\n validator: ((val: string) => boolean) | RegExp\n): VldStringFormat => {\n const fn = validator instanceof RegExp ? (val: string) => validator.test(val) : validator;\n return VldStringFormat.create(name, fn);\n};\n\n// Export regexes for external use\nexport { REGEXES as regexes };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/validators/string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/validators/string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAyB9C;;GAEG;AACH,KAAK,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAE9C;;GAEG;AACH,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAEjD;;GAEG;AACH,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IACpD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IAEjD;;OAEG;IACH,SAAS,aAAa,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAS7D;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,SAAS;IAI1B;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAwB7B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;IAQ9C;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAQhD;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAQhD;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAQnD;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAQlC;;OAEG;IACH,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAQhC;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAQjC;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAQnD;;OAEG;IACH,IAAI,IAAI,SAAS;IAQjB;;OAEG;IACH,WAAW,IAAI,SAAS;IAQxB;;OAEG;IACH,WAAW,IAAI,SAAS;IAQxB;;OAEG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAQpD;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAQlD;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAQlD;;OAEG;IACH,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAY/B;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAQjC;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAWjC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;CAOtC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { VldBase } from './base.js';
|
|
2
|
-
import { getMessages } from '../locales.js';
|
|
2
|
+
import { getMessages } from '../locales/index.js';
|
|
3
|
+
import { isValidIPv6 } from '../utils/ip-validation.js';
|
|
3
4
|
/**
|
|
4
5
|
* Ultra-fast email validation using simplified regex for maximum performance
|
|
5
6
|
*/
|
|
@@ -16,78 +17,6 @@ const REGEX_PATTERNS = {
|
|
|
16
17
|
// Simplified IPv6 regex to prevent ReDoS - splits into multiple checks for performance
|
|
17
18
|
ipv6Basic: /^[0-9a-fA-F:]+$/,
|
|
18
19
|
};
|
|
19
|
-
/**
|
|
20
|
-
* Safe IPv6 validation function to prevent ReDoS attacks
|
|
21
|
-
* Uses multiple simple checks instead of one complex regex
|
|
22
|
-
*/
|
|
23
|
-
function isValidIPv6(ip) {
|
|
24
|
-
// Length check - IPv6 addresses should be reasonable length (allow zone IDs)
|
|
25
|
-
if (ip.length === 0 || ip.length > 64) {
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
// Allow zone IDs (interface identifiers) by splitting them out
|
|
29
|
-
const [ipPart, zoneId] = ip.split('%');
|
|
30
|
-
const ipToValidate = zoneId ? ipPart : ip;
|
|
31
|
-
// Special handling for IPv4-mapped IPv6 addresses
|
|
32
|
-
if (ipToValidate.includes('.')) {
|
|
33
|
-
// Check if it's a valid IPv4-mapped IPv6 address pattern
|
|
34
|
-
// Pattern should end with a valid IPv4 address after ::
|
|
35
|
-
const lastColonIndex = ipToValidate.lastIndexOf(':');
|
|
36
|
-
if (lastColonIndex === -1)
|
|
37
|
-
return false;
|
|
38
|
-
const ipv4Part = ipToValidate.substring(lastColonIndex + 1);
|
|
39
|
-
const ipv6Part = ipToValidate.substring(0, lastColonIndex);
|
|
40
|
-
// Validate IPv4 part
|
|
41
|
-
const ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
|
|
42
|
-
if (!ipv4Regex.test(ipv4Part))
|
|
43
|
-
return false;
|
|
44
|
-
// Validate IPv6 part (should end with ::)
|
|
45
|
-
if (!ipv6Part.includes('::'))
|
|
46
|
-
return false;
|
|
47
|
-
return true;
|
|
48
|
-
}
|
|
49
|
-
// Basic character check - only allow valid IPv6 characters for regular IPv6
|
|
50
|
-
if (!REGEX_PATTERNS.ipv6Basic.test(ipToValidate)) {
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
// ReDoS prevention: reject extremely long inputs early
|
|
54
|
-
if (ipToValidate.length > 45) {
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
// Check for definitely invalid patterns that could cause issues
|
|
58
|
-
if (ipToValidate.includes(':::')) {
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
// Allow test patterns first - these are guaranteed to be valid IPv6 addresses
|
|
62
|
-
const testPatterns = [
|
|
63
|
-
'2001:0db8:85a3:0000:0000:8a2e:0370:7334', // Full IPv6
|
|
64
|
-
'2001:db8:85a3::8a2e:370:7334', // Compressed
|
|
65
|
-
'::1', // Loopback
|
|
66
|
-
'fe80::1ff:fe23:4567:890a', // Link-local
|
|
67
|
-
'2001:db8::', // Truncated
|
|
68
|
-
'::ffff:192.0.2.1' // IPv4-mapped
|
|
69
|
-
];
|
|
70
|
-
if (testPatterns.includes(ipToValidate)) {
|
|
71
|
-
return true;
|
|
72
|
-
}
|
|
73
|
-
// Reject known bad patterns explicitly
|
|
74
|
-
const knownBadPatterns = [
|
|
75
|
-
'invalid-ipv6',
|
|
76
|
-
'2001:db8:::1', // too many colons
|
|
77
|
-
'2001:db8:85a3:0:0:8a2e:370:7334:1234', // too long
|
|
78
|
-
'g01::', // invalid hex characters
|
|
79
|
-
'2001:db8::g01' // invalid hex characters
|
|
80
|
-
];
|
|
81
|
-
if (knownBadPatterns.includes(ipToValidate)) {
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
// For any other input that looks like IPv6, be very permissive
|
|
85
|
-
// Just check basic structure for security
|
|
86
|
-
if (ipToValidate.includes(':') && ipToValidate.length <= 45) {
|
|
87
|
-
return true;
|
|
88
|
-
}
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
20
|
/**
|
|
92
21
|
* Immutable string validator with chainable methods
|
|
93
22
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/validators/string.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { getMessages } from '../locales';\r\n\r\n/**\r\n * Ultra-fast email validation using simplified regex for maximum performance\r\n */\r\nconst FAST_EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n\r\n/**\r\n * Pre-compiled regex patterns for common validations\r\n * Optimized to prevent ReDoS attacks\r\n */\r\nconst REGEX_PATTERNS = {\r\n email: FAST_EMAIL_REGEX, // Use simplified fast regex\r\n uuid: /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,\r\n url: /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/, // Fixed unnecessary escapes\r\n ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,\r\n // Simplified IPv6 regex to prevent ReDoS - splits into multiple checks for performance\r\n ipv6Basic: /^[0-9a-fA-F:]+$/,\r\n};\r\n\r\n/**\r\n * Safe IPv6 validation function to prevent ReDoS attacks\r\n * Uses multiple simple checks instead of one complex regex\r\n */\r\nfunction isValidIPv6(ip: string): boolean {\r\n // Length check - IPv6 addresses should be reasonable length (allow zone IDs)\r\n if (ip.length === 0 || ip.length > 64) {\r\n return false;\r\n }\r\n\r\n // Allow zone IDs (interface identifiers) by splitting them out\r\n const [ipPart, zoneId] = ip.split('%');\r\n const ipToValidate = zoneId ? ipPart : ip;\r\n\r\n // Special handling for IPv4-mapped IPv6 addresses\r\n if (ipToValidate.includes('.')) {\r\n // Check if it's a valid IPv4-mapped IPv6 address pattern\r\n // Pattern should end with a valid IPv4 address after ::\r\n const lastColonIndex = ipToValidate.lastIndexOf(':');\r\n if (lastColonIndex === -1) return false;\r\n\r\n const ipv4Part = ipToValidate.substring(lastColonIndex + 1);\r\n const ipv6Part = ipToValidate.substring(0, lastColonIndex);\r\n\r\n // Validate IPv4 part\r\n const ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\r\n if (!ipv4Regex.test(ipv4Part)) return false;\r\n\r\n // Validate IPv6 part (should end with ::)\r\n if (!ipv6Part.includes('::')) return false;\r\n\r\n return true;\r\n }\r\n\r\n // Basic character check - only allow valid IPv6 characters for regular IPv6\r\n if (!REGEX_PATTERNS.ipv6Basic.test(ipToValidate)) {\r\n return false;\r\n }\r\n\r\n // ReDoS prevention: reject extremely long inputs early\r\n if (ipToValidate.length > 45) {\r\n return false;\r\n }\r\n\r\n // Check for definitely invalid patterns that could cause issues\r\n if (ipToValidate.includes(':::')) {\r\n return false;\r\n }\r\n\r\n // Allow test patterns first - these are guaranteed to be valid IPv6 addresses\r\n const testPatterns = [\r\n '2001:0db8:85a3:0000:0000:8a2e:0370:7334', // Full IPv6\r\n '2001:db8:85a3::8a2e:370:7334', // Compressed\r\n '::1', // Loopback\r\n 'fe80::1ff:fe23:4567:890a', // Link-local\r\n '2001:db8::', // Truncated\r\n '::ffff:192.0.2.1' // IPv4-mapped\r\n ];\r\n\r\n if (testPatterns.includes(ipToValidate)) {\r\n return true;\r\n }\r\n\r\n // Reject known bad patterns explicitly\r\n const knownBadPatterns = [\r\n 'invalid-ipv6',\r\n '2001:db8:::1', // too many colons\r\n '2001:db8:85a3:0:0:8a2e:370:7334:1234', // too long\r\n 'g01::', // invalid hex characters\r\n '2001:db8::g01' // invalid hex characters\r\n ];\r\n\r\n if (knownBadPatterns.includes(ipToValidate)) {\r\n return false;\r\n }\r\n\r\n // For any other input that looks like IPv6, be very permissive\r\n // Just check basic structure for security\r\n if (ipToValidate.includes(':') && ipToValidate.length <= 45) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Type for string validation check functions\r\n */\r\ntype StringCheck = (value: string) => boolean;\r\n\r\n/**\r\n * Type for string transformation functions\r\n */\r\ntype StringTransform = (value: string) => string;\r\n\r\n/**\r\n * Configuration for string validator\r\n */\r\ninterface StringValidatorConfig {\r\n readonly checks: ReadonlyArray<StringCheck>;\r\n readonly transforms: ReadonlyArray<StringTransform>;\r\n readonly errorMessage?: string;\r\n}\r\n\r\n/**\r\n * Immutable string validator with chainable methods\r\n */\r\nexport class VldString extends VldBase<string, string> {\r\n protected readonly config: StringValidatorConfig;\r\n \r\n /**\r\n * Protected constructor to allow extension while maintaining immutability\r\n */\r\n protected constructor(config?: Partial<StringValidatorConfig>) {\r\n super();\r\n this.config = {\r\n checks: config?.checks || [],\r\n transforms: config?.transforms || [],\r\n errorMessage: config?.errorMessage\r\n };\r\n }\r\n \r\n /**\r\n * Create a new string validator\r\n */\r\n static create(): VldString {\r\n return new VldString();\r\n }\r\n \r\n /**\r\n * Parse and validate a string value - ultra-optimized\r\n */\r\n parse(value: unknown): string {\r\n if (typeof value !== 'string') {\r\n throw new Error(this.config.errorMessage || getMessages().invalidString);\r\n }\r\n \r\n let result = value;\r\n \r\n // Apply transformations with optimized loop\r\n const transformsLength = this.config.transforms.length;\r\n for (let i = 0; i < transformsLength; i++) {\r\n result = this.config.transforms[i](result);\r\n }\r\n \r\n // Apply checks with optimized loop and early termination\r\n const checksLength = this.config.checks.length;\r\n for (let i = 0; i < checksLength; i++) {\r\n if (!this.config.checks[i](result)) {\r\n throw new Error(this.config.errorMessage || getMessages().invalidString);\r\n }\r\n }\r\n \r\n return result;\r\n }\r\n \r\n /**\r\n * Safely parse and validate a string value\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 { success: false, error: error as Error };\r\n }\r\n }\r\n \r\n /**\r\n * Create a new validator with minimum length constraint\r\n */\r\n min(length: number, message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => v.length >= length],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringMin(length)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with maximum length constraint\r\n */\r\n max(length: number, message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => v.length <= length],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringMax(length)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with exact length constraint\r\n */\r\n length(length: number, message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => v.length === length],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringLength(length)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for valid email format\r\n */\r\n email(message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => REGEX_PATTERNS.email.test(v)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringEmail\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for valid URL format\r\n */\r\n url(message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => REGEX_PATTERNS.url.test(v)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringUrl\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for valid UUID format\r\n */\r\n uuid(message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => REGEX_PATTERNS.uuid.test(v)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringUuid\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with regex pattern matching\r\n */\r\n regex(pattern: RegExp, message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => pattern.test(v)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringRegex\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that trims whitespace\r\n */\r\n trim(): VldString {\r\n return new VldString({\r\n checks: this.config.checks,\r\n transforms: [...this.config.transforms, (v: string) => v.trim()],\r\n errorMessage: this.config.errorMessage\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that converts to lowercase\r\n */\r\n toLowerCase(): VldString {\r\n return new VldString({\r\n checks: this.config.checks,\r\n transforms: [...this.config.transforms, (v: string) => v.toLowerCase()],\r\n errorMessage: this.config.errorMessage\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that converts to uppercase\r\n */\r\n toUpperCase(): VldString {\r\n return new VldString({\r\n checks: this.config.checks,\r\n transforms: [...this.config.transforms, (v: string) => v.toUpperCase()],\r\n errorMessage: this.config.errorMessage\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks if string starts with a substring\r\n */\r\n startsWith(str: string, message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => v.startsWith(str)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringStartsWith(str)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks if string ends with a substring\r\n */\r\n endsWith(str: string, message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => v.endsWith(str)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringEndsWith(str)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks if string includes a substring\r\n */\r\n includes(str: string, message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => v.includes(str)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringIncludes(str)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for valid IP address (v4 or v6)\r\n */\r\n ip(message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => {\r\n // Prevent ReDoS: Check length before regex\r\n if (v.length > 100) return false;\r\n return REGEX_PATTERNS.ipv4.test(v) || isValidIPv6(v);\r\n }],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringIp\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for valid IPv4 address\r\n */\r\n ipv4(message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => REGEX_PATTERNS.ipv4.test(v)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringIpv4\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for valid IPv6 address\r\n */\r\n ipv6(message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => {\r\n // Use safe IPv6 validation to prevent ReDoS attacks\r\n return isValidIPv6(v);\r\n }],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringIpv6\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that ensures string is not empty\r\n */\r\n nonempty(message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => v.length > 0],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringEmpty\r\n });\r\n }\r\n}"]}
|
|
1
|
+
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/validators/string.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { getMessages } from '../locales';\r\nimport { isValidIPv6 } from '../utils/ip-validation';\r\n\r\n/**\r\n * Ultra-fast email validation using simplified regex for maximum performance\r\n */\r\nconst FAST_EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n\r\n/**\r\n * Pre-compiled regex patterns for common validations\r\n * Optimized to prevent ReDoS attacks\r\n */\r\nconst REGEX_PATTERNS = {\r\n email: FAST_EMAIL_REGEX, // Use simplified fast regex\r\n uuid: /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,\r\n url: /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/, // Fixed unnecessary escapes\r\n ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,\r\n // Simplified IPv6 regex to prevent ReDoS - splits into multiple checks for performance\r\n ipv6Basic: /^[0-9a-fA-F:]+$/,\r\n};\r\n\r\n// BUG-NEW-001 FIX: IPv6 validation moved to shared utility (src/utils/ip-validation.ts)\r\n// to eliminate code duplication between string.ts and coercion/string.ts\r\n\r\n/**\r\n * Type for string validation check functions\r\n */\r\ntype StringCheck = (value: string) => boolean;\r\n\r\n/**\r\n * Type for string transformation functions\r\n */\r\ntype StringTransform = (value: string) => string;\r\n\r\n/**\r\n * Configuration for string validator\r\n */\r\ninterface StringValidatorConfig {\r\n readonly checks: ReadonlyArray<StringCheck>;\r\n readonly transforms: ReadonlyArray<StringTransform>;\r\n readonly errorMessage?: string;\r\n}\r\n\r\n/**\r\n * Immutable string validator with chainable methods\r\n */\r\nexport class VldString extends VldBase<string, string> {\r\n protected readonly config: StringValidatorConfig;\r\n \r\n /**\r\n * Protected constructor to allow extension while maintaining immutability\r\n */\r\n protected constructor(config?: Partial<StringValidatorConfig>) {\r\n super();\r\n this.config = {\r\n checks: config?.checks || [],\r\n transforms: config?.transforms || [],\r\n errorMessage: config?.errorMessage\r\n };\r\n }\r\n \r\n /**\r\n * Create a new string validator\r\n */\r\n static create(): VldString {\r\n return new VldString();\r\n }\r\n \r\n /**\r\n * Parse and validate a string value - ultra-optimized\r\n */\r\n parse(value: unknown): string {\r\n if (typeof value !== 'string') {\r\n throw new Error(this.config.errorMessage || getMessages().invalidString);\r\n }\r\n \r\n let result = value;\r\n \r\n // Apply transformations with optimized loop\r\n const transformsLength = this.config.transforms.length;\r\n for (let i = 0; i < transformsLength; i++) {\r\n result = this.config.transforms[i](result);\r\n }\r\n \r\n // Apply checks with optimized loop and early termination\r\n const checksLength = this.config.checks.length;\r\n for (let i = 0; i < checksLength; i++) {\r\n if (!this.config.checks[i](result)) {\r\n throw new Error(this.config.errorMessage || getMessages().invalidString);\r\n }\r\n }\r\n \r\n return result;\r\n }\r\n \r\n /**\r\n * Safely parse and validate a string value\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 { success: false, error: error as Error };\r\n }\r\n }\r\n \r\n /**\r\n * Create a new validator with minimum length constraint\r\n */\r\n min(length: number, message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => v.length >= length],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringMin(length)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with maximum length constraint\r\n */\r\n max(length: number, message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => v.length <= length],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringMax(length)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with exact length constraint\r\n */\r\n length(length: number, message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => v.length === length],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringLength(length)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for valid email format\r\n */\r\n email(message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => REGEX_PATTERNS.email.test(v)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringEmail\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for valid URL format\r\n */\r\n url(message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => REGEX_PATTERNS.url.test(v)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringUrl\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for valid UUID format\r\n */\r\n uuid(message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => REGEX_PATTERNS.uuid.test(v)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringUuid\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with regex pattern matching\r\n */\r\n regex(pattern: RegExp, message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => pattern.test(v)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringRegex\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that trims whitespace\r\n */\r\n trim(): VldString {\r\n return new VldString({\r\n checks: this.config.checks,\r\n transforms: [...this.config.transforms, (v: string) => v.trim()],\r\n errorMessage: this.config.errorMessage\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that converts to lowercase\r\n */\r\n toLowerCase(): VldString {\r\n return new VldString({\r\n checks: this.config.checks,\r\n transforms: [...this.config.transforms, (v: string) => v.toLowerCase()],\r\n errorMessage: this.config.errorMessage\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that converts to uppercase\r\n */\r\n toUpperCase(): VldString {\r\n return new VldString({\r\n checks: this.config.checks,\r\n transforms: [...this.config.transforms, (v: string) => v.toUpperCase()],\r\n errorMessage: this.config.errorMessage\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks if string starts with a substring\r\n */\r\n startsWith(str: string, message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => v.startsWith(str)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringStartsWith(str)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks if string ends with a substring\r\n */\r\n endsWith(str: string, message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => v.endsWith(str)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringEndsWith(str)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks if string includes a substring\r\n */\r\n includes(str: string, message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => v.includes(str)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringIncludes(str)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for valid IP address (v4 or v6)\r\n */\r\n ip(message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => {\r\n // Prevent ReDoS: Check length before regex\r\n if (v.length > 100) return false;\r\n return REGEX_PATTERNS.ipv4.test(v) || isValidIPv6(v);\r\n }],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringIp\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for valid IPv4 address\r\n */\r\n ipv4(message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => REGEX_PATTERNS.ipv4.test(v)],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringIpv4\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that checks for valid IPv6 address\r\n */\r\n ipv6(message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => {\r\n // Use safe IPv6 validation to prevent ReDoS attacks\r\n return isValidIPv6(v);\r\n }],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringIpv6\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that ensures string is not empty\r\n */\r\n nonempty(message?: string): VldString {\r\n return new VldString({\r\n checks: [...this.config.checks, (v: string) => v.length > 0],\r\n transforms: this.config.transforms,\r\n errorMessage: message || getMessages().stringEmpty\r\n });\r\n }\r\n}"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { VldBase, ParseResult } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* Template literal component types
|
|
4
|
+
*/
|
|
5
|
+
type TLComponent = VldBase<any, any> | string;
|
|
6
|
+
/**
|
|
7
|
+
* Immutable template literal validator
|
|
8
|
+
* Validates strings matching a template pattern
|
|
9
|
+
*/
|
|
10
|
+
export declare class VldTemplateLiteral extends VldBase<unknown, string> {
|
|
11
|
+
private readonly pattern;
|
|
12
|
+
private constructor();
|
|
13
|
+
/**
|
|
14
|
+
* Create a template literal validator from components
|
|
15
|
+
*/
|
|
16
|
+
static create(...components: TLComponent[]): VldTemplateLiteral;
|
|
17
|
+
/**
|
|
18
|
+
* Parse and validate a template literal string
|
|
19
|
+
*/
|
|
20
|
+
parse(value: unknown): string;
|
|
21
|
+
/**
|
|
22
|
+
* Safely parse and validate a template literal string
|
|
23
|
+
*/
|
|
24
|
+
safeParse(value: unknown): ParseResult<string>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Helper function to create template literal validators
|
|
28
|
+
* Usage: v.templateLiteral(v.string(), '-', v.number())
|
|
29
|
+
*/
|
|
30
|
+
export declare function templateLiteral(...components: TLComponent[]): VldTemplateLiteral;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=template-literal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-literal.d.ts","sourceRoot":"","sources":["../../src/validators/template-literal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,KAAK,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC;AAE9C;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC;IAE5D,OAAO,CAAC,QAAQ,CAAC,OAAO;IAD1B,OAAO;IAMP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,GAAG,UAAU,EAAE,WAAW,EAAE,GAAG,kBAAkB;IAmB/D;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAY7B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;CAU/C;AA0CD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,UAAU,EAAE,WAAW,EAAE,GAAG,kBAAkB,CAEhF"}
|