utilitify-core 1.0.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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +338 -0
  3. package/dist/async.cjs +25 -0
  4. package/dist/async.cjs.map +1 -0
  5. package/dist/async.d.cts +104 -0
  6. package/dist/async.d.ts +104 -0
  7. package/dist/async.js +4 -0
  8. package/dist/async.js.map +1 -0
  9. package/dist/chunk-2ICNRTSN.cjs +346 -0
  10. package/dist/chunk-2ICNRTSN.cjs.map +1 -0
  11. package/dist/chunk-3DPF72DY.js +170 -0
  12. package/dist/chunk-3DPF72DY.js.map +1 -0
  13. package/dist/chunk-4CV4JOE5.js +24 -0
  14. package/dist/chunk-4CV4JOE5.js.map +1 -0
  15. package/dist/chunk-4SLYNSLH.cjs +783 -0
  16. package/dist/chunk-4SLYNSLH.cjs.map +1 -0
  17. package/dist/chunk-5WP7DWCG.js +1285 -0
  18. package/dist/chunk-5WP7DWCG.js.map +1 -0
  19. package/dist/chunk-BMQ6YPKV.js +876 -0
  20. package/dist/chunk-BMQ6YPKV.js.map +1 -0
  21. package/dist/chunk-BZCMWUKS.cjs +479 -0
  22. package/dist/chunk-BZCMWUKS.cjs.map +1 -0
  23. package/dist/chunk-C5R744DY.cjs +173 -0
  24. package/dist/chunk-C5R744DY.cjs.map +1 -0
  25. package/dist/chunk-C75J62CV.cjs +913 -0
  26. package/dist/chunk-C75J62CV.cjs.map +1 -0
  27. package/dist/chunk-CZLDE2OZ.cjs +28 -0
  28. package/dist/chunk-CZLDE2OZ.cjs.map +1 -0
  29. package/dist/chunk-DSMB6AF6.cjs +193 -0
  30. package/dist/chunk-DSMB6AF6.cjs.map +1 -0
  31. package/dist/chunk-ETWGPOPY.js +426 -0
  32. package/dist/chunk-ETWGPOPY.js.map +1 -0
  33. package/dist/chunk-FQBPVN63.cjs +403 -0
  34. package/dist/chunk-FQBPVN63.cjs.map +1 -0
  35. package/dist/chunk-G4GYQGTW.cjs +178 -0
  36. package/dist/chunk-G4GYQGTW.cjs.map +1 -0
  37. package/dist/chunk-GFDMZDMI.js +486 -0
  38. package/dist/chunk-GFDMZDMI.js.map +1 -0
  39. package/dist/chunk-HOTOYIPB.js +171 -0
  40. package/dist/chunk-HOTOYIPB.js.map +1 -0
  41. package/dist/chunk-HYADH4ZX.js +176 -0
  42. package/dist/chunk-HYADH4ZX.js.map +1 -0
  43. package/dist/chunk-JBN7C5WE.js +255 -0
  44. package/dist/chunk-JBN7C5WE.js.map +1 -0
  45. package/dist/chunk-JNCTPFTD.cjs +25 -0
  46. package/dist/chunk-JNCTPFTD.cjs.map +1 -0
  47. package/dist/chunk-N3BH3BV7.js +21 -0
  48. package/dist/chunk-N3BH3BV7.js.map +1 -0
  49. package/dist/chunk-NFPGAVRQ.js +749 -0
  50. package/dist/chunk-NFPGAVRQ.js.map +1 -0
  51. package/dist/chunk-OFFRGRBN.cjs +1332 -0
  52. package/dist/chunk-OFFRGRBN.cjs.map +1 -0
  53. package/dist/chunk-OZLKYIZL.cjs +490 -0
  54. package/dist/chunk-OZLKYIZL.cjs.map +1 -0
  55. package/dist/chunk-P3NUK46X.js +145 -0
  56. package/dist/chunk-P3NUK46X.js.map +1 -0
  57. package/dist/chunk-P7P2B7ZI.cjs +429 -0
  58. package/dist/chunk-P7P2B7ZI.cjs.map +1 -0
  59. package/dist/chunk-PB6SKSJN.cjs +150 -0
  60. package/dist/chunk-PB6SKSJN.cjs.map +1 -0
  61. package/dist/chunk-R3IXCJR7.js +378 -0
  62. package/dist/chunk-R3IXCJR7.js.map +1 -0
  63. package/dist/chunk-SD6P3WEJ.js +324 -0
  64. package/dist/chunk-SD6P3WEJ.js.map +1 -0
  65. package/dist/chunk-YSCHP26P.js +451 -0
  66. package/dist/chunk-YSCHP26P.js.map +1 -0
  67. package/dist/chunk-ZLMPRPCY.cjs +274 -0
  68. package/dist/chunk-ZLMPRPCY.cjs.map +1 -0
  69. package/dist/common-CBDYNJeh.d.cts +48 -0
  70. package/dist/common-CBDYNJeh.d.ts +48 -0
  71. package/dist/constants.cjs +42 -0
  72. package/dist/constants.cjs.map +1 -0
  73. package/dist/constants.d.cts +60 -0
  74. package/dist/constants.d.ts +60 -0
  75. package/dist/constants.js +5 -0
  76. package/dist/constants.js.map +1 -0
  77. package/dist/country/index.cjs +154 -0
  78. package/dist/country/index.cjs.map +1 -0
  79. package/dist/country/index.d.cts +1 -0
  80. package/dist/country/index.d.ts +1 -0
  81. package/dist/country/index.js +5 -0
  82. package/dist/country/index.js.map +1 -0
  83. package/dist/date/index.cjs +117 -0
  84. package/dist/date/index.cjs.map +1 -0
  85. package/dist/date/index.d.cts +283 -0
  86. package/dist/date/index.d.ts +283 -0
  87. package/dist/date/index.js +4 -0
  88. package/dist/date/index.js.map +1 -0
  89. package/dist/environment/index.cjs +73 -0
  90. package/dist/environment/index.cjs.map +1 -0
  91. package/dist/environment/index.d.cts +127 -0
  92. package/dist/environment/index.d.ts +127 -0
  93. package/dist/environment/index.js +4 -0
  94. package/dist/environment/index.js.map +1 -0
  95. package/dist/form/index.cjs +81 -0
  96. package/dist/form/index.cjs.map +1 -0
  97. package/dist/form/index.d.cts +227 -0
  98. package/dist/form/index.d.ts +227 -0
  99. package/dist/form/index.js +4 -0
  100. package/dist/form/index.js.map +1 -0
  101. package/dist/i18n.cjs +37 -0
  102. package/dist/i18n.cjs.map +1 -0
  103. package/dist/i18n.d.cts +102 -0
  104. package/dist/i18n.d.ts +102 -0
  105. package/dist/i18n.js +4 -0
  106. package/dist/i18n.js.map +1 -0
  107. package/dist/index-BXBmBHyL.d.ts +718 -0
  108. package/dist/index-BYsUCP3u.d.cts +718 -0
  109. package/dist/index-Cl26FrAZ.d.cts +362 -0
  110. package/dist/index-Cl26FrAZ.d.ts +362 -0
  111. package/dist/index.cjs +1265 -0
  112. package/dist/index.cjs.map +1 -0
  113. package/dist/index.d.cts +205 -0
  114. package/dist/index.d.ts +205 -0
  115. package/dist/index.js +277 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/schema.cjs +13 -0
  118. package/dist/schema.cjs.map +1 -0
  119. package/dist/schema.d.cts +84 -0
  120. package/dist/schema.d.ts +84 -0
  121. package/dist/schema.js +4 -0
  122. package/dist/schema.js.map +1 -0
  123. package/dist/security/index.cjs +94 -0
  124. package/dist/security/index.cjs.map +1 -0
  125. package/dist/security/index.d.cts +216 -0
  126. package/dist/security/index.d.ts +216 -0
  127. package/dist/security/index.js +5 -0
  128. package/dist/security/index.js.map +1 -0
  129. package/dist/string/index.cjs +153 -0
  130. package/dist/string/index.cjs.map +1 -0
  131. package/dist/string/index.d.cts +471 -0
  132. package/dist/string/index.d.ts +471 -0
  133. package/dist/string/index.js +4 -0
  134. package/dist/string/index.js.map +1 -0
  135. package/dist/transform/index.cjs +105 -0
  136. package/dist/transform/index.cjs.map +1 -0
  137. package/dist/transform/index.d.cts +271 -0
  138. package/dist/transform/index.d.ts +271 -0
  139. package/dist/transform/index.js +4 -0
  140. package/dist/transform/index.js.map +1 -0
  141. package/dist/validators/index.cjs +195 -0
  142. package/dist/validators/index.cjs.map +1 -0
  143. package/dist/validators/index.d.cts +2 -0
  144. package/dist/validators/index.d.ts +2 -0
  145. package/dist/validators/index.js +6 -0
  146. package/dist/validators/index.js.map +1 -0
  147. package/package.json +229 -0
@@ -0,0 +1,403 @@
1
+ 'use strict';
2
+
3
+ // src/transform/merge.ts
4
+ function deepMerge(...objects) {
5
+ return deepMergeWith({}, ...objects);
6
+ }
7
+ function deepMergeWith(options, ...objects) {
8
+ const opts = {
9
+ arrayMerge: options.arrayMerge || "concat",
10
+ clone: options.clone !== false
11
+ };
12
+ return objects.reduce((result, obj) => {
13
+ if (!obj || typeof obj !== "object") return result;
14
+ Object.keys(obj).forEach((key) => {
15
+ const resultValue = result[key];
16
+ const objValue = obj[key];
17
+ if (Array.isArray(resultValue) && Array.isArray(objValue)) {
18
+ switch (opts.arrayMerge) {
19
+ case "replace":
20
+ result[key] = opts.clone ? [...objValue] : objValue;
21
+ break;
22
+ case "union":
23
+ result[key] = [
24
+ .../* @__PURE__ */ new Set([...resultValue, ...objValue])
25
+ ];
26
+ break;
27
+ case "concat":
28
+ default:
29
+ result[key] = [
30
+ ...resultValue,
31
+ ...objValue
32
+ ];
33
+ }
34
+ } else if (isPlainObject(resultValue) && isPlainObject(objValue)) {
35
+ result[key] = deepMergeWith(
36
+ opts,
37
+ resultValue,
38
+ objValue
39
+ );
40
+ } else {
41
+ result[key] = opts.clone ? cloneDeep(objValue) : objValue;
42
+ }
43
+ });
44
+ return result;
45
+ }, opts.clone ? {} : objects[0] || {});
46
+ }
47
+ function cloneDeep(obj) {
48
+ const seen = /* @__PURE__ */ new WeakMap();
49
+ return cloneDeepInternal(obj, seen);
50
+ }
51
+ function cloneDeepInternal(obj, seen) {
52
+ if (obj === null || typeof obj !== "object") {
53
+ return obj;
54
+ }
55
+ if (seen.has(obj)) {
56
+ return seen.get(obj);
57
+ }
58
+ if (obj instanceof Date) {
59
+ return new Date(obj.getTime());
60
+ }
61
+ if (obj instanceof RegExp) {
62
+ return new RegExp(obj.source, obj.flags);
63
+ }
64
+ if (Array.isArray(obj)) {
65
+ const clonedArray = [];
66
+ seen.set(obj, clonedArray);
67
+ for (const item of obj) {
68
+ clonedArray.push(cloneDeepInternal(item, seen));
69
+ }
70
+ return clonedArray;
71
+ }
72
+ if (obj instanceof Map) {
73
+ const clonedMap = /* @__PURE__ */ new Map();
74
+ seen.set(obj, clonedMap);
75
+ obj.forEach((value, key) => {
76
+ clonedMap.set(cloneDeepInternal(key, seen), cloneDeepInternal(value, seen));
77
+ });
78
+ return clonedMap;
79
+ }
80
+ if (obj instanceof Set) {
81
+ const clonedSet = /* @__PURE__ */ new Set();
82
+ seen.set(obj, clonedSet);
83
+ obj.forEach((value) => {
84
+ clonedSet.add(cloneDeepInternal(value, seen));
85
+ });
86
+ return clonedSet;
87
+ }
88
+ const clonedObj = {};
89
+ seen.set(obj, clonedObj);
90
+ for (const key in obj) {
91
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
92
+ clonedObj[key] = cloneDeepInternal(
93
+ obj[key],
94
+ seen
95
+ );
96
+ }
97
+ }
98
+ return clonedObj;
99
+ }
100
+ function isPlainObject(value) {
101
+ if (value === null || typeof value !== "object") return false;
102
+ const proto = Object.getPrototypeOf(value);
103
+ return proto === Object.prototype || proto === null;
104
+ }
105
+
106
+ // src/transform/flatten.ts
107
+ function flattenObject(obj, options = {}) {
108
+ const opts = {
109
+ delimiter: options.delimiter || ".",
110
+ maxDepth: options.maxDepth,
111
+ flattenArrays: options.flattenArrays ?? true
112
+ };
113
+ const result = {};
114
+ function flatten(current, prefix, depth) {
115
+ if (opts.maxDepth !== void 0 && depth >= opts.maxDepth) {
116
+ result[prefix] = current;
117
+ return;
118
+ }
119
+ if (Array.isArray(current) && opts.flattenArrays) {
120
+ if (current.length === 0) {
121
+ result[prefix] = current;
122
+ } else {
123
+ current.forEach((item, index) => {
124
+ const key = prefix ? `${prefix}${opts.delimiter}${index}` : String(index);
125
+ flatten(item, key, depth + 1);
126
+ });
127
+ }
128
+ } else if (current !== null && typeof current === "object" && isPlainObject2(current)) {
129
+ const keys = Object.keys(current);
130
+ if (keys.length === 0) {
131
+ result[prefix] = current;
132
+ } else {
133
+ keys.forEach((key) => {
134
+ const newKey = prefix ? `${prefix}${opts.delimiter}${key}` : key;
135
+ flatten(current[key], newKey, depth + 1);
136
+ });
137
+ }
138
+ } else {
139
+ result[prefix] = current;
140
+ }
141
+ }
142
+ flatten(obj, "", 0);
143
+ return result;
144
+ }
145
+ function unflattenObject(obj, options = {}) {
146
+ const delimiter = options.delimiter || ".";
147
+ const result = {};
148
+ for (const [key, value] of Object.entries(obj)) {
149
+ const keys = key.split(delimiter);
150
+ let current = result;
151
+ for (let i = 0; i < keys.length - 1; i++) {
152
+ const k = keys[i];
153
+ const nextKey = keys[i + 1];
154
+ const isArrayIndex = /^\d+$/.test(nextKey);
155
+ if (!(k in current)) {
156
+ current[k] = isArrayIndex ? [] : {};
157
+ }
158
+ current = current[k];
159
+ }
160
+ const lastKey = keys[keys.length - 1];
161
+ current[lastKey] = value;
162
+ }
163
+ return result;
164
+ }
165
+ function get(obj, path, defaultValue) {
166
+ const keys = Array.isArray(path) ? path : path.split(".");
167
+ let result = obj;
168
+ for (const key of keys) {
169
+ if (result === null || result === void 0) {
170
+ return defaultValue;
171
+ }
172
+ result = result[key];
173
+ }
174
+ return result === void 0 ? defaultValue : result;
175
+ }
176
+ function set(obj, path, value) {
177
+ const keys = Array.isArray(path) ? path : path.split(".");
178
+ let current = obj;
179
+ for (let i = 0; i < keys.length - 1; i++) {
180
+ const key = keys[i];
181
+ const nextKey = keys[i + 1];
182
+ if (!(key in current) || current[key] === null || typeof current[key] !== "object") {
183
+ current[key] = /^\d+$/.test(nextKey) ? [] : {};
184
+ }
185
+ current = current[key];
186
+ }
187
+ current[keys[keys.length - 1]] = value;
188
+ return obj;
189
+ }
190
+ function isPlainObject2(value) {
191
+ if (value === null || typeof value !== "object") return false;
192
+ const proto = Object.getPrototypeOf(value);
193
+ return proto === Object.prototype || proto === null;
194
+ }
195
+
196
+ // src/transform/pick.ts
197
+ function pick(obj, keys) {
198
+ const result = {};
199
+ for (const key of keys) {
200
+ if (key in obj) {
201
+ result[key] = obj[key];
202
+ }
203
+ }
204
+ return result;
205
+ }
206
+ function omit(obj, keys) {
207
+ const keysSet = new Set(keys);
208
+ const result = {};
209
+ for (const key of Object.keys(obj)) {
210
+ if (!keysSet.has(key)) {
211
+ result[key] = obj[key];
212
+ }
213
+ }
214
+ return result;
215
+ }
216
+ function pickBy(obj, predicate) {
217
+ const result = {};
218
+ for (const [key, value] of Object.entries(obj)) {
219
+ if (predicate(value, key)) {
220
+ result[key] = value;
221
+ }
222
+ }
223
+ return result;
224
+ }
225
+ function omitBy(obj, predicate) {
226
+ return pickBy(obj, (value, key) => !predicate(value, key));
227
+ }
228
+ function compact(obj) {
229
+ return pickBy(obj, (value) => value !== null && value !== void 0);
230
+ }
231
+ function compactDeep(obj) {
232
+ return pickBy(obj, (value) => Boolean(value));
233
+ }
234
+ function mapValues(obj, fn) {
235
+ const result = {};
236
+ for (const key of Object.keys(obj)) {
237
+ result[key] = fn(obj[key], key);
238
+ }
239
+ return result;
240
+ }
241
+ function mapKeys(obj, fn) {
242
+ const result = {};
243
+ for (const [key, value] of Object.entries(obj)) {
244
+ result[fn(key, value)] = value;
245
+ }
246
+ return result;
247
+ }
248
+ function invert(obj) {
249
+ const result = {};
250
+ for (const [key, value] of Object.entries(obj)) {
251
+ result[String(value)] = key;
252
+ }
253
+ return result;
254
+ }
255
+ function getAllKeys(obj, prefix = "") {
256
+ const keys = [];
257
+ for (const [key, value] of Object.entries(obj)) {
258
+ const fullKey = prefix ? `${prefix}.${key}` : key;
259
+ keys.push(fullKey);
260
+ if (value !== null && typeof value === "object" && !Array.isArray(value)) {
261
+ keys.push(...getAllKeys(value, fullKey));
262
+ }
263
+ }
264
+ return keys;
265
+ }
266
+
267
+ // src/transform/sanitize.ts
268
+ var DEFAULT_OPTIONS = {
269
+ stripHtml: true,
270
+ escapeHtml: false,
271
+ trim: true,
272
+ removeNullBytes: true
273
+ };
274
+ function sanitizeString(input, options = {}) {
275
+ if (!input || typeof input !== "string") return "";
276
+ const opts = { ...DEFAULT_OPTIONS, ...options };
277
+ let result = input;
278
+ if (opts.removeNullBytes) {
279
+ result = result.replace(/\0/g, "");
280
+ }
281
+ if (opts.stripHtml) {
282
+ result = stripHtml(result, opts.allowedTags);
283
+ } else if (opts.escapeHtml) {
284
+ result = escapeHtml(result);
285
+ }
286
+ if (opts.trim) {
287
+ result = result.trim();
288
+ }
289
+ if (opts.maxLength && result.length > opts.maxLength) {
290
+ result = result.slice(0, opts.maxLength);
291
+ }
292
+ return result;
293
+ }
294
+ function stripHtml(html, allowedTags) {
295
+ if (!html || typeof html !== "string") return "";
296
+ if (allowedTags && allowedTags.length > 0) {
297
+ const allowedPattern = allowedTags.join("|");
298
+ const regex = new RegExp(`<(?!/?(${allowedPattern})\\b)[^>]*>`, "gi");
299
+ return html.replace(regex, "");
300
+ }
301
+ return html.replace(/<[^>]*>/g, "");
302
+ }
303
+ function escapeHtml(str) {
304
+ if (!str || typeof str !== "string") return "";
305
+ const htmlEntities = {
306
+ "&": "&amp;",
307
+ "<": "&lt;",
308
+ ">": "&gt;",
309
+ '"': "&quot;",
310
+ "'": "&#39;",
311
+ "/": "&#x2F;",
312
+ "`": "&#x60;",
313
+ "=": "&#x3D;"
314
+ };
315
+ return str.replace(/[&<>"'`=/]/g, (char) => htmlEntities[char] || char);
316
+ }
317
+ function unescapeHtml(str) {
318
+ if (!str || typeof str !== "string") return "";
319
+ const htmlEntities = {
320
+ "&amp;": "&",
321
+ "&lt;": "<",
322
+ "&gt;": ">",
323
+ "&quot;": '"',
324
+ "&#39;": "'",
325
+ "&#x2F;": "/",
326
+ "&#x60;": "`",
327
+ "&#x3D;": "="
328
+ };
329
+ return str.replace(
330
+ /&amp;|&lt;|&gt;|&quot;|&#39;|&#x2F;|&#x60;|&#x3D;/g,
331
+ (entity) => htmlEntities[entity] || entity
332
+ );
333
+ }
334
+ function sanitizeObject(obj, options = {}) {
335
+ const seen = /* @__PURE__ */ new WeakSet();
336
+ return sanitizeObjectInternal(obj, options, seen);
337
+ }
338
+ function sanitizeObjectInternal(obj, options, seen) {
339
+ if (!obj || typeof obj !== "object") return obj;
340
+ if (seen.has(obj)) {
341
+ return Array.isArray(obj) ? [] : {};
342
+ }
343
+ seen.add(obj);
344
+ const result = {};
345
+ for (const [key, value] of Object.entries(obj)) {
346
+ if (typeof value === "string") {
347
+ result[key] = sanitizeString(value, options);
348
+ } else if (Array.isArray(value)) {
349
+ result[key] = value.map(
350
+ (item) => typeof item === "string" ? sanitizeString(item, options) : typeof item === "object" && item !== null ? sanitizeObjectInternal(item, options, seen) : item
351
+ );
352
+ } else if (typeof value === "object" && value !== null) {
353
+ result[key] = sanitizeObjectInternal(value, options, seen);
354
+ } else {
355
+ result[key] = value;
356
+ }
357
+ }
358
+ return result;
359
+ }
360
+ function sanitizeUrl(str) {
361
+ if (!str || typeof str !== "string") return "";
362
+ try {
363
+ const url = new URL(str);
364
+ const dangerousProtocols = ["javascript:", "data:", "vbscript:"];
365
+ if (dangerousProtocols.includes(url.protocol.toLowerCase())) {
366
+ return "";
367
+ }
368
+ return str;
369
+ } catch {
370
+ return encodeURIComponent(str);
371
+ }
372
+ }
373
+ function removeControlChars(str) {
374
+ if (!str || typeof str !== "string") return "";
375
+ return str.replace(/[\x00-\x1F\x7F]/g, "");
376
+ }
377
+
378
+ exports.cloneDeep = cloneDeep;
379
+ exports.compact = compact;
380
+ exports.compactDeep = compactDeep;
381
+ exports.deepMerge = deepMerge;
382
+ exports.deepMergeWith = deepMergeWith;
383
+ exports.escapeHtml = escapeHtml;
384
+ exports.flattenObject = flattenObject;
385
+ exports.get = get;
386
+ exports.getAllKeys = getAllKeys;
387
+ exports.invert = invert;
388
+ exports.mapKeys = mapKeys;
389
+ exports.mapValues = mapValues;
390
+ exports.omit = omit;
391
+ exports.omitBy = omitBy;
392
+ exports.pick = pick;
393
+ exports.pickBy = pickBy;
394
+ exports.removeControlChars = removeControlChars;
395
+ exports.sanitizeObject = sanitizeObject;
396
+ exports.sanitizeString = sanitizeString;
397
+ exports.sanitizeUrl = sanitizeUrl;
398
+ exports.set = set;
399
+ exports.stripHtml = stripHtml;
400
+ exports.unescapeHtml = unescapeHtml;
401
+ exports.unflattenObject = unflattenObject;
402
+ //# sourceMappingURL=chunk-FQBPVN63.cjs.map
403
+ //# sourceMappingURL=chunk-FQBPVN63.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/transform/merge.ts","../src/transform/flatten.ts","../src/transform/pick.ts","../src/transform/sanitize.ts"],"names":["isPlainObject"],"mappings":"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","file":"chunk-FQBPVN63.cjs","sourcesContent":["/**\r\n * Merge options\r\n */\r\nexport interface MergeOptions {\r\n /** How to merge arrays: 'concat', 'replace', or 'union' */\r\n arrayMerge?: 'concat' | 'replace' | 'union';\r\n /** Clone objects instead of mutating */\r\n clone?: boolean;\r\n}\r\n\r\n/**\r\n * Deep merge multiple objects\r\n *\r\n * @param objects - Objects to merge\r\n * @returns Merged object\r\n * @since 1.0.0\r\n *\r\n * @example\r\n * ```typescript\r\n * deepMerge({ a: 1, b: { c: 2 } }, { b: { d: 3 } });\r\n * // { a: 1, b: { c: 2, d: 3 } }\r\n * ```\r\n */\r\nexport function deepMerge<T extends object>(...objects: Partial<T>[]): T {\r\n return deepMergeWith({}, ...objects);\r\n}\r\n\r\n/**\r\n * Deep merge with options\r\n *\r\n * @param options - Merge options\r\n * @param objects - Objects to merge\r\n * @returns Merged object\r\n * @since 1.0.0\r\n */\r\nexport function deepMergeWith<T extends object>(\r\n options: MergeOptions,\r\n ...objects: Partial<T>[]\r\n): T {\r\n const opts: MergeOptions = {\r\n arrayMerge: options.arrayMerge || 'concat',\r\n clone: options.clone !== false,\r\n };\r\n\r\n return objects.reduce((result, obj) => {\r\n if (!obj || typeof obj !== 'object') return result;\r\n\r\n Object.keys(obj).forEach(key => {\r\n const resultValue = (result as Record<string, unknown>)[key];\r\n const objValue = (obj as Record<string, unknown>)[key];\r\n\r\n if (Array.isArray(resultValue) && Array.isArray(objValue)) {\r\n // Handle arrays\r\n switch (opts.arrayMerge) {\r\n case 'replace':\r\n (result as Record<string, unknown>)[key] = opts.clone\r\n ? [...objValue]\r\n : objValue;\r\n break;\r\n case 'union':\r\n (result as Record<string, unknown>)[key] = [\r\n ...new Set([...resultValue, ...objValue]),\r\n ];\r\n break;\r\n case 'concat':\r\n default:\r\n (result as Record<string, unknown>)[key] = [\r\n ...resultValue,\r\n ...objValue,\r\n ];\r\n }\r\n } else if (isPlainObject(resultValue) && isPlainObject(objValue)) {\r\n // Recursively merge objects\r\n (result as Record<string, unknown>)[key] = deepMergeWith(\r\n opts,\r\n resultValue as object,\r\n objValue as object\r\n );\r\n } else {\r\n // Simple assignment\r\n (result as Record<string, unknown>)[key] = opts.clone\r\n ? cloneDeep(objValue)\r\n : objValue;\r\n }\r\n });\r\n\r\n return result;\r\n }, (opts.clone ? {} : objects[0] || {}) as T) as T;\r\n}\r\n\r\n/**\r\n * Deep clone an object\r\n *\r\n * @param obj - Object to clone\r\n * @returns Cloned object\r\n * @since 1.0.0\r\n */\r\nexport function cloneDeep<T>(obj: T): T {\r\n // Use WeakMap to handle circular references\r\n const seen = new WeakMap<object, unknown>();\r\n return cloneDeepInternal(obj, seen);\r\n}\r\n\r\n/**\r\n * Internal recursive clone with circular reference protection\r\n */\r\nfunction cloneDeepInternal<T>(obj: T, seen: WeakMap<object, unknown>): T {\r\n if (obj === null || typeof obj !== 'object') {\r\n return obj;\r\n }\r\n\r\n // Check for circular reference\r\n if (seen.has(obj as object)) {\r\n return seen.get(obj as object) as T;\r\n }\r\n\r\n if (obj instanceof Date) {\r\n return new Date(obj.getTime()) as T;\r\n }\r\n\r\n if (obj instanceof RegExp) {\r\n return new RegExp(obj.source, obj.flags) as T;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n const clonedArray: unknown[] = [];\r\n seen.set(obj as object, clonedArray);\r\n for (const item of obj) {\r\n clonedArray.push(cloneDeepInternal(item, seen));\r\n }\r\n return clonedArray as T;\r\n }\r\n\r\n if (obj instanceof Map) {\r\n const clonedMap = new Map();\r\n seen.set(obj as object, clonedMap);\r\n obj.forEach((value, key) => {\r\n clonedMap.set(cloneDeepInternal(key, seen), cloneDeepInternal(value, seen));\r\n });\r\n return clonedMap as T;\r\n }\r\n\r\n if (obj instanceof Set) {\r\n const clonedSet = new Set();\r\n seen.set(obj as object, clonedSet);\r\n obj.forEach(value => {\r\n clonedSet.add(cloneDeepInternal(value, seen));\r\n });\r\n return clonedSet as T;\r\n }\r\n\r\n const clonedObj = {} as T;\r\n seen.set(obj as object, clonedObj);\r\n\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n (clonedObj as Record<string, unknown>)[key] = cloneDeepInternal(\r\n (obj as Record<string, unknown>)[key],\r\n seen\r\n );\r\n }\r\n }\r\n\r\n return clonedObj;\r\n}\r\n\r\n/**\r\n * Check if value is a plain object\r\n */\r\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\r\n if (value === null || typeof value !== 'object') return false;\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === Object.prototype || proto === null;\r\n}\r\n","/**\r\n * Flatten options\r\n */\r\nexport interface FlattenOptions {\r\n /** Delimiter for keys (default: '.') */\r\n delimiter?: string;\r\n /** Maximum depth to flatten */\r\n maxDepth?: number;\r\n /** Whether to flatten arrays */\r\n flattenArrays?: boolean;\r\n}\r\n\r\n/**\r\n * Flatten a nested object\r\n *\r\n * @param obj - Object to flatten\r\n * @param options - Flatten options\r\n * @returns Flattened object\r\n *\r\n * @example\r\n * ```typescript\r\n * flattenObject({ a: { b: { c: 1 } }, d: 2 });\r\n * // { 'a.b.c': 1, 'd': 2 }\r\n * ```\r\n */\r\nexport function flattenObject<T extends object>(\r\n obj: T,\r\n options: FlattenOptions = {}\r\n): Record<string, unknown> {\r\n const opts: FlattenOptions = {\r\n delimiter: options.delimiter || '.',\r\n maxDepth: options.maxDepth,\r\n flattenArrays: options.flattenArrays ?? true,\r\n };\r\n\r\n const result: Record<string, unknown> = {};\r\n\r\n function flatten(current: unknown, prefix: string, depth: number): void {\r\n if (opts.maxDepth !== undefined && depth >= opts.maxDepth) {\r\n result[prefix] = current;\r\n return;\r\n }\r\n\r\n if (Array.isArray(current) && opts.flattenArrays) {\r\n if (current.length === 0) {\r\n result[prefix] = current;\r\n } else {\r\n current.forEach((item, index) => {\r\n const key = prefix ? `${prefix}${opts.delimiter}${index}` : String(index);\r\n flatten(item, key, depth + 1);\r\n });\r\n }\r\n } else if (current !== null && typeof current === 'object' && isPlainObject(current)) {\r\n const keys = Object.keys(current);\r\n if (keys.length === 0) {\r\n result[prefix] = current;\r\n } else {\r\n keys.forEach(key => {\r\n const newKey = prefix ? `${prefix}${opts.delimiter}${key}` : key;\r\n flatten((current as Record<string, unknown>)[key], newKey, depth + 1);\r\n });\r\n }\r\n } else {\r\n result[prefix] = current;\r\n }\r\n }\r\n\r\n flatten(obj, '', 0);\r\n return result;\r\n}\r\n\r\n/**\r\n * Unflatten a flattened object\r\n *\r\n * @param obj - Flattened object\r\n * @param options - Options\r\n * @returns Nested object\r\n *\r\n * @example\r\n * ```typescript\r\n * unflattenObject({ 'a.b.c': 1, 'd': 2 });\r\n * // { a: { b: { c: 1 } }, d: 2 }\r\n * ```\r\n */\r\nexport function unflattenObject<T extends object>(\r\n obj: Record<string, unknown>,\r\n options: FlattenOptions = {}\r\n): T {\r\n const delimiter = options.delimiter || '.';\r\n const result: Record<string, unknown> = {};\r\n\r\n for (const [key, value] of Object.entries(obj)) {\r\n const keys = key.split(delimiter);\r\n let current = result;\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const k = keys[i];\r\n const nextKey = keys[i + 1];\r\n const isArrayIndex = /^\\d+$/.test(nextKey);\r\n\r\n if (!(k in current)) {\r\n current[k] = isArrayIndex ? [] : {};\r\n }\r\n\r\n current = current[k] as Record<string, unknown>;\r\n }\r\n\r\n const lastKey = keys[keys.length - 1];\r\n current[lastKey] = value;\r\n }\r\n\r\n return result as T;\r\n}\r\n\r\n/**\r\n * Get value at path\r\n *\r\n * @param obj - Object\r\n * @param path - Dot-notation path\r\n * @param defaultValue - Default value if not found\r\n * @returns Value at path\r\n */\r\nexport function get<T = unknown>(\r\n obj: Record<string, unknown>,\r\n path: string | string[],\r\n defaultValue?: T\r\n): T | undefined {\r\n const keys = Array.isArray(path) ? path : path.split('.');\r\n let result: unknown = obj;\r\n\r\n for (const key of keys) {\r\n if (result === null || result === undefined) {\r\n return defaultValue;\r\n }\r\n result = (result as Record<string, unknown>)[key];\r\n }\r\n\r\n return (result === undefined ? defaultValue : result) as T;\r\n}\r\n\r\n/**\r\n * Set value at path\r\n *\r\n * @param obj - Object\r\n * @param path - Dot-notation path\r\n * @param value - Value to set\r\n * @returns Modified object\r\n */\r\nexport function set<T extends object>(\r\n obj: T,\r\n path: string | string[],\r\n value: unknown\r\n): T {\r\n const keys = Array.isArray(path) ? path : path.split('.');\r\n let current: Record<string, unknown> = obj as Record<string, unknown>;\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n const nextKey = keys[i + 1];\r\n\r\n if (!(key in current) || current[key] === null || typeof current[key] !== 'object') {\r\n current[key] = /^\\d+$/.test(nextKey) ? [] : {};\r\n }\r\n\r\n current = current[key] as Record<string, unknown>;\r\n }\r\n\r\n current[keys[keys.length - 1]] = value;\r\n return obj;\r\n}\r\n\r\n/**\r\n * Check if value is a plain object\r\n */\r\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\r\n if (value === null || typeof value !== 'object') return false;\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === Object.prototype || proto === null;\r\n}\r\n","/**\r\n * Pick specified keys from object\r\n *\r\n * @param obj - Source object\r\n * @param keys - Keys to pick\r\n * @returns New object with only specified keys\r\n *\r\n * @example\r\n * ```typescript\r\n * pick({ a: 1, b: 2, c: 3 }, ['a', 'c']);\r\n * // { a: 1, c: 3 }\r\n * ```\r\n */\r\nexport function pick<T extends object, K extends keyof T>(\r\n obj: T,\r\n keys: K[]\r\n): Pick<T, K> {\r\n const result = {} as Pick<T, K>;\r\n\r\n for (const key of keys) {\r\n if (key in obj) {\r\n result[key] = obj[key];\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Omit specified keys from object\r\n *\r\n * @param obj - Source object\r\n * @param keys - Keys to omit\r\n * @returns New object without specified keys\r\n *\r\n * @example\r\n * ```typescript\r\n * omit({ a: 1, b: 2, c: 3 }, ['b']);\r\n * // { a: 1, c: 3 }\r\n * ```\r\n */\r\nexport function omit<T extends object, K extends keyof T>(\r\n obj: T,\r\n keys: K[]\r\n): Omit<T, K> {\r\n const keysSet = new Set(keys as string[]);\r\n const result = {} as Omit<T, K>;\r\n\r\n for (const key of Object.keys(obj)) {\r\n if (!keysSet.has(key)) {\r\n (result as Record<string, unknown>)[key] = (obj as Record<string, unknown>)[key];\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Pick keys by predicate function\r\n *\r\n * @param obj - Source object\r\n * @param predicate - Function to test each entry\r\n * @returns New object with matching entries\r\n *\r\n * @example\r\n * ```typescript\r\n * pickBy({ a: 1, b: null, c: 3 }, value => value !== null);\r\n * // { a: 1, c: 3 }\r\n * ```\r\n */\r\nexport function pickBy<T extends object>(\r\n obj: T,\r\n predicate: (value: unknown, key: string) => boolean\r\n): Partial<T> {\r\n const result = {} as Partial<T>;\r\n\r\n for (const [key, value] of Object.entries(obj)) {\r\n if (predicate(value, key)) {\r\n (result as Record<string, unknown>)[key] = value;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Omit keys by predicate function\r\n *\r\n * @param obj - Source object\r\n * @param predicate - Function to test each entry\r\n * @returns New object without matching entries\r\n */\r\nexport function omitBy<T extends object>(\r\n obj: T,\r\n predicate: (value: unknown, key: string) => boolean\r\n): Partial<T> {\r\n return pickBy(obj, (value, key) => !predicate(value, key));\r\n}\r\n\r\n/**\r\n * Remove null and undefined values\r\n *\r\n * @param obj - Source object\r\n * @returns Object without null/undefined values\r\n */\r\nexport function compact<T extends object>(obj: T): Partial<T> {\r\n return pickBy(obj, value => value !== null && value !== undefined);\r\n}\r\n\r\n/**\r\n * Remove falsy values (null, undefined, '', 0, false)\r\n *\r\n * @param obj - Source object\r\n * @returns Object without falsy values\r\n */\r\nexport function compactDeep<T extends object>(obj: T): Partial<T> {\r\n return pickBy(obj, value => Boolean(value));\r\n}\r\n\r\n/**\r\n * Map object values\r\n *\r\n * @param obj - Source object\r\n * @param fn - Mapping function\r\n * @returns New object with mapped values\r\n */\r\nexport function mapValues<T extends object, R>(\r\n obj: T,\r\n fn: (value: T[keyof T], key: keyof T) => R\r\n): Record<keyof T, R> {\r\n const result = {} as Record<keyof T, R>;\r\n\r\n for (const key of Object.keys(obj) as (keyof T)[]) {\r\n result[key] = fn(obj[key], key);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Map object keys\r\n *\r\n * @param obj - Source object\r\n * @param fn - Mapping function\r\n * @returns New object with mapped keys\r\n */\r\nexport function mapKeys<T extends object>(\r\n obj: T,\r\n fn: (key: string, value: unknown) => string\r\n): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n\r\n for (const [key, value] of Object.entries(obj)) {\r\n result[fn(key, value)] = value;\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Invert object (swap keys and values)\r\n *\r\n * @param obj - Source object\r\n * @returns Inverted object\r\n */\r\nexport function invert<T extends Record<string, string | number>>(\r\n obj: T\r\n): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n\r\n for (const [key, value] of Object.entries(obj)) {\r\n result[String(value)] = key;\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Get all keys including nested (as paths)\r\n *\r\n * @param obj - Source object\r\n * @param prefix - Key prefix\r\n * @returns Array of all paths\r\n */\r\nexport function getAllKeys(obj: Record<string, unknown>, prefix: string = ''): string[] {\r\n const keys: string[] = [];\r\n\r\n for (const [key, value] of Object.entries(obj)) {\r\n const fullKey = prefix ? `${prefix}.${key}` : key;\r\n keys.push(fullKey);\r\n\r\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\r\n keys.push(...getAllKeys(value as Record<string, unknown>, fullKey));\r\n }\r\n }\r\n\r\n return keys;\r\n}\r\n","/**\r\n * Sanitization options\r\n */\r\nexport interface SanitizeOptions {\r\n /** Strip HTML tags */\r\n stripHtml?: boolean;\r\n /** Escape HTML entities */\r\n escapeHtml?: boolean;\r\n /** Trim whitespace */\r\n trim?: boolean;\r\n /** Remove null bytes */\r\n removeNullBytes?: boolean;\r\n /** Maximum string length */\r\n maxLength?: number;\r\n /** Allowed HTML tags (if not stripping all) */\r\n allowedTags?: string[];\r\n}\r\n\r\n/**\r\n * Default sanitization options\r\n */\r\nconst DEFAULT_OPTIONS: SanitizeOptions = {\r\n stripHtml: true,\r\n escapeHtml: false,\r\n trim: true,\r\n removeNullBytes: true,\r\n};\r\n\r\n/**\r\n * Sanitize string input\r\n *\r\n * @param input - String to sanitize\r\n * @param options - Sanitization options\r\n * @returns Sanitized string\r\n * @since 1.0.0\r\n */\r\nexport function sanitizeString(input: string, options: SanitizeOptions = {}): string {\r\n if (!input || typeof input !== 'string') return '';\r\n\r\n const opts = { ...DEFAULT_OPTIONS, ...options };\r\n let result = input;\r\n\r\n // Remove null bytes\r\n if (opts.removeNullBytes) {\r\n result = result.replace(/\\0/g, '');\r\n }\r\n\r\n // Strip HTML\r\n if (opts.stripHtml) {\r\n result = stripHtml(result, opts.allowedTags);\r\n } else if (opts.escapeHtml) {\r\n result = escapeHtml(result);\r\n }\r\n\r\n // Trim\r\n if (opts.trim) {\r\n result = result.trim();\r\n }\r\n\r\n // Max length\r\n if (opts.maxLength && result.length > opts.maxLength) {\r\n result = result.slice(0, opts.maxLength);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Strip HTML tags from string\r\n *\r\n * @param html - HTML string\r\n * @param allowedTags - Tags to keep\r\n * @returns Cleaned string\r\n * @since 1.0.0\r\n */\r\nexport function stripHtml(html: string, allowedTags?: string[]): string {\r\n if (!html || typeof html !== 'string') return '';\r\n\r\n if (allowedTags && allowedTags.length > 0) {\r\n // Only strip non-allowed tags\r\n const allowedPattern = allowedTags.join('|');\r\n const regex = new RegExp(`<(?!\\/?(${allowedPattern})\\\\b)[^>]*>`, 'gi');\r\n return html.replace(regex, '');\r\n }\r\n\r\n // Strip all tags\r\n return html.replace(/<[^>]*>/g, '');\r\n}\r\n\r\n/**\r\n * Escape HTML entities\r\n *\r\n * @param str - String to escape\r\n * @returns Escaped string\r\n * @since 1.0.0\r\n */\r\nexport function escapeHtml(str: string): string {\r\n if (!str || typeof str !== 'string') return '';\r\n\r\n const htmlEntities: Record<string, string> = {\r\n '&': '&amp;',\r\n '<': '&lt;',\r\n '>': '&gt;',\r\n '\"': '&quot;',\r\n \"'\": '&#39;',\r\n '/': '&#x2F;',\r\n '`': '&#x60;',\r\n '=': '&#x3D;',\r\n };\r\n\r\n return str.replace(/[&<>\"'`=/]/g, char => htmlEntities[char] || char);\r\n}\r\n\r\n/**\r\n * Unescape HTML entities\r\n *\r\n * @param str - String to unescape\r\n * @returns Unescaped string\r\n * @since 1.0.0\r\n */\r\nexport function unescapeHtml(str: string): string {\r\n if (!str || typeof str !== 'string') return '';\r\n\r\n const htmlEntities: Record<string, string> = {\r\n '&amp;': '&',\r\n '&lt;': '<',\r\n '&gt;': '>',\r\n '&quot;': '\"',\r\n '&#39;': \"'\",\r\n '&#x2F;': '/',\r\n '&#x60;': '`',\r\n '&#x3D;': '=',\r\n };\r\n\r\n return str.replace(\r\n /&amp;|&lt;|&gt;|&quot;|&#39;|&#x2F;|&#x60;|&#x3D;/g,\r\n entity => htmlEntities[entity] || entity\r\n );\r\n}\r\n\r\n/**\r\n * Sanitize object recursively\r\n *\r\n * @param obj - Object to sanitize\r\n * @param options - Sanitization options\r\n * @returns Sanitized object\r\n * @since 1.0.0\r\n */\r\nexport function sanitizeObject<T extends object>(\r\n obj: T,\r\n options: SanitizeOptions = {}\r\n): T {\r\n // Use WeakSet to track seen objects and prevent circular reference issues\r\n const seen = new WeakSet<object>();\r\n return sanitizeObjectInternal(obj, options, seen);\r\n}\r\n\r\n/**\r\n * Internal recursive sanitization with circular reference protection\r\n */\r\nfunction sanitizeObjectInternal<T extends object>(\r\n obj: T,\r\n options: SanitizeOptions,\r\n seen: WeakSet<object>\r\n): T {\r\n if (!obj || typeof obj !== 'object') return obj;\r\n\r\n // Check for circular reference\r\n if (seen.has(obj)) {\r\n // Return a placeholder or empty object for circular refs\r\n return (Array.isArray(obj) ? [] : {}) as T;\r\n }\r\n\r\n // Mark this object as seen\r\n seen.add(obj);\r\n\r\n const result = {} as T;\r\n\r\n for (const [key, value] of Object.entries(obj)) {\r\n if (typeof value === 'string') {\r\n (result as Record<string, unknown>)[key] = sanitizeString(value, options);\r\n } else if (Array.isArray(value)) {\r\n (result as Record<string, unknown>)[key] = value.map(item =>\r\n typeof item === 'string'\r\n ? sanitizeString(item, options)\r\n : typeof item === 'object' && item !== null\r\n ? sanitizeObjectInternal(item, options, seen)\r\n : item\r\n );\r\n } else if (typeof value === 'object' && value !== null) {\r\n (result as Record<string, unknown>)[key] = sanitizeObjectInternal(value, options, seen);\r\n } else {\r\n (result as Record<string, unknown>)[key] = value;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Sanitize for URL\r\n *\r\n * @param str - String to sanitize\r\n * @returns URL-safe string\r\n */\r\nexport function sanitizeUrl(str: string): string {\r\n if (!str || typeof str !== 'string') return '';\r\n\r\n try {\r\n // Check for javascript: protocol and other dangerous schemes\r\n const url = new URL(str);\r\n const dangerousProtocols = ['javascript:', 'data:', 'vbscript:'];\r\n\r\n if (dangerousProtocols.includes(url.protocol.toLowerCase())) {\r\n return '';\r\n }\r\n\r\n return str;\r\n } catch {\r\n // Not a valid URL, encode it\r\n return encodeURIComponent(str);\r\n }\r\n}\r\n\r\n/**\r\n * Remove control characters\r\n *\r\n * @param str - String to clean\r\n * @returns Cleaned string\r\n */\r\nexport function removeControlChars(str: string): string {\r\n if (!str || typeof str !== 'string') return '';\r\n return str.replace(/[\\x00-\\x1F\\x7F]/g, '');\r\n}\r\n"]}
@@ -0,0 +1,178 @@
1
+ 'use strict';
2
+
3
+ // src/i18n.ts
4
+ var EN_MESSAGES = {
5
+ required: "This field is required",
6
+ invalid: "This field is invalid",
7
+ tooShort: "Must be at least {min} characters",
8
+ tooLong: "Must not exceed {max} characters",
9
+ emailInvalid: "Please enter a valid email address",
10
+ emailDisposable: "Disposable email addresses are not allowed",
11
+ emailDomainBlocked: "This email domain is not allowed",
12
+ phoneInvalid: "Please enter a valid phone number",
13
+ phoneTooShort: "Phone number is too short",
14
+ phoneTooLong: "Phone number is too long",
15
+ phoneMobileOnly: "Only mobile numbers are allowed",
16
+ passwordTooWeak: "Password is too weak",
17
+ passwordNoUppercase: "Password must contain uppercase letters",
18
+ passwordNoLowercase: "Password must contain lowercase letters",
19
+ passwordNoNumber: "Password must contain numbers",
20
+ passwordNoSymbol: "Password must contain special characters",
21
+ passwordCommonPattern: "Password is too common",
22
+ nameInvalid: "Please enter a valid name",
23
+ nameContainsNumbers: "Name cannot contain numbers",
24
+ usernameReserved: "This username is reserved",
25
+ usernameInvalidChars: "Username contains invalid characters",
26
+ urlInvalid: "Please enter a valid URL",
27
+ urlDangerous: "This URL is not allowed for security reasons",
28
+ cardInvalid: "Please enter a valid card number",
29
+ cardExpired: "This card has expired",
30
+ cardCvvInvalid: "Please enter a valid CVV"
31
+ };
32
+ var ES_MESSAGES = {
33
+ required: "Este campo es obligatorio",
34
+ invalid: "Este campo no es válido",
35
+ tooShort: "Debe tener al menos {min} caracteres",
36
+ tooLong: "No debe exceder {max} caracteres",
37
+ emailInvalid: "Por favor ingrese un correo electrónico válido",
38
+ emailDisposable: "No se permiten correos electrónicos temporales",
39
+ emailDomainBlocked: "Este dominio de correo no está permitido",
40
+ phoneInvalid: "Por favor ingrese un número de teléfono válido",
41
+ phoneTooShort: "El número de teléfono es muy corto",
42
+ phoneTooLong: "El número de teléfono es muy largo",
43
+ phoneMobileOnly: "Solo se permiten números móviles",
44
+ passwordTooWeak: "La contraseña es muy débil",
45
+ passwordNoUppercase: "La contraseña debe contener mayúsculas",
46
+ passwordNoLowercase: "La contraseña debe contener minúsculas",
47
+ passwordNoNumber: "La contraseña debe contener números",
48
+ passwordNoSymbol: "La contraseña debe contener caracteres especiales",
49
+ passwordCommonPattern: "La contraseña es muy común",
50
+ nameInvalid: "Por favor ingrese un nombre válido",
51
+ nameContainsNumbers: "El nombre no puede contener números",
52
+ usernameReserved: "Este nombre de usuario está reservado",
53
+ usernameInvalidChars: "El nombre de usuario contiene caracteres no válidos",
54
+ urlInvalid: "Por favor ingrese una URL válida",
55
+ urlDangerous: "Esta URL no está permitida por razones de seguridad",
56
+ cardInvalid: "Por favor ingrese un número de tarjeta válido",
57
+ cardExpired: "Esta tarjeta ha expirado",
58
+ cardCvvInvalid: "Por favor ingrese un CVV válido"
59
+ };
60
+ var UR_MESSAGES = {
61
+ required: "یہ فیلڈ ضروری ہے",
62
+ invalid: "یہ فیلڈ درست نہیں ہے",
63
+ tooShort: "کم از کم {min} حروف ہونے چاہئیں",
64
+ tooLong: "{max} حروف سے زیادہ نہیں ہونے چاہئیں",
65
+ emailInvalid: "براہ کرم درست ای میل درج کریں",
66
+ emailDisposable: "عارضی ای میل کی اجازت نہیں ہے",
67
+ emailDomainBlocked: "یہ ای میل ڈومین کی اجازت نہیں ہے",
68
+ phoneInvalid: "براہ کرم درست فون نمبر درج کریں",
69
+ phoneTooShort: "فون نمبر بہت چھوٹا ہے",
70
+ phoneTooLong: "فون نمبر بہت لمبا ہے",
71
+ phoneMobileOnly: "صرف موبائل نمبر کی اجازت ہے",
72
+ passwordTooWeak: "پاس ورڈ بہت کمزور ہے",
73
+ passwordNoUppercase: "پاس ورڈ میں بڑے حروف ہونے چاہئیں",
74
+ passwordNoLowercase: "پاس ورڈ میں چھوٹے حروف ہونے چاہئیں",
75
+ passwordNoNumber: "پاس ورڈ میں نمبر ہونے چاہئیں",
76
+ passwordNoSymbol: "پاس ورڈ میں خاص حروف ہونے چاہئیں",
77
+ passwordCommonPattern: "پاس ورڈ بہت عام ہے",
78
+ nameInvalid: "براہ کرم درست نام درج کریں",
79
+ nameContainsNumbers: "نام میں نمبر نہیں ہو سکتے",
80
+ usernameReserved: "یہ صارف نام محفوظ ہے",
81
+ usernameInvalidChars: "صارف نام میں غیر درست حروف ہیں",
82
+ urlInvalid: "براہ کرم درست URL درج کریں",
83
+ urlDangerous: "سیکیورٹی وجوہات کی بنا پر یہ URL کی اجازت نہیں ہے",
84
+ cardInvalid: "براہ کرم درست کارڈ نمبر درج کریں",
85
+ cardExpired: "یہ کارڈ ختم ہو چکا ہے",
86
+ cardCvvInvalid: "براہ کرم درست CVV درج کریں"
87
+ };
88
+ var AR_MESSAGES = {
89
+ required: "هذا الحقل مطلوب",
90
+ invalid: "هذا الحقل غير صالح",
91
+ tooShort: "يجب أن يكون على الأقل {min} أحرف",
92
+ tooLong: "يجب ألا يتجاوز {max} أحرف",
93
+ emailInvalid: "يرجى إدخال بريد إلكتروني صالح",
94
+ emailDisposable: "البريد الإلكتروني المؤقت غير مسموح به",
95
+ emailDomainBlocked: "نطاق البريد الإلكتروني هذا غير مسموح به",
96
+ phoneInvalid: "يرجى إدخال رقم هاتف صالح",
97
+ phoneTooShort: "رقم الهاتف قصير جداً",
98
+ phoneTooLong: "رقم الهاتف طويل جداً",
99
+ phoneMobileOnly: "يسمح فقط بأرقام الجوال",
100
+ passwordTooWeak: "كلمة المرور ضعيفة جداً",
101
+ passwordNoUppercase: "يجب أن تحتوي كلمة المرور على أحرف كبيرة",
102
+ passwordNoLowercase: "يجب أن تحتوي كلمة المرور على أحرف صغيرة",
103
+ passwordNoNumber: "يجب أن تحتوي كلمة المرور على أرقام",
104
+ passwordNoSymbol: "يجب أن تحتوي كلمة المرور على رموز خاصة",
105
+ passwordCommonPattern: "كلمة المرور شائعة جداً",
106
+ nameInvalid: "يرجى إدخال اسم صالح",
107
+ nameContainsNumbers: "لا يمكن أن يحتوي الاسم على أرقام",
108
+ usernameReserved: "اسم المستخدم هذا محجوز",
109
+ usernameInvalidChars: "اسم المستخدم يحتوي على أحرف غير صالحة",
110
+ urlInvalid: "يرجى إدخال رابط صالح",
111
+ urlDangerous: "هذا الرابط غير مسموح به لأسباب أمنية",
112
+ cardInvalid: "يرجى إدخال رقم بطاقة صالح",
113
+ cardExpired: "انتهت صلاحية هذه البطاقة",
114
+ cardCvvInvalid: "يرجى إدخال CVV صالح"
115
+ };
116
+ var MESSAGES = {
117
+ en: EN_MESSAGES,
118
+ es: ES_MESSAGES,
119
+ fr: EN_MESSAGES,
120
+ // Fallback to English
121
+ de: EN_MESSAGES,
122
+ // Fallback to English
123
+ ar: AR_MESSAGES,
124
+ zh: EN_MESSAGES,
125
+ // Fallback to English
126
+ ur: UR_MESSAGES,
127
+ hi: EN_MESSAGES
128
+ // Fallback to English
129
+ };
130
+ var currentLocale = "en";
131
+ var customMessages = {};
132
+ function setLocale(locale) {
133
+ currentLocale = locale;
134
+ }
135
+ function getLocale() {
136
+ return currentLocale;
137
+ }
138
+ function getMessage(key, params) {
139
+ let message = customMessages[key] || MESSAGES[currentLocale]?.[key] || MESSAGES.en[key];
140
+ if (params) {
141
+ Object.entries(params).forEach(([k, v]) => {
142
+ message = message.replace(new RegExp(`\\{${k}\\}`, "g"), String(v));
143
+ });
144
+ }
145
+ return message;
146
+ }
147
+ function setCustomMessages(messages) {
148
+ customMessages = { ...customMessages, ...messages };
149
+ }
150
+ function addLocale(locale, messages) {
151
+ MESSAGES[locale] = messages;
152
+ }
153
+ function getAvailableLocales() {
154
+ return Object.keys(MESSAGES);
155
+ }
156
+ function withLocalization(validator) {
157
+ return ((...args) => {
158
+ const result = validator(...args);
159
+ const localizedErrors = result.errors.map((error) => ({
160
+ ...error,
161
+ message: getMessage(error.code.toLowerCase()) || error.message
162
+ }));
163
+ return {
164
+ ...result,
165
+ errors: localizedErrors
166
+ };
167
+ });
168
+ }
169
+
170
+ exports.addLocale = addLocale;
171
+ exports.getAvailableLocales = getAvailableLocales;
172
+ exports.getLocale = getLocale;
173
+ exports.getMessage = getMessage;
174
+ exports.setCustomMessages = setCustomMessages;
175
+ exports.setLocale = setLocale;
176
+ exports.withLocalization = withLocalization;
177
+ //# sourceMappingURL=chunk-G4GYQGTW.cjs.map
178
+ //# sourceMappingURL=chunk-G4GYQGTW.cjs.map