@oxog/vld 1.5.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/CHANGELOG.md +168 -0
  2. package/LICENSE +20 -20
  3. package/README.md +558 -517
  4. package/dist/chunks/bigint-DgsCr2dC.js +1709 -0
  5. package/dist/chunks/bigint-DgsCr2dC.js.map +1 -0
  6. package/dist/{coercion/string.js → chunks/date-ODue_rtq.js} +271 -5
  7. package/dist/chunks/date-ODue_rtq.js.map +1 -0
  8. package/dist/chunks/index-BZqWZvVe.js +426 -0
  9. package/dist/chunks/index-BZqWZvVe.js.map +1 -0
  10. package/dist/chunks/index-CETyGkrv.js +894 -0
  11. package/dist/chunks/index-CETyGkrv.js.map +1 -0
  12. package/dist/chunks/json-o20GFhTh.js +2021 -0
  13. package/dist/chunks/json-o20GFhTh.js.map +1 -0
  14. package/dist/{validators/unknown.js → chunks/unknown-SLIH1VCf.js} +6 -3
  15. package/dist/chunks/unknown-SLIH1VCf.js.map +1 -0
  16. package/dist/cjs/errors.cjs +387 -0
  17. package/dist/cjs/errors.cjs.map +1 -0
  18. package/dist/cjs/index.cjs +9983 -0
  19. package/dist/cjs/index.cjs.map +1 -0
  20. package/dist/cjs/locales/index.cjs +2877 -0
  21. package/dist/cjs/locales/index.cjs.map +1 -0
  22. package/dist/cjs/locales/lazy.cjs +3169 -0
  23. package/dist/cjs/locales/lazy.cjs.map +1 -0
  24. package/dist/cjs/mini.cjs +7329 -0
  25. package/dist/cjs/mini.cjs.map +1 -0
  26. package/dist/codecs/index.js +4 -275
  27. package/dist/codecs/index.js.map +1 -1
  28. package/dist/coercion/index.d.ts +11 -0
  29. package/dist/coercion/index.d.ts.map +1 -0
  30. package/dist/coercion/{bigint.js → index.js} +7 -4
  31. package/dist/coercion/index.js.map +1 -0
  32. package/dist/compat/emitter.js +6 -4
  33. package/dist/compat/emitter.js.map +1 -1
  34. package/dist/compat/result.js +21 -19
  35. package/dist/compat/result.js.map +1 -1
  36. package/dist/errors.js +13 -10
  37. package/dist/errors.js.map +1 -1
  38. package/dist/index.js +225 -126
  39. package/dist/index.js.map +1 -1
  40. package/dist/kernel.js +10 -7
  41. package/dist/kernel.js.map +1 -1
  42. package/dist/locales/af.js +4 -2
  43. package/dist/locales/af.js.map +1 -1
  44. package/dist/locales/ar.js +4 -2
  45. package/dist/locales/ar.js.map +1 -1
  46. package/dist/locales/bn.js +4 -2
  47. package/dist/locales/bn.js.map +1 -1
  48. package/dist/locales/da.js +4 -2
  49. package/dist/locales/da.js.map +1 -1
  50. package/dist/locales/de.js +4 -2
  51. package/dist/locales/de.js.map +1 -1
  52. package/dist/locales/en.js +4 -2
  53. package/dist/locales/en.js.map +1 -1
  54. package/dist/locales/es-MX.js +4 -2
  55. package/dist/locales/es-MX.js.map +1 -1
  56. package/dist/locales/es.js +4 -2
  57. package/dist/locales/es.js.map +1 -1
  58. package/dist/locales/fi.js +4 -2
  59. package/dist/locales/fi.js.map +1 -1
  60. package/dist/locales/fr.js +4 -2
  61. package/dist/locales/fr.js.map +1 -1
  62. package/dist/locales/hi.js +4 -2
  63. package/dist/locales/hi.js.map +1 -1
  64. package/dist/locales/id.js +4 -2
  65. package/dist/locales/id.js.map +1 -1
  66. package/dist/locales/index.js +3 -91
  67. package/dist/locales/index.js.map +1 -1
  68. package/dist/locales/it.js +4 -2
  69. package/dist/locales/it.js.map +1 -1
  70. package/dist/locales/ja.js +4 -2
  71. package/dist/locales/ja.js.map +1 -1
  72. package/dist/locales/ko.js +4 -2
  73. package/dist/locales/ko.js.map +1 -1
  74. package/dist/locales/lazy.d.ts +111 -0
  75. package/dist/locales/lazy.d.ts.map +1 -0
  76. package/dist/locales/lazy.js +220 -0
  77. package/dist/locales/lazy.js.map +1 -0
  78. package/dist/locales/nl.js +4 -2
  79. package/dist/locales/nl.js.map +1 -1
  80. package/dist/locales/no.js +4 -2
  81. package/dist/locales/no.js.map +1 -1
  82. package/dist/locales/pl.js +4 -2
  83. package/dist/locales/pl.js.map +1 -1
  84. package/dist/locales/pt-BR.js +4 -2
  85. package/dist/locales/pt-BR.js.map +1 -1
  86. package/dist/locales/pt.js +4 -2
  87. package/dist/locales/pt.js.map +1 -1
  88. package/dist/locales/ru.js +4 -2
  89. package/dist/locales/ru.js.map +1 -1
  90. package/dist/locales/sv.js +4 -2
  91. package/dist/locales/sv.js.map +1 -1
  92. package/dist/locales/sw.js +4 -2
  93. package/dist/locales/sw.js.map +1 -1
  94. package/dist/locales/th.js +4 -2
  95. package/dist/locales/th.js.map +1 -1
  96. package/dist/locales/tr.js +4 -2
  97. package/dist/locales/tr.js.map +1 -1
  98. package/dist/locales/vi.js +4 -2
  99. package/dist/locales/vi.js.map +1 -1
  100. package/dist/locales/zh.js +4 -2
  101. package/dist/locales/zh.js.map +1 -1
  102. package/dist/mini.d.ts +182 -0
  103. package/dist/mini.d.ts.map +1 -0
  104. package/dist/mini.js +132 -0
  105. package/dist/mini.js.map +1 -0
  106. package/dist/pigment.js +8 -7
  107. package/dist/pigment.js.map +1 -1
  108. package/dist/validators/array.d.ts +5 -0
  109. package/dist/validators/array.d.ts.map +1 -1
  110. package/dist/validators/discriminated-union.d.ts.map +1 -1
  111. package/dist/validators/enum.d.ts +5 -1
  112. package/dist/validators/enum.d.ts.map +1 -1
  113. package/dist/validators/index.js +5 -45
  114. package/dist/validators/index.js.map +1 -1
  115. package/dist/validators/lazy.d.ts +8 -1
  116. package/dist/validators/lazy.d.ts.map +1 -1
  117. package/dist/validators/literal.d.ts +5 -1
  118. package/dist/validators/literal.d.ts.map +1 -1
  119. package/dist/validators/object.d.ts +30 -3
  120. package/dist/validators/object.d.ts.map +1 -1
  121. package/dist/validators/string.d.ts +12 -1
  122. package/dist/validators/string.d.ts.map +1 -1
  123. package/package.json +69 -11
  124. package/dist/cli/benchmark.d.ts +0 -15
  125. package/dist/cli/benchmark.d.ts.map +0 -1
  126. package/dist/cli/benchmark.js +0 -248
  127. package/dist/cli/benchmark.js.map +0 -1
  128. package/dist/cli/bin.js +0 -35
  129. package/dist/cli/bin.js.map +0 -1
  130. package/dist/cli/commands/benchmark.js +0 -204
  131. package/dist/cli/commands/benchmark.js.map +0 -1
  132. package/dist/cli/commands/validate.js +0 -157
  133. package/dist/cli/commands/validate.js.map +0 -1
  134. package/dist/cli/generate.d.ts +0 -14
  135. package/dist/cli/generate.d.ts.map +0 -1
  136. package/dist/cli/generate.js +0 -233
  137. package/dist/cli/generate.js.map +0 -1
  138. package/dist/cli/index.js +0 -182
  139. package/dist/cli/index.js.map +0 -1
  140. package/dist/cli/validate.d.ts +0 -15
  141. package/dist/cli/validate.d.ts.map +0 -1
  142. package/dist/cli/validate.js +0 -162
  143. package/dist/cli/validate.js.map +0 -1
  144. package/dist/coercion/bigint.js.map +0 -1
  145. package/dist/coercion/boolean.js +0 -59
  146. package/dist/coercion/boolean.js.map +0 -1
  147. package/dist/coercion/date.js +0 -52
  148. package/dist/coercion/date.js.map +0 -1
  149. package/dist/coercion/number.js +0 -160
  150. package/dist/coercion/number.js.map +0 -1
  151. package/dist/coercion/string.js.map +0 -1
  152. package/dist/compat/index.js +0 -14
  153. package/dist/compat/index.js.map +0 -1
  154. package/dist/events.js +0 -8
  155. package/dist/events.js.map +0 -1
  156. package/dist/guards.d.ts +0 -143
  157. package/dist/guards.d.ts.map +0 -1
  158. package/dist/guards.js +0 -238
  159. package/dist/guards.js.map +0 -1
  160. package/dist/index-new.d.ts.map +0 -1
  161. package/dist/locales/backup-en.js +0 -105
  162. package/dist/locales/backup-en.js.map +0 -1
  163. package/dist/locales/types.js +0 -2
  164. package/dist/locales/types.js.map +0 -1
  165. package/dist/locales.d.ts +0 -54
  166. package/dist/locales.d.ts.map +0 -1
  167. package/dist/locales.js +0 -732
  168. package/dist/locales.js.map +0 -1
  169. package/dist/logger.js +0 -184
  170. package/dist/logger.js.map +0 -1
  171. package/dist/plugins/codecs.d.ts +0 -17
  172. package/dist/plugins/codecs.d.ts.map +0 -1
  173. package/dist/plugins/codecs.js +0 -29
  174. package/dist/plugins/codecs.js.map +0 -1
  175. package/dist/plugins/coercion.d.ts +0 -13
  176. package/dist/plugins/coercion.d.ts.map +0 -1
  177. package/dist/plugins/coercion.js +0 -34
  178. package/dist/plugins/coercion.js.map +0 -1
  179. package/dist/plugins/core-validators.d.ts +0 -13
  180. package/dist/plugins/core-validators.d.ts.map +0 -1
  181. package/dist/plugins/core-validators.js +0 -96
  182. package/dist/plugins/core-validators.js.map +0 -1
  183. package/dist/plugins/index.js +0 -8
  184. package/dist/plugins/index.js.map +0 -1
  185. package/dist/plugins/kernel.d.ts +0 -29
  186. package/dist/plugins/kernel.d.ts.map +0 -1
  187. package/dist/plugins/kernel.js +0 -486
  188. package/dist/plugins/kernel.js.map +0 -1
  189. package/dist/plugins/types.js +0 -8
  190. package/dist/plugins/types.js.map +0 -1
  191. package/dist/style.d.ts +0 -123
  192. package/dist/style.d.ts.map +0 -1
  193. package/dist/style.js +0 -369
  194. package/dist/style.js.map +0 -1
  195. package/dist/utils/codec-utils.js +0 -229
  196. package/dist/utils/codec-utils.js.map +0 -1
  197. package/dist/utils/deep-merge.js +0 -76
  198. package/dist/utils/deep-merge.js.map +0 -1
  199. package/dist/utils/ip-validation.js +0 -98
  200. package/dist/utils/ip-validation.js.map +0 -1
  201. package/dist/utils/security.js +0 -61
  202. package/dist/utils/security.js.map +0 -1
  203. package/dist/validators/any.js +0 -25
  204. package/dist/validators/any.js.map +0 -1
  205. package/dist/validators/array.js +0 -190
  206. package/dist/validators/array.js.map +0 -1
  207. package/dist/validators/base.js +0 -499
  208. package/dist/validators/base.js.map +0 -1
  209. package/dist/validators/base64.js +0 -65
  210. package/dist/validators/base64.js.map +0 -1
  211. package/dist/validators/bigint.js +0 -142
  212. package/dist/validators/bigint.js.map +0 -1
  213. package/dist/validators/boolean.js +0 -114
  214. package/dist/validators/boolean.js.map +0 -1
  215. package/dist/validators/codec.js +0 -182
  216. package/dist/validators/codec.js.map +0 -1
  217. package/dist/validators/custom.js +0 -50
  218. package/dist/validators/custom.js.map +0 -1
  219. package/dist/validators/date.js +0 -227
  220. package/dist/validators/date.js.map +0 -1
  221. package/dist/validators/discriminated-union.js +0 -98
  222. package/dist/validators/discriminated-union.js.map +0 -1
  223. package/dist/validators/enum.js +0 -82
  224. package/dist/validators/enum.js.map +0 -1
  225. package/dist/validators/file.js +0 -114
  226. package/dist/validators/file.js.map +0 -1
  227. package/dist/validators/function.js +0 -45
  228. package/dist/validators/function.js.map +0 -1
  229. package/dist/validators/hex.js +0 -62
  230. package/dist/validators/hex.js.map +0 -1
  231. package/dist/validators/intersection.js +0 -64
  232. package/dist/validators/intersection.js.map +0 -1
  233. package/dist/validators/json.js +0 -64
  234. package/dist/validators/json.js.map +0 -1
  235. package/dist/validators/lazy.js +0 -42
  236. package/dist/validators/lazy.js.map +0 -1
  237. package/dist/validators/literal.js +0 -45
  238. package/dist/validators/literal.js.map +0 -1
  239. package/dist/validators/map.js +0 -54
  240. package/dist/validators/map.js.map +0 -1
  241. package/dist/validators/nan.js +0 -32
  242. package/dist/validators/nan.js.map +0 -1
  243. package/dist/validators/never.js +0 -29
  244. package/dist/validators/never.js.map +0 -1
  245. package/dist/validators/null.js +0 -31
  246. package/dist/validators/null.js.map +0 -1
  247. package/dist/validators/number.js +0 -225
  248. package/dist/validators/number.js.map +0 -1
  249. package/dist/validators/object-optimized.d.ts +0 -23
  250. package/dist/validators/object-optimized.d.ts.map +0 -1
  251. package/dist/validators/object-optimized.js +0 -179
  252. package/dist/validators/object-optimized.js.map +0 -1
  253. package/dist/validators/object-ultra.d.ts +0 -34
  254. package/dist/validators/object-ultra.d.ts.map +0 -1
  255. package/dist/validators/object-ultra.js +0 -175
  256. package/dist/validators/object-ultra.js.map +0 -1
  257. package/dist/validators/object.js +0 -458
  258. package/dist/validators/object.js.map +0 -1
  259. package/dist/validators/record.js +0 -128
  260. package/dist/validators/record.js.map +0 -1
  261. package/dist/validators/set.js +0 -51
  262. package/dist/validators/set.js.map +0 -1
  263. package/dist/validators/string-bool.js +0 -127
  264. package/dist/validators/string-bool.js.map +0 -1
  265. package/dist/validators/string-formats.js +0 -120
  266. package/dist/validators/string-formats.js.map +0 -1
  267. package/dist/validators/string-ultra.d.ts +0 -49
  268. package/dist/validators/string-ultra.d.ts.map +0 -1
  269. package/dist/validators/string-ultra.js +0 -217
  270. package/dist/validators/string-ultra.js.map +0 -1
  271. package/dist/validators/string.js +0 -253
  272. package/dist/validators/string.js.map +0 -1
  273. package/dist/validators/symbol.js +0 -42
  274. package/dist/validators/symbol.js.map +0 -1
  275. package/dist/validators/template-literal.js +0 -102
  276. package/dist/validators/template-literal.js.map +0 -1
  277. package/dist/validators/tuple.js +0 -55
  278. package/dist/validators/tuple.js.map +0 -1
  279. package/dist/validators/uint8array.js +0 -98
  280. package/dist/validators/uint8array.js.map +0 -1
  281. package/dist/validators/undefined.js +0 -31
  282. package/dist/validators/undefined.js.map +0 -1
  283. package/dist/validators/union-optimized.d.ts +0 -15
  284. package/dist/validators/union-optimized.d.ts.map +0 -1
  285. package/dist/validators/union-optimized.js +0 -92
  286. package/dist/validators/union-optimized.js.map +0 -1
  287. package/dist/validators/union.js +0 -126
  288. package/dist/validators/union.js.map +0 -1
  289. package/dist/validators/unknown.js.map +0 -1
  290. package/dist/validators/void.js +0 -35
  291. package/dist/validators/void.js.map +0 -1
  292. package/dist/validators/xor.js +0 -64
  293. package/dist/validators/xor.js.map +0 -1
@@ -1,190 +0,0 @@
1
- import { VldBase } from './base.js';
2
- import { getMessages } from '../locales/index.js';
3
- /**
4
- * Immutable array validator with chainable methods
5
- */
6
- export class VldArray extends VldBase {
7
- /**
8
- * Private constructor to enforce immutability
9
- */
10
- constructor(config) {
11
- super();
12
- this.config = config;
13
- }
14
- /**
15
- * Create a new array validator
16
- */
17
- static create(itemValidator) {
18
- return new VldArray({ itemValidator });
19
- }
20
- /**
21
- * Parse and validate an array value
22
- */
23
- parse(value) {
24
- if (!Array.isArray(value)) {
25
- throw new Error(this.config.errorMessage || getMessages().invalidArray);
26
- }
27
- // Validate length constraints
28
- if (this.config.exactLength !== undefined && value.length !== this.config.exactLength) {
29
- throw new Error(this.config.errorMessage || getMessages().arrayLength(this.config.exactLength));
30
- }
31
- if (this.config.minLength !== undefined && value.length < this.config.minLength) {
32
- throw new Error(this.config.errorMessage || getMessages().arrayMin(this.config.minLength));
33
- }
34
- if (this.config.maxLength !== undefined && value.length > this.config.maxLength) {
35
- throw new Error(this.config.errorMessage || getMessages().arrayMax(this.config.maxLength));
36
- }
37
- // Validate each item with optimized loop and safeParse
38
- const result = [];
39
- const length = value.length;
40
- for (let i = 0; i < length; i++) {
41
- const parseResult = this.config.itemValidator.safeParse(value[i]);
42
- if (!parseResult.success) {
43
- throw new Error(getMessages().arrayItem(i, parseResult.error.message));
44
- }
45
- result[i] = parseResult.data; // Direct assignment is faster than push
46
- }
47
- // Check uniqueness if required
48
- if (this.config.unique) {
49
- const seen = new Set();
50
- for (const item of result) {
51
- const key = typeof item === 'object' ? this.stableStringify(item) : item;
52
- if (seen.has(key)) {
53
- throw new Error('Array must contain unique items');
54
- }
55
- seen.add(key);
56
- }
57
- }
58
- return result;
59
- }
60
- /**
61
- * Safely parse and validate an array value
62
- */
63
- safeParse(value) {
64
- try {
65
- return { success: true, data: this.parse(value) };
66
- }
67
- catch (error) {
68
- return { success: false, error: error };
69
- }
70
- }
71
- /**
72
- * Create a stable string representation of an object for hashing
73
- * Handles circular references and deep nesting gracefully
74
- * BUG-006 FIX: Added depth limit to prevent stack overflow
75
- * BUG-NEW-003 FIX: Fixed depth tracking to properly track recursion depth
76
- */
77
- stableStringify(obj) {
78
- const seen = new WeakSet();
79
- const MAX_DEPTH = 100; // Reasonable depth limit to prevent stack overflow
80
- // Helper function to sort keys and create stable representation
81
- const sortedStringify = (value, depth = 0) => {
82
- // Check depth limit
83
- if (depth > MAX_DEPTH) {
84
- return '"[Max Depth Exceeded]"';
85
- }
86
- // Handle primitives
87
- if (value === null)
88
- return 'null';
89
- if (value === undefined)
90
- return 'undefined';
91
- if (typeof value !== 'object')
92
- return JSON.stringify(value);
93
- // Handle circular references
94
- if (seen.has(value)) {
95
- return '"[Circular]"';
96
- }
97
- seen.add(value);
98
- try {
99
- // Handle arrays
100
- if (Array.isArray(value)) {
101
- const items = value.map(item => sortedStringify(item, depth + 1));
102
- return `[${items.join(',')}]`;
103
- }
104
- // Handle objects - sort keys for stability
105
- const keys = Object.keys(value).sort();
106
- const pairs = keys.map(key => {
107
- const serializedKey = JSON.stringify(key);
108
- const serializedValue = sortedStringify(value[key], depth + 1);
109
- return `${serializedKey}:${serializedValue}`;
110
- });
111
- return `{${pairs.join(',')}}`;
112
- }
113
- finally {
114
- // Clean up seen set for this branch
115
- seen.delete(value);
116
- }
117
- };
118
- try {
119
- return sortedStringify(obj);
120
- }
121
- catch (error) {
122
- // Fallback to safe representation if stringify fails
123
- return String(obj);
124
- }
125
- }
126
- /**
127
- * Create a new validator with minimum length constraint
128
- */
129
- min(length, message) {
130
- return new VldArray({
131
- ...this.config,
132
- minLength: length,
133
- errorMessage: message || getMessages().arrayMin(length)
134
- });
135
- }
136
- /**
137
- * Create a new validator with maximum length constraint
138
- */
139
- max(length, message) {
140
- return new VldArray({
141
- ...this.config,
142
- maxLength: length,
143
- errorMessage: message || getMessages().arrayMax(length)
144
- });
145
- }
146
- /**
147
- * Create a new validator with exact length constraint
148
- */
149
- length(length, message) {
150
- return new VldArray({
151
- ...this.config,
152
- exactLength: length,
153
- minLength: undefined,
154
- maxLength: undefined,
155
- errorMessage: message || getMessages().arrayLength(length)
156
- });
157
- }
158
- /**
159
- * Create a new validator that ensures array is not empty
160
- */
161
- nonempty(message) {
162
- return new VldArray({
163
- ...this.config,
164
- minLength: 1,
165
- errorMessage: message || getMessages().arrayEmpty
166
- });
167
- }
168
- /**
169
- * Create a new validator that ensures array contains unique items
170
- */
171
- unique(message) {
172
- return new VldArray({
173
- ...this.config,
174
- unique: true,
175
- errorMessage: message || 'Array must contain unique items'
176
- });
177
- }
178
- /**
179
- * Create a new validator with a range constraint for length
180
- */
181
- between(min, max, message) {
182
- return new VldArray({
183
- ...this.config,
184
- minLength: min,
185
- maxLength: max,
186
- errorMessage: message || `Array length must be between ${min} and ${max}`
187
- });
188
- }
189
- }
190
- //# sourceMappingURL=array.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/validators/array.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\r\nimport { getMessages } from '../locales';\r\n\r\n/**\r\n * Configuration for array validator\r\n */\r\ninterface ArrayValidatorConfig<T> {\r\n readonly itemValidator: VldBase<unknown, T>;\r\n readonly minLength?: number;\r\n readonly maxLength?: number;\r\n readonly exactLength?: number;\r\n readonly unique?: boolean;\r\n readonly errorMessage?: string;\r\n}\r\n\r\n/**\r\n * Immutable array validator with chainable methods\r\n */\r\nexport class VldArray<T> extends VldBase<unknown[], T[]> {\r\n private readonly config: ArrayValidatorConfig<T>;\r\n \r\n /**\r\n * Private constructor to enforce immutability\r\n */\r\n private constructor(config: ArrayValidatorConfig<T>) {\r\n super();\r\n this.config = config;\r\n }\r\n \r\n /**\r\n * Create a new array validator\r\n */\r\n static create<T>(itemValidator: VldBase<unknown, T>): VldArray<T> {\r\n return new VldArray({ itemValidator });\r\n }\r\n \r\n /**\r\n * Parse and validate an array value\r\n */\r\n parse(value: unknown): T[] {\r\n if (!Array.isArray(value)) {\r\n throw new Error(this.config.errorMessage || getMessages().invalidArray);\r\n }\r\n \r\n // Validate length constraints\r\n if (this.config.exactLength !== undefined && value.length !== this.config.exactLength) {\r\n throw new Error(this.config.errorMessage || getMessages().arrayLength(this.config.exactLength));\r\n }\r\n \r\n if (this.config.minLength !== undefined && value.length < this.config.minLength) {\r\n throw new Error(this.config.errorMessage || getMessages().arrayMin(this.config.minLength));\r\n }\r\n \r\n if (this.config.maxLength !== undefined && value.length > this.config.maxLength) {\r\n throw new Error(this.config.errorMessage || getMessages().arrayMax(this.config.maxLength));\r\n }\r\n \r\n // Validate each item with optimized loop and safeParse\r\n const result: T[] = [];\r\n const length = value.length;\r\n \r\n for (let i = 0; i < length; i++) {\r\n const parseResult = this.config.itemValidator.safeParse(value[i]);\r\n if (!parseResult.success) {\r\n throw new Error(getMessages().arrayItem(i, parseResult.error.message));\r\n }\r\n result[i] = parseResult.data; // Direct assignment is faster than push\r\n }\r\n \r\n // Check uniqueness if required\r\n if (this.config.unique) {\r\n const seen = new Set<any>();\r\n for (const item of result) {\r\n const key = typeof item === 'object' ? this.stableStringify(item) : item;\r\n if (seen.has(key)) {\r\n throw new Error('Array must contain unique items');\r\n }\r\n seen.add(key);\r\n }\r\n }\r\n \r\n return result;\r\n }\r\n \r\n /**\r\n * Safely parse and validate an array value\r\n */\r\n safeParse(value: unknown): ParseResult<T[]> {\r\n try {\r\n return { success: true, data: this.parse(value) };\r\n } catch (error) {\r\n return { success: false, error: error as Error };\r\n }\r\n }\r\n\r\n /**\r\n * Create a stable string representation of an object for hashing\r\n * Handles circular references and deep nesting gracefully\r\n * BUG-006 FIX: Added depth limit to prevent stack overflow\r\n * BUG-NEW-003 FIX: Fixed depth tracking to properly track recursion depth\r\n */\r\n private stableStringify(obj: any): string {\r\n const seen = new WeakSet();\r\n const MAX_DEPTH = 100; // Reasonable depth limit to prevent stack overflow\r\n\r\n // Helper function to sort keys and create stable representation\r\n const sortedStringify = (value: any, depth: number = 0): string => {\r\n // Check depth limit\r\n if (depth > MAX_DEPTH) {\r\n return '\"[Max Depth Exceeded]\"';\r\n }\r\n\r\n // Handle primitives\r\n if (value === null) return 'null';\r\n if (value === undefined) return 'undefined';\r\n if (typeof value !== 'object') return JSON.stringify(value);\r\n\r\n // Handle circular references\r\n if (seen.has(value)) {\r\n return '\"[Circular]\"';\r\n }\r\n\r\n seen.add(value);\r\n\r\n try {\r\n // Handle arrays\r\n if (Array.isArray(value)) {\r\n const items = value.map(item => sortedStringify(item, depth + 1));\r\n return `[${items.join(',')}]`;\r\n }\r\n\r\n // Handle objects - sort keys for stability\r\n const keys = Object.keys(value).sort();\r\n const pairs = keys.map(key => {\r\n const serializedKey = JSON.stringify(key);\r\n const serializedValue = sortedStringify(value[key], depth + 1);\r\n return `${serializedKey}:${serializedValue}`;\r\n });\r\n\r\n return `{${pairs.join(',')}}`;\r\n } finally {\r\n // Clean up seen set for this branch\r\n seen.delete(value);\r\n }\r\n };\r\n\r\n try {\r\n return sortedStringify(obj);\r\n } catch (error) {\r\n // Fallback to safe representation if stringify fails\r\n return String(obj);\r\n }\r\n }\r\n \r\n /**\r\n * Create a new validator with minimum length constraint\r\n */\r\n min(length: number, message?: string): VldArray<T> {\r\n return new VldArray({\r\n ...this.config,\r\n minLength: length,\r\n errorMessage: message || getMessages().arrayMin(length)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with maximum length constraint\r\n */\r\n max(length: number, message?: string): VldArray<T> {\r\n return new VldArray({\r\n ...this.config,\r\n maxLength: length,\r\n errorMessage: message || getMessages().arrayMax(length)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with exact length constraint\r\n */\r\n length(length: number, message?: string): VldArray<T> {\r\n return new VldArray({\r\n ...this.config,\r\n exactLength: length,\r\n minLength: undefined,\r\n maxLength: undefined,\r\n errorMessage: message || getMessages().arrayLength(length)\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that ensures array is not empty\r\n */\r\n nonempty(message?: string): VldArray<T> {\r\n return new VldArray({\r\n ...this.config,\r\n minLength: 1,\r\n errorMessage: message || getMessages().arrayEmpty\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator that ensures array contains unique items\r\n */\r\n unique(message?: string): VldArray<T> {\r\n return new VldArray({\r\n ...this.config,\r\n unique: true,\r\n errorMessage: message || 'Array must contain unique items'\r\n });\r\n }\r\n \r\n /**\r\n * Create a new validator with a range constraint for length\r\n */\r\n between(min: number, max: number, message?: string): VldArray<T> {\r\n return new VldArray({\r\n ...this.config,\r\n minLength: min,\r\n maxLength: max,\r\n errorMessage: message || `Array length must be between ${min} and ${max}`\r\n });\r\n }\r\n}"]}