@oxog/vld 1.5.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/CHANGELOG.md +168 -0
  2. package/LICENSE +20 -20
  3. package/README.md +558 -517
  4. package/dist/chunks/bigint-DgsCr2dC.js +1709 -0
  5. package/dist/chunks/bigint-DgsCr2dC.js.map +1 -0
  6. package/dist/{coercion/string.js → chunks/date-ODue_rtq.js} +271 -5
  7. package/dist/chunks/date-ODue_rtq.js.map +1 -0
  8. package/dist/chunks/index-BZqWZvVe.js +426 -0
  9. package/dist/chunks/index-BZqWZvVe.js.map +1 -0
  10. package/dist/chunks/index-CETyGkrv.js +894 -0
  11. package/dist/chunks/index-CETyGkrv.js.map +1 -0
  12. package/dist/chunks/json-o20GFhTh.js +2021 -0
  13. package/dist/chunks/json-o20GFhTh.js.map +1 -0
  14. package/dist/{validators/unknown.js → chunks/unknown-SLIH1VCf.js} +6 -3
  15. package/dist/chunks/unknown-SLIH1VCf.js.map +1 -0
  16. package/dist/cjs/errors.cjs +387 -0
  17. package/dist/cjs/errors.cjs.map +1 -0
  18. package/dist/cjs/index.cjs +9983 -0
  19. package/dist/cjs/index.cjs.map +1 -0
  20. package/dist/cjs/locales/index.cjs +2877 -0
  21. package/dist/cjs/locales/index.cjs.map +1 -0
  22. package/dist/cjs/locales/lazy.cjs +3169 -0
  23. package/dist/cjs/locales/lazy.cjs.map +1 -0
  24. package/dist/cjs/mini.cjs +7329 -0
  25. package/dist/cjs/mini.cjs.map +1 -0
  26. package/dist/codecs/index.js +4 -275
  27. package/dist/codecs/index.js.map +1 -1
  28. package/dist/coercion/index.d.ts +11 -0
  29. package/dist/coercion/index.d.ts.map +1 -0
  30. package/dist/coercion/{bigint.js → index.js} +7 -4
  31. package/dist/coercion/index.js.map +1 -0
  32. package/dist/compat/emitter.js +6 -4
  33. package/dist/compat/emitter.js.map +1 -1
  34. package/dist/compat/result.js +21 -19
  35. package/dist/compat/result.js.map +1 -1
  36. package/dist/errors.js +13 -10
  37. package/dist/errors.js.map +1 -1
  38. package/dist/index.js +225 -126
  39. package/dist/index.js.map +1 -1
  40. package/dist/kernel.js +10 -7
  41. package/dist/kernel.js.map +1 -1
  42. package/dist/locales/af.js +4 -2
  43. package/dist/locales/af.js.map +1 -1
  44. package/dist/locales/ar.js +4 -2
  45. package/dist/locales/ar.js.map +1 -1
  46. package/dist/locales/bn.js +4 -2
  47. package/dist/locales/bn.js.map +1 -1
  48. package/dist/locales/da.js +4 -2
  49. package/dist/locales/da.js.map +1 -1
  50. package/dist/locales/de.js +4 -2
  51. package/dist/locales/de.js.map +1 -1
  52. package/dist/locales/en.js +4 -2
  53. package/dist/locales/en.js.map +1 -1
  54. package/dist/locales/es-MX.js +4 -2
  55. package/dist/locales/es-MX.js.map +1 -1
  56. package/dist/locales/es.js +4 -2
  57. package/dist/locales/es.js.map +1 -1
  58. package/dist/locales/fi.js +4 -2
  59. package/dist/locales/fi.js.map +1 -1
  60. package/dist/locales/fr.js +4 -2
  61. package/dist/locales/fr.js.map +1 -1
  62. package/dist/locales/hi.js +4 -2
  63. package/dist/locales/hi.js.map +1 -1
  64. package/dist/locales/id.js +4 -2
  65. package/dist/locales/id.js.map +1 -1
  66. package/dist/locales/index.js +3 -91
  67. package/dist/locales/index.js.map +1 -1
  68. package/dist/locales/it.js +4 -2
  69. package/dist/locales/it.js.map +1 -1
  70. package/dist/locales/ja.js +4 -2
  71. package/dist/locales/ja.js.map +1 -1
  72. package/dist/locales/ko.js +4 -2
  73. package/dist/locales/ko.js.map +1 -1
  74. package/dist/locales/lazy.d.ts +111 -0
  75. package/dist/locales/lazy.d.ts.map +1 -0
  76. package/dist/locales/lazy.js +220 -0
  77. package/dist/locales/lazy.js.map +1 -0
  78. package/dist/locales/nl.js +4 -2
  79. package/dist/locales/nl.js.map +1 -1
  80. package/dist/locales/no.js +4 -2
  81. package/dist/locales/no.js.map +1 -1
  82. package/dist/locales/pl.js +4 -2
  83. package/dist/locales/pl.js.map +1 -1
  84. package/dist/locales/pt-BR.js +4 -2
  85. package/dist/locales/pt-BR.js.map +1 -1
  86. package/dist/locales/pt.js +4 -2
  87. package/dist/locales/pt.js.map +1 -1
  88. package/dist/locales/ru.js +4 -2
  89. package/dist/locales/ru.js.map +1 -1
  90. package/dist/locales/sv.js +4 -2
  91. package/dist/locales/sv.js.map +1 -1
  92. package/dist/locales/sw.js +4 -2
  93. package/dist/locales/sw.js.map +1 -1
  94. package/dist/locales/th.js +4 -2
  95. package/dist/locales/th.js.map +1 -1
  96. package/dist/locales/tr.js +4 -2
  97. package/dist/locales/tr.js.map +1 -1
  98. package/dist/locales/vi.js +4 -2
  99. package/dist/locales/vi.js.map +1 -1
  100. package/dist/locales/zh.js +4 -2
  101. package/dist/locales/zh.js.map +1 -1
  102. package/dist/mini.d.ts +182 -0
  103. package/dist/mini.d.ts.map +1 -0
  104. package/dist/mini.js +132 -0
  105. package/dist/mini.js.map +1 -0
  106. package/dist/pigment.js +8 -7
  107. package/dist/pigment.js.map +1 -1
  108. package/dist/validators/array.d.ts +5 -0
  109. package/dist/validators/array.d.ts.map +1 -1
  110. package/dist/validators/discriminated-union.d.ts.map +1 -1
  111. package/dist/validators/enum.d.ts +5 -1
  112. package/dist/validators/enum.d.ts.map +1 -1
  113. package/dist/validators/index.js +5 -45
  114. package/dist/validators/index.js.map +1 -1
  115. package/dist/validators/lazy.d.ts +8 -1
  116. package/dist/validators/lazy.d.ts.map +1 -1
  117. package/dist/validators/literal.d.ts +5 -1
  118. package/dist/validators/literal.d.ts.map +1 -1
  119. package/dist/validators/object.d.ts +30 -3
  120. package/dist/validators/object.d.ts.map +1 -1
  121. package/dist/validators/string.d.ts +12 -1
  122. package/dist/validators/string.d.ts.map +1 -1
  123. package/package.json +69 -11
  124. package/dist/cli/benchmark.d.ts +0 -15
  125. package/dist/cli/benchmark.d.ts.map +0 -1
  126. package/dist/cli/benchmark.js +0 -248
  127. package/dist/cli/benchmark.js.map +0 -1
  128. package/dist/cli/bin.js +0 -35
  129. package/dist/cli/bin.js.map +0 -1
  130. package/dist/cli/commands/benchmark.js +0 -204
  131. package/dist/cli/commands/benchmark.js.map +0 -1
  132. package/dist/cli/commands/validate.js +0 -157
  133. package/dist/cli/commands/validate.js.map +0 -1
  134. package/dist/cli/generate.d.ts +0 -14
  135. package/dist/cli/generate.d.ts.map +0 -1
  136. package/dist/cli/generate.js +0 -233
  137. package/dist/cli/generate.js.map +0 -1
  138. package/dist/cli/index.js +0 -182
  139. package/dist/cli/index.js.map +0 -1
  140. package/dist/cli/validate.d.ts +0 -15
  141. package/dist/cli/validate.d.ts.map +0 -1
  142. package/dist/cli/validate.js +0 -162
  143. package/dist/cli/validate.js.map +0 -1
  144. package/dist/coercion/bigint.js.map +0 -1
  145. package/dist/coercion/boolean.js +0 -59
  146. package/dist/coercion/boolean.js.map +0 -1
  147. package/dist/coercion/date.js +0 -52
  148. package/dist/coercion/date.js.map +0 -1
  149. package/dist/coercion/number.js +0 -160
  150. package/dist/coercion/number.js.map +0 -1
  151. package/dist/coercion/string.js.map +0 -1
  152. package/dist/compat/index.js +0 -14
  153. package/dist/compat/index.js.map +0 -1
  154. package/dist/events.js +0 -8
  155. package/dist/events.js.map +0 -1
  156. package/dist/guards.d.ts +0 -143
  157. package/dist/guards.d.ts.map +0 -1
  158. package/dist/guards.js +0 -238
  159. package/dist/guards.js.map +0 -1
  160. package/dist/index-new.d.ts.map +0 -1
  161. package/dist/locales/backup-en.js +0 -105
  162. package/dist/locales/backup-en.js.map +0 -1
  163. package/dist/locales/types.js +0 -2
  164. package/dist/locales/types.js.map +0 -1
  165. package/dist/locales.d.ts +0 -54
  166. package/dist/locales.d.ts.map +0 -1
  167. package/dist/locales.js +0 -732
  168. package/dist/locales.js.map +0 -1
  169. package/dist/logger.js +0 -184
  170. package/dist/logger.js.map +0 -1
  171. package/dist/plugins/codecs.d.ts +0 -17
  172. package/dist/plugins/codecs.d.ts.map +0 -1
  173. package/dist/plugins/codecs.js +0 -29
  174. package/dist/plugins/codecs.js.map +0 -1
  175. package/dist/plugins/coercion.d.ts +0 -13
  176. package/dist/plugins/coercion.d.ts.map +0 -1
  177. package/dist/plugins/coercion.js +0 -34
  178. package/dist/plugins/coercion.js.map +0 -1
  179. package/dist/plugins/core-validators.d.ts +0 -13
  180. package/dist/plugins/core-validators.d.ts.map +0 -1
  181. package/dist/plugins/core-validators.js +0 -96
  182. package/dist/plugins/core-validators.js.map +0 -1
  183. package/dist/plugins/index.js +0 -8
  184. package/dist/plugins/index.js.map +0 -1
  185. package/dist/plugins/kernel.d.ts +0 -29
  186. package/dist/plugins/kernel.d.ts.map +0 -1
  187. package/dist/plugins/kernel.js +0 -486
  188. package/dist/plugins/kernel.js.map +0 -1
  189. package/dist/plugins/types.js +0 -8
  190. package/dist/plugins/types.js.map +0 -1
  191. package/dist/style.d.ts +0 -123
  192. package/dist/style.d.ts.map +0 -1
  193. package/dist/style.js +0 -369
  194. package/dist/style.js.map +0 -1
  195. package/dist/utils/codec-utils.js +0 -229
  196. package/dist/utils/codec-utils.js.map +0 -1
  197. package/dist/utils/deep-merge.js +0 -76
  198. package/dist/utils/deep-merge.js.map +0 -1
  199. package/dist/utils/ip-validation.js +0 -98
  200. package/dist/utils/ip-validation.js.map +0 -1
  201. package/dist/utils/security.js +0 -61
  202. package/dist/utils/security.js.map +0 -1
  203. package/dist/validators/any.js +0 -25
  204. package/dist/validators/any.js.map +0 -1
  205. package/dist/validators/array.js +0 -190
  206. package/dist/validators/array.js.map +0 -1
  207. package/dist/validators/base.js +0 -499
  208. package/dist/validators/base.js.map +0 -1
  209. package/dist/validators/base64.js +0 -65
  210. package/dist/validators/base64.js.map +0 -1
  211. package/dist/validators/bigint.js +0 -142
  212. package/dist/validators/bigint.js.map +0 -1
  213. package/dist/validators/boolean.js +0 -114
  214. package/dist/validators/boolean.js.map +0 -1
  215. package/dist/validators/codec.js +0 -182
  216. package/dist/validators/codec.js.map +0 -1
  217. package/dist/validators/custom.js +0 -50
  218. package/dist/validators/custom.js.map +0 -1
  219. package/dist/validators/date.js +0 -227
  220. package/dist/validators/date.js.map +0 -1
  221. package/dist/validators/discriminated-union.js +0 -98
  222. package/dist/validators/discriminated-union.js.map +0 -1
  223. package/dist/validators/enum.js +0 -82
  224. package/dist/validators/enum.js.map +0 -1
  225. package/dist/validators/file.js +0 -114
  226. package/dist/validators/file.js.map +0 -1
  227. package/dist/validators/function.js +0 -45
  228. package/dist/validators/function.js.map +0 -1
  229. package/dist/validators/hex.js +0 -62
  230. package/dist/validators/hex.js.map +0 -1
  231. package/dist/validators/intersection.js +0 -64
  232. package/dist/validators/intersection.js.map +0 -1
  233. package/dist/validators/json.js +0 -64
  234. package/dist/validators/json.js.map +0 -1
  235. package/dist/validators/lazy.js +0 -42
  236. package/dist/validators/lazy.js.map +0 -1
  237. package/dist/validators/literal.js +0 -45
  238. package/dist/validators/literal.js.map +0 -1
  239. package/dist/validators/map.js +0 -54
  240. package/dist/validators/map.js.map +0 -1
  241. package/dist/validators/nan.js +0 -32
  242. package/dist/validators/nan.js.map +0 -1
  243. package/dist/validators/never.js +0 -29
  244. package/dist/validators/never.js.map +0 -1
  245. package/dist/validators/null.js +0 -31
  246. package/dist/validators/null.js.map +0 -1
  247. package/dist/validators/number.js +0 -225
  248. package/dist/validators/number.js.map +0 -1
  249. package/dist/validators/object-optimized.d.ts +0 -23
  250. package/dist/validators/object-optimized.d.ts.map +0 -1
  251. package/dist/validators/object-optimized.js +0 -179
  252. package/dist/validators/object-optimized.js.map +0 -1
  253. package/dist/validators/object-ultra.d.ts +0 -34
  254. package/dist/validators/object-ultra.d.ts.map +0 -1
  255. package/dist/validators/object-ultra.js +0 -175
  256. package/dist/validators/object-ultra.js.map +0 -1
  257. package/dist/validators/object.js +0 -458
  258. package/dist/validators/object.js.map +0 -1
  259. package/dist/validators/record.js +0 -128
  260. package/dist/validators/record.js.map +0 -1
  261. package/dist/validators/set.js +0 -51
  262. package/dist/validators/set.js.map +0 -1
  263. package/dist/validators/string-bool.js +0 -127
  264. package/dist/validators/string-bool.js.map +0 -1
  265. package/dist/validators/string-formats.js +0 -120
  266. package/dist/validators/string-formats.js.map +0 -1
  267. package/dist/validators/string-ultra.d.ts +0 -49
  268. package/dist/validators/string-ultra.d.ts.map +0 -1
  269. package/dist/validators/string-ultra.js +0 -217
  270. package/dist/validators/string-ultra.js.map +0 -1
  271. package/dist/validators/string.js +0 -253
  272. package/dist/validators/string.js.map +0 -1
  273. package/dist/validators/symbol.js +0 -42
  274. package/dist/validators/symbol.js.map +0 -1
  275. package/dist/validators/template-literal.js +0 -102
  276. package/dist/validators/template-literal.js.map +0 -1
  277. package/dist/validators/tuple.js +0 -55
  278. package/dist/validators/tuple.js.map +0 -1
  279. package/dist/validators/uint8array.js +0 -98
  280. package/dist/validators/uint8array.js.map +0 -1
  281. package/dist/validators/undefined.js +0 -31
  282. package/dist/validators/undefined.js.map +0 -1
  283. package/dist/validators/union-optimized.d.ts +0 -15
  284. package/dist/validators/union-optimized.d.ts.map +0 -1
  285. package/dist/validators/union-optimized.js +0 -92
  286. package/dist/validators/union-optimized.js.map +0 -1
  287. package/dist/validators/union.js +0 -126
  288. package/dist/validators/union.js.map +0 -1
  289. package/dist/validators/unknown.js.map +0 -1
  290. package/dist/validators/void.js +0 -35
  291. package/dist/validators/void.js.map +0 -1
  292. package/dist/validators/xor.js +0 -64
  293. package/dist/validators/xor.js.map +0 -1
@@ -1,217 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"string-ultra.js","sourceRoot":"","sources":["../../src/validators/string-ultra.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,OAAwB;IAgB1D,YAAoB,SAQhB,EAAE;QACJ,KAAK,EAAE,CAAC;QAjBO,sBAAiB,GAAsC,EAAE,CAAC;QAkBzE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,cAAc,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,wBAAwB;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,mCAAmC;QACnC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;QAEvB,+DAA+D;QAC/D,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,qDAAqD;QACrD,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,YAAY,CAAC,CAAC;QAC9C,CAAC;QAED,4BAA4B;QAC5B,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC;QAED,uDAAuD;QACvD,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;QACxD,IAAI,iBAAiB,GAAG,CAAC,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpC,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,gBAAgB,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,SAAS,CAAC,KAAc;QACtB,IAAI,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,cAAc,CAAC;YACxB,SAAS,EAAE,MAAM;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,cAAc,CAAC;YACxB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,MAAM;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,OAAO,IAAI,cAAc,CAAC;YACxB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,IAAI,cAAc,CAAC;YACxB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,GAAG;QACD,OAAO,IAAI,cAAc,CAAC;YACxB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe;QACnB,OAAO,IAAI,cAAc,CAAC;YACxB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI;QACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC;QACxC,OAAO,IAAI,cAAc,CAAC;YACxB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,gBAAgB,CAAC,CAAC;gBAC3B,CAAC,GAAW,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC/C,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,WAAW;QACT,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC;QACxC,OAAO,IAAI,cAAc,CAAC;YACxB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,gBAAgB,CAAC,CAAC;gBAC3B,CAAC,GAAW,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBACtD,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE;SACrC,CAAC,CAAC;IACL,CAAC;IAED,WAAW;QACT,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC;QACxC,OAAO,IAAI,cAAc,CAAC;YACxB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,gBAAgB,CAAC,CAAC;gBAC3B,CAAC,GAAW,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBACtD,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE;SACrC,CAAC,CAAC;IACL,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,UAAU,CAAC,MAAc;QACvB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,SAAiB;QACxB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;;AAnPD,4DAA4D;AACpC,0BAAW,GAAG,4BAA4B,AAA/B,CAAgC;AAEnE,yBAAyB;AACD,wBAAS,GAAG,qBAAqB,AAAxB,CAAyB","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}"]}
@@ -1,253 +0,0 @@
1
- import { VldBase } from './base.js';
2
- import { getMessages } from '../locales/index.js';
3
- import { isValidIPv6 } from '../utils/ip-validation.js';
4
- /**
5
- * Ultra-fast email validation using simplified regex for maximum performance
6
- */
7
- const FAST_EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
8
- /**
9
- * Pre-compiled regex patterns for common validations
10
- * Optimized to prevent ReDoS attacks
11
- */
12
- const REGEX_PATTERNS = {
13
- email: FAST_EMAIL_REGEX, // Use simplified fast regex
14
- 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,
15
- url: /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/, // Fixed unnecessary escapes
16
- 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]?)$/,
17
- // Simplified IPv6 regex to prevent ReDoS - splits into multiple checks for performance
18
- ipv6Basic: /^[0-9a-fA-F:]+$/,
19
- };
20
- /**
21
- * Immutable string validator with chainable methods
22
- */
23
- export class VldString extends VldBase {
24
- /**
25
- * Protected constructor to allow extension while maintaining immutability
26
- */
27
- constructor(config) {
28
- super();
29
- this.config = {
30
- checks: config?.checks || [],
31
- transforms: config?.transforms || [],
32
- errorMessage: config?.errorMessage
33
- };
34
- }
35
- /**
36
- * Create a new string validator
37
- */
38
- static create() {
39
- return new VldString();
40
- }
41
- /**
42
- * Parse and validate a string value - ultra-optimized
43
- */
44
- parse(value) {
45
- if (typeof value !== 'string') {
46
- throw new Error(this.config.errorMessage || getMessages().invalidString);
47
- }
48
- let result = value;
49
- // Apply transformations with optimized loop
50
- const transformsLength = this.config.transforms.length;
51
- for (let i = 0; i < transformsLength; i++) {
52
- result = this.config.transforms[i](result);
53
- }
54
- // Apply checks with optimized loop and early termination
55
- const checksLength = this.config.checks.length;
56
- for (let i = 0; i < checksLength; i++) {
57
- if (!this.config.checks[i](result)) {
58
- throw new Error(this.config.errorMessage || getMessages().invalidString);
59
- }
60
- }
61
- return result;
62
- }
63
- /**
64
- * Safely parse and validate a string value
65
- */
66
- safeParse(value) {
67
- try {
68
- return { success: true, data: this.parse(value) };
69
- }
70
- catch (error) {
71
- return { success: false, error: error };
72
- }
73
- }
74
- /**
75
- * Create a new validator with minimum length constraint
76
- */
77
- min(length, message) {
78
- return new VldString({
79
- checks: [...this.config.checks, (v) => v.length >= length],
80
- transforms: this.config.transforms,
81
- errorMessage: message || getMessages().stringMin(length)
82
- });
83
- }
84
- /**
85
- * Create a new validator with maximum length constraint
86
- */
87
- max(length, message) {
88
- return new VldString({
89
- checks: [...this.config.checks, (v) => v.length <= length],
90
- transforms: this.config.transforms,
91
- errorMessage: message || getMessages().stringMax(length)
92
- });
93
- }
94
- /**
95
- * Create a new validator with exact length constraint
96
- */
97
- length(length, message) {
98
- return new VldString({
99
- checks: [...this.config.checks, (v) => v.length === length],
100
- transforms: this.config.transforms,
101
- errorMessage: message || getMessages().stringLength(length)
102
- });
103
- }
104
- /**
105
- * Create a new validator that checks for valid email format
106
- */
107
- email(message) {
108
- return new VldString({
109
- checks: [...this.config.checks, (v) => REGEX_PATTERNS.email.test(v)],
110
- transforms: this.config.transforms,
111
- errorMessage: message || getMessages().stringEmail
112
- });
113
- }
114
- /**
115
- * Create a new validator that checks for valid URL format
116
- */
117
- url(message) {
118
- return new VldString({
119
- checks: [...this.config.checks, (v) => REGEX_PATTERNS.url.test(v)],
120
- transforms: this.config.transforms,
121
- errorMessage: message || getMessages().stringUrl
122
- });
123
- }
124
- /**
125
- * Create a new validator that checks for valid UUID format
126
- */
127
- uuid(message) {
128
- return new VldString({
129
- checks: [...this.config.checks, (v) => REGEX_PATTERNS.uuid.test(v)],
130
- transforms: this.config.transforms,
131
- errorMessage: message || getMessages().stringUuid
132
- });
133
- }
134
- /**
135
- * Create a new validator with regex pattern matching
136
- */
137
- regex(pattern, message) {
138
- return new VldString({
139
- checks: [...this.config.checks, (v) => pattern.test(v)],
140
- transforms: this.config.transforms,
141
- errorMessage: message || getMessages().stringRegex
142
- });
143
- }
144
- /**
145
- * Create a new validator that trims whitespace
146
- */
147
- trim() {
148
- return new VldString({
149
- checks: this.config.checks,
150
- transforms: [...this.config.transforms, (v) => v.trim()],
151
- errorMessage: this.config.errorMessage
152
- });
153
- }
154
- /**
155
- * Create a new validator that converts to lowercase
156
- */
157
- toLowerCase() {
158
- return new VldString({
159
- checks: this.config.checks,
160
- transforms: [...this.config.transforms, (v) => v.toLowerCase()],
161
- errorMessage: this.config.errorMessage
162
- });
163
- }
164
- /**
165
- * Create a new validator that converts to uppercase
166
- */
167
- toUpperCase() {
168
- return new VldString({
169
- checks: this.config.checks,
170
- transforms: [...this.config.transforms, (v) => v.toUpperCase()],
171
- errorMessage: this.config.errorMessage
172
- });
173
- }
174
- /**
175
- * Create a new validator that checks if string starts with a substring
176
- */
177
- startsWith(str, message) {
178
- return new VldString({
179
- checks: [...this.config.checks, (v) => v.startsWith(str)],
180
- transforms: this.config.transforms,
181
- errorMessage: message || getMessages().stringStartsWith(str)
182
- });
183
- }
184
- /**
185
- * Create a new validator that checks if string ends with a substring
186
- */
187
- endsWith(str, message) {
188
- return new VldString({
189
- checks: [...this.config.checks, (v) => v.endsWith(str)],
190
- transforms: this.config.transforms,
191
- errorMessage: message || getMessages().stringEndsWith(str)
192
- });
193
- }
194
- /**
195
- * Create a new validator that checks if string includes a substring
196
- */
197
- includes(str, message) {
198
- return new VldString({
199
- checks: [...this.config.checks, (v) => v.includes(str)],
200
- transforms: this.config.transforms,
201
- errorMessage: message || getMessages().stringIncludes(str)
202
- });
203
- }
204
- /**
205
- * Create a new validator that checks for valid IP address (v4 or v6)
206
- */
207
- ip(message) {
208
- return new VldString({
209
- checks: [...this.config.checks, (v) => {
210
- // Prevent ReDoS: Check length before regex
211
- if (v.length > 100)
212
- return false;
213
- return REGEX_PATTERNS.ipv4.test(v) || isValidIPv6(v);
214
- }],
215
- transforms: this.config.transforms,
216
- errorMessage: message || getMessages().stringIp
217
- });
218
- }
219
- /**
220
- * Create a new validator that checks for valid IPv4 address
221
- */
222
- ipv4(message) {
223
- return new VldString({
224
- checks: [...this.config.checks, (v) => REGEX_PATTERNS.ipv4.test(v)],
225
- transforms: this.config.transforms,
226
- errorMessage: message || getMessages().stringIpv4
227
- });
228
- }
229
- /**
230
- * Create a new validator that checks for valid IPv6 address
231
- */
232
- ipv6(message) {
233
- return new VldString({
234
- checks: [...this.config.checks, (v) => {
235
- // Use safe IPv6 validation to prevent ReDoS attacks
236
- return isValidIPv6(v);
237
- }],
238
- transforms: this.config.transforms,
239
- errorMessage: message || getMessages().stringIpv6
240
- });
241
- }
242
- /**
243
- * Create a new validator that ensures string is not empty
244
- */
245
- nonempty(message) {
246
- return new VldString({
247
- checks: [...this.config.checks, (v) => v.length > 0],
248
- transforms: this.config.transforms,
249
- errorMessage: message || getMessages().stringEmpty
250
- });
251
- }
252
- }
253
- //# sourceMappingURL=string.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/validators/string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD;;GAEG;AACH,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAEtD;;;GAGG;AACH,MAAM,cAAc,GAAG;IACrB,KAAK,EAAE,gBAAgB,EAAE,4BAA4B;IACrD,IAAI,EAAE,4EAA4E;IAClF,GAAG,EAAE,uGAAuG,EAAG,4BAA4B;IAC3I,IAAI,EAAE,6FAA6F;IACnG,uFAAuF;IACvF,SAAS,EAAE,iBAAiB;CAC7B,CAAC;AAwBF;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,OAAuB;IAGpD;;OAEG;IACH,YAAsB,MAAuC;QAC3D,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG;YACZ,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE;YAC5B,UAAU,EAAE,MAAM,EAAE,UAAU,IAAI,EAAE;YACpC,YAAY,EAAE,MAAM,EAAE,YAAY;SACnC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,SAAS,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,4CAA4C;QAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;QACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QAED,yDAAyD;QACzD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAc;QACtB,IAAI,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,MAAc,EAAE,OAAgB;QAClC,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC;YAClE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC;SACzD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,MAAc,EAAE,OAAgB;QAClC,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC;YAClE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC;SACzD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAc,EAAE,OAAgB;QACrC,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;YACnE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC;SAC5D,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAgB;QACpB,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5E,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,WAAW;SACnD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,OAAgB;QAClB,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1E,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,SAAS;SACjD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAgB;QACnB,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3E,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,UAAU;SAClD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe,EAAE,OAAgB;QACrC,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/D,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,WAAW;SACnD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;SACvC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACvE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;SACvC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACvE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;SACvC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,GAAW,EAAE,OAAgB;QACtC,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACjE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAW,EAAE,OAAgB;QACpC,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC/D,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC;SAC3D,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAW,EAAE,OAAgB;QACpC,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC/D,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC;SAC3D,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,EAAE,CAAC,OAAgB;QACjB,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;oBAC5C,2CAA2C;oBAC3C,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG;wBAAE,OAAO,KAAK,CAAC;oBACjC,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;gBACvD,CAAC,CAAC;YACF,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,QAAQ;SAChD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAgB;QACnB,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3E,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,UAAU;SAClD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAgB;QACnB,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;oBAC5C,oDAAoD;oBACpD,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;gBACxB,CAAC,CAAC;YACF,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,UAAU;SAClD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,OAAgB;QACvB,OAAO,IAAI,SAAS,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5D,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC,WAAW;SACnD,CAAC,CAAC;IACL,CAAC;CACF","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}"]}
@@ -1,42 +0,0 @@
1
- import { VldBase } from './base.js';
2
- import { getMessages } from '../locales/index.js';
3
- /**
4
- * Immutable symbol validator
5
- */
6
- export class VldSymbol extends VldBase {
7
- /**
8
- * Private constructor to enforce immutability
9
- */
10
- constructor(errorMessage) {
11
- super();
12
- this.errorMessage = errorMessage;
13
- }
14
- /**
15
- * Create a new symbol validator
16
- */
17
- static create() {
18
- return new VldSymbol();
19
- }
20
- /**
21
- * Parse and validate a symbol value
22
- */
23
- parse(value) {
24
- if (typeof value !== 'symbol') {
25
- throw new Error(this.errorMessage || getMessages().invalidSymbol);
26
- }
27
- return value;
28
- }
29
- /**
30
- * Safely parse and validate a symbol value
31
- */
32
- safeParse(value) {
33
- if (typeof value === 'symbol') {
34
- return { success: true, data: value };
35
- }
36
- return {
37
- success: false,
38
- error: new Error(this.errorMessage || getMessages().invalidSymbol)
39
- };
40
- }
41
- }
42
- //# sourceMappingURL=symbol.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"symbol.js","sourceRoot":"","sources":["../../src/validators/symbol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,OAAuB;IAGpD;;OAEG;IACH,YAAoB,YAAqB;QACvC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,SAAS,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAc;QACtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACxC,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,aAAa,CAAC;SACnE,CAAC;IACJ,CAAC;CACF","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Immutable symbol validator\n */\nexport class VldSymbol extends VldBase<symbol, symbol> {\n private readonly errorMessage?: string;\n \n /**\n * Private constructor to enforce immutability\n */\n private constructor(errorMessage?: string) {\n super();\n this.errorMessage = errorMessage;\n }\n \n /**\n * Create a new symbol validator\n */\n static create(): VldSymbol {\n return new VldSymbol();\n }\n \n /**\n * Parse and validate a symbol value\n */\n parse(value: unknown): symbol {\n if (typeof value !== 'symbol') {\n throw new Error(this.errorMessage || getMessages().invalidSymbol);\n }\n return value;\n }\n \n /**\n * Safely parse and validate a symbol value\n */\n safeParse(value: unknown): ParseResult<symbol> {\n if (typeof value === 'symbol') {\n return { success: true, data: value };\n }\n return { \n success: false, \n error: new Error(this.errorMessage || getMessages().invalidSymbol) \n };\n }\n}"]}