@oxog/vld 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/README.md +61 -43
  3. package/dist/coercion/bigint.js +1 -1
  4. package/dist/coercion/boolean.d.ts.map +1 -1
  5. package/dist/coercion/boolean.js +7 -3
  6. package/dist/coercion/boolean.js.map +1 -1
  7. package/dist/coercion/date.js +1 -1
  8. package/dist/coercion/number.d.ts.map +1 -1
  9. package/dist/coercion/number.js +20 -4
  10. package/dist/coercion/number.js.map +1 -1
  11. package/dist/coercion/string.d.ts.map +1 -1
  12. package/dist/coercion/string.js +84 -12
  13. package/dist/coercion/string.js.map +1 -1
  14. package/dist/index.d.ts +593 -3
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +76 -5
  17. package/dist/index.js.map +1 -1
  18. package/dist/locales/af.d.ts.map +1 -1
  19. package/dist/locales/af.js +21 -4
  20. package/dist/locales/af.js.map +1 -1
  21. package/dist/locales/ar.d.ts.map +1 -1
  22. package/dist/locales/ar.js +21 -4
  23. package/dist/locales/ar.js.map +1 -1
  24. package/dist/locales/backup-en.d.ts +3 -0
  25. package/dist/locales/backup-en.d.ts.map +1 -0
  26. package/dist/locales/backup-en.js +105 -0
  27. package/dist/locales/backup-en.js.map +1 -0
  28. package/dist/locales/bn.d.ts.map +1 -1
  29. package/dist/locales/bn.js +21 -4
  30. package/dist/locales/bn.js.map +1 -1
  31. package/dist/locales/da.d.ts.map +1 -1
  32. package/dist/locales/da.js +21 -4
  33. package/dist/locales/da.js.map +1 -1
  34. package/dist/locales/de.d.ts.map +1 -1
  35. package/dist/locales/de.js +21 -4
  36. package/dist/locales/de.js.map +1 -1
  37. package/dist/locales/en.d.ts.map +1 -1
  38. package/dist/locales/en.js +21 -4
  39. package/dist/locales/en.js.map +1 -1
  40. package/dist/locales/es-MX.d.ts.map +1 -1
  41. package/dist/locales/es-MX.js +20 -4
  42. package/dist/locales/es-MX.js.map +1 -1
  43. package/dist/locales/es.d.ts.map +1 -1
  44. package/dist/locales/es.js +21 -4
  45. package/dist/locales/es.js.map +1 -1
  46. package/dist/locales/fi.d.ts.map +1 -1
  47. package/dist/locales/fi.js +21 -4
  48. package/dist/locales/fi.js.map +1 -1
  49. package/dist/locales/fr.d.ts.map +1 -1
  50. package/dist/locales/fr.js +21 -4
  51. package/dist/locales/fr.js.map +1 -1
  52. package/dist/locales/hi.d.ts.map +1 -1
  53. package/dist/locales/hi.js +21 -4
  54. package/dist/locales/hi.js.map +1 -1
  55. package/dist/locales/id.d.ts.map +1 -1
  56. package/dist/locales/id.js +21 -4
  57. package/dist/locales/id.js.map +1 -1
  58. package/dist/locales/it.d.ts.map +1 -1
  59. package/dist/locales/it.js +21 -4
  60. package/dist/locales/it.js.map +1 -1
  61. package/dist/locales/ja.d.ts.map +1 -1
  62. package/dist/locales/ja.js +21 -4
  63. package/dist/locales/ja.js.map +1 -1
  64. package/dist/locales/ko.d.ts.map +1 -1
  65. package/dist/locales/ko.js +21 -4
  66. package/dist/locales/ko.js.map +1 -1
  67. package/dist/locales/nl.d.ts.map +1 -1
  68. package/dist/locales/nl.js +21 -4
  69. package/dist/locales/nl.js.map +1 -1
  70. package/dist/locales/no.d.ts.map +1 -1
  71. package/dist/locales/no.js +21 -4
  72. package/dist/locales/no.js.map +1 -1
  73. package/dist/locales/pl.d.ts.map +1 -1
  74. package/dist/locales/pl.js +21 -4
  75. package/dist/locales/pl.js.map +1 -1
  76. package/dist/locales/pt-BR.d.ts.map +1 -1
  77. package/dist/locales/pt-BR.js +21 -4
  78. package/dist/locales/pt-BR.js.map +1 -1
  79. package/dist/locales/pt.d.ts.map +1 -1
  80. package/dist/locales/pt.js +21 -4
  81. package/dist/locales/pt.js.map +1 -1
  82. package/dist/locales/ru.d.ts.map +1 -1
  83. package/dist/locales/ru.js +21 -4
  84. package/dist/locales/ru.js.map +1 -1
  85. package/dist/locales/sv.d.ts.map +1 -1
  86. package/dist/locales/sv.js +21 -4
  87. package/dist/locales/sv.js.map +1 -1
  88. package/dist/locales/sw.d.ts.map +1 -1
  89. package/dist/locales/sw.js +21 -4
  90. package/dist/locales/sw.js.map +1 -1
  91. package/dist/locales/th.d.ts.map +1 -1
  92. package/dist/locales/th.js +21 -4
  93. package/dist/locales/th.js.map +1 -1
  94. package/dist/locales/tr.d.ts.map +1 -1
  95. package/dist/locales/tr.js +21 -4
  96. package/dist/locales/tr.js.map +1 -1
  97. package/dist/locales/types.d.ts +16 -3
  98. package/dist/locales/types.d.ts.map +1 -1
  99. package/dist/locales/types.js.map +1 -1
  100. package/dist/locales/vi.d.ts.map +1 -1
  101. package/dist/locales/vi.js +21 -4
  102. package/dist/locales/vi.js.map +1 -1
  103. package/dist/locales/zh.d.ts.map +1 -1
  104. package/dist/locales/zh.js +21 -4
  105. package/dist/locales/zh.js.map +1 -1
  106. package/dist/utils/codec-utils.d.ts +3 -1
  107. package/dist/utils/codec-utils.d.ts.map +1 -1
  108. package/dist/utils/codec-utils.js +110 -5
  109. package/dist/utils/codec-utils.js.map +1 -1
  110. package/dist/utils/deep-merge.d.ts +3 -0
  111. package/dist/utils/deep-merge.d.ts.map +1 -1
  112. package/dist/utils/deep-merge.js +30 -22
  113. package/dist/utils/deep-merge.js.map +1 -1
  114. package/dist/utils/ip-validation.d.ts +11 -0
  115. package/dist/utils/ip-validation.d.ts.map +1 -0
  116. package/dist/utils/ip-validation.js +78 -0
  117. package/dist/utils/ip-validation.js.map +1 -0
  118. package/dist/utils/security.d.ts +12 -0
  119. package/dist/utils/security.d.ts.map +1 -0
  120. package/dist/utils/security.js +61 -0
  121. package/dist/utils/security.js.map +1 -0
  122. package/dist/validators/array.d.ts +7 -0
  123. package/dist/validators/array.d.ts.map +1 -1
  124. package/dist/validators/array.js +57 -2
  125. package/dist/validators/array.js.map +1 -1
  126. package/dist/validators/base.d.ts +131 -0
  127. package/dist/validators/base.d.ts.map +1 -1
  128. package/dist/validators/base.js +247 -1
  129. package/dist/validators/base.js.map +1 -1
  130. package/dist/validators/base64.d.ts.map +1 -1
  131. package/dist/validators/base64.js +6 -3
  132. package/dist/validators/base64.js.map +1 -1
  133. package/dist/validators/bigint.d.ts +20 -0
  134. package/dist/validators/bigint.d.ts.map +1 -1
  135. package/dist/validators/bigint.js +39 -1
  136. package/dist/validators/bigint.js.map +1 -1
  137. package/dist/validators/boolean.js +29 -1
  138. package/dist/validators/boolean.js.map +1 -1
  139. package/dist/validators/codec.js +1 -1
  140. package/dist/validators/custom.d.ts +47 -0
  141. package/dist/validators/custom.d.ts.map +1 -0
  142. package/dist/validators/custom.js +50 -0
  143. package/dist/validators/custom.js.map +1 -0
  144. package/dist/validators/date.d.ts +21 -1
  145. package/dist/validators/date.d.ts.map +1 -1
  146. package/dist/validators/date.js +109 -30
  147. package/dist/validators/date.js.map +1 -1
  148. package/dist/validators/discriminated-union.d.ts +29 -0
  149. package/dist/validators/discriminated-union.d.ts.map +1 -0
  150. package/dist/validators/discriminated-union.js +98 -0
  151. package/dist/validators/discriminated-union.js.map +1 -0
  152. package/dist/validators/enum.d.ts +10 -0
  153. package/dist/validators/enum.d.ts.map +1 -1
  154. package/dist/validators/enum.js +38 -1
  155. package/dist/validators/enum.js.map +1 -1
  156. package/dist/validators/file.d.ts +57 -0
  157. package/dist/validators/file.d.ts.map +1 -0
  158. package/dist/validators/file.js +114 -0
  159. package/dist/validators/file.js.map +1 -0
  160. package/dist/validators/function.d.ts +26 -0
  161. package/dist/validators/function.d.ts.map +1 -0
  162. package/dist/validators/function.js +45 -0
  163. package/dist/validators/function.js.map +1 -0
  164. package/dist/validators/hex.d.ts.map +1 -1
  165. package/dist/validators/hex.js +3 -2
  166. package/dist/validators/hex.js.map +1 -1
  167. package/dist/validators/index.d.ts +18 -1
  168. package/dist/validators/index.d.ts.map +1 -1
  169. package/dist/validators/index.js +16 -1
  170. package/dist/validators/index.js.map +1 -1
  171. package/dist/validators/intersection.d.ts.map +1 -1
  172. package/dist/validators/intersection.js +15 -8
  173. package/dist/validators/intersection.js.map +1 -1
  174. package/dist/validators/json.d.ts +26 -0
  175. package/dist/validators/json.d.ts.map +1 -0
  176. package/dist/validators/json.js +64 -0
  177. package/dist/validators/json.js.map +1 -0
  178. package/dist/validators/lazy.d.ts +28 -0
  179. package/dist/validators/lazy.d.ts.map +1 -0
  180. package/dist/validators/lazy.js +42 -0
  181. package/dist/validators/lazy.js.map +1 -0
  182. package/dist/validators/literal.js +1 -1
  183. package/dist/validators/map.js +1 -1
  184. package/dist/validators/nan.d.ts +17 -0
  185. package/dist/validators/nan.d.ts.map +1 -0
  186. package/dist/validators/nan.js +32 -0
  187. package/dist/validators/nan.js.map +1 -0
  188. package/dist/validators/never.js +1 -1
  189. package/dist/validators/null.d.ts +16 -0
  190. package/dist/validators/null.d.ts.map +1 -0
  191. package/dist/validators/null.js +31 -0
  192. package/dist/validators/null.js.map +1 -0
  193. package/dist/validators/number.d.ts +22 -0
  194. package/dist/validators/number.d.ts.map +1 -1
  195. package/dist/validators/number.js +56 -4
  196. package/dist/validators/number.js.map +1 -1
  197. package/dist/validators/object.d.ts +37 -0
  198. package/dist/validators/object.d.ts.map +1 -1
  199. package/dist/validators/object.js +183 -14
  200. package/dist/validators/object.js.map +1 -1
  201. package/dist/validators/record.d.ts +15 -2
  202. package/dist/validators/record.d.ts.map +1 -1
  203. package/dist/validators/record.js +77 -1
  204. package/dist/validators/record.js.map +1 -1
  205. package/dist/validators/set.js +1 -1
  206. package/dist/validators/string-bool.d.ts +61 -0
  207. package/dist/validators/string-bool.d.ts.map +1 -0
  208. package/dist/validators/string-bool.js +127 -0
  209. package/dist/validators/string-bool.js.map +1 -0
  210. package/dist/validators/string-formats.d.ts +97 -0
  211. package/dist/validators/string-formats.d.ts.map +1 -0
  212. package/dist/validators/string-formats.js +120 -0
  213. package/dist/validators/string-formats.js.map +1 -0
  214. package/dist/validators/string.d.ts.map +1 -1
  215. package/dist/validators/string.js +16 -5
  216. package/dist/validators/string.js.map +1 -1
  217. package/dist/validators/symbol.js +1 -1
  218. package/dist/validators/template-literal.d.ts +32 -0
  219. package/dist/validators/template-literal.d.ts.map +1 -0
  220. package/dist/validators/template-literal.js +101 -0
  221. package/dist/validators/template-literal.js.map +1 -0
  222. package/dist/validators/tuple.js +1 -1
  223. package/dist/validators/uint8array.d.ts +21 -4
  224. package/dist/validators/uint8array.d.ts.map +1 -1
  225. package/dist/validators/uint8array.js +34 -23
  226. package/dist/validators/uint8array.js.map +1 -1
  227. package/dist/validators/undefined.d.ts +16 -0
  228. package/dist/validators/undefined.d.ts.map +1 -0
  229. package/dist/validators/undefined.js +31 -0
  230. package/dist/validators/undefined.js.map +1 -0
  231. package/dist/validators/union.d.ts +3 -0
  232. package/dist/validators/union.d.ts.map +1 -1
  233. package/dist/validators/union.js +46 -41
  234. package/dist/validators/union.js.map +1 -1
  235. package/dist/validators/void.js +1 -1
  236. package/dist/validators/xor.d.ts +23 -0
  237. package/dist/validators/xor.d.ts.map +1 -0
  238. package/dist/validators/xor.js +64 -0
  239. package/dist/validators/xor.js.map +1 -0
  240. package/package.json +2 -2
  241. package/dist/index-new.d.ts.map +0 -1
  242. package/dist/locales.d.ts +0 -54
  243. package/dist/locales.d.ts.map +0 -1
  244. package/dist/locales.js +0 -732
  245. package/dist/locales.js.map +0 -1
  246. package/dist/validators/object-optimized.d.ts +0 -23
  247. package/dist/validators/object-optimized.d.ts.map +0 -1
  248. package/dist/validators/object-optimized.js +0 -179
  249. package/dist/validators/object-optimized.js.map +0 -1
  250. package/dist/validators/object-ultra.d.ts +0 -34
  251. package/dist/validators/object-ultra.d.ts.map +0 -1
  252. package/dist/validators/object-ultra.js +0 -175
  253. package/dist/validators/object-ultra.js.map +0 -1
  254. package/dist/validators/string-ultra.d.ts +0 -49
  255. package/dist/validators/string-ultra.d.ts.map +0 -1
  256. package/dist/validators/string-ultra.js +0 -217
  257. package/dist/validators/string-ultra.js.map +0 -1
  258. package/dist/validators/union-optimized.d.ts +0 -15
  259. package/dist/validators/union-optimized.d.ts.map +0 -1
  260. package/dist/validators/union-optimized.js +0 -92
  261. package/dist/validators/union-optimized.js.map +0 -1
@@ -0,0 +1,101 @@
1
+ import { VldBase } from './base.js';
2
+ import { getMessages } from '../locales/index.js';
3
+ /**
4
+ * Immutable template literal validator
5
+ * Validates strings matching a template pattern
6
+ */
7
+ export class VldTemplateLiteral extends VldBase {
8
+ constructor(pattern) {
9
+ super();
10
+ this.pattern = pattern;
11
+ }
12
+ /**
13
+ * Create a template literal validator from components
14
+ */
15
+ static create(...components) {
16
+ // Build regex pattern from components
17
+ let pattern = '^';
18
+ for (const comp of components) {
19
+ if (typeof comp === 'string') {
20
+ // Escape special regex characters
21
+ pattern += comp.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
22
+ }
23
+ else {
24
+ // Add appropriate pattern based on validator type
25
+ pattern += getPatternForValidator(comp);
26
+ }
27
+ }
28
+ pattern += '$';
29
+ return new VldTemplateLiteral(new RegExp(pattern));
30
+ }
31
+ /**
32
+ * Parse and validate a template literal string
33
+ */
34
+ parse(value) {
35
+ if (typeof value !== 'string') {
36
+ throw new Error(getMessages().invalidString);
37
+ }
38
+ if (!this.pattern.test(value)) {
39
+ throw new Error(getMessages().stringPatternInvalid);
40
+ }
41
+ return value;
42
+ }
43
+ /**
44
+ * Safely parse and validate a template literal string
45
+ */
46
+ safeParse(value) {
47
+ try {
48
+ return { success: true, data: this.parse(value) };
49
+ }
50
+ catch (error) {
51
+ return {
52
+ success: false,
53
+ error: error
54
+ };
55
+ }
56
+ }
57
+ }
58
+ /**
59
+ * Get regex pattern for a validator type
60
+ */
61
+ function getPatternForValidator(validator) {
62
+ // For template literals, we need to identify the validator type
63
+ // and return an appropriate capture group pattern
64
+ const vStr = validator.toString();
65
+ // Check for specific validator types
66
+ if (vStr.includes('VldString')) {
67
+ return '(.+)';
68
+ }
69
+ if (vStr.includes('VldNumber')) {
70
+ return '(-?\\d+(?:\\.\\d+)?)';
71
+ }
72
+ if (vStr.includes('VldBigInt')) {
73
+ return '(-?\\d+)';
74
+ }
75
+ if (vStr.includes('VldBoolean')) {
76
+ return '(true|false)';
77
+ }
78
+ if (vStr.includes('VldNull')) {
79
+ return '(null)';
80
+ }
81
+ if (vStr.includes('VldUndefined')) {
82
+ return '(undefined)';
83
+ }
84
+ if (vStr.includes('VldLiteral')) {
85
+ // Extract literal value from validator
86
+ const match = vStr.match(/value:\s*['"`]([^'"`]+)['"`]/);
87
+ if (match) {
88
+ return '(' + match[1].replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + ')';
89
+ }
90
+ }
91
+ // Default: match any string
92
+ return '(.+)';
93
+ }
94
+ /**
95
+ * Helper function to create template literal validators
96
+ * Usage: v.templateLiteral(v.string(), '-', v.number())
97
+ */
98
+ export function templateLiteral(...components) {
99
+ return VldTemplateLiteral.create(...components);
100
+ }
101
+ //# sourceMappingURL=template-literal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-literal.js","sourceRoot":"","sources":["../../src/validators/template-literal.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Template literal component types\n */\ntype TLComponent = VldBase<any, any> | string;\n\n/**\n * Immutable template literal validator\n * Validates strings matching a template pattern\n */\nexport class VldTemplateLiteral extends VldBase<unknown, string> {\n private constructor(\n private readonly pattern: RegExp\n ) {\n super();\n }\n\n /**\n * Create a template literal validator from components\n */\n static create(...components: TLComponent[]): VldTemplateLiteral {\n // Build regex pattern from components\n let pattern = '^';\n\n for (const comp of components) {\n if (typeof comp === 'string') {\n // Escape special regex characters\n pattern += comp.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n } else {\n // Add appropriate pattern based on validator type\n pattern += getPatternForValidator(comp);\n }\n }\n\n pattern += '$';\n\n return new VldTemplateLiteral(new RegExp(pattern));\n }\n\n /**\n * Parse and validate a template literal string\n */\n parse(value: unknown): string {\n if (typeof value !== 'string') {\n throw new Error(getMessages().invalidString);\n }\n\n if (!this.pattern.test(value)) {\n throw new Error(getMessages().stringPatternInvalid);\n }\n\n return value;\n }\n\n /**\n * Safely parse and validate a template literal string\n */\n safeParse(value: unknown): ParseResult<string> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return {\n success: false,\n error: error as Error\n };\n }\n }\n}\n\n/**\n * Get regex pattern for a validator type\n */\nfunction getPatternForValidator(validator: VldBase<any, any>): string {\n // For template literals, we need to identify the validator type\n // and return an appropriate capture group pattern\n\n const vStr = validator.toString();\n\n // Check for specific validator types\n if (vStr.includes('VldString')) {\n return '(.+)';\n }\n if (vStr.includes('VldNumber')) {\n return '(-?\\\\d+(?:\\\\.\\\\d+)?)';\n }\n if (vStr.includes('VldBigInt')) {\n return '(-?\\\\d+)';\n }\n if (vStr.includes('VldBoolean')) {\n return '(true|false)';\n }\n if (vStr.includes('VldNull')) {\n return '(null)';\n }\n if (vStr.includes('VldUndefined')) {\n return '(undefined)';\n }\n if (vStr.includes('VldLiteral')) {\n // Extract literal value from validator\n const match = vStr.match(/value:\\s*['\"`]([^'\"`]+)['\"`]/);\n if (match) {\n return '(' + match[1].replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + ')';\n }\n }\n\n // Default: match any string\n return '(.+)';\n}\n\n/**\n * Helper function to create template literal validators\n * Usage: v.templateLiteral(v.string(), '-', v.number())\n */\nexport function templateLiteral(...components: TLComponent[]): VldTemplateLiteral {\n return VldTemplateLiteral.create(...components);\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { VldBase } from './base.js';
2
- import { getMessages } from '../locales.js';
2
+ import { getMessages } from '../locales/index.js';
3
3
  /**
4
4
  * Immutable tuple validator for fixed-length arrays
5
5
  */
@@ -1,25 +1,42 @@
1
1
  import { VldBase, ParseResult } from './base';
2
2
  /**
3
- * Uint8Array validator
3
+ * Configuration for Uint8Array validator
4
+ * BUG-NEW-010 FIX: Use config object pattern for immutability
5
+ */
6
+ interface Uint8ArrayValidatorConfig {
7
+ readonly minLength?: number;
8
+ readonly maxLength?: number;
9
+ readonly exactLength?: number;
10
+ }
11
+ /**
12
+ * Uint8Array validator with immutable configuration
13
+ * BUG-NEW-010 FIX: Refactored to follow immutability pattern
4
14
  */
5
15
  export declare class VldUint8Array extends VldBase<Uint8Array, Uint8Array> {
6
- private minLength?;
7
- private maxLength?;
8
- private exactLength?;
16
+ private readonly config;
17
+ /**
18
+ * Protected constructor to maintain immutability
19
+ */
20
+ protected constructor(config?: Uint8ArrayValidatorConfig);
9
21
  parse(value: unknown): Uint8Array;
10
22
  safeParse(value: unknown): ParseResult<Uint8Array>;
11
23
  /**
12
24
  * Set minimum byte length
25
+ * Returns new immutable validator instance
13
26
  */
14
27
  min(length: number): VldUint8Array;
15
28
  /**
16
29
  * Set maximum byte length
30
+ * Returns new immutable validator instance
17
31
  */
18
32
  max(length: number): VldUint8Array;
19
33
  /**
20
34
  * Set exact byte length
35
+ * Returns new immutable validator instance
36
+ * Clears min/max when setting exact length
21
37
  */
22
38
  length(length: number): VldUint8Array;
23
39
  static create(): VldUint8Array;
24
40
  }
41
+ export {};
25
42
  //# sourceMappingURL=uint8array.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"uint8array.d.ts","sourceRoot":"","sources":["../../src/validators/uint8array.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAI9C;;GAEG;AACH,qBAAa,aAAc,SAAQ,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC;IAChE,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAC,CAAS;IAE7B,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU;IAQjC,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC;IA2ClD;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;IAQlC;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;IAQlC;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;IAQrC,MAAM,CAAC,MAAM,IAAI,aAAa;CAG/B"}
1
+ {"version":3,"file":"uint8array.d.ts","sourceRoot":"","sources":["../../src/validators/uint8array.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAI9C;;;GAGG;AACH,UAAU,yBAAyB;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,qBAAa,aAAc,SAAQ,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC;IAChE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IAEnD;;OAEG;IACH,SAAS,aAAa,MAAM,CAAC,EAAE,yBAAyB;IAKxD,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU;IAQjC,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC;IA2ClD;;;OAGG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;IAOlC;;;OAGG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;IAOlC;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;IASrC,MAAM,CAAC,MAAM,IAAI,aAAa;CAG/B"}
@@ -1,10 +1,18 @@
1
1
  import { VldBase } from './base.js';
2
2
  import { VldError, createIssue } from '../errors.js';
3
- import { getMessages } from '../locales.js';
3
+ import { getMessages } from '../locales/index.js';
4
4
  /**
5
- * Uint8Array validator
5
+ * Uint8Array validator with immutable configuration
6
+ * BUG-NEW-010 FIX: Refactored to follow immutability pattern
6
7
  */
7
8
  export class VldUint8Array extends VldBase {
9
+ /**
10
+ * Protected constructor to maintain immutability
11
+ */
12
+ constructor(config) {
13
+ super();
14
+ this.config = config || {};
15
+ }
8
16
  parse(value) {
9
17
  const result = this.safeParse(value);
10
18
  if (!result.success) {
@@ -22,29 +30,29 @@ export class VldUint8Array extends VldBase {
22
30
  };
23
31
  }
24
32
  // Check exact length if specified
25
- if (this.exactLength !== undefined && value.length !== this.exactLength) {
33
+ if (this.config.exactLength !== undefined && value.length !== this.config.exactLength) {
26
34
  return {
27
35
  success: false,
28
36
  error: new VldError([
29
- createIssue('custom', [], getMessages().uint8ArrayExactLength.replace('{length}', this.exactLength.toString()))
37
+ createIssue('custom', [], getMessages().uint8ArrayExactLength(this.config.exactLength))
30
38
  ])
31
39
  };
32
40
  }
33
41
  // Check minimum length
34
- if (this.minLength !== undefined && value.length < this.minLength) {
42
+ if (this.config.minLength !== undefined && value.length < this.config.minLength) {
35
43
  return {
36
44
  success: false,
37
45
  error: new VldError([
38
- createIssue('custom', [], getMessages().uint8ArrayMinLength.replace('{min}', this.minLength.toString()))
46
+ createIssue('custom', [], getMessages().uint8ArrayMinLength(this.config.minLength))
39
47
  ])
40
48
  };
41
49
  }
42
50
  // Check maximum length
43
- if (this.maxLength !== undefined && value.length > this.maxLength) {
51
+ if (this.config.maxLength !== undefined && value.length > this.config.maxLength) {
44
52
  return {
45
53
  success: false,
46
54
  error: new VldError([
47
- createIssue('custom', [], getMessages().uint8ArrayMaxLength.replace('{max}', this.maxLength.toString()))
55
+ createIssue('custom', [], getMessages().uint8ArrayMaxLength(this.config.maxLength))
48
56
  ])
49
57
  };
50
58
  }
@@ -52,33 +60,36 @@ export class VldUint8Array extends VldBase {
52
60
  }
53
61
  /**
54
62
  * Set minimum byte length
63
+ * Returns new immutable validator instance
55
64
  */
56
65
  min(length) {
57
- const validator = new VldUint8Array();
58
- validator.minLength = length;
59
- validator.maxLength = this.maxLength;
60
- validator.exactLength = this.exactLength;
61
- return validator;
66
+ return new VldUint8Array({
67
+ ...this.config,
68
+ minLength: length
69
+ });
62
70
  }
63
71
  /**
64
72
  * Set maximum byte length
73
+ * Returns new immutable validator instance
65
74
  */
66
75
  max(length) {
67
- const validator = new VldUint8Array();
68
- validator.minLength = this.minLength;
69
- validator.maxLength = length;
70
- validator.exactLength = this.exactLength;
71
- return validator;
76
+ return new VldUint8Array({
77
+ ...this.config,
78
+ maxLength: length
79
+ });
72
80
  }
73
81
  /**
74
82
  * Set exact byte length
83
+ * Returns new immutable validator instance
84
+ * Clears min/max when setting exact length
75
85
  */
76
86
  length(length) {
77
- const validator = new VldUint8Array();
78
- validator.minLength = this.minLength;
79
- validator.maxLength = this.maxLength;
80
- validator.exactLength = length;
81
- return validator;
87
+ return new VldUint8Array({
88
+ exactLength: length,
89
+ // Clear min/max when exact length is set
90
+ minLength: undefined,
91
+ maxLength: undefined
92
+ });
82
93
  }
83
94
  static create() {
84
95
  return new VldUint8Array();
@@ -1 +1 @@
1
- {"version":3,"file":"uint8array.js","sourceRoot":"","sources":["../../src/validators/uint8array.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { VldError, createIssue } from '../errors';\nimport { getMessages } from '../locales';\n\n/**\n * Uint8Array validator\n */\nexport class VldUint8Array extends VldBase<Uint8Array, Uint8Array> {\n private minLength?: number;\n private maxLength?: number;\n private exactLength?: number;\n \n parse(value: unknown): Uint8Array {\n const result = this.safeParse(value);\n if (!result.success) {\n throw result.error;\n }\n return result.data;\n }\n \n safeParse(value: unknown): ParseResult<Uint8Array> {\n if (!(value instanceof Uint8Array)) {\n return {\n success: false,\n error: new VldError([\n createIssue('invalid_type', [], getMessages().expectedUint8Array)\n ])\n };\n }\n \n // Check exact length if specified\n if (this.exactLength !== undefined && value.length !== this.exactLength) {\n return {\n success: false,\n error: new VldError([\n createIssue('custom', [], getMessages().uint8ArrayExactLength.replace('{length}', this.exactLength.toString()))\n ])\n };\n }\n \n // Check minimum length\n if (this.minLength !== undefined && value.length < this.minLength) {\n return {\n success: false,\n error: new VldError([\n createIssue('custom', [], getMessages().uint8ArrayMinLength.replace('{min}', this.minLength.toString()))\n ])\n };\n }\n \n // Check maximum length\n if (this.maxLength !== undefined && value.length > this.maxLength) {\n return {\n success: false,\n error: new VldError([\n createIssue('custom', [], getMessages().uint8ArrayMaxLength.replace('{max}', this.maxLength.toString()))\n ])\n };\n }\n \n return { success: true, data: value };\n }\n \n /**\n * Set minimum byte length\n */\n min(length: number): VldUint8Array {\n const validator = new VldUint8Array();\n validator.minLength = length;\n validator.maxLength = this.maxLength;\n validator.exactLength = this.exactLength;\n return validator;\n }\n \n /**\n * Set maximum byte length\n */\n max(length: number): VldUint8Array {\n const validator = new VldUint8Array();\n validator.minLength = this.minLength;\n validator.maxLength = length;\n validator.exactLength = this.exactLength;\n return validator;\n }\n \n /**\n * Set exact byte length\n */\n length(length: number): VldUint8Array {\n const validator = new VldUint8Array();\n validator.minLength = this.minLength;\n validator.maxLength = this.maxLength;\n validator.exactLength = length;\n return validator;\n }\n \n static create(): VldUint8Array {\n return new VldUint8Array();\n }\n}"]}
1
+ {"version":3,"file":"uint8array.js","sourceRoot":"","sources":["../../src/validators/uint8array.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { VldError, createIssue } from '../errors';\r\nimport { getMessages } from '../locales';\r\n\r\n/**\r\n * Configuration for Uint8Array validator\r\n * BUG-NEW-010 FIX: Use config object pattern for immutability\r\n */\r\ninterface Uint8ArrayValidatorConfig {\r\n readonly minLength?: number;\r\n readonly maxLength?: number;\r\n readonly exactLength?: number;\r\n}\r\n\r\n/**\r\n * Uint8Array validator with immutable configuration\r\n * BUG-NEW-010 FIX: Refactored to follow immutability pattern\r\n */\r\nexport class VldUint8Array extends VldBase<Uint8Array, Uint8Array> {\r\n private readonly config: Uint8ArrayValidatorConfig;\r\n\r\n /**\r\n * Protected constructor to maintain immutability\r\n */\r\n protected constructor(config?: Uint8ArrayValidatorConfig) {\r\n super();\r\n this.config = config || {};\r\n }\r\n\r\n parse(value: unknown): Uint8Array {\r\n const result = this.safeParse(value);\r\n if (!result.success) {\r\n throw result.error;\r\n }\r\n return result.data;\r\n }\r\n\r\n safeParse(value: unknown): ParseResult<Uint8Array> {\r\n if (!(value instanceof Uint8Array)) {\r\n return {\r\n success: false,\r\n error: new VldError([\r\n createIssue('invalid_type', [], getMessages().expectedUint8Array)\r\n ])\r\n };\r\n }\r\n\r\n // Check exact length if specified\r\n if (this.config.exactLength !== undefined && value.length !== this.config.exactLength) {\r\n return {\r\n success: false,\r\n error: new VldError([\r\n createIssue('custom', [], getMessages().uint8ArrayExactLength(this.config.exactLength))\r\n ])\r\n };\r\n }\r\n\r\n // Check minimum length\r\n if (this.config.minLength !== undefined && value.length < this.config.minLength) {\r\n return {\r\n success: false,\r\n error: new VldError([\r\n createIssue('custom', [], getMessages().uint8ArrayMinLength(this.config.minLength))\r\n ])\r\n };\r\n }\r\n\r\n // Check maximum length\r\n if (this.config.maxLength !== undefined && value.length > this.config.maxLength) {\r\n return {\r\n success: false,\r\n error: new VldError([\r\n createIssue('custom', [], getMessages().uint8ArrayMaxLength(this.config.maxLength))\r\n ])\r\n };\r\n }\r\n\r\n return { success: true, data: value };\r\n }\r\n\r\n /**\r\n * Set minimum byte length\r\n * Returns new immutable validator instance\r\n */\r\n min(length: number): VldUint8Array {\r\n return new VldUint8Array({\r\n ...this.config,\r\n minLength: length\r\n });\r\n }\r\n\r\n /**\r\n * Set maximum byte length\r\n * Returns new immutable validator instance\r\n */\r\n max(length: number): VldUint8Array {\r\n return new VldUint8Array({\r\n ...this.config,\r\n maxLength: length\r\n });\r\n }\r\n\r\n /**\r\n * Set exact byte length\r\n * Returns new immutable validator instance\r\n * Clears min/max when setting exact length\r\n */\r\n length(length: number): VldUint8Array {\r\n return new VldUint8Array({\r\n exactLength: length,\r\n // Clear min/max when exact length is set\r\n minLength: undefined,\r\n maxLength: undefined\r\n });\r\n }\r\n\r\n static create(): VldUint8Array {\r\n return new VldUint8Array();\r\n }\r\n}\r\n"]}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * VldUndefined - Validates that a value is exactly undefined
3
+ * Part of Zod 4 API parity implementation
4
+ */
5
+ import { VldBase } from './base';
6
+ import type { ParseResult } from './base';
7
+ /**
8
+ * Undefined validator - validates that a value is exactly undefined
9
+ */
10
+ export declare class VldUndefined extends VldBase<unknown, undefined> {
11
+ private constructor();
12
+ static create(): VldUndefined;
13
+ parse(value: unknown): undefined;
14
+ safeParse(value: unknown): ParseResult<undefined>;
15
+ }
16
+ //# sourceMappingURL=undefined.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"undefined.d.ts","sourceRoot":"","sources":["../../src/validators/undefined.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C;;GAEG;AACH,qBAAa,YAAa,SAAQ,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;IAC3D,OAAO;IAIP,MAAM,CAAC,MAAM,IAAI,YAAY;IAI7B,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS;IAOhC,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC;CAOlD"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * VldUndefined - Validates that a value is exactly undefined
3
+ * Part of Zod 4 API parity implementation
4
+ */
5
+ import { VldBase } from './base.js';
6
+ /**
7
+ * Undefined validator - validates that a value is exactly undefined
8
+ */
9
+ export class VldUndefined extends VldBase {
10
+ constructor() {
11
+ super();
12
+ }
13
+ static create() {
14
+ return new VldUndefined();
15
+ }
16
+ parse(value) {
17
+ if (value !== undefined) {
18
+ throw new Error(`Expected undefined, received ${typeof value}`);
19
+ }
20
+ return undefined;
21
+ }
22
+ safeParse(value) {
23
+ try {
24
+ return { success: true, data: this.parse(value) };
25
+ }
26
+ catch (error) {
27
+ return { success: false, error: error };
28
+ }
29
+ }
30
+ }
31
+ //# sourceMappingURL=undefined.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"undefined.js","sourceRoot":"","sources":["../../src/validators/undefined.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGjC;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,OAA2B;IAC3D;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,KAAK,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,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;CACF","sourcesContent":["/**\n * VldUndefined - Validates that a value is exactly undefined\n * Part of Zod 4 API parity implementation\n */\n\nimport { VldBase } from './base';\nimport type { ParseResult } from './base';\n\n/**\n * Undefined validator - validates that a value is exactly undefined\n */\nexport class VldUndefined extends VldBase<unknown, undefined> {\n private constructor() {\n super();\n }\n\n static create(): VldUndefined {\n return new VldUndefined();\n }\n\n parse(value: unknown): undefined {\n if (value !== undefined) {\n throw new Error(`Expected undefined, received ${typeof value}`);\n }\n return undefined;\n }\n\n safeParse(value: unknown): ParseResult<undefined> {\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"]}
@@ -13,6 +13,7 @@ export declare class VldUnion<T extends readonly VldBase<any, any>[]> extends Vl
13
13
  private constructor();
14
14
  /**
15
15
  * Create type checker based on validator type for fast path optimization
16
+ * Uses a safer approach that's less prone to spoofing
16
17
  */
17
18
  private createTypeChecker;
18
19
  /**
@@ -22,11 +23,13 @@ export declare class VldUnion<T extends readonly VldBase<any, any>[]> extends Vl
22
23
  /**
23
24
  * Parse and validate a value against union options
24
25
  * Optimized with type checking and safeParse to avoid try-catch overhead
26
+ * BUG-NEW-013 FIX: Single-pass error collection to avoid double parsing
25
27
  */
26
28
  parse(value: unknown): T[number] extends VldBase<any, infer U> ? U : never;
27
29
  /**
28
30
  * Safely parse and validate a value against union options
29
31
  * Optimized version using type checking shortcuts
32
+ * BUG-NEW-013 FIX: Single-pass error collection to avoid double parsing
30
33
  */
31
34
  safeParse(value: unknown): ParseResult<T[number] extends VldBase<any, infer U> ? U : never>;
32
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"union.d.ts","sourceRoot":"","sources":["../../src/validators/union.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;;GAGG;AACH,qBAAa,QAAQ,CAAC,CAAC,SAAS,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAE,SAAQ,OAAO,CAC3E,OAAO,EACP,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CACpD;IACC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAI;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;IAGvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsD;IAEnF;;OAEG;IACH,OAAO;IAeP;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgCzB;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,UAAU,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAIpF;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;IAgC1E;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;CAiC5F"}
1
+ {"version":3,"file":"union.d.ts","sourceRoot":"","sources":["../../src/validators/union.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;;GAGG;AACH,qBAAa,QAAQ,CAAC,CAAC,SAAS,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAE,SAAQ,OAAO,CAC3E,OAAO,EACP,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CACpD;IACC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAI;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;IAGvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsD;IAEnF;;OAEG;IACH,OAAO;IAeP;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAgDzB;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,UAAU,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAIpF;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;IA6B1E;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;CA8B5F"}
@@ -1,5 +1,5 @@
1
1
  import { VldBase } from './base.js';
2
- import { getMessages } from '../locales.js';
2
+ import { getMessages } from '../locales/index.js';
3
3
  /**
4
4
  * Optimized immutable union validator for multiple type options
5
5
  * Features type-checking shortcuts for 110x performance improvement
@@ -20,36 +20,47 @@ export class VldUnion extends VldBase {
20
20
  }
21
21
  /**
22
22
  * Create type checker based on validator type for fast path optimization
23
+ * Uses a safer approach that's less prone to spoofing
23
24
  */
24
25
  createTypeChecker(validator) {
25
- // Quick type checks based on validator type
26
- const className = validator.constructor.name;
27
- switch (className) {
28
- case 'VldString':
26
+ // More conservative approach that prioritizes security and stability
27
+ // Only use fast path checks for very common, unambiguous types
28
+ try {
29
+ // Test basic types with safe parsing to validate the validator
30
+ const stringTest = validator.safeParse('test');
31
+ if (stringTest.success) {
29
32
  return (v) => typeof v === 'string';
30
- case 'VldNumber':
33
+ }
34
+ const numberTest = validator.safeParse(123);
35
+ if (numberTest.success) {
31
36
  return (v) => typeof v === 'number' && !isNaN(v);
32
- case 'VldBoolean':
37
+ }
38
+ const booleanTest = validator.safeParse(true);
39
+ if (booleanTest.success) {
33
40
  return (v) => typeof v === 'boolean';
34
- case 'VldDate':
35
- return (v) => v instanceof Date || (typeof v === 'string' && !isNaN(Date.parse(v)));
36
- case 'VldArray':
41
+ }
42
+ const arrayTest = validator.safeParse([]);
43
+ if (arrayTest.success) {
37
44
  return (v) => Array.isArray(v);
38
- case 'VldObject':
45
+ }
46
+ const objectTest = validator.safeParse({});
47
+ if (objectTest.success) {
39
48
  return (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
40
- case 'VldBigInt':
41
- return (v) => typeof v === 'bigint';
42
- case 'VldSymbol':
43
- return (v) => typeof v === 'symbol';
44
- case 'VldNull':
49
+ }
50
+ const nullTest = validator.safeParse(null);
51
+ if (nullTest.success) {
45
52
  return (v) => v === null;
46
- case 'VldUndefined':
47
- return (v) => v === undefined;
48
- case 'VldVoid':
53
+ }
54
+ const undefinedTest = validator.safeParse(undefined);
55
+ if (undefinedTest.success) {
49
56
  return (v) => v === undefined;
50
- default:
51
- return () => true; // No quick check available
57
+ }
58
+ }
59
+ catch {
60
+ // If safe testing fails, fall back to safe validation
52
61
  }
62
+ // Fallback: no quick check available - use safe validation
63
+ return () => true;
53
64
  }
54
65
  /**
55
66
  * Create a new union validator
@@ -60,12 +71,14 @@ export class VldUnion extends VldBase {
60
71
  /**
61
72
  * Parse and validate a value against union options
62
73
  * Optimized with type checking and safeParse to avoid try-catch overhead
74
+ * BUG-NEW-013 FIX: Single-pass error collection to avoid double parsing
63
75
  */
64
76
  parse(value) {
65
- // Fast path: try validators that are likely to match based on type
77
+ // Single pass: collect errors during validation
78
+ const errors = [];
66
79
  for (const validator of this.validators) {
67
80
  const typeChecker = this.typeCheckers.get(validator);
68
- // Skip validators that definitely won't match
81
+ // Skip validators that definitely won't match based on type
69
82
  if (typeChecker && !typeChecker(value)) {
70
83
  continue;
71
84
  }
@@ -74,27 +87,24 @@ export class VldUnion extends VldBase {
74
87
  if (result.success) {
75
88
  return result.data;
76
89
  }
90
+ // Collect error for final message if all validators fail
91
+ errors.push(result.error.message);
77
92
  }
78
- // Slow path: collect all errors for better error message
79
- const errors = [];
80
- for (const validator of this.validators) {
81
- const result = validator.safeParse(value);
82
- if (!result.success) {
83
- errors.push(result.error.message);
84
- }
85
- }
93
+ // All validators failed - throw with collected errors
86
94
  throw new Error(this.errorMessage ||
87
95
  getMessages().unionNoMatch(errors));
88
96
  }
89
97
  /**
90
98
  * Safely parse and validate a value against union options
91
99
  * Optimized version using type checking shortcuts
100
+ * BUG-NEW-013 FIX: Single-pass error collection to avoid double parsing
92
101
  */
93
102
  safeParse(value) {
94
- // Fast path with type checking
103
+ // Single pass: collect errors during validation
104
+ const errors = [];
95
105
  for (const validator of this.validators) {
96
106
  const typeChecker = this.typeCheckers.get(validator);
97
- // Skip validators that definitely won't match
107
+ // Skip validators that definitely won't match based on type
98
108
  if (typeChecker && !typeChecker(value)) {
99
109
  continue;
100
110
  }
@@ -102,15 +112,10 @@ export class VldUnion extends VldBase {
102
112
  if (result.success) {
103
113
  return result;
104
114
  }
115
+ // Collect error for final message if all validators fail
116
+ errors.push(result.error.message);
105
117
  }
106
- // All failed - collect errors for message
107
- const errors = [];
108
- for (const validator of this.validators) {
109
- const result = validator.safeParse(value);
110
- if (!result.success) {
111
- errors.push(result.error.message);
112
- }
113
- }
118
+ // All validators failed - return error with collected messages
114
119
  return {
115
120
  success: false,
116
121
  error: new Error(this.errorMessage ||
@@ -1 +1 @@
1
- {"version":3,"file":"union.js","sourceRoot":"","sources":["../../src/validators/union.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Optimized immutable union validator for multiple type options\n * Features type-checking shortcuts for 110x performance improvement\n */\nexport class VldUnion<T extends readonly VldBase<any, any>[]> extends VldBase<\n unknown,\n T[number] extends VldBase<any, infer U> ? U : never\n> {\n private readonly validators: T;\n private readonly errorMessage?: string;\n \n // Cache for type checking optimization\n private readonly typeCheckers: Map<VldBase<any, any>, (value: unknown) => boolean>;\n \n /**\n * Private constructor to enforce immutability\n */\n private constructor(\n validators: T,\n errorMessage?: string\n ) {\n super();\n this.validators = validators;\n this.errorMessage = errorMessage;\n this.typeCheckers = new Map();\n \n // Pre-compile type checkers for common types\n for (const validator of validators) {\n this.typeCheckers.set(validator, this.createTypeChecker(validator));\n }\n }\n \n /**\n * Create type checker based on validator type for fast path optimization\n */\n private createTypeChecker(validator: VldBase<any, any>): (value: unknown) => boolean {\n // Quick type checks based on validator type\n const className = validator.constructor.name;\n \n switch (className) {\n case 'VldString':\n return (v) => typeof v === 'string';\n case 'VldNumber':\n return (v) => typeof v === 'number' && !isNaN(v as number);\n case 'VldBoolean':\n return (v) => typeof v === 'boolean';\n case 'VldDate':\n return (v) => v instanceof Date || (typeof v === 'string' && !isNaN(Date.parse(v as string)));\n case 'VldArray':\n return (v) => Array.isArray(v);\n case 'VldObject':\n return (v) => typeof v === 'object' && v !== null && !Array.isArray(v);\n case 'VldBigInt':\n return (v) => typeof v === 'bigint';\n case 'VldSymbol':\n return (v) => typeof v === 'symbol';\n case 'VldNull':\n return (v) => v === null;\n case 'VldUndefined':\n return (v) => v === undefined;\n case 'VldVoid':\n return (v) => v === undefined;\n default:\n return () => true; // No quick check available\n }\n }\n \n /**\n * Create a new union validator\n */\n static create<T extends readonly VldBase<any, any>[]>(...validators: T): VldUnion<T> {\n return new VldUnion(validators);\n }\n \n /**\n * Parse and validate a value against union options\n * Optimized with type checking and safeParse to avoid try-catch overhead\n */\n parse(value: unknown): T[number] extends VldBase<any, infer U> ? U : never {\n // Fast path: try validators that are likely to match based on type\n for (const validator of this.validators) {\n const typeChecker = this.typeCheckers.get(validator);\n \n // Skip validators that definitely won't match\n if (typeChecker && !typeChecker(value)) {\n continue;\n }\n \n // Use safeParse to avoid try-catch overhead\n const result = validator.safeParse(value);\n if (result.success) {\n return result.data;\n }\n }\n \n // Slow path: collect all errors for better error message\n const errors: string[] = [];\n for (const validator of this.validators) {\n const result = validator.safeParse(value);\n if (!result.success) {\n errors.push(result.error.message);\n }\n }\n \n throw new Error(\n this.errorMessage || \n getMessages().unionNoMatch(errors)\n );\n }\n \n /**\n * Safely parse and validate a value against union options\n * Optimized version using type checking shortcuts\n */\n safeParse(value: unknown): ParseResult<T[number] extends VldBase<any, infer U> ? U : never> {\n // Fast path with type checking\n for (const validator of this.validators) {\n const typeChecker = this.typeCheckers.get(validator);\n \n // Skip validators that definitely won't match\n if (typeChecker && !typeChecker(value)) {\n continue;\n }\n \n const result = validator.safeParse(value);\n if (result.success) {\n return result;\n }\n }\n \n // All failed - collect errors for message\n const errors: string[] = [];\n for (const validator of this.validators) {\n const result = validator.safeParse(value);\n if (!result.success) {\n errors.push(result.error.message);\n }\n }\n \n return {\n success: false,\n error: new Error(\n this.errorMessage || \n getMessages().unionNoMatch(errors)\n )\n };\n }\n}"]}
1
+ {"version":3,"file":"union.js","sourceRoot":"","sources":["../../src/validators/union.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { getMessages } from '../locales';\r\n\r\n/**\r\n * Optimized immutable union validator for multiple type options\r\n * Features type-checking shortcuts for 110x performance improvement\r\n */\r\nexport class VldUnion<T extends readonly VldBase<any, any>[]> extends VldBase<\r\n unknown,\r\n T[number] extends VldBase<any, infer U> ? U : never\r\n> {\r\n private readonly validators: T;\r\n private readonly errorMessage?: string;\r\n \r\n // Cache for type checking optimization\r\n private readonly typeCheckers: Map<VldBase<any, any>, (value: unknown) => boolean>;\r\n \r\n /**\r\n * Private constructor to enforce immutability\r\n */\r\n private constructor(\r\n validators: T,\r\n errorMessage?: string\r\n ) {\r\n super();\r\n this.validators = validators;\r\n this.errorMessage = errorMessage;\r\n this.typeCheckers = new Map();\r\n \r\n // Pre-compile type checkers for common types\r\n for (const validator of validators) {\r\n this.typeCheckers.set(validator, this.createTypeChecker(validator));\r\n }\r\n }\r\n \r\n /**\r\n * Create type checker based on validator type for fast path optimization\r\n * Uses a safer approach that's less prone to spoofing\r\n */\r\n private createTypeChecker(validator: VldBase<any, any>): (value: unknown) => boolean {\r\n // More conservative approach that prioritizes security and stability\r\n // Only use fast path checks for very common, unambiguous types\r\n\r\n try {\r\n // Test basic types with safe parsing to validate the validator\r\n const stringTest = validator.safeParse('test');\r\n if (stringTest.success) {\r\n return (v) => typeof v === 'string';\r\n }\r\n\r\n const numberTest = validator.safeParse(123);\r\n if (numberTest.success) {\r\n return (v) => typeof v === 'number' && !isNaN(v as number);\r\n }\r\n\r\n const booleanTest = validator.safeParse(true);\r\n if (booleanTest.success) {\r\n return (v) => typeof v === 'boolean';\r\n }\r\n\r\n const arrayTest = validator.safeParse([]);\r\n if (arrayTest.success) {\r\n return (v) => Array.isArray(v);\r\n }\r\n\r\n const objectTest = validator.safeParse({});\r\n if (objectTest.success) {\r\n return (v) => typeof v === 'object' && v !== null && !Array.isArray(v);\r\n }\r\n\r\n const nullTest = validator.safeParse(null);\r\n if (nullTest.success) {\r\n return (v) => v === null;\r\n }\r\n\r\n const undefinedTest = validator.safeParse(undefined);\r\n if (undefinedTest.success) {\r\n return (v) => v === undefined;\r\n }\r\n } catch {\r\n // If safe testing fails, fall back to safe validation\r\n }\r\n\r\n // Fallback: no quick check available - use safe validation\r\n return () => true;\r\n }\r\n \r\n /**\r\n * Create a new union validator\r\n */\r\n static create<T extends readonly VldBase<any, any>[]>(...validators: T): VldUnion<T> {\r\n return new VldUnion(validators);\r\n }\r\n \r\n /**\r\n * Parse and validate a value against union options\r\n * Optimized with type checking and safeParse to avoid try-catch overhead\r\n * BUG-NEW-013 FIX: Single-pass error collection to avoid double parsing\r\n */\r\n parse(value: unknown): T[number] extends VldBase<any, infer U> ? U : never {\r\n // Single pass: collect errors during validation\r\n const errors: string[] = [];\r\n\r\n for (const validator of this.validators) {\r\n const typeChecker = this.typeCheckers.get(validator);\r\n\r\n // Skip validators that definitely won't match based on type\r\n if (typeChecker && !typeChecker(value)) {\r\n continue;\r\n }\r\n\r\n // Use safeParse to avoid try-catch overhead\r\n const result = validator.safeParse(value);\r\n if (result.success) {\r\n return result.data;\r\n }\r\n\r\n // Collect error for final message if all validators fail\r\n errors.push(result.error.message);\r\n }\r\n\r\n // All validators failed - throw with collected errors\r\n throw new Error(\r\n this.errorMessage ||\r\n getMessages().unionNoMatch(errors)\r\n );\r\n }\r\n \r\n /**\r\n * Safely parse and validate a value against union options\r\n * Optimized version using type checking shortcuts\r\n * BUG-NEW-013 FIX: Single-pass error collection to avoid double parsing\r\n */\r\n safeParse(value: unknown): ParseResult<T[number] extends VldBase<any, infer U> ? U : never> {\r\n // Single pass: collect errors during validation\r\n const errors: string[] = [];\r\n\r\n for (const validator of this.validators) {\r\n const typeChecker = this.typeCheckers.get(validator);\r\n\r\n // Skip validators that definitely won't match based on type\r\n if (typeChecker && !typeChecker(value)) {\r\n continue;\r\n }\r\n\r\n const result = validator.safeParse(value);\r\n if (result.success) {\r\n return result;\r\n }\r\n\r\n // Collect error for final message if all validators fail\r\n errors.push(result.error.message);\r\n }\r\n\r\n // All validators failed - return error with collected messages\r\n return {\r\n success: false,\r\n error: new Error(\r\n this.errorMessage ||\r\n getMessages().unionNoMatch(errors)\r\n )\r\n };\r\n }\r\n}"]}
@@ -1,5 +1,5 @@
1
1
  import { VldBase } from './base.js';
2
- import { getMessages } from '../locales.js';
2
+ import { getMessages } from '../locales/index.js';
3
3
  /**
4
4
  * Validator that only accepts undefined
5
5
  */