@oxog/vld 1.0.0 → 1.1.1

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 (138) hide show
  1. package/CHANGELOG.md +117 -102
  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/locales/af.js +3 -3
  29. package/dist/locales/af.js.map +1 -1
  30. package/dist/utils/deep-merge.d.ts +18 -0
  31. package/dist/utils/deep-merge.d.ts.map +1 -0
  32. package/dist/utils/deep-merge.js +68 -0
  33. package/dist/utils/deep-merge.js.map +1 -0
  34. package/dist/validators/any.d.ts +19 -0
  35. package/dist/validators/any.d.ts.map +1 -0
  36. package/dist/validators/any.js +25 -0
  37. package/dist/validators/any.js.map +1 -0
  38. package/dist/validators/array.d.ts +48 -0
  39. package/dist/validators/array.d.ts.map +1 -0
  40. package/dist/validators/array.js +135 -0
  41. package/dist/validators/array.js.map +1 -0
  42. package/dist/validators/base.d.ts +155 -0
  43. package/dist/validators/base.d.ts.map +1 -0
  44. package/dist/validators/base.js +245 -0
  45. package/dist/validators/base.js.map +1 -0
  46. package/dist/validators/bigint.d.ts +60 -0
  47. package/dist/validators/bigint.d.ts.map +1 -0
  48. package/dist/validators/bigint.js +104 -0
  49. package/dist/validators/bigint.js.map +1 -0
  50. package/dist/validators/boolean.d.ts +32 -0
  51. package/dist/validators/boolean.d.ts.map +1 -0
  52. package/dist/validators/boolean.js +86 -0
  53. package/dist/validators/boolean.js.map +1 -0
  54. package/dist/validators/date.d.ts +68 -0
  55. package/dist/validators/date.d.ts.map +1 -0
  56. package/dist/validators/date.js +148 -0
  57. package/dist/validators/date.js.map +1 -0
  58. package/dist/validators/enum.d.ts +25 -0
  59. package/dist/validators/enum.d.ts.map +1 -0
  60. package/dist/validators/enum.js +45 -0
  61. package/dist/validators/enum.js.map +1 -0
  62. package/dist/validators/index.d.ts +27 -0
  63. package/dist/validators/index.d.ts.map +1 -0
  64. package/dist/validators/index.js +30 -0
  65. package/dist/validators/index.js.map +1 -0
  66. package/dist/validators/intersection.d.ts +25 -0
  67. package/dist/validators/intersection.d.ts.map +1 -0
  68. package/dist/validators/intersection.js +57 -0
  69. package/dist/validators/intersection.js.map +1 -0
  70. package/dist/validators/literal.d.ts +25 -0
  71. package/dist/validators/literal.d.ts.map +1 -0
  72. package/dist/validators/literal.js +45 -0
  73. package/dist/validators/literal.js.map +1 -0
  74. package/dist/validators/map.d.ts +26 -0
  75. package/dist/validators/map.d.ts.map +1 -0
  76. package/dist/validators/map.js +54 -0
  77. package/dist/validators/map.js.map +1 -0
  78. package/dist/validators/never.d.ts +19 -0
  79. package/dist/validators/never.d.ts.map +1 -0
  80. package/dist/validators/never.js +29 -0
  81. package/dist/validators/never.js.map +1 -0
  82. package/dist/validators/number.d.ts +92 -0
  83. package/dist/validators/number.d.ts.map +1 -0
  84. package/dist/validators/number.js +173 -0
  85. package/dist/validators/number.js.map +1 -0
  86. package/dist/validators/object-optimized.d.ts +23 -0
  87. package/dist/validators/object-optimized.d.ts.map +1 -0
  88. package/dist/validators/object-optimized.js +179 -0
  89. package/dist/validators/object-optimized.js.map +1 -0
  90. package/dist/validators/object-ultra.d.ts +34 -0
  91. package/dist/validators/object-ultra.d.ts.map +1 -0
  92. package/dist/validators/object-ultra.js +175 -0
  93. package/dist/validators/object-ultra.js.map +1 -0
  94. package/dist/validators/object.d.ts +73 -0
  95. package/dist/validators/object.d.ts.map +1 -0
  96. package/dist/validators/object.js +289 -0
  97. package/dist/validators/object.js.map +1 -0
  98. package/dist/validators/record.d.ts +25 -0
  99. package/dist/validators/record.d.ts.map +1 -0
  100. package/dist/validators/record.js +52 -0
  101. package/dist/validators/record.js.map +1 -0
  102. package/dist/validators/set.d.ts +25 -0
  103. package/dist/validators/set.d.ts.map +1 -0
  104. package/dist/validators/set.js +51 -0
  105. package/dist/validators/set.js.map +1 -0
  106. package/dist/validators/string-ultra.d.ts +49 -0
  107. package/dist/validators/string-ultra.d.ts.map +1 -0
  108. package/dist/validators/string-ultra.js +217 -0
  109. package/dist/validators/string-ultra.js.map +1 -0
  110. package/dist/validators/string.d.ts +109 -0
  111. package/dist/validators/string.d.ts.map +1 -0
  112. package/dist/validators/string.js +242 -0
  113. package/dist/validators/string.js.map +1 -0
  114. package/dist/validators/symbol.d.ts +24 -0
  115. package/dist/validators/symbol.d.ts.map +1 -0
  116. package/dist/validators/symbol.js +42 -0
  117. package/dist/validators/symbol.js.map +1 -0
  118. package/dist/validators/tuple.d.ts +31 -0
  119. package/dist/validators/tuple.d.ts.map +1 -0
  120. package/dist/validators/tuple.js +55 -0
  121. package/dist/validators/tuple.js.map +1 -0
  122. package/dist/validators/union-optimized.d.ts +15 -0
  123. package/dist/validators/union-optimized.d.ts.map +1 -0
  124. package/dist/validators/union-optimized.js +92 -0
  125. package/dist/validators/union-optimized.js.map +1 -0
  126. package/dist/validators/union.d.ts +33 -0
  127. package/dist/validators/union.d.ts.map +1 -0
  128. package/dist/validators/union.js +121 -0
  129. package/dist/validators/union.js.map +1 -0
  130. package/dist/validators/unknown.d.ts +19 -0
  131. package/dist/validators/unknown.d.ts.map +1 -0
  132. package/dist/validators/unknown.js +25 -0
  133. package/dist/validators/unknown.js.map +1 -0
  134. package/dist/validators/void.d.ts +19 -0
  135. package/dist/validators/void.d.ts.map +1 -0
  136. package/dist/validators/void.js +35 -0
  137. package/dist/validators/void.js.map +1 -0
  138. package/package.json +12 -6
@@ -0,0 +1,179 @@
1
+ import { VldBase, VldOptional } from './base.js';
2
+ import { getMessages } from '../locales.js';
3
+ export class VldObjectOptimized extends VldBase {
4
+ constructor(config) {
5
+ super();
6
+ this.config = config;
7
+ // Pre-compute shape keys for faster access
8
+ this.shapeKeys = Object.keys(config.shape);
9
+ this.shapeKeysSet = new Set(this.shapeKeys);
10
+ }
11
+ static create(shape) {
12
+ return new VldObjectOptimized({ shape });
13
+ }
14
+ parse(value) {
15
+ // Fast type check
16
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
17
+ throw new Error(this.config.errorMessage || getMessages().invalidObject);
18
+ }
19
+ const obj = value;
20
+ const result = {};
21
+ // Optimized field validation without try-catch for each field
22
+ const errors = [];
23
+ // Use for loop instead of Object.entries for better performance
24
+ for (let i = 0; i < this.shapeKeys.length; i++) {
25
+ const key = this.shapeKeys[i];
26
+ const validator = this.config.shape[key];
27
+ const fieldValue = obj[key];
28
+ // Use safeParse to avoid try-catch overhead
29
+ const parseResult = validator.safeParse(fieldValue);
30
+ if (parseResult.success) {
31
+ result[key] = parseResult.data;
32
+ }
33
+ else {
34
+ errors.push([key, parseResult.error.message]);
35
+ }
36
+ }
37
+ // If there were any errors, throw the first one
38
+ if (errors.length > 0) {
39
+ const [key, message] = errors[0];
40
+ throw new Error(getMessages().objectField(key, message));
41
+ }
42
+ // Handle strict mode - optimized with Set
43
+ if (this.config.strict) {
44
+ const objKeys = Object.keys(obj);
45
+ const extraKeys = [];
46
+ for (let i = 0; i < objKeys.length; i++) {
47
+ if (!this.shapeKeysSet.has(objKeys[i])) {
48
+ extraKeys.push(objKeys[i]);
49
+ }
50
+ }
51
+ if (extraKeys.length > 0) {
52
+ throw new Error(getMessages().unexpectedKeys(extraKeys));
53
+ }
54
+ }
55
+ // Handle passthrough mode - optimized
56
+ if (this.config.passthrough) {
57
+ const objKeys = Object.keys(obj);
58
+ for (let i = 0; i < objKeys.length; i++) {
59
+ const key = objKeys[i];
60
+ if (!this.shapeKeysSet.has(key)) {
61
+ result[key] = obj[key];
62
+ }
63
+ }
64
+ }
65
+ return result;
66
+ }
67
+ safeParse(value) {
68
+ // Fast type check
69
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
70
+ return {
71
+ success: false,
72
+ error: new Error(this.config.errorMessage || getMessages().invalidObject)
73
+ };
74
+ }
75
+ const obj = value;
76
+ const result = {};
77
+ // Validate all fields
78
+ for (let i = 0; i < this.shapeKeys.length; i++) {
79
+ const key = this.shapeKeys[i];
80
+ const validator = this.config.shape[key];
81
+ const fieldValue = obj[key];
82
+ const parseResult = validator.safeParse(fieldValue);
83
+ if (parseResult.success) {
84
+ result[key] = parseResult.data;
85
+ }
86
+ else {
87
+ return {
88
+ success: false,
89
+ error: new Error(getMessages().objectField(key, parseResult.error.message))
90
+ };
91
+ }
92
+ }
93
+ // Handle strict mode
94
+ if (this.config.strict) {
95
+ const objKeys = Object.keys(obj);
96
+ const extraKeys = [];
97
+ for (let i = 0; i < objKeys.length; i++) {
98
+ if (!this.shapeKeysSet.has(objKeys[i])) {
99
+ extraKeys.push(objKeys[i]);
100
+ }
101
+ }
102
+ if (extraKeys.length > 0) {
103
+ return {
104
+ success: false,
105
+ error: new Error(getMessages().unexpectedKeys(extraKeys))
106
+ };
107
+ }
108
+ }
109
+ // Handle passthrough mode
110
+ if (this.config.passthrough) {
111
+ const objKeys = Object.keys(obj);
112
+ for (let i = 0; i < objKeys.length; i++) {
113
+ const key = objKeys[i];
114
+ if (!this.shapeKeysSet.has(key)) {
115
+ result[key] = obj[key];
116
+ }
117
+ }
118
+ }
119
+ return { success: true, data: result };
120
+ }
121
+ // All the chain methods remain the same
122
+ strict(message) {
123
+ return new VldObjectOptimized({
124
+ ...this.config,
125
+ strict: true,
126
+ passthrough: false,
127
+ errorMessage: message
128
+ });
129
+ }
130
+ passthrough() {
131
+ return new VldObjectOptimized({
132
+ ...this.config,
133
+ strict: false,
134
+ passthrough: true
135
+ });
136
+ }
137
+ partial() {
138
+ const partialShape = {};
139
+ for (const key in this.config.shape) {
140
+ partialShape[key] = new VldOptional(this.config.shape[key]);
141
+ }
142
+ return new VldObjectOptimized({
143
+ ...this.config,
144
+ shape: partialShape
145
+ });
146
+ }
147
+ pick(...keys) {
148
+ const pickedShape = {};
149
+ for (const key of keys) {
150
+ if (key in this.config.shape) {
151
+ pickedShape[key] = this.config.shape[key];
152
+ }
153
+ }
154
+ return new VldObjectOptimized({
155
+ ...this.config,
156
+ shape: pickedShape
157
+ });
158
+ }
159
+ omit(...keys) {
160
+ const omittedShape = {};
161
+ const keysToOmit = new Set(keys);
162
+ for (const key in this.config.shape) {
163
+ if (!keysToOmit.has(key)) {
164
+ omittedShape[key] = this.config.shape[key];
165
+ }
166
+ }
167
+ return new VldObjectOptimized({
168
+ ...this.config,
169
+ shape: omittedShape
170
+ });
171
+ }
172
+ extend(extension) {
173
+ return new VldObjectOptimized({
174
+ ...this.config,
175
+ shape: { ...this.config.shape, ...extension }
176
+ });
177
+ }
178
+ }
179
+ //# sourceMappingURL=object-optimized.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-optimized.js","sourceRoot":"","sources":["../../src/validators/object-optimized.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult, VldOptional } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Optimized object validator with better performance\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\nexport class VldObjectOptimized<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 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 static create<T extends Record<string, any>>(\n shape: { [K in keyof T]: VldBase<unknown, T[K]> }\n ): VldObjectOptimized<T> {\n return new VldObjectOptimized({ shape });\n }\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 // Optimized field validation without try-catch for each field\n const errors: Array<[string, string]> = [];\n \n // Use for loop instead of Object.entries for better performance\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 // Use safeParse to avoid try-catch overhead\n const parseResult = validator.safeParse(fieldValue);\n \n if (parseResult.success) {\n result[key] = parseResult.data;\n } else {\n errors.push([key, parseResult.error.message]);\n }\n }\n \n // If there were any errors, throw the first one\n if (errors.length > 0) {\n const [key, message] = errors[0];\n throw new Error(getMessages().objectField(key, message));\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 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 // All the chain methods remain the same\n strict(message?: string): VldObjectOptimized<T> {\n return new VldObjectOptimized({\n ...this.config,\n strict: true,\n passthrough: false,\n errorMessage: message\n });\n }\n \n passthrough(): VldObjectOptimized<T> {\n return new VldObjectOptimized({\n ...this.config,\n strict: false,\n passthrough: true\n });\n }\n \n partial(): VldObjectOptimized<{ [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 VldObjectOptimized({ \n ...this.config, \n shape: partialShape \n }) as any;\n }\n \n pick<K extends keyof T>(...keys: K[]): VldObjectOptimized<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 VldObjectOptimized({ \n ...this.config, \n shape: pickedShape \n });\n }\n \n omit<K extends keyof T>(...keys: K[]): VldObjectOptimized<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 VldObjectOptimized({ \n ...this.config, \n shape: omittedShape \n });\n }\n \n extend<U extends Record<string, any>>(\n extension: { [K in keyof U]: VldBase<unknown, U[K]> }\n ): VldObjectOptimized<T & U> {\n return new VldObjectOptimized({\n ...this.config,\n shape: { ...this.config.shape, ...extension } as any\n });\n }\n}"]}
@@ -0,0 +1,34 @@
1
+ import { VldBase, ParseResult } from './base';
2
+ /**
3
+ * Ultra-optimized object validator for maximum performance
4
+ * Features aggressive optimizations for speed over flexibility
5
+ */
6
+ export declare class VldObjectUltra<T extends Record<string, any>> extends VldBase<unknown, T> {
7
+ private readonly config;
8
+ private readonly shapeKeys;
9
+ private readonly validators;
10
+ private readonly keysLength;
11
+ private readonly fastValidate;
12
+ private constructor();
13
+ /**
14
+ * Create ultra-fast validator using direct property access
15
+ */
16
+ private createFastValidator;
17
+ static create<T extends Record<string, any>>(shape: {
18
+ [K in keyof T]: VldBase<unknown, T[K]>;
19
+ }): VldObjectUltra<T>;
20
+ parse(value: unknown): T;
21
+ safeParse(value: unknown): ParseResult<T>;
22
+ strict(message?: string): VldObjectUltra<T>;
23
+ passthrough(): VldObjectUltra<T>;
24
+ partial(): VldObjectUltra<{
25
+ [K in keyof T]?: T[K];
26
+ }>;
27
+ pick<K extends keyof T>(...keys: K[]): VldObjectUltra<Pick<T, K>>;
28
+ omit<K extends keyof T>(...keys: K[]): VldObjectUltra<Omit<T, K>>;
29
+ extend<U extends Record<string, any>>(extension: {
30
+ [K in keyof U]: VldBase<unknown, U[K]>;
31
+ }): VldObjectUltra<T & U>;
32
+ merge<U extends Record<string, any>>(other: VldObjectUltra<U>): VldObjectUltra<T & U>;
33
+ }
34
+ //# sourceMappingURL=object-ultra.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-ultra.d.ts","sourceRoot":"","sources":["../../src/validators/object-ultra.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAe,MAAM,QAAQ,CAAC;AAa3D;;;GAGG;AACH,qBAAa,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAE,SAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACpF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAGpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsC;IAEnE,OAAO;IAWP;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkE3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzC,KAAK,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GAChD,cAAc,CAAC,CAAC,CAAC;IAIpB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC;IASxB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC;IAkBzC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC;IAS3C,WAAW,IAAI,cAAc,CAAC,CAAC,CAAC;IAQhC,OAAO,IAAI,cAAc,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;IAWpD,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAajE,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAcjE,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClC,SAAS,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GACpD,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC;IAOxB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GACvB,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC;CAMzB"}
@@ -0,0 +1,175 @@
1
+ import { VldBase, VldOptional } from './base.js';
2
+ import { getMessages } from '../locales.js';
3
+ /**
4
+ * Ultra-optimized object validator for maximum performance
5
+ * Features aggressive optimizations for speed over flexibility
6
+ */
7
+ export class VldObjectUltra extends VldBase {
8
+ constructor(config) {
9
+ super();
10
+ this.config = config;
11
+ this.shapeKeys = Object.keys(config.shape);
12
+ this.validators = this.shapeKeys.map(key => config.shape[key]);
13
+ this.keysLength = this.shapeKeys.length;
14
+ // Pre-compile optimized validation function
15
+ this.fastValidate = this.createFastValidator();
16
+ }
17
+ /**
18
+ * Create ultra-fast validator using direct property access
19
+ */
20
+ createFastValidator() {
21
+ const keys = this.shapeKeys;
22
+ const validators = this.validators;
23
+ const length = this.keysLength;
24
+ // Return optimized function with direct property access
25
+ return (obj) => {
26
+ const result = {};
27
+ // Unrolled loop for small objects (most common case)
28
+ if (length <= 4) {
29
+ // Manual unrolling for 1-4 properties
30
+ for (let i = 0; i < length; i++) {
31
+ const key = keys[i];
32
+ const validator = validators[i];
33
+ const value = obj[key];
34
+ // Inline fast-path validation
35
+ if (validator.constructor.name === 'VldString') {
36
+ if (typeof value !== 'string') {
37
+ throw new Error(`Field ${key}: Expected string`);
38
+ }
39
+ result[key] = value;
40
+ }
41
+ else if (validator.constructor.name === 'VldNumber') {
42
+ if (typeof value !== 'number' || isNaN(value)) {
43
+ throw new Error(`Field ${key}: Expected number`);
44
+ }
45
+ result[key] = value;
46
+ }
47
+ else if (validator.constructor.name === 'VldBoolean') {
48
+ if (typeof value !== 'boolean') {
49
+ throw new Error(`Field ${key}: Expected boolean`);
50
+ }
51
+ result[key] = value;
52
+ }
53
+ else if (validator.constructor.name === 'VldDate') {
54
+ if (!(value instanceof Date)) {
55
+ throw new Error(`Field ${key}: Expected date`);
56
+ }
57
+ result[key] = value;
58
+ }
59
+ else {
60
+ // Fallback to safeParse for complex validators
61
+ const parseResult = validator.safeParse(value);
62
+ if (!parseResult.success) {
63
+ throw parseResult.error;
64
+ }
65
+ result[key] = parseResult.data;
66
+ }
67
+ }
68
+ }
69
+ else {
70
+ // Standard loop for larger objects
71
+ for (let i = 0; i < length; i++) {
72
+ const key = keys[i];
73
+ const validator = validators[i];
74
+ const value = obj[key];
75
+ const parseResult = validator.safeParse(value);
76
+ if (!parseResult.success) {
77
+ throw new Error(getMessages().objectField(key, parseResult.error.message));
78
+ }
79
+ result[key] = parseResult.data;
80
+ }
81
+ }
82
+ return result;
83
+ };
84
+ }
85
+ static create(shape) {
86
+ return new VldObjectUltra({ shape });
87
+ }
88
+ parse(value) {
89
+ // Ultra-fast type check
90
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
91
+ throw new Error(this.config.errorMessage || getMessages().invalidObject);
92
+ }
93
+ return this.fastValidate(value);
94
+ }
95
+ safeParse(value) {
96
+ // Ultra-fast type check
97
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
98
+ return {
99
+ success: false,
100
+ error: new Error(this.config.errorMessage || getMessages().invalidObject)
101
+ };
102
+ }
103
+ try {
104
+ const result = this.fastValidate(value);
105
+ return { success: true, data: result };
106
+ }
107
+ catch (error) {
108
+ return { success: false, error: error };
109
+ }
110
+ }
111
+ // Minimal set of chainable methods for performance
112
+ strict(message) {
113
+ return new VldObjectUltra({
114
+ ...this.config,
115
+ strict: true,
116
+ passthrough: false,
117
+ errorMessage: message
118
+ });
119
+ }
120
+ passthrough() {
121
+ return new VldObjectUltra({
122
+ ...this.config,
123
+ strict: false,
124
+ passthrough: true
125
+ });
126
+ }
127
+ partial() {
128
+ const partialShape = {};
129
+ for (const key in this.config.shape) {
130
+ partialShape[key] = new VldOptional(this.config.shape[key]);
131
+ }
132
+ return new VldObjectUltra({
133
+ ...this.config,
134
+ shape: partialShape
135
+ });
136
+ }
137
+ pick(...keys) {
138
+ const pickedShape = {};
139
+ for (const key of keys) {
140
+ if (key in this.config.shape) {
141
+ pickedShape[key] = this.config.shape[key];
142
+ }
143
+ }
144
+ return new VldObjectUltra({
145
+ ...this.config,
146
+ shape: pickedShape
147
+ });
148
+ }
149
+ omit(...keys) {
150
+ const omittedShape = {};
151
+ const keysToOmit = new Set(keys);
152
+ for (const key in this.config.shape) {
153
+ if (!keysToOmit.has(key)) {
154
+ omittedShape[key] = this.config.shape[key];
155
+ }
156
+ }
157
+ return new VldObjectUltra({
158
+ ...this.config,
159
+ shape: omittedShape
160
+ });
161
+ }
162
+ extend(extension) {
163
+ return new VldObjectUltra({
164
+ ...this.config,
165
+ shape: { ...this.config.shape, ...extension }
166
+ });
167
+ }
168
+ merge(other) {
169
+ return new VldObjectUltra({
170
+ ...this.config,
171
+ shape: { ...this.config.shape, ...other.config.shape }
172
+ });
173
+ }
174
+ }
175
+ //# sourceMappingURL=object-ultra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-ultra.js","sourceRoot":"","sources":["../../src/validators/object-ultra.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult, VldOptional } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Configuration for ultra-optimized 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 * Ultra-optimized object validator for maximum performance\n * Features aggressive optimizations for speed over flexibility\n */\nexport class VldObjectUltra<T extends Record<string, any>> extends VldBase<unknown, T> {\n private readonly config: ObjectValidatorConfig<T>;\n private readonly shapeKeys: string[];\n private readonly validators: VldBase<unknown, any>[];\n private readonly keysLength: number;\n \n // Pre-computed validation function for hot path\n private readonly fastValidate: (obj: Record<string, unknown>) => T;\n \n private constructor(config: ObjectValidatorConfig<T>) {\n super();\n this.config = config;\n this.shapeKeys = Object.keys(config.shape);\n this.validators = this.shapeKeys.map(key => config.shape[key]);\n this.keysLength = this.shapeKeys.length;\n \n // Pre-compile optimized validation function\n this.fastValidate = this.createFastValidator();\n }\n \n /**\n * Create ultra-fast validator using direct property access\n */\n private createFastValidator(): (obj: Record<string, unknown>) => T {\n const keys = this.shapeKeys;\n const validators = this.validators;\n const length = this.keysLength;\n \n // Return optimized function with direct property access\n return (obj: Record<string, unknown>): T => {\n const result: any = {};\n \n // Unrolled loop for small objects (most common case)\n if (length <= 4) {\n // Manual unrolling for 1-4 properties\n for (let i = 0; i < length; i++) {\n const key = keys[i];\n const validator = validators[i];\n const value = obj[key];\n \n // Inline fast-path validation\n if (validator.constructor.name === 'VldString') {\n if (typeof value !== 'string') {\n throw new Error(`Field ${key}: Expected string`);\n }\n result[key] = value;\n } else if (validator.constructor.name === 'VldNumber') {\n if (typeof value !== 'number' || isNaN(value)) {\n throw new Error(`Field ${key}: Expected number`);\n }\n result[key] = value;\n } else if (validator.constructor.name === 'VldBoolean') {\n if (typeof value !== 'boolean') {\n throw new Error(`Field ${key}: Expected boolean`);\n }\n result[key] = value;\n } else if (validator.constructor.name === 'VldDate') {\n if (!(value instanceof Date)) {\n throw new Error(`Field ${key}: Expected date`);\n }\n result[key] = value;\n } else {\n // Fallback to safeParse for complex validators\n const parseResult = validator.safeParse(value);\n if (!parseResult.success) {\n throw parseResult.error;\n }\n result[key] = parseResult.data;\n }\n }\n } else {\n // Standard loop for larger objects\n for (let i = 0; i < length; i++) {\n const key = keys[i];\n const validator = validators[i];\n const value = obj[key];\n \n const parseResult = validator.safeParse(value);\n if (!parseResult.success) {\n throw new Error(getMessages().objectField(key, parseResult.error.message));\n }\n result[key] = parseResult.data;\n }\n }\n \n return result as T;\n };\n }\n \n static create<T extends Record<string, any>>(\n shape: { [K in keyof T]: VldBase<unknown, T[K]> }\n ): VldObjectUltra<T> {\n return new VldObjectUltra({ shape });\n }\n \n parse(value: unknown): T {\n // Ultra-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 return this.fastValidate(value as Record<string, unknown>);\n }\n \n safeParse(value: unknown): ParseResult<T> {\n // Ultra-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 try {\n const result = this.fastValidate(value as Record<string, unknown>);\n return { success: true, data: result };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n \n // Minimal set of chainable methods for performance\n strict(message?: string): VldObjectUltra<T> {\n return new VldObjectUltra({\n ...this.config,\n strict: true,\n passthrough: false,\n errorMessage: message\n });\n }\n \n passthrough(): VldObjectUltra<T> {\n return new VldObjectUltra({\n ...this.config,\n strict: false,\n passthrough: true\n });\n }\n \n partial(): VldObjectUltra<{ [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 VldObjectUltra({ \n ...this.config, \n shape: partialShape \n }) as any;\n }\n \n pick<K extends keyof T>(...keys: K[]): VldObjectUltra<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 VldObjectUltra({ \n ...this.config, \n shape: pickedShape \n });\n }\n \n omit<K extends keyof T>(...keys: K[]): VldObjectUltra<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 VldObjectUltra({ \n ...this.config, \n shape: omittedShape \n });\n }\n \n extend<U extends Record<string, any>>(\n extension: { [K in keyof U]: VldBase<unknown, U[K]> }\n ): VldObjectUltra<T & U> {\n return new VldObjectUltra({\n ...this.config,\n shape: { ...this.config.shape, ...extension } as any\n });\n }\n \n merge<U extends Record<string, any>>(\n other: VldObjectUltra<U>\n ): VldObjectUltra<T & U> {\n return new VldObjectUltra({\n ...this.config,\n shape: { ...this.config.shape, ...other.config.shape } as any\n });\n }\n}"]}
@@ -0,0 +1,73 @@
1
+ import { VldBase, ParseResult } from './base';
2
+ /**
3
+ * Optimized immutable object validator with chainable methods
4
+ * Features pre-computed keys and Set-based lookups for better performance
5
+ */
6
+ export declare class VldObject<T extends Record<string, any>> extends VldBase<unknown, T> {
7
+ private readonly config;
8
+ private readonly shapeKeys;
9
+ private readonly shapeKeysSet;
10
+ /**
11
+ * Private constructor to enforce immutability
12
+ */
13
+ private constructor();
14
+ /**
15
+ * Create a new object validator
16
+ */
17
+ static create<T extends Record<string, any>>(shape: {
18
+ [K in keyof T]: VldBase<unknown, T[K]>;
19
+ }): VldObject<T>;
20
+ /**
21
+ * Parse and validate an object value
22
+ * Ultra-optimized with inline type checks and minimal overhead
23
+ */
24
+ parse(value: unknown): T;
25
+ /**
26
+ * Safely parse and validate an object value
27
+ * Optimized version using pre-computed keys
28
+ */
29
+ safeParse(value: unknown): ParseResult<T>;
30
+ /**
31
+ * Create a new validator in strict mode (no extra keys allowed)
32
+ */
33
+ strict(message?: string): VldObject<T>;
34
+ /**
35
+ * Create a new validator in passthrough mode (extra keys are preserved)
36
+ */
37
+ passthrough(): VldObject<T>;
38
+ /**
39
+ * Create a new validator with all fields optional
40
+ */
41
+ partial(): VldObject<{
42
+ [K in keyof T]?: T[K];
43
+ }>;
44
+ /**
45
+ * Create a new validator with deep partial (nested objects also partial)
46
+ */
47
+ deepPartial(): VldObject<any>;
48
+ /**
49
+ * Create a new validator with only specified keys
50
+ */
51
+ pick<K extends keyof T>(...keys: K[]): VldObject<Pick<T, K>>;
52
+ /**
53
+ * Create a new validator without specified keys
54
+ */
55
+ omit<K extends keyof T>(...keys: K[]): VldObject<Omit<T, K>>;
56
+ /**
57
+ * Create a new validator with additional fields
58
+ */
59
+ extend<U extends Record<string, any>>(extension: {
60
+ [K in keyof U]: VldBase<unknown, U[K]>;
61
+ }): VldObject<T & U>;
62
+ /**
63
+ * Create a new validator by merging with another object validator
64
+ */
65
+ merge<U extends Record<string, any>>(other: VldObject<U>): VldObject<T & U>;
66
+ /**
67
+ * Create a new validator with all fields required (removes optional)
68
+ */
69
+ required(): VldObject<{
70
+ [K in keyof T]-?: T[K];
71
+ }>;
72
+ }
73
+ //# sourceMappingURL=object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/validators/object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAe,MAAM,QAAQ,CAAC;AAa3D;;;GAGG;AACH,qBAAa,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAE,SAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAE3C;;OAEG;IACH,OAAO;IAQP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzC,KAAK,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GAChD,SAAS,CAAC,CAAC,CAAC;IAIf;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC;IAoFxB;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC;IAiEzC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAStC;;OAEG;IACH,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC;IAQ3B;;OAEG;IACH,OAAO,IAAI,SAAS,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;IAW/C;;OAEG;IACH,WAAW,IAAI,SAAS,CAAC,GAAG,CAAC;IAgB7B;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAa5D;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAc5D;;OAEG;IACH,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClC,SAAS,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GACpD,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;IAOnB;;OAEG;IACH,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAClB,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;IAOnB;;OAEG;IACH,QAAQ,IAAI,SAAS,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;CAgBlD"}