@oxog/vld 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +97 -103
- package/README.md +78 -13
- package/dist/coercion/bigint.d.ts +27 -0
- package/dist/coercion/bigint.d.ts.map +1 -0
- package/dist/coercion/bigint.js +108 -0
- package/dist/coercion/bigint.js.map +1 -0
- package/dist/coercion/boolean.d.ts +20 -0
- package/dist/coercion/boolean.d.ts.map +1 -0
- package/dist/coercion/boolean.js +63 -0
- package/dist/coercion/boolean.js.map +1 -0
- package/dist/coercion/date.d.ts +20 -0
- package/dist/coercion/date.d.ts.map +1 -0
- package/dist/coercion/date.js +52 -0
- package/dist/coercion/date.js.map +1 -0
- package/dist/coercion/number.d.ts +35 -0
- package/dist/coercion/number.d.ts.map +1 -0
- package/dist/coercion/number.js +144 -0
- package/dist/coercion/number.js.map +1 -0
- package/dist/coercion/string.d.ts +38 -0
- package/dist/coercion/string.d.ts.map +1 -0
- package/dist/coercion/string.js +168 -0
- package/dist/coercion/string.js.map +1 -0
- package/dist/index-new.d.ts.map +1 -0
- package/dist/index.d.ts +64 -257
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -1164
- package/dist/index.js.map +1 -1
- package/dist/utils/deep-merge.d.ts +18 -0
- package/dist/utils/deep-merge.d.ts.map +1 -0
- package/dist/utils/deep-merge.js +68 -0
- package/dist/utils/deep-merge.js.map +1 -0
- package/dist/validators/any.d.ts +19 -0
- package/dist/validators/any.d.ts.map +1 -0
- package/dist/validators/any.js +25 -0
- package/dist/validators/any.js.map +1 -0
- package/dist/validators/array.d.ts +48 -0
- package/dist/validators/array.d.ts.map +1 -0
- package/dist/validators/array.js +135 -0
- package/dist/validators/array.js.map +1 -0
- package/dist/validators/base.d.ts +155 -0
- package/dist/validators/base.d.ts.map +1 -0
- package/dist/validators/base.js +245 -0
- package/dist/validators/base.js.map +1 -0
- package/dist/validators/bigint.d.ts +60 -0
- package/dist/validators/bigint.d.ts.map +1 -0
- package/dist/validators/bigint.js +104 -0
- package/dist/validators/bigint.js.map +1 -0
- package/dist/validators/boolean.d.ts +32 -0
- package/dist/validators/boolean.d.ts.map +1 -0
- package/dist/validators/boolean.js +86 -0
- package/dist/validators/boolean.js.map +1 -0
- package/dist/validators/date.d.ts +68 -0
- package/dist/validators/date.d.ts.map +1 -0
- package/dist/validators/date.js +148 -0
- package/dist/validators/date.js.map +1 -0
- package/dist/validators/enum.d.ts +25 -0
- package/dist/validators/enum.d.ts.map +1 -0
- package/dist/validators/enum.js +45 -0
- package/dist/validators/enum.js.map +1 -0
- package/dist/validators/index.d.ts +27 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +30 -0
- package/dist/validators/index.js.map +1 -0
- package/dist/validators/intersection.d.ts +25 -0
- package/dist/validators/intersection.d.ts.map +1 -0
- package/dist/validators/intersection.js +57 -0
- package/dist/validators/intersection.js.map +1 -0
- package/dist/validators/literal.d.ts +25 -0
- package/dist/validators/literal.d.ts.map +1 -0
- package/dist/validators/literal.js +45 -0
- package/dist/validators/literal.js.map +1 -0
- package/dist/validators/map.d.ts +26 -0
- package/dist/validators/map.d.ts.map +1 -0
- package/dist/validators/map.js +54 -0
- package/dist/validators/map.js.map +1 -0
- package/dist/validators/never.d.ts +19 -0
- package/dist/validators/never.d.ts.map +1 -0
- package/dist/validators/never.js +29 -0
- package/dist/validators/never.js.map +1 -0
- package/dist/validators/number.d.ts +92 -0
- package/dist/validators/number.d.ts.map +1 -0
- package/dist/validators/number.js +173 -0
- package/dist/validators/number.js.map +1 -0
- package/dist/validators/object-optimized.d.ts +23 -0
- package/dist/validators/object-optimized.d.ts.map +1 -0
- package/dist/validators/object-optimized.js +179 -0
- package/dist/validators/object-optimized.js.map +1 -0
- package/dist/validators/object-ultra.d.ts +34 -0
- package/dist/validators/object-ultra.d.ts.map +1 -0
- package/dist/validators/object-ultra.js +175 -0
- package/dist/validators/object-ultra.js.map +1 -0
- package/dist/validators/object.d.ts +73 -0
- package/dist/validators/object.d.ts.map +1 -0
- package/dist/validators/object.js +285 -0
- package/dist/validators/object.js.map +1 -0
- package/dist/validators/record.d.ts +25 -0
- package/dist/validators/record.d.ts.map +1 -0
- package/dist/validators/record.js +52 -0
- package/dist/validators/record.js.map +1 -0
- package/dist/validators/set.d.ts +25 -0
- package/dist/validators/set.d.ts.map +1 -0
- package/dist/validators/set.js +51 -0
- package/dist/validators/set.js.map +1 -0
- package/dist/validators/string-ultra.d.ts +49 -0
- package/dist/validators/string-ultra.d.ts.map +1 -0
- package/dist/validators/string-ultra.js +217 -0
- package/dist/validators/string-ultra.js.map +1 -0
- package/dist/validators/string.d.ts +109 -0
- package/dist/validators/string.d.ts.map +1 -0
- package/dist/validators/string.js +242 -0
- package/dist/validators/string.js.map +1 -0
- package/dist/validators/symbol.d.ts +24 -0
- package/dist/validators/symbol.d.ts.map +1 -0
- package/dist/validators/symbol.js +42 -0
- package/dist/validators/symbol.js.map +1 -0
- package/dist/validators/tuple.d.ts +31 -0
- package/dist/validators/tuple.d.ts.map +1 -0
- package/dist/validators/tuple.js +55 -0
- package/dist/validators/tuple.js.map +1 -0
- package/dist/validators/union-optimized.d.ts +15 -0
- package/dist/validators/union-optimized.d.ts.map +1 -0
- package/dist/validators/union-optimized.js +92 -0
- package/dist/validators/union-optimized.js.map +1 -0
- package/dist/validators/union.d.ts +33 -0
- package/dist/validators/union.d.ts.map +1 -0
- package/dist/validators/union.js +121 -0
- package/dist/validators/union.js.map +1 -0
- package/dist/validators/unknown.d.ts +19 -0
- package/dist/validators/unknown.d.ts.map +1 -0
- package/dist/validators/unknown.js +25 -0
- package/dist/validators/unknown.js.map +1 -0
- package/dist/validators/void.d.ts +19 -0
- package/dist/validators/void.d.ts.map +1 -0
- package/dist/validators/void.js +35 -0
- package/dist/validators/void.js.map +1 -0
- package/package.json +12 -6
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { VldBase } from './base.js';
|
|
2
|
+
import { getMessages } from '../locales.js';
|
|
3
|
+
/**
|
|
4
|
+
* Ultra-optimized string validator with pre-compiled validations
|
|
5
|
+
*/
|
|
6
|
+
export class VldStringUltra extends VldBase {
|
|
7
|
+
constructor(config = {}) {
|
|
8
|
+
super();
|
|
9
|
+
this.customValidations = [];
|
|
10
|
+
this.minLength = config.minLength;
|
|
11
|
+
this.maxLength = config.maxLength;
|
|
12
|
+
this.exactLength = config.exactLength;
|
|
13
|
+
this.pattern = config.pattern;
|
|
14
|
+
this.isEmail = config.isEmail;
|
|
15
|
+
this.isUrl = config.isUrl;
|
|
16
|
+
this.transform = config.transform;
|
|
17
|
+
}
|
|
18
|
+
static create() {
|
|
19
|
+
return new VldStringUltra();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Ultra-fast string validation with minimal overhead
|
|
23
|
+
*/
|
|
24
|
+
parse(value) {
|
|
25
|
+
// Ultra-fast type check
|
|
26
|
+
if (typeof value !== 'string') {
|
|
27
|
+
throw new Error(getMessages().invalidString);
|
|
28
|
+
}
|
|
29
|
+
let str = value;
|
|
30
|
+
// Apply transform first if present
|
|
31
|
+
if (this.transform) {
|
|
32
|
+
str = this.transform(str);
|
|
33
|
+
}
|
|
34
|
+
const len = str.length;
|
|
35
|
+
// Fast length checks with bitwise operations for small numbers
|
|
36
|
+
if (this.exactLength !== undefined && len !== this.exactLength) {
|
|
37
|
+
throw new Error(getMessages().stringLength(this.exactLength));
|
|
38
|
+
}
|
|
39
|
+
if (this.minLength !== undefined && len < this.minLength) {
|
|
40
|
+
throw new Error(getMessages().stringMinLength(this.minLength));
|
|
41
|
+
}
|
|
42
|
+
if (this.maxLength !== undefined && len > this.maxLength) {
|
|
43
|
+
throw new Error(getMessages().stringMaxLength(this.maxLength));
|
|
44
|
+
}
|
|
45
|
+
// Ultra-fast email validation (simplified for speed)
|
|
46
|
+
if (this.isEmail && !VldStringUltra.EMAIL_REGEX.test(str)) {
|
|
47
|
+
throw new Error(getMessages().invalidEmail);
|
|
48
|
+
}
|
|
49
|
+
// Ultra-fast URL validation
|
|
50
|
+
if (this.isUrl && !VldStringUltra.URL_REGEX.test(str)) {
|
|
51
|
+
throw new Error(getMessages().invalidUrl);
|
|
52
|
+
}
|
|
53
|
+
// Pattern matching
|
|
54
|
+
if (this.pattern && !this.pattern.test(str)) {
|
|
55
|
+
throw new Error(getMessages().stringPattern);
|
|
56
|
+
}
|
|
57
|
+
// Custom validations (loop unrolling for small arrays)
|
|
58
|
+
const validationsLength = this.customValidations.length;
|
|
59
|
+
if (validationsLength > 0) {
|
|
60
|
+
for (let i = 0; i < validationsLength; i++) {
|
|
61
|
+
if (!this.customValidations[i](str)) {
|
|
62
|
+
throw new Error(getMessages().customValidation);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return str;
|
|
67
|
+
}
|
|
68
|
+
safeParse(value) {
|
|
69
|
+
try {
|
|
70
|
+
return { success: true, data: this.parse(value) };
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
return { success: false, error: error };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Chainable methods with ultra-fast creation
|
|
77
|
+
min(length) {
|
|
78
|
+
return new VldStringUltra({
|
|
79
|
+
minLength: length,
|
|
80
|
+
maxLength: this.maxLength,
|
|
81
|
+
exactLength: this.exactLength,
|
|
82
|
+
pattern: this.pattern,
|
|
83
|
+
isEmail: this.isEmail,
|
|
84
|
+
isUrl: this.isUrl,
|
|
85
|
+
transform: this.transform
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
max(length) {
|
|
89
|
+
return new VldStringUltra({
|
|
90
|
+
minLength: this.minLength,
|
|
91
|
+
maxLength: length,
|
|
92
|
+
exactLength: this.exactLength,
|
|
93
|
+
pattern: this.pattern,
|
|
94
|
+
isEmail: this.isEmail,
|
|
95
|
+
isUrl: this.isUrl,
|
|
96
|
+
transform: this.transform
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
length(length) {
|
|
100
|
+
return new VldStringUltra({
|
|
101
|
+
minLength: this.minLength,
|
|
102
|
+
maxLength: this.maxLength,
|
|
103
|
+
exactLength: length,
|
|
104
|
+
pattern: this.pattern,
|
|
105
|
+
isEmail: this.isEmail,
|
|
106
|
+
isUrl: this.isUrl,
|
|
107
|
+
transform: this.transform
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Ultra-fast email validation using simplified regex
|
|
112
|
+
*/
|
|
113
|
+
email() {
|
|
114
|
+
return new VldStringUltra({
|
|
115
|
+
minLength: this.minLength,
|
|
116
|
+
maxLength: this.maxLength,
|
|
117
|
+
exactLength: this.exactLength,
|
|
118
|
+
pattern: this.pattern,
|
|
119
|
+
isEmail: true,
|
|
120
|
+
isUrl: this.isUrl,
|
|
121
|
+
transform: this.transform
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Ultra-fast URL validation
|
|
126
|
+
*/
|
|
127
|
+
url() {
|
|
128
|
+
return new VldStringUltra({
|
|
129
|
+
minLength: this.minLength,
|
|
130
|
+
maxLength: this.maxLength,
|
|
131
|
+
exactLength: this.exactLength,
|
|
132
|
+
pattern: this.pattern,
|
|
133
|
+
isEmail: this.isEmail,
|
|
134
|
+
isUrl: true,
|
|
135
|
+
transform: this.transform
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Pattern matching with custom regex
|
|
140
|
+
*/
|
|
141
|
+
regex(pattern) {
|
|
142
|
+
return new VldStringUltra({
|
|
143
|
+
minLength: this.minLength,
|
|
144
|
+
maxLength: this.maxLength,
|
|
145
|
+
exactLength: this.exactLength,
|
|
146
|
+
pattern: pattern,
|
|
147
|
+
isEmail: this.isEmail,
|
|
148
|
+
isUrl: this.isUrl,
|
|
149
|
+
transform: this.transform
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Transform string after validation
|
|
154
|
+
*/
|
|
155
|
+
trim() {
|
|
156
|
+
const currentTransform = this.transform;
|
|
157
|
+
return new VldStringUltra({
|
|
158
|
+
minLength: this.minLength,
|
|
159
|
+
maxLength: this.maxLength,
|
|
160
|
+
exactLength: this.exactLength,
|
|
161
|
+
pattern: this.pattern,
|
|
162
|
+
isEmail: this.isEmail,
|
|
163
|
+
isUrl: this.isUrl,
|
|
164
|
+
transform: currentTransform ?
|
|
165
|
+
(str) => currentTransform(str).trim() :
|
|
166
|
+
(str) => str.trim()
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
toLowerCase() {
|
|
170
|
+
const currentTransform = this.transform;
|
|
171
|
+
return new VldStringUltra({
|
|
172
|
+
minLength: this.minLength,
|
|
173
|
+
maxLength: this.maxLength,
|
|
174
|
+
exactLength: this.exactLength,
|
|
175
|
+
pattern: this.pattern,
|
|
176
|
+
isEmail: this.isEmail,
|
|
177
|
+
isUrl: this.isUrl,
|
|
178
|
+
transform: currentTransform ?
|
|
179
|
+
(str) => currentTransform(str).toLowerCase() :
|
|
180
|
+
(str) => str.toLowerCase()
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
toUpperCase() {
|
|
184
|
+
const currentTransform = this.transform;
|
|
185
|
+
return new VldStringUltra({
|
|
186
|
+
minLength: this.minLength,
|
|
187
|
+
maxLength: this.maxLength,
|
|
188
|
+
exactLength: this.exactLength,
|
|
189
|
+
pattern: this.pattern,
|
|
190
|
+
isEmail: this.isEmail,
|
|
191
|
+
isUrl: this.isUrl,
|
|
192
|
+
transform: currentTransform ?
|
|
193
|
+
(str) => currentTransform(str).toUpperCase() :
|
|
194
|
+
(str) => str.toUpperCase()
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
nonempty() {
|
|
198
|
+
return this.min(1);
|
|
199
|
+
}
|
|
200
|
+
startsWith(prefix) {
|
|
201
|
+
this.customValidations.push((str) => str.startsWith(prefix));
|
|
202
|
+
return this;
|
|
203
|
+
}
|
|
204
|
+
endsWith(suffix) {
|
|
205
|
+
this.customValidations.push((str) => str.endsWith(suffix));
|
|
206
|
+
return this;
|
|
207
|
+
}
|
|
208
|
+
includes(substring) {
|
|
209
|
+
this.customValidations.push((str) => str.includes(substring));
|
|
210
|
+
return this;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Pre-compiled ultra-fast email regex (simplified but fast)
|
|
214
|
+
VldStringUltra.EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
215
|
+
// Pre-compiled URL regex
|
|
216
|
+
VldStringUltra.URL_REGEX = /^https?:\/\/[^\s]+$/;
|
|
217
|
+
//# sourceMappingURL=string-ultra.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-ultra.js","sourceRoot":"","sources":["../../src/validators/string-ultra.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Ultra-optimized string validator with pre-compiled validations\n */\nexport class VldStringUltra extends VldBase<unknown, string> {\n private readonly minLength?: number;\n private readonly maxLength?: number;\n private readonly exactLength?: number;\n private readonly pattern?: RegExp;\n private readonly isEmail?: boolean;\n private readonly isUrl?: boolean;\n private readonly transform?: (value: string) => string;\n private readonly customValidations: Array<(value: string) => boolean> = [];\n \n // Pre-compiled ultra-fast email regex (simplified but fast)\n private static readonly EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n \n // Pre-compiled URL regex\n private static readonly URL_REGEX = /^https?:\\/\\/[^\\s]+$/;\n \n private constructor(config: {\n minLength?: number;\n maxLength?: number;\n exactLength?: number;\n pattern?: RegExp;\n isEmail?: boolean;\n isUrl?: boolean;\n transform?: (value: string) => string;\n } = {}) {\n super();\n this.minLength = config.minLength;\n this.maxLength = config.maxLength;\n this.exactLength = config.exactLength;\n this.pattern = config.pattern;\n this.isEmail = config.isEmail;\n this.isUrl = config.isUrl;\n this.transform = config.transform;\n }\n \n static create(): VldStringUltra {\n return new VldStringUltra();\n }\n \n /**\n * Ultra-fast string validation with minimal overhead\n */\n parse(value: unknown): string {\n // Ultra-fast type check\n if (typeof value !== 'string') {\n throw new Error(getMessages().invalidString);\n }\n \n let str = value;\n \n // Apply transform first if present\n if (this.transform) {\n str = this.transform(str);\n }\n \n const len = str.length;\n \n // Fast length checks with bitwise operations for small numbers\n if (this.exactLength !== undefined && len !== this.exactLength) {\n throw new Error(getMessages().stringLength(this.exactLength));\n }\n \n if (this.minLength !== undefined && len < this.minLength) {\n throw new Error(getMessages().stringMinLength(this.minLength));\n }\n \n if (this.maxLength !== undefined && len > this.maxLength) {\n throw new Error(getMessages().stringMaxLength(this.maxLength));\n }\n \n // Ultra-fast email validation (simplified for speed)\n if (this.isEmail && !VldStringUltra.EMAIL_REGEX.test(str)) {\n throw new Error(getMessages().invalidEmail);\n }\n \n // Ultra-fast URL validation\n if (this.isUrl && !VldStringUltra.URL_REGEX.test(str)) {\n throw new Error(getMessages().invalidUrl);\n }\n \n // Pattern matching\n if (this.pattern && !this.pattern.test(str)) {\n throw new Error(getMessages().stringPattern);\n }\n \n // Custom validations (loop unrolling for small arrays)\n const validationsLength = this.customValidations.length;\n if (validationsLength > 0) {\n for (let i = 0; i < validationsLength; i++) {\n if (!this.customValidations[i](str)) {\n throw new Error(getMessages().customValidation);\n }\n }\n }\n \n return str;\n }\n \n safeParse(value: unknown): ParseResult<string> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n \n // Chainable methods with ultra-fast creation\n min(length: number): VldStringUltra {\n return new VldStringUltra({\n minLength: length,\n maxLength: this.maxLength,\n exactLength: this.exactLength,\n pattern: this.pattern,\n isEmail: this.isEmail,\n isUrl: this.isUrl,\n transform: this.transform\n });\n }\n \n max(length: number): VldStringUltra {\n return new VldStringUltra({\n minLength: this.minLength,\n maxLength: length,\n exactLength: this.exactLength,\n pattern: this.pattern,\n isEmail: this.isEmail,\n isUrl: this.isUrl,\n transform: this.transform\n });\n }\n \n length(length: number): VldStringUltra {\n return new VldStringUltra({\n minLength: this.minLength,\n maxLength: this.maxLength,\n exactLength: length,\n pattern: this.pattern,\n isEmail: this.isEmail,\n isUrl: this.isUrl,\n transform: this.transform\n });\n }\n \n /**\n * Ultra-fast email validation using simplified regex\n */\n email(): VldStringUltra {\n return new VldStringUltra({\n minLength: this.minLength,\n maxLength: this.maxLength,\n exactLength: this.exactLength,\n pattern: this.pattern,\n isEmail: true,\n isUrl: this.isUrl,\n transform: this.transform\n });\n }\n \n /**\n * Ultra-fast URL validation\n */\n url(): VldStringUltra {\n return new VldStringUltra({\n minLength: this.minLength,\n maxLength: this.maxLength,\n exactLength: this.exactLength,\n pattern: this.pattern,\n isEmail: this.isEmail,\n isUrl: true,\n transform: this.transform\n });\n }\n \n /**\n * Pattern matching with custom regex\n */\n regex(pattern: RegExp): VldStringUltra {\n return new VldStringUltra({\n minLength: this.minLength,\n maxLength: this.maxLength,\n exactLength: this.exactLength,\n pattern: pattern,\n isEmail: this.isEmail,\n isUrl: this.isUrl,\n transform: this.transform\n });\n }\n \n /**\n * Transform string after validation\n */\n trim(): VldStringUltra {\n const currentTransform = this.transform;\n return new VldStringUltra({\n minLength: this.minLength,\n maxLength: this.maxLength,\n exactLength: this.exactLength,\n pattern: this.pattern,\n isEmail: this.isEmail,\n isUrl: this.isUrl,\n transform: currentTransform ? \n (str: string) => currentTransform(str).trim() : \n (str: string) => str.trim()\n });\n }\n \n toLowerCase(): VldStringUltra {\n const currentTransform = this.transform;\n return new VldStringUltra({\n minLength: this.minLength,\n maxLength: this.maxLength,\n exactLength: this.exactLength,\n pattern: this.pattern,\n isEmail: this.isEmail,\n isUrl: this.isUrl,\n transform: currentTransform ? \n (str: string) => currentTransform(str).toLowerCase() : \n (str: string) => str.toLowerCase()\n });\n }\n \n toUpperCase(): VldStringUltra {\n const currentTransform = this.transform;\n return new VldStringUltra({\n minLength: this.minLength,\n maxLength: this.maxLength,\n exactLength: this.exactLength,\n pattern: this.pattern,\n isEmail: this.isEmail,\n isUrl: this.isUrl,\n transform: currentTransform ? \n (str: string) => currentTransform(str).toUpperCase() : \n (str: string) => str.toUpperCase()\n });\n }\n \n nonempty(): VldStringUltra {\n return this.min(1);\n }\n \n startsWith(prefix: string): VldStringUltra {\n this.customValidations.push((str: string) => str.startsWith(prefix));\n return this;\n }\n \n endsWith(suffix: string): VldStringUltra {\n this.customValidations.push((str: string) => str.endsWith(suffix));\n return this;\n }\n \n includes(substring: string): VldStringUltra {\n this.customValidations.push((str: string) => str.includes(substring));\n return this;\n }\n}"]}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { VldBase, ParseResult } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* Type for string validation check functions
|
|
4
|
+
*/
|
|
5
|
+
type StringCheck = (value: string) => boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Type for string transformation functions
|
|
8
|
+
*/
|
|
9
|
+
type StringTransform = (value: string) => string;
|
|
10
|
+
/**
|
|
11
|
+
* Configuration for string validator
|
|
12
|
+
*/
|
|
13
|
+
interface StringValidatorConfig {
|
|
14
|
+
readonly checks: ReadonlyArray<StringCheck>;
|
|
15
|
+
readonly transforms: ReadonlyArray<StringTransform>;
|
|
16
|
+
readonly errorMessage?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Immutable string validator with chainable methods
|
|
20
|
+
*/
|
|
21
|
+
export declare class VldString extends VldBase<string, string> {
|
|
22
|
+
protected readonly config: StringValidatorConfig;
|
|
23
|
+
/**
|
|
24
|
+
* Protected constructor to allow extension while maintaining immutability
|
|
25
|
+
*/
|
|
26
|
+
protected constructor(config?: Partial<StringValidatorConfig>);
|
|
27
|
+
/**
|
|
28
|
+
* Create a new string validator
|
|
29
|
+
*/
|
|
30
|
+
static create(): VldString;
|
|
31
|
+
/**
|
|
32
|
+
* Parse and validate a string value - ultra-optimized
|
|
33
|
+
*/
|
|
34
|
+
parse(value: unknown): string;
|
|
35
|
+
/**
|
|
36
|
+
* Safely parse and validate a string value
|
|
37
|
+
*/
|
|
38
|
+
safeParse(value: unknown): ParseResult<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Create a new validator with minimum length constraint
|
|
41
|
+
*/
|
|
42
|
+
min(length: number, message?: string): VldString;
|
|
43
|
+
/**
|
|
44
|
+
* Create a new validator with maximum length constraint
|
|
45
|
+
*/
|
|
46
|
+
max(length: number, message?: string): VldString;
|
|
47
|
+
/**
|
|
48
|
+
* Create a new validator with exact length constraint
|
|
49
|
+
*/
|
|
50
|
+
length(length: number, message?: string): VldString;
|
|
51
|
+
/**
|
|
52
|
+
* Create a new validator that checks for valid email format
|
|
53
|
+
*/
|
|
54
|
+
email(message?: string): VldString;
|
|
55
|
+
/**
|
|
56
|
+
* Create a new validator that checks for valid URL format
|
|
57
|
+
*/
|
|
58
|
+
url(message?: string): VldString;
|
|
59
|
+
/**
|
|
60
|
+
* Create a new validator that checks for valid UUID format
|
|
61
|
+
*/
|
|
62
|
+
uuid(message?: string): VldString;
|
|
63
|
+
/**
|
|
64
|
+
* Create a new validator with regex pattern matching
|
|
65
|
+
*/
|
|
66
|
+
regex(pattern: RegExp, message?: string): VldString;
|
|
67
|
+
/**
|
|
68
|
+
* Create a new validator that trims whitespace
|
|
69
|
+
*/
|
|
70
|
+
trim(): VldString;
|
|
71
|
+
/**
|
|
72
|
+
* Create a new validator that converts to lowercase
|
|
73
|
+
*/
|
|
74
|
+
toLowerCase(): VldString;
|
|
75
|
+
/**
|
|
76
|
+
* Create a new validator that converts to uppercase
|
|
77
|
+
*/
|
|
78
|
+
toUpperCase(): VldString;
|
|
79
|
+
/**
|
|
80
|
+
* Create a new validator that checks if string starts with a substring
|
|
81
|
+
*/
|
|
82
|
+
startsWith(str: string, message?: string): VldString;
|
|
83
|
+
/**
|
|
84
|
+
* Create a new validator that checks if string ends with a substring
|
|
85
|
+
*/
|
|
86
|
+
endsWith(str: string, message?: string): VldString;
|
|
87
|
+
/**
|
|
88
|
+
* Create a new validator that checks if string includes a substring
|
|
89
|
+
*/
|
|
90
|
+
includes(str: string, message?: string): VldString;
|
|
91
|
+
/**
|
|
92
|
+
* Create a new validator that checks for valid IP address (v4 or v6)
|
|
93
|
+
*/
|
|
94
|
+
ip(message?: string): VldString;
|
|
95
|
+
/**
|
|
96
|
+
* Create a new validator that checks for valid IPv4 address
|
|
97
|
+
*/
|
|
98
|
+
ipv4(message?: string): VldString;
|
|
99
|
+
/**
|
|
100
|
+
* Create a new validator that checks for valid IPv6 address
|
|
101
|
+
*/
|
|
102
|
+
ipv6(message?: string): VldString;
|
|
103
|
+
/**
|
|
104
|
+
* Create a new validator that ensures string is not empty
|
|
105
|
+
*/
|
|
106
|
+
nonempty(message?: string): VldString;
|
|
107
|
+
}
|
|
108
|
+
export {};
|
|
109
|
+
//# sourceMappingURL=string.d.ts.map
|
|
@@ -0,0 +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;AAmB9C;;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;IAQ/B;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAQjC;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAQjC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;CAOtC"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { VldBase } from './base.js';
|
|
2
|
+
import { getMessages } from '../locales.js';
|
|
3
|
+
/**
|
|
4
|
+
* Ultra-fast email validation using simplified regex for maximum performance
|
|
5
|
+
*/
|
|
6
|
+
const FAST_EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
7
|
+
/**
|
|
8
|
+
* Pre-compiled regex patterns for common validations
|
|
9
|
+
*/
|
|
10
|
+
const REGEX_PATTERNS = {
|
|
11
|
+
email: FAST_EMAIL_REGEX, // Use simplified fast regex
|
|
12
|
+
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,
|
|
13
|
+
url: /^https?:\/\/[^\s]+$/, // Simplified for speed
|
|
14
|
+
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]?)$/,
|
|
15
|
+
ipv6: /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Immutable string validator with chainable methods
|
|
19
|
+
*/
|
|
20
|
+
export class VldString extends VldBase {
|
|
21
|
+
/**
|
|
22
|
+
* Protected constructor to allow extension while maintaining immutability
|
|
23
|
+
*/
|
|
24
|
+
constructor(config) {
|
|
25
|
+
super();
|
|
26
|
+
this.config = {
|
|
27
|
+
checks: config?.checks || [],
|
|
28
|
+
transforms: config?.transforms || [],
|
|
29
|
+
errorMessage: config?.errorMessage
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a new string validator
|
|
34
|
+
*/
|
|
35
|
+
static create() {
|
|
36
|
+
return new VldString();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Parse and validate a string value - ultra-optimized
|
|
40
|
+
*/
|
|
41
|
+
parse(value) {
|
|
42
|
+
if (typeof value !== 'string') {
|
|
43
|
+
throw new Error(this.config.errorMessage || getMessages().invalidString);
|
|
44
|
+
}
|
|
45
|
+
let result = value;
|
|
46
|
+
// Apply transformations with optimized loop
|
|
47
|
+
const transformsLength = this.config.transforms.length;
|
|
48
|
+
for (let i = 0; i < transformsLength; i++) {
|
|
49
|
+
result = this.config.transforms[i](result);
|
|
50
|
+
}
|
|
51
|
+
// Apply checks with optimized loop and early termination
|
|
52
|
+
const checksLength = this.config.checks.length;
|
|
53
|
+
for (let i = 0; i < checksLength; i++) {
|
|
54
|
+
if (!this.config.checks[i](result)) {
|
|
55
|
+
throw new Error(this.config.errorMessage || getMessages().invalidString);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Safely parse and validate a string value
|
|
62
|
+
*/
|
|
63
|
+
safeParse(value) {
|
|
64
|
+
try {
|
|
65
|
+
return { success: true, data: this.parse(value) };
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return { success: false, error: error };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Create a new validator with minimum length constraint
|
|
73
|
+
*/
|
|
74
|
+
min(length, message) {
|
|
75
|
+
return new VldString({
|
|
76
|
+
checks: [...this.config.checks, (v) => v.length >= length],
|
|
77
|
+
transforms: this.config.transforms,
|
|
78
|
+
errorMessage: message || getMessages().stringMin(length)
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Create a new validator with maximum length constraint
|
|
83
|
+
*/
|
|
84
|
+
max(length, message) {
|
|
85
|
+
return new VldString({
|
|
86
|
+
checks: [...this.config.checks, (v) => v.length <= length],
|
|
87
|
+
transforms: this.config.transforms,
|
|
88
|
+
errorMessage: message || getMessages().stringMax(length)
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create a new validator with exact length constraint
|
|
93
|
+
*/
|
|
94
|
+
length(length, message) {
|
|
95
|
+
return new VldString({
|
|
96
|
+
checks: [...this.config.checks, (v) => v.length === length],
|
|
97
|
+
transforms: this.config.transforms,
|
|
98
|
+
errorMessage: message || getMessages().stringLength(length)
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Create a new validator that checks for valid email format
|
|
103
|
+
*/
|
|
104
|
+
email(message) {
|
|
105
|
+
return new VldString({
|
|
106
|
+
checks: [...this.config.checks, (v) => REGEX_PATTERNS.email.test(v)],
|
|
107
|
+
transforms: this.config.transforms,
|
|
108
|
+
errorMessage: message || getMessages().stringEmail
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Create a new validator that checks for valid URL format
|
|
113
|
+
*/
|
|
114
|
+
url(message) {
|
|
115
|
+
return new VldString({
|
|
116
|
+
checks: [...this.config.checks, (v) => REGEX_PATTERNS.url.test(v)],
|
|
117
|
+
transforms: this.config.transforms,
|
|
118
|
+
errorMessage: message || getMessages().stringUrl
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Create a new validator that checks for valid UUID format
|
|
123
|
+
*/
|
|
124
|
+
uuid(message) {
|
|
125
|
+
return new VldString({
|
|
126
|
+
checks: [...this.config.checks, (v) => REGEX_PATTERNS.uuid.test(v)],
|
|
127
|
+
transforms: this.config.transforms,
|
|
128
|
+
errorMessage: message || getMessages().stringUuid
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Create a new validator with regex pattern matching
|
|
133
|
+
*/
|
|
134
|
+
regex(pattern, message) {
|
|
135
|
+
return new VldString({
|
|
136
|
+
checks: [...this.config.checks, (v) => pattern.test(v)],
|
|
137
|
+
transforms: this.config.transforms,
|
|
138
|
+
errorMessage: message || getMessages().stringRegex
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Create a new validator that trims whitespace
|
|
143
|
+
*/
|
|
144
|
+
trim() {
|
|
145
|
+
return new VldString({
|
|
146
|
+
checks: this.config.checks,
|
|
147
|
+
transforms: [...this.config.transforms, (v) => v.trim()],
|
|
148
|
+
errorMessage: this.config.errorMessage
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Create a new validator that converts to lowercase
|
|
153
|
+
*/
|
|
154
|
+
toLowerCase() {
|
|
155
|
+
return new VldString({
|
|
156
|
+
checks: this.config.checks,
|
|
157
|
+
transforms: [...this.config.transforms, (v) => v.toLowerCase()],
|
|
158
|
+
errorMessage: this.config.errorMessage
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Create a new validator that converts to uppercase
|
|
163
|
+
*/
|
|
164
|
+
toUpperCase() {
|
|
165
|
+
return new VldString({
|
|
166
|
+
checks: this.config.checks,
|
|
167
|
+
transforms: [...this.config.transforms, (v) => v.toUpperCase()],
|
|
168
|
+
errorMessage: this.config.errorMessage
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Create a new validator that checks if string starts with a substring
|
|
173
|
+
*/
|
|
174
|
+
startsWith(str, message) {
|
|
175
|
+
return new VldString({
|
|
176
|
+
checks: [...this.config.checks, (v) => v.startsWith(str)],
|
|
177
|
+
transforms: this.config.transforms,
|
|
178
|
+
errorMessage: message || getMessages().stringStartsWith(str)
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Create a new validator that checks if string ends with a substring
|
|
183
|
+
*/
|
|
184
|
+
endsWith(str, message) {
|
|
185
|
+
return new VldString({
|
|
186
|
+
checks: [...this.config.checks, (v) => v.endsWith(str)],
|
|
187
|
+
transforms: this.config.transforms,
|
|
188
|
+
errorMessage: message || getMessages().stringEndsWith(str)
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Create a new validator that checks if string includes a substring
|
|
193
|
+
*/
|
|
194
|
+
includes(str, message) {
|
|
195
|
+
return new VldString({
|
|
196
|
+
checks: [...this.config.checks, (v) => v.includes(str)],
|
|
197
|
+
transforms: this.config.transforms,
|
|
198
|
+
errorMessage: message || getMessages().stringIncludes(str)
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Create a new validator that checks for valid IP address (v4 or v6)
|
|
203
|
+
*/
|
|
204
|
+
ip(message) {
|
|
205
|
+
return new VldString({
|
|
206
|
+
checks: [...this.config.checks, (v) => REGEX_PATTERNS.ipv4.test(v) || REGEX_PATTERNS.ipv6.test(v)],
|
|
207
|
+
transforms: this.config.transforms,
|
|
208
|
+
errorMessage: message || getMessages().stringIp
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Create a new validator that checks for valid IPv4 address
|
|
213
|
+
*/
|
|
214
|
+
ipv4(message) {
|
|
215
|
+
return new VldString({
|
|
216
|
+
checks: [...this.config.checks, (v) => REGEX_PATTERNS.ipv4.test(v)],
|
|
217
|
+
transforms: this.config.transforms,
|
|
218
|
+
errorMessage: message || getMessages().stringIpv4
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Create a new validator that checks for valid IPv6 address
|
|
223
|
+
*/
|
|
224
|
+
ipv6(message) {
|
|
225
|
+
return new VldString({
|
|
226
|
+
checks: [...this.config.checks, (v) => REGEX_PATTERNS.ipv6.test(v)],
|
|
227
|
+
transforms: this.config.transforms,
|
|
228
|
+
errorMessage: message || getMessages().stringIpv6
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Create a new validator that ensures string is not empty
|
|
233
|
+
*/
|
|
234
|
+
nonempty(message) {
|
|
235
|
+
return new VldString({
|
|
236
|
+
checks: [...this.config.checks, (v) => v.length > 0],
|
|
237
|
+
transforms: this.config.transforms,
|
|
238
|
+
errorMessage: message || getMessages().stringEmpty
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=string.js.map
|
|
@@ -0,0 +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';\nimport { getMessages } from '../locales';\n\n/**\n * Ultra-fast email validation using simplified regex for maximum performance\n */\nconst FAST_EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n/**\n * Pre-compiled regex patterns for common validations\n */\nconst REGEX_PATTERNS = {\n email: FAST_EMAIL_REGEX, // Use simplified fast regex\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,\n url: /^https?:\\/\\/[^\\s]+$/, // Simplified for speed\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}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,\n};\n\n/**\n * Type for string validation check functions\n */\ntype StringCheck = (value: string) => boolean;\n\n/**\n * Type for string transformation functions\n */\ntype StringTransform = (value: string) => string;\n\n/**\n * Configuration for string validator\n */\ninterface StringValidatorConfig {\n readonly checks: ReadonlyArray<StringCheck>;\n readonly transforms: ReadonlyArray<StringTransform>;\n readonly errorMessage?: string;\n}\n\n/**\n * Immutable string validator with chainable methods\n */\nexport class VldString extends VldBase<string, string> {\n protected readonly config: StringValidatorConfig;\n \n /**\n * Protected constructor to allow extension while maintaining immutability\n */\n protected constructor(config?: Partial<StringValidatorConfig>) {\n super();\n this.config = {\n checks: config?.checks || [],\n transforms: config?.transforms || [],\n errorMessage: config?.errorMessage\n };\n }\n \n /**\n * Create a new string validator\n */\n static create(): VldString {\n return new VldString();\n }\n \n /**\n * Parse and validate a string value - ultra-optimized\n */\n parse(value: unknown): string {\n if (typeof value !== 'string') {\n throw new Error(this.config.errorMessage || getMessages().invalidString);\n }\n \n let result = value;\n \n // Apply transformations with optimized loop\n const transformsLength = this.config.transforms.length;\n for (let i = 0; i < transformsLength; i++) {\n result = this.config.transforms[i](result);\n }\n \n // Apply checks with optimized loop and early termination\n const checksLength = this.config.checks.length;\n for (let i = 0; i < checksLength; i++) {\n if (!this.config.checks[i](result)) {\n throw new Error(this.config.errorMessage || getMessages().invalidString);\n }\n }\n \n return result;\n }\n \n /**\n * Safely parse and validate a string value\n */\n safeParse(value: unknown): ParseResult<string> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n \n /**\n * Create a new validator with minimum length constraint\n */\n min(length: number, message?: string): VldString {\n return new VldString({\n checks: [...this.config.checks, (v: string) => v.length >= length],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringMin(length)\n });\n }\n \n /**\n * Create a new validator with maximum length constraint\n */\n max(length: number, message?: string): VldString {\n return new VldString({\n checks: [...this.config.checks, (v: string) => v.length <= length],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringMax(length)\n });\n }\n \n /**\n * Create a new validator with exact length constraint\n */\n length(length: number, message?: string): VldString {\n return new VldString({\n checks: [...this.config.checks, (v: string) => v.length === length],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringLength(length)\n });\n }\n \n /**\n * Create a new validator that checks for valid email format\n */\n email(message?: string): VldString {\n return new VldString({\n checks: [...this.config.checks, (v: string) => REGEX_PATTERNS.email.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringEmail\n });\n }\n \n /**\n * Create a new validator that checks for valid URL format\n */\n url(message?: string): VldString {\n return new VldString({\n checks: [...this.config.checks, (v: string) => REGEX_PATTERNS.url.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringUrl\n });\n }\n \n /**\n * Create a new validator that checks for valid UUID format\n */\n uuid(message?: string): VldString {\n return new VldString({\n checks: [...this.config.checks, (v: string) => REGEX_PATTERNS.uuid.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringUuid\n });\n }\n \n /**\n * Create a new validator with regex pattern matching\n */\n regex(pattern: RegExp, message?: string): VldString {\n return new VldString({\n checks: [...this.config.checks, (v: string) => pattern.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringRegex\n });\n }\n \n /**\n * Create a new validator that trims whitespace\n */\n trim(): VldString {\n return new VldString({\n checks: this.config.checks,\n transforms: [...this.config.transforms, (v: string) => v.trim()],\n errorMessage: this.config.errorMessage\n });\n }\n \n /**\n * Create a new validator that converts to lowercase\n */\n toLowerCase(): VldString {\n return new VldString({\n checks: this.config.checks,\n transforms: [...this.config.transforms, (v: string) => v.toLowerCase()],\n errorMessage: this.config.errorMessage\n });\n }\n \n /**\n * Create a new validator that converts to uppercase\n */\n toUpperCase(): VldString {\n return new VldString({\n checks: this.config.checks,\n transforms: [...this.config.transforms, (v: string) => v.toUpperCase()],\n errorMessage: this.config.errorMessage\n });\n }\n \n /**\n * Create a new validator that checks if string starts with a substring\n */\n startsWith(str: string, message?: string): VldString {\n return new VldString({\n checks: [...this.config.checks, (v: string) => v.startsWith(str)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringStartsWith(str)\n });\n }\n \n /**\n * Create a new validator that checks if string ends with a substring\n */\n endsWith(str: string, message?: string): VldString {\n return new VldString({\n checks: [...this.config.checks, (v: string) => v.endsWith(str)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringEndsWith(str)\n });\n }\n \n /**\n * Create a new validator that checks if string includes a substring\n */\n includes(str: string, message?: string): VldString {\n return new VldString({\n checks: [...this.config.checks, (v: string) => v.includes(str)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIncludes(str)\n });\n }\n \n /**\n * Create a new validator that checks for valid IP address (v4 or v6)\n */\n ip(message?: string): VldString {\n return new VldString({\n checks: [...this.config.checks, (v: string) => REGEX_PATTERNS.ipv4.test(v) || REGEX_PATTERNS.ipv6.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIp\n });\n }\n \n /**\n * Create a new validator that checks for valid IPv4 address\n */\n ipv4(message?: string): VldString {\n return new VldString({\n checks: [...this.config.checks, (v: string) => REGEX_PATTERNS.ipv4.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIpv4\n });\n }\n \n /**\n * Create a new validator that checks for valid IPv6 address\n */\n ipv6(message?: string): VldString {\n return new VldString({\n checks: [...this.config.checks, (v: string) => REGEX_PATTERNS.ipv6.test(v)],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringIpv6\n });\n }\n \n /**\n * Create a new validator that ensures string is not empty\n */\n nonempty(message?: string): VldString {\n return new VldString({\n checks: [...this.config.checks, (v: string) => v.length > 0],\n transforms: this.config.transforms,\n errorMessage: message || getMessages().stringEmpty\n });\n }\n}"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { VldBase, ParseResult } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* Immutable symbol validator
|
|
4
|
+
*/
|
|
5
|
+
export declare class VldSymbol extends VldBase<symbol, symbol> {
|
|
6
|
+
private readonly errorMessage?;
|
|
7
|
+
/**
|
|
8
|
+
* Private constructor to enforce immutability
|
|
9
|
+
*/
|
|
10
|
+
private constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Create a new symbol validator
|
|
13
|
+
*/
|
|
14
|
+
static create(): VldSymbol;
|
|
15
|
+
/**
|
|
16
|
+
* Parse and validate a symbol value
|
|
17
|
+
*/
|
|
18
|
+
parse(value: unknown): symbol;
|
|
19
|
+
/**
|
|
20
|
+
* Safely parse and validate a symbol value
|
|
21
|
+
*/
|
|
22
|
+
safeParse(value: unknown): ParseResult<symbol>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=symbol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol.d.ts","sourceRoot":"","sources":["../../src/validators/symbol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,qBAAa,SAAU,SAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC;IACpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;IAEvC;;OAEG;IACH,OAAO;IAKP;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,SAAS;IAI1B;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAO7B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;CAS/C"}
|