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