umt 2.13.0 → 2.15.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 (199) hide show
  1. package/module/Array/arraysJoin.js +9 -1
  2. package/module/Array/arraysJoin.js.map +1 -1
  3. package/module/Array/sum.js +35 -2
  4. package/module/Array/sum.js.map +1 -1
  5. package/module/Array/ultraNumberSort.js +8 -3
  6. package/module/Array/ultraNumberSort.js.map +1 -1
  7. package/module/Array/zip.js +21 -5
  8. package/module/Array/zip.js.map +1 -1
  9. package/module/Array/zipLongest.js +23 -4
  10. package/module/Array/zipLongest.js.map +1 -1
  11. package/module/Crypto/decodeBase32.js +3 -2
  12. package/module/Crypto/decodeBase32.js.map +1 -1
  13. package/module/Crypto/decodeBase58.js +6 -4
  14. package/module/Crypto/decodeBase58.js.map +1 -1
  15. package/module/Crypto/encodeBase32.js +11 -6
  16. package/module/Crypto/encodeBase32.js.map +1 -1
  17. package/module/Crypto/encodeBase58.js +5 -2
  18. package/module/Crypto/encodeBase58.js.map +1 -1
  19. package/module/DataStructure/priorityQueue.js +8 -1
  20. package/module/DataStructure/priorityQueue.js.map +1 -1
  21. package/module/IP/ipToBinaryString.js +3 -1
  22. package/module/IP/ipToBinaryString.js.map +1 -1
  23. package/module/IP/longToIp.d.ts +1 -1
  24. package/module/IP/longToIp.js +2 -7
  25. package/module/IP/longToIp.js.map +1 -1
  26. package/module/Math/addition.js +4 -11
  27. package/module/Math/addition.js.map +1 -1
  28. package/module/Math/multiplication.js +14 -6
  29. package/module/Math/multiplication.js.map +1 -1
  30. package/module/Math/nCr.js +6 -2
  31. package/module/Math/nCr.js.map +1 -1
  32. package/module/Math/standardDeviation.js +12 -7
  33. package/module/Math/standardDeviation.js.map +1 -1
  34. package/module/Math/subtract.js +5 -9
  35. package/module/Math/subtract.js.map +1 -1
  36. package/module/Object/deepClone.d.ts +10 -0
  37. package/module/Object/deepClone.js +16 -6
  38. package/module/Object/deepClone.js.map +1 -1
  39. package/module/Object/getObjectsCommon.d.ts +10 -0
  40. package/module/Object/getObjectsCommon.js +10 -0
  41. package/module/Object/getObjectsCommon.js.map +1 -1
  42. package/module/Object/getObjectsDiff.d.ts +10 -0
  43. package/module/Object/getObjectsDiff.js +17 -6
  44. package/module/Object/getObjectsDiff.js.map +1 -1
  45. package/module/Object/has.d.ts +10 -0
  46. package/module/Object/has.js +10 -0
  47. package/module/Object/has.js.map +1 -1
  48. package/module/Object/index.d.ts +4 -0
  49. package/module/Object/index.js +4 -0
  50. package/module/Object/index.js.map +1 -1
  51. package/module/Object/keyBy.d.ts +10 -0
  52. package/module/Object/keyBy.js +10 -0
  53. package/module/Object/keyBy.js.map +1 -1
  54. package/module/Object/mapKeys.d.ts +10 -0
  55. package/module/Object/mapKeys.js +12 -1
  56. package/module/Object/mapKeys.js.map +1 -1
  57. package/module/Object/mapValues.d.ts +10 -0
  58. package/module/Object/mapValues.js +10 -0
  59. package/module/Object/mapValues.js.map +1 -1
  60. package/module/Object/merge.d.ts +10 -0
  61. package/module/Object/merge.js +17 -1
  62. package/module/Object/merge.js.map +1 -1
  63. package/module/Object/mergeDeep.d.ts +10 -0
  64. package/module/Object/mergeDeep.js +29 -15
  65. package/module/Object/mergeDeep.js.map +1 -1
  66. package/module/Object/pickDeep.d.ts +10 -0
  67. package/module/Object/pickDeep.js +10 -5
  68. package/module/Object/pickDeep.js.map +1 -1
  69. package/module/Object/removePrototype.d.ts +15 -0
  70. package/module/Object/removePrototype.js +25 -0
  71. package/module/Object/removePrototype.js.map +1 -0
  72. package/module/Object/removePrototypeDeep.d.ts +11 -0
  73. package/module/Object/removePrototypeDeep.js +60 -0
  74. package/module/Object/removePrototypeDeep.js.map +1 -0
  75. package/module/Object/removePrototypeMap.d.ts +9 -0
  76. package/module/Object/removePrototypeMap.js +13 -0
  77. package/module/Object/removePrototypeMap.js.map +1 -0
  78. package/module/Object/removePrototypeMapDeep.d.ts +9 -0
  79. package/module/Object/removePrototypeMapDeep.js +13 -0
  80. package/module/Object/removePrototypeMapDeep.js.map +1 -0
  81. package/module/String/escapeHtml.js +11 -2
  82. package/module/String/escapeHtml.js.map +1 -1
  83. package/module/String/formatString/applyFormatter.js +5 -5
  84. package/module/String/formatString/applyFormatter.js.map +1 -1
  85. package/module/String/formatString/getValue.js +3 -1
  86. package/module/String/formatString/getValue.js.map +1 -1
  87. package/module/String/levenshteinDistance.js +41 -24
  88. package/module/String/levenshteinDistance.js.map +1 -1
  89. package/module/String/slugify.js +7 -5
  90. package/module/String/slugify.js.map +1 -1
  91. package/module/String/trimEndCharacters.js +3 -1
  92. package/module/String/trimEndCharacters.js.map +1 -1
  93. package/module/String/trimStartCharacters.js +3 -1
  94. package/module/String/trimStartCharacters.js.map +1 -1
  95. package/module/String/unescapeHtml.d.ts +1 -1
  96. package/module/String/unescapeHtml.js +48 -4
  97. package/module/String/unescapeHtml.js.map +1 -1
  98. package/module/Tool/parseJson.js +13 -1
  99. package/module/Tool/parseJson.js.map +1 -1
  100. package/module/URL/buildUrl.js +4 -0
  101. package/module/URL/buildUrl.js.map +1 -1
  102. package/module/URL/parseQueryString.js +4 -0
  103. package/module/URL/parseQueryString.js.map +1 -1
  104. package/module/Validate/isDeepEqual.js +7 -5
  105. package/module/Validate/isDeepEqual.js.map +1 -1
  106. package/module/Validate/isPrimeNumber.js +12 -2
  107. package/module/Validate/isPrimeNumber.js.map +1 -1
  108. package/module/Validate/object/index.d.ts +2 -0
  109. package/module/Validate/object/index.js +2 -0
  110. package/module/Validate/object/index.js.map +1 -1
  111. package/module/Validate/object/intersection.d.ts +10 -0
  112. package/module/Validate/object/intersection.js +25 -0
  113. package/module/Validate/object/intersection.js.map +1 -0
  114. package/module/Validate/object/optional.d.ts +6 -0
  115. package/module/Validate/object/optional.js +6 -0
  116. package/module/Validate/object/optional.js.map +1 -1
  117. package/module/Validate/object/union.d.ts +9 -0
  118. package/module/Validate/object/union.js +27 -0
  119. package/module/Validate/object/union.js.map +1 -0
  120. package/module/Validate/parseEmail.js +6 -0
  121. package/module/Validate/parseEmail.js.map +1 -1
  122. package/module/Validate/string/uuid.d.ts +1 -5
  123. package/module/Validate/string/uuid.js +19 -2
  124. package/module/Validate/string/uuid.js.map +1 -1
  125. package/module/es5/Array/arraysJoin.js +20 -2
  126. package/module/es5/Array/sum.js +38 -4
  127. package/module/es5/Array/ultraNumberSort.js +31 -45
  128. package/module/es5/Array/zip.js +23 -17
  129. package/module/es5/Array/zipLongest.js +27 -14
  130. package/module/es5/Crypto/decodeBase32.js +11 -2
  131. package/module/es5/Crypto/decodeBase58.js +13 -6
  132. package/module/es5/Crypto/encodeBase32.js +12 -6
  133. package/module/es5/Crypto/encodeBase58.js +6 -2
  134. package/module/es5/DataStructure/priorityQueue.js +8 -3
  135. package/module/es5/IP/ipToBinaryString.js +2 -2
  136. package/module/es5/IP/longToIp.d.ts +1 -1
  137. package/module/es5/IP/longToIp.js +2 -13
  138. package/module/es5/Math/addition.js +4 -13
  139. package/module/es5/Math/multiplication.js +37 -6
  140. package/module/es5/Math/nCr.js +7 -2
  141. package/module/es5/Math/standardDeviation.js +25 -10
  142. package/module/es5/Math/subtract.js +12 -9
  143. package/module/es5/Object/deepClone.d.ts +10 -0
  144. package/module/es5/Object/deepClone.js +16 -6
  145. package/module/es5/Object/getObjectsCommon.d.ts +10 -0
  146. package/module/es5/Object/getObjectsCommon.js +10 -0
  147. package/module/es5/Object/getObjectsDiff.d.ts +10 -0
  148. package/module/es5/Object/getObjectsDiff.js +32 -17
  149. package/module/es5/Object/has.d.ts +10 -0
  150. package/module/es5/Object/has.js +10 -0
  151. package/module/es5/Object/index.d.ts +4 -0
  152. package/module/es5/Object/index.js +44 -0
  153. package/module/es5/Object/keyBy.d.ts +10 -0
  154. package/module/es5/Object/keyBy.js +10 -0
  155. package/module/es5/Object/mapKeys.d.ts +10 -0
  156. package/module/es5/Object/mapKeys.js +12 -1
  157. package/module/es5/Object/mapValues.d.ts +10 -0
  158. package/module/es5/Object/mapValues.js +10 -0
  159. package/module/es5/Object/merge.d.ts +10 -0
  160. package/module/es5/Object/merge.js +19 -1
  161. package/module/es5/Object/mergeDeep.d.ts +10 -0
  162. package/module/es5/Object/mergeDeep.js +34 -18
  163. package/module/es5/Object/pickDeep.d.ts +10 -0
  164. package/module/es5/Object/pickDeep.js +10 -3
  165. package/module/es5/Object/removePrototype.d.ts +15 -0
  166. package/module/es5/Object/removePrototype.js +31 -0
  167. package/module/es5/Object/removePrototypeDeep.d.ts +11 -0
  168. package/module/es5/Object/removePrototypeDeep.js +81 -0
  169. package/module/es5/Object/removePrototypeMap.d.ts +9 -0
  170. package/module/es5/Object/removePrototypeMap.js +20 -0
  171. package/module/es5/Object/removePrototypeMapDeep.d.ts +9 -0
  172. package/module/es5/Object/removePrototypeMapDeep.js +20 -0
  173. package/module/es5/String/escapeHtml.js +12 -3
  174. package/module/es5/String/formatString/applyFormatter.js +5 -5
  175. package/module/es5/String/formatString/getValue.js +4 -1
  176. package/module/es5/String/levenshteinDistance.js +43 -28
  177. package/module/es5/String/slugify.js +8 -1
  178. package/module/es5/String/trimEndCharacters.js +3 -1
  179. package/module/es5/String/trimStartCharacters.js +3 -1
  180. package/module/es5/String/unescapeHtml.d.ts +1 -1
  181. package/module/es5/String/unescapeHtml.js +46 -4
  182. package/module/es5/Tool/parseJson.js +14 -1
  183. package/module/es5/URL/buildUrl.js +4 -0
  184. package/module/es5/URL/parseQueryString.js +4 -0
  185. package/module/es5/Validate/isDeepEqual.js +48 -39
  186. package/module/es5/Validate/isPrimeNumber.js +14 -2
  187. package/module/es5/Validate/object/index.d.ts +2 -0
  188. package/module/es5/Validate/object/index.js +22 -0
  189. package/module/es5/Validate/object/intersection.d.ts +10 -0
  190. package/module/es5/Validate/object/intersection.js +34 -0
  191. package/module/es5/Validate/object/optional.d.ts +6 -0
  192. package/module/es5/Validate/object/optional.js +6 -0
  193. package/module/es5/Validate/object/union.d.ts +9 -0
  194. package/module/es5/Validate/object/union.js +36 -0
  195. package/module/es5/Validate/parseEmail.js +8 -0
  196. package/module/es5/Validate/string/uuid.d.ts +1 -5
  197. package/module/es5/Validate/string/uuid.js +24 -2
  198. package/package.json +33 -28
  199. package/module/es5/tsconfig.tsbuildinfo +0 -1
@@ -1,3 +1,10 @@
1
+ // Security: Keys that must be stripped during JSON parsing to prevent
2
+ // prototype pollution. If an attacker controls the JSON input, they can
3
+ // embed keys like "__proto__" which, when the parsed object is later
4
+ // spread or merged (e.g. via Object.assign, spread operator, or any
5
+ // deep-merge utility), can overwrite properties on Object.prototype
6
+ // and affect all objects in the runtime.
7
+ const DANGEROUS_KEYS = new Set(["__proto__", "constructor", "prototype"]);
1
8
  /**
2
9
  * Parses a JSON string into a typed JavaScript value
3
10
  * @template T The expected type of the parsed value (defaults to unknown)
@@ -6,6 +13,11 @@
6
13
  * @throws {SyntaxError} If the JSON string is invalid
7
14
  */
8
15
  export const parseJson = (json) => {
9
- return JSON.parse(json);
16
+ return JSON.parse(json, (key, value) => {
17
+ if (DANGEROUS_KEYS.has(key)) {
18
+ return;
19
+ }
20
+ return value;
21
+ });
10
22
  };
11
23
  //# sourceMappingURL=parseJson.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseJson.js","sourceRoot":"","sources":["../../src/Tool/parseJson.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAc,IAAY,EAAK,EAAE;IACxD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC"}
1
+ {"version":3,"file":"parseJson.js","sourceRoot":"","sources":["../../src/Tool/parseJson.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,wEAAwE;AACxE,qEAAqE;AACrE,oEAAoE;AACpE,oEAAoE;AACpE,yCAAyC;AACzC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAc,IAAY,EAAK,EAAE;IACxD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACrC,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -17,6 +17,10 @@
17
17
  export const buildUrl = (base, parameters = {}) => {
18
18
  const url = new URL(base);
19
19
  for (const key of Object.keys(parameters)) {
20
+ // Prevent prototype pollution by rejecting dangerous keys
21
+ if (key === "__proto__" || key === "constructor" || key === "prototype") {
22
+ continue;
23
+ }
20
24
  url.searchParams.append(key, parameters[key]);
21
25
  }
22
26
  return url.toString();
@@ -1 +1 @@
1
- {"version":3,"file":"buildUrl.js","sourceRoot":"","sources":["../../src/URL/buildUrl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,IAAY,EACZ,aAAqC,EAAE,EAC/B,EAAE;IACV,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC,CAAC"}
1
+ {"version":3,"file":"buildUrl.js","sourceRoot":"","sources":["../../src/URL/buildUrl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,IAAY,EACZ,aAAqC,EAAE,EAC/B,EAAE;IACV,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,0DAA0D;QAC1D,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxE,SAAS;QACX,CAAC;QACD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC,CAAC"}
@@ -27,6 +27,10 @@ export const parseQueryString = (query) => {
27
27
  const parameters = new URLSearchParams(searchString);
28
28
  const result = {};
29
29
  for (const [key, value] of parameters) {
30
+ // Prevent prototype pollution by rejecting dangerous keys
31
+ if (key === "__proto__" || key === "constructor" || key === "prototype") {
32
+ continue;
33
+ }
30
34
  result[key] = value;
31
35
  }
32
36
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"parseQueryString.js","sourceRoot":"","sources":["../../src/URL/parseQueryString.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAA0B,EAAE;IACxE,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,YAAY,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACvC,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
1
+ {"version":3,"file":"parseQueryString.js","sourceRoot":"","sources":["../../src/URL/parseQueryString.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAA0B,EAAE;IACxE,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,YAAY,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACvC,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;QACtC,0DAA0D;QAC1D,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxE,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
@@ -59,12 +59,14 @@ export function isDeepEqual(a, b, options = {}) {
59
59
  }
60
60
  }
61
61
  else {
62
- const yCopy = [...y];
62
+ // Performance: Use Set<number> to track matched indices instead of
63
+ // splice(), avoiding O(n) array shifts per removal (O(n²) → O(n)).
64
+ const usedIndices = new Set();
63
65
  for (const itemX of x) {
64
66
  let found = false;
65
- for (let index = 0; index < yCopy.length; index++) {
66
- if (compare(itemX, yCopy[index])) {
67
- yCopy.splice(index, 1);
67
+ for (const [index, itemY] of y.entries()) {
68
+ if (!usedIndices.has(index) && compare(itemX, itemY)) {
69
+ usedIndices.add(index);
68
70
  found = true;
69
71
  break;
70
72
  }
@@ -73,7 +75,7 @@ export function isDeepEqual(a, b, options = {}) {
73
75
  return false;
74
76
  }
75
77
  }
76
- return yCopy.length === 0;
78
+ return usedIndices.size === y.length;
77
79
  }
78
80
  return true;
79
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"isDeepEqual.js","sourceRoot":"","sources":["../../src/Validate/isDeepEqual.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"isDeepEqual.js","sourceRoot":"","sources":["../../src/Validate/isDeepEqual.ts"],"names":[],"mappings":"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"}
@@ -12,8 +12,18 @@ export const isPrimeNumber = (n) => {
12
12
  if (n <= 1 || !Number.isInteger(n)) {
13
13
  return false;
14
14
  }
15
- for (let index = 2; index <= Math.sqrt(n); index++) {
16
- if (n % index === 0) {
15
+ // Handle small primes and eliminate even numbers / multiples of 3 early
16
+ if (n <= 3) {
17
+ return true;
18
+ }
19
+ if (n % 2 === 0 || n % 3 === 0) {
20
+ return false;
21
+ }
22
+ // Performance: only test divisors of the form 6k +/- 1.
23
+ // All primes > 3 are of this form, so we skip ~2/3 of candidates
24
+ // compared to the naive loop that checks every integer from 2 to sqrt(n).
25
+ for (let index = 5; index * index <= n; index += 6) {
26
+ if (n % index === 0 || n % (index + 2) === 0) {
17
27
  return false;
18
28
  }
19
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"isPrimeNumber.js","sourceRoot":"","sources":["../../src/Validate/isPrimeNumber.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAS,EAAW,EAAE;IAClD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACnD,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
1
+ {"version":3,"file":"isPrimeNumber.js","sourceRoot":"","sources":["../../src/Validate/isPrimeNumber.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAS,EAAW,EAAE;IAClD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,wEAAwE;IACxE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,wDAAwD;IACxD,iEAAiE;IACjE,0EAA0E;IAC1E,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
@@ -1,2 +1,4 @@
1
1
  export * from "./core";
2
+ export * from "./intersection";
2
3
  export * from "./optional";
4
+ export * from "./union";
@@ -1,3 +1,5 @@
1
1
  export * from "./core";
2
+ export * from "./intersection";
2
3
  export * from "./optional";
4
+ export * from "./union";
3
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Validate/object/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Validate/object/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { UnionToIntersection } from "../../types/logic";
2
+ import type { ValidateCoreReturnType } from "../../Validate/type";
3
+ type ExtractValidatedType<V> = V extends (value: never) => ValidateCoreReturnType<infer T> ? T : never;
4
+ /**
5
+ * Creates an intersection validator that passes only if all given validators pass
6
+ * @param validators - Validator functions to compose as an intersection (logical AND)
7
+ * @returns {Function} - Validator that checks if the value matches all validators
8
+ */
9
+ export declare const intersection: <Vs extends ((value: never) => ValidateCoreReturnType<unknown>)[]>(...validators: [...Vs]) => (value: UnionToIntersection<ExtractValidatedType<Vs[number]>>) => ValidateCoreReturnType<UnionToIntersection<ExtractValidatedType<Vs[number]>>>;
10
+ export {};
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Creates an intersection validator that passes only if all given validators pass
3
+ * @param validators - Validator functions to compose as an intersection (logical AND)
4
+ * @returns {Function} - Validator that checks if the value matches all validators
5
+ */
6
+ export const intersection = (...validators) => {
7
+ return (value) => {
8
+ for (const validator of validators) {
9
+ const result = validator(value);
10
+ if (!result.validate) {
11
+ return {
12
+ validate: false,
13
+ message: result.message,
14
+ type: value,
15
+ };
16
+ }
17
+ }
18
+ return {
19
+ validate: true,
20
+ message: "",
21
+ type: value,
22
+ };
23
+ };
24
+ };
25
+ //# sourceMappingURL=intersection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intersection.js","sourceRoot":"","sources":["../../../src/Validate/object/intersection.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAG1B,GAAG,UAAmB,EACtB,EAAE;IACF,OAAO,CACL,KAA4D,EAG5D,EAAE;QACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,MAAM,GACV,SAKD,CAAC,KAAK,CAAC,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACrB,OAAO;oBACL,QAAQ,EAAE,KAAK;oBACf,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,KAEL;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,KAEL;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -1,2 +1,8 @@
1
1
  import type { ValidateCoreReturnType } from "../../Validate/type";
2
+ /**
3
+ * Wraps a validator to accept undefined values
4
+ * @template T - The type of value the wrapped validator expects
5
+ * @param {Function} validator - Validator function to make optional
6
+ * @returns {Function} - Validator that passes for undefined or delegates to the wrapped validator
7
+ */
2
8
  export declare const optional: <T>(validator: (value: T) => ValidateCoreReturnType<T>) => ((value?: T) => ValidateCoreReturnType<T | undefined>);
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Wraps a validator to accept undefined values
3
+ * @template T - The type of value the wrapped validator expects
4
+ * @param {Function} validator - Validator function to make optional
5
+ * @returns {Function} - Validator that passes for undefined or delegates to the wrapped validator
6
+ */
1
7
  export const optional = (validator) => {
2
8
  const optionalValidator = (value) => {
3
9
  if (value === undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"optional.js","sourceRoot":"","sources":["../../../src/Validate/object/optional.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,SAAkD,EACM,EAAE;IAC1D,MAAM,iBAAiB,GAAG,CACxB,KAAS,EAC8B,EAAE;QACzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO;gBACL,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,WAAW;aAClB,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC"}
1
+ {"version":3,"file":"optional.js","sourceRoot":"","sources":["../../../src/Validate/object/optional.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,SAAkD,EACM,EAAE;IAC1D,MAAM,iBAAiB,GAAG,CACxB,KAAS,EAC8B,EAAE;QACzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO;gBACL,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,WAAW;aAClB,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ValidateCoreReturnType } from "../../Validate/type";
2
+ type ExtractValidatedType<V> = V extends (value: never) => ValidateCoreReturnType<infer T> ? T : never;
3
+ /**
4
+ * Creates a union validator that passes if any of the given validators pass
5
+ * @param validators - Validator functions to compose as a union (logical OR)
6
+ * @returns {Function} - Validator that checks if the value matches any of the validators
7
+ */
8
+ export declare const union: <Vs extends ((value: never) => ValidateCoreReturnType<unknown>)[]>(...validators: [...Vs]) => (value: ExtractValidatedType<Vs[number]>) => ValidateCoreReturnType<ExtractValidatedType<Vs[number]>>;
9
+ export {};
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Creates a union validator that passes if any of the given validators pass
3
+ * @param validators - Validator functions to compose as a union (logical OR)
4
+ * @returns {Function} - Validator that checks if the value matches any of the validators
5
+ */
6
+ export const union = (...validators) => {
7
+ return (value) => {
8
+ let lastMessage = "";
9
+ for (const validator of validators) {
10
+ const result = validator(value);
11
+ if (result.validate) {
12
+ return {
13
+ validate: true,
14
+ message: "",
15
+ type: value,
16
+ };
17
+ }
18
+ lastMessage = result.message;
19
+ }
20
+ return {
21
+ validate: false,
22
+ message: lastMessage,
23
+ type: value,
24
+ };
25
+ };
26
+ };
27
+ //# sourceMappingURL=union.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"union.js","sourceRoot":"","sources":["../../../src/Validate/object/union.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAGnB,GAAG,UAAmB,EACtB,EAAE;IACF,OAAO,CACL,KAAuC,EACmB,EAAE;QAC5D,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,MAAM,GACV,SAGD,CAAC,KAAK,CAAC,CAAC;YACT,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,OAAO;oBACL,QAAQ,EAAE,IAAI;oBACd,OAAO,EAAE,EAAE;oBACX,IAAI,EAAE,KAA2D;iBAClE,CAAC;YACJ,CAAC;YACD,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,WAAW;YACpB,IAAI,EAAE,KAA2D;SAClE,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -6,6 +6,12 @@ const EMAIL_PATTERNS = {
6
6
  rfc5322: /^(?=.{1,998}$)(?:\s|\((?:[^()\\]|\\[\S\s])*(?:\((?:[^()\\]|\\[\S\s])*\)(?:[^()\\]|\\[\S\s])*)*\))*(?<local>"(?:[^"\\]|\\[\S\s]){0,62}"(?:\."(?:[^"\\]|\\[\S\s]){0,62}")*|"(?:[^"\\]|\\[\S\s]){0,62}"(?:(?:\.[\w!#$%&'*+/=?^`{|}~-]{1,64})+)+|[\w!#$%&'*+/=?^`{|}~-]{1,64}(?:\.[\w!#$%&'*+/=?^`{|}~-]{1,64})*(?:\."(?:[^"\\]|\\[\S\s]){0,62}")+|[\w!#$%&'*+/=?^`{|}~-]{1,64}(?:(?:\s|\((?:[^()\\]|\\[\S\s])*(?:\((?:[^()\\]|\\[\S\s])*\)(?:[^()\\]|\\[\S\s])*)*\))*\.(?:\s|\((?:[^()\\]|\\[\S\s])*(?:\((?:[^()\\]|\\[\S\s])*\)(?:[^()\\]|\\[\S\s])*)*\))*[\w!#$%&'*+/=?^`{|}~-]{1,64})*)(?:\s|\((?:[^()\\]|\\[\S\s])*(?:\((?:[^()\\]|\\[\S\s])*\)(?:[^()\\]|\\[\S\s])*)*\))*@(?:\s|\((?:[^()\\]|\\[\S\s])*(?:\((?:[^()\\]|\\[\S\s])*\)(?:[^()\\]|\\[\S\s])*)*\))*(?<domain>[\dA-Za-z](?:[\dA-Za-z-]{0,61}[\dA-Za-z])?(?:(?:\s|\((?:[^()\\]|\\[\S\s])*(?:\((?:[^()\\]|\\[\S\s])*\)(?:[^()\\]|\\[\S\s])*)*\))*\.(?:\s|\((?:[^()\\]|\\[\S\s])*(?:\((?:[^()\\]|\\[\S\s])*\)(?:[^()\\]|\\[\S\s])*)*\))*[\dA-Za-z](?:[\dA-Za-z-]{0,61}[\dA-Za-z])?)+|\[(?:(?:\d{1,3}\.){3}\d{1,3}|IPv6:[\d:A-Fa-f]+)])(?:\s|\((?:[^()\\]|\\[\S\s])*(?:\((?:[^()\\]|\\[\S\s])*\)(?:[^()\\]|\\[\S\s])*)*\))*$/,
7
7
  };
8
8
  export const parseEmail = ({ email, options, }) => {
9
+ // ReDoS mitigation: reject excessively long inputs before regex evaluation
10
+ // RFC 5321 specifies max 256 characters for a full email address
11
+ const MAX_EMAIL_LENGTH = 320;
12
+ if (email.length > MAX_EMAIL_LENGTH) {
13
+ return { valid: false };
14
+ }
9
15
  const { level } = options;
10
16
  const pattern = EMAIL_PATTERNS[level];
11
17
  const match = pattern.exec(email);
@@ -1 +1 @@
1
- {"version":3,"file":"parseEmail.js","sourceRoot":"","sources":["../../src/Validate/parseEmail.ts"],"names":[],"mappings":"AAOA,MAAM,cAAc,GAAG;IACrB,KAAK,EACH,6IAA6I;IAC/I,MAAM,EACJ,yhBAAyhB;IAC3hB,OAAO,EACL,sOAAsO;IACxO,OAAO,EACL,iSAAiS;IACnS,OAAO,EACL,snCAAsnC;CAChnC,CAAC;AAMX,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EACzB,KAAK,EACL,OAAO,GAIR,EAGC,EAAE;IACF,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1B,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAElC,OAAO;QACL,KAAK,EAAE,KAAK,KAAK,IAAI;QACrB,KAAK,EAAE,KAAK,EAAE,MAAM;YAClB,CAAC,CAAC;gBACE,qFAAqF;gBACrF,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC5B,qFAAqF;gBACrF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;aAC/B;YACH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"parseEmail.js","sourceRoot":"","sources":["../../src/Validate/parseEmail.ts"],"names":[],"mappings":"AAOA,MAAM,cAAc,GAAG;IACrB,KAAK,EACH,6IAA6I;IAC/I,MAAM,EACJ,yhBAAyhB;IAC3hB,OAAO,EACL,sOAAsO;IACxO,OAAO,EACL,iSAAiS;IACnS,OAAO,EACL,snCAAsnC;CAChnC,CAAC;AAMX,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EACzB,KAAK,EACL,OAAO,GAIR,EAGC,EAAE;IACF,2EAA2E;IAC3E,iEAAiE;IACjE,MAAM,gBAAgB,GAAG,GAAG,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;QACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1B,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAElC,OAAO;QACL,KAAK,EAAE,KAAK,KAAK,IAAI;QACrB,KAAK,EAAE,KAAK,EAAE,MAAM;YAClB,CAAC,CAAC;gBACE,qFAAqF;gBACrF,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC5B,qFAAqF;gBACrF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;aAC/B;YACH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC,CAAC"}
@@ -1,11 +1,7 @@
1
1
  import type { ValidateReturnType } from "../../Validate/type";
2
- /**
3
- * String validation module for UUID strings
4
- * Provides validation functionality for checking if a string is a valid UUID
5
- */
6
2
  /**
7
3
  * Creates a validator for checking if a string is a valid UUID
8
- * @param {number[]} [versions=[4]] - Array of supported UUID versions
4
+ * @param {number[]} [versions=[4]] - Array of supported UUID versions (1-7)
9
5
  * @param {string} [message] - Custom error message for validation failure
10
6
  * @returns {ValidateReturnType<string>} - Validator for UUID strings
11
7
  */
@@ -2,14 +2,31 @@
2
2
  * String validation module for UUID strings
3
3
  * Provides validation functionality for checking if a string is a valid UUID
4
4
  */
5
+ // Security: Valid UUID versions are single-digit integers (1-7).
6
+ // The version value is interpolated into a RegExp constructor, so untrusted
7
+ // input could inject arbitrary regex patterns (regex injection / ReDoS).
8
+ // We validate each version is a safe integer in the expected range before use.
9
+ const VALID_UUID_VERSIONS = new Set([1, 2, 3, 4, 5, 6, 7]);
5
10
  /**
6
11
  * Creates a validator for checking if a string is a valid UUID
7
- * @param {number[]} [versions=[4]] - Array of supported UUID versions
12
+ * @param {number[]} [versions=[4]] - Array of supported UUID versions (1-7)
8
13
  * @param {string} [message] - Custom error message for validation failure
9
14
  * @returns {ValidateReturnType<string>} - Validator for UUID strings
10
15
  */
11
16
  export const uuid = (versions = [4], message) => {
12
- const versionRegexes = versions.map((version) => new RegExp(String.raw `^[\da-f]{8}-?[\da-f]{4}-?${version}[\da-f]{3}-?[89ab][\da-f]{3}-?[\da-f]{12}$`, "i"));
17
+ // Security: Sanitize version input to prevent regex injection.
18
+ // Only allow known UUID version numbers (integers 1-7) to be interpolated
19
+ // into the RegExp pattern. Reject anything else to block arbitrary regex
20
+ // metacharacter injection via untrusted input.
21
+ const safeVersions = versions.filter((v) => VALID_UUID_VERSIONS.has(v));
22
+ if (safeVersions.length === 0) {
23
+ return {
24
+ type: "string",
25
+ message,
26
+ validate: () => false,
27
+ };
28
+ }
29
+ const versionRegexes = safeVersions.map((version) => new RegExp(String.raw `^[\da-f]{8}-?[\da-f]{4}-?${version}[\da-f]{3}-?[89ab][\da-f]{3}-?[\da-f]{12}$`, "i"));
13
30
  return {
14
31
  type: "string",
15
32
  message,
@@ -1 +1 @@
1
- {"version":3,"file":"uuid.js","sourceRoot":"","sources":["../../../src/Validate/string/uuid.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,WAAqB,CAAC,CAAC,CAAC,EACxB,OAAgB,EACY,EAAE;IAC9B,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CACjC,CAAC,OAAO,EAAE,EAAE,CACV,IAAI,MAAM,CACR,MAAM,CAAC,GAAG,CAAA,4BAA4B,OAAO,4CAA4C,EACzF,GAAG,CACJ,CACJ,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO;QACP,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"uuid.js","sourceRoot":"","sources":["../../../src/Validate/string/uuid.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,iEAAiE;AACjE,4EAA4E;AAC5E,yEAAyE;AACzE,+EAA+E;AAC/E,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,WAAqB,CAAC,CAAC,CAAC,EACxB,OAAgB,EACY,EAAE;IAC9B,+DAA+D;IAC/D,0EAA0E;IAC1E,yEAAyE;IACzE,+CAA+C;IAC/C,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO;YACP,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CACrC,CAAC,OAAO,EAAE,EAAE,CACV,IAAI,MAAM,CACR,MAAM,CAAC,GAAG,CAAA,4BAA4B,OAAO,4CAA4C,EACzF,GAAG,CACJ,CACJ,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO;QACP,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -6,9 +6,10 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.arraysJoin = void 0;
7
7
  function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
8
8
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
9
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
10
9
  function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
11
10
  function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
11
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
12
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
12
13
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
13
14
  /**
14
15
  * Join arrays without duplicates
@@ -18,8 +19,25 @@ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length)
18
19
  * @example arraysJoin([1, 2, 3], [2, 3, 4]); // [1, 2, 3, 4]
19
20
  */
20
21
  var arraysJoin = exports.arraysJoin = function arraysJoin(array) {
22
+ // Build Set directly to avoid the intermediate spread-concat array.
23
+ // Previous: [...new Set([...array, ...arrays.flat()])] allocated a temporary
24
+ // combined array before constructing the Set.
25
+ // This approach feeds flat() results directly into the Set, skipping that copy.
26
+ var set = new Set(array);
21
27
  for (var _len = arguments.length, arrays = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
22
28
  arrays[_key - 1] = arguments[_key];
23
29
  }
24
- return _toConsumableArray(new Set([].concat(_toConsumableArray(array), _toConsumableArray(arrays.flat()))));
30
+ var _iterator = _createForOfIteratorHelper(arrays.flat()),
31
+ _step;
32
+ try {
33
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
34
+ var element = _step.value;
35
+ set.add(element);
36
+ }
37
+ } catch (err) {
38
+ _iterator.e(err);
39
+ } finally {
40
+ _iterator.f();
41
+ }
42
+ return _toConsumableArray(set);
25
43
  };
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.sum = void 0;
7
- var _addition = require("../Math/addition");
7
+ var _getDecimalLength = require("../Math/getDecimalLength");
8
8
  /**
9
9
  * Returns the sum of an array of numbers
10
10
  * @param {number[]} x Array of numbers
@@ -12,7 +12,41 @@ var _addition = require("../Math/addition");
12
12
  * @example sum([1, 2, 3]); // 6
13
13
  */
14
14
  var sum = exports.sum = function sum(x) {
15
- return x.reduce(function (a, b) {
16
- return (0, _addition.addition)(a, b);
17
- }, 0);
15
+ var length = x.length;
16
+ if (length === 0) {
17
+ return 0;
18
+ }
19
+
20
+ // Performance: determine decimal precision once for the entire array,
21
+ // rather than calling addition() per element which redundantly checks
22
+ // Number.isInteger() and getDecimalLength() on every accumulator step.
23
+ // This reduces overhead from O(n) getDecimalLength calls on the
24
+ // accumulator to a single pass over the input values.
25
+ var maxDecimal = 0;
26
+ for (var index = 0; index < length; index++) {
27
+ if (!Number.isInteger(x[index])) {
28
+ var decLength = (0, _getDecimalLength.getDecimalLength)(x[index]);
29
+ if (decLength > maxDecimal) {
30
+ maxDecimal = decLength;
31
+ }
32
+ }
33
+ }
34
+
35
+ // Fast path: all integers, just sum directly
36
+ if (maxDecimal === 0) {
37
+ var result = 0;
38
+ for (var _index = 0; _index < length; _index++) {
39
+ result += x[_index];
40
+ }
41
+ return result;
42
+ }
43
+
44
+ // Decimal path: scale to integers, sum, then scale back.
45
+ // Single multiplication factor computed once instead of per-element.
46
+ var scale = Math.pow(10, maxDecimal);
47
+ var scaled = 0;
48
+ for (var _index2 = 0; _index2 < length; _index2++) {
49
+ scaled += Math.round(x[_index2] * scale);
50
+ }
51
+ return scaled / scale;
18
52
  };
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.ultraNumberSort = void 0;
7
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
8
7
  function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
9
8
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
10
9
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
@@ -275,33 +274,27 @@ var inlineSort3 = function inlineSort3(array, ascending) {
275
274
  var handleNaNSort = function handleNaNSort(array, ascending) {
276
275
  var valid = [];
277
276
  var nanCount = 0;
278
- var _iterator = _createForOfIteratorHelper(array),
279
- _step;
280
- try {
281
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
282
- var element = _step.value;
283
- // biome-ignore lint/suspicious/noSelfCompare: ignore
284
- if (element === element) {
285
- valid.push(element);
286
- } else {
287
- nanCount++;
288
- }
277
+ var index = 0;
278
+ while (index < array.length) {
279
+ var element = array[index];
280
+ // biome-ignore lint/suspicious/noSelfCompare: ignore
281
+ if (element === element) {
282
+ valid.push(element);
283
+ } else {
284
+ nanCount++;
289
285
  }
290
- } catch (err) {
291
- _iterator.e(err);
292
- } finally {
293
- _iterator.f();
286
+ index++;
294
287
  }
295
288
  numericQuickSort(valid, 0, valid.length - 1, ascending);
296
289
 
297
290
  // NaN values go to the end
298
- for (var index = 0; index < nanCount; index++) {
291
+ for (var _index10 = 0; _index10 < nanCount; _index10++) {
299
292
  valid.push(Number.NaN);
300
293
  }
301
294
 
302
295
  // Copy back
303
- for (var _index10 = 0; _index10 < array.length; _index10++) {
304
- array[_index10] = valid[_index10];
296
+ for (var _index11 = 0; _index11 < array.length; _index11++) {
297
+ array[_index11] = valid[_index11];
305
298
  }
306
299
  return array;
307
300
  };
@@ -314,33 +307,26 @@ var countingSort = function countingSort(array, min, max, ascending) {
314
307
  var count = new Uint32Array(range);
315
308
 
316
309
  // Count occurrences
317
- var _iterator2 = _createForOfIteratorHelper(array),
318
- _step2;
319
- try {
320
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
321
- var element = _step2.value;
322
- count[element - min]++;
323
- }
324
-
325
- // Reconstruct array
326
- } catch (err) {
327
- _iterator2.e(err);
328
- } finally {
329
- _iterator2.f();
310
+ var index_ = 0;
311
+ while (index_ < array.length) {
312
+ count[array[index_] - min]++;
313
+ index_++;
330
314
  }
315
+
316
+ // Reconstruct array
331
317
  var index = 0;
332
318
  if (ascending) {
333
- for (var index_ = 0; index_ < range; index_++) {
334
- var cnt = count[index_];
335
- var value = index_ + min;
319
+ for (var _index_ = 0; _index_ < range; _index_++) {
320
+ var cnt = count[_index_];
321
+ var value = _index_ + min;
336
322
  for (var index__ = 0; index__ < cnt; index__++) {
337
323
  array[index++] = value;
338
324
  }
339
325
  }
340
326
  } else {
341
- for (var _index_ = range - 1; _index_ >= 0; _index_--) {
342
- var _cnt = count[_index_];
343
- var _value = _index_ + min;
327
+ for (var _index_2 = range - 1; _index_2 >= 0; _index_2--) {
328
+ var _cnt = count[_index_2];
329
+ var _value = _index_2 + min;
344
330
  for (var _index__ = 0; _index__ < _cnt; _index__++) {
345
331
  array[index++] = _value;
346
332
  }
@@ -395,14 +381,14 @@ var numericInsertionSort = function numericInsertionSort(array, low, high, ascen
395
381
  array[index_ + 1] = key;
396
382
  }
397
383
  } else {
398
- for (var _index11 = low + 1; _index11 <= high; _index11++) {
399
- var _key = array[_index11];
400
- var _index_2 = _index11 - 1;
401
- while (_index_2 >= low && array[_index_2] < _key) {
402
- array[_index_2 + 1] = array[_index_2];
403
- _index_2--;
384
+ for (var _index12 = low + 1; _index12 <= high; _index12++) {
385
+ var _key = array[_index12];
386
+ var _index_3 = _index12 - 1;
387
+ while (_index_3 >= low && array[_index_3] < _key) {
388
+ array[_index_3 + 1] = array[_index_3];
389
+ _index_3--;
404
390
  }
405
- array[_index_2 + 1] = _key;
391
+ array[_index_3 + 1] = _key;
406
392
  }
407
393
  }
408
394
  };