umt 2.14.0 → 2.16.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 (196) 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/zip.js +21 -5
  6. package/module/Array/zip.js.map +1 -1
  7. package/module/Array/zipLongest.js +23 -4
  8. package/module/Array/zipLongest.js.map +1 -1
  9. package/module/Crypto/decodeBase32.js.map +1 -1
  10. package/module/Crypto/decodeBase58.js +1 -2
  11. package/module/Crypto/decodeBase58.js.map +1 -1
  12. package/module/Crypto/encodeBase32.js +11 -6
  13. package/module/Crypto/encodeBase32.js.map +1 -1
  14. package/module/DataStructure/priorityQueue.js +8 -1
  15. package/module/DataStructure/priorityQueue.js.map +1 -1
  16. package/module/IP/ipToBinaryString.js +3 -1
  17. package/module/IP/ipToBinaryString.js.map +1 -1
  18. package/module/IP/longToIp.d.ts +1 -1
  19. package/module/IP/longToIp.js +2 -7
  20. package/module/IP/longToIp.js.map +1 -1
  21. package/module/Math/addition.js +4 -11
  22. package/module/Math/addition.js.map +1 -1
  23. package/module/Math/multiplication.js +14 -6
  24. package/module/Math/multiplication.js.map +1 -1
  25. package/module/Math/nCr.js +6 -2
  26. package/module/Math/nCr.js.map +1 -1
  27. package/module/Math/standardDeviation.js +12 -7
  28. package/module/Math/standardDeviation.js.map +1 -1
  29. package/module/Math/subtract.js +5 -9
  30. package/module/Math/subtract.js.map +1 -1
  31. package/module/Object/deepClone.d.ts +10 -0
  32. package/module/Object/deepClone.js +16 -9
  33. package/module/Object/deepClone.js.map +1 -1
  34. package/module/Object/getObjectsCommon.d.ts +10 -0
  35. package/module/Object/getObjectsCommon.js +10 -0
  36. package/module/Object/getObjectsCommon.js.map +1 -1
  37. package/module/Object/getObjectsDiff.d.ts +10 -0
  38. package/module/Object/getObjectsDiff.js +17 -6
  39. package/module/Object/getObjectsDiff.js.map +1 -1
  40. package/module/Object/has.d.ts +10 -0
  41. package/module/Object/has.js +13 -2
  42. package/module/Object/has.js.map +1 -1
  43. package/module/Object/index.d.ts +4 -0
  44. package/module/Object/index.js +4 -0
  45. package/module/Object/index.js.map +1 -1
  46. package/module/Object/keyBy.d.ts +10 -0
  47. package/module/Object/keyBy.js +10 -0
  48. package/module/Object/keyBy.js.map +1 -1
  49. package/module/Object/mapKeys.d.ts +10 -0
  50. package/module/Object/mapKeys.js +12 -1
  51. package/module/Object/mapKeys.js.map +1 -1
  52. package/module/Object/mapValues.d.ts +10 -0
  53. package/module/Object/mapValues.js +10 -0
  54. package/module/Object/mapValues.js.map +1 -1
  55. package/module/Object/merge.d.ts +10 -0
  56. package/module/Object/merge.js +17 -1
  57. package/module/Object/merge.js.map +1 -1
  58. package/module/Object/mergeDeep.d.ts +10 -0
  59. package/module/Object/mergeDeep.js +29 -15
  60. package/module/Object/mergeDeep.js.map +1 -1
  61. package/module/Object/pick.d.ts +10 -0
  62. package/module/Object/pick.js +10 -0
  63. package/module/Object/pick.js.map +1 -1
  64. package/module/Object/pickDeep.d.ts +10 -0
  65. package/module/Object/pickDeep.js +10 -5
  66. package/module/Object/pickDeep.js.map +1 -1
  67. package/module/Object/removePrototype.d.ts +15 -0
  68. package/module/Object/removePrototype.js +25 -0
  69. package/module/Object/removePrototype.js.map +1 -0
  70. package/module/Object/removePrototypeDeep.d.ts +11 -0
  71. package/module/Object/removePrototypeDeep.js +60 -0
  72. package/module/Object/removePrototypeDeep.js.map +1 -0
  73. package/module/Object/removePrototypeMap.d.ts +9 -0
  74. package/module/Object/removePrototypeMap.js +13 -0
  75. package/module/Object/removePrototypeMap.js.map +1 -0
  76. package/module/Object/removePrototypeMapDeep.d.ts +9 -0
  77. package/module/Object/removePrototypeMapDeep.js +13 -0
  78. package/module/Object/removePrototypeMapDeep.js.map +1 -0
  79. package/module/String/escapeHtml.js +11 -2
  80. package/module/String/escapeHtml.js.map +1 -1
  81. package/module/String/formatString/applyFormatter.js +5 -5
  82. package/module/String/formatString/applyFormatter.js.map +1 -1
  83. package/module/String/formatString/getValue.js +3 -1
  84. package/module/String/formatString/getValue.js.map +1 -1
  85. package/module/String/levenshteinDistance.js +41 -24
  86. package/module/String/levenshteinDistance.js.map +1 -1
  87. package/module/String/slugify.js +7 -5
  88. package/module/String/slugify.js.map +1 -1
  89. package/module/String/trimEndCharacters.js +3 -1
  90. package/module/String/trimEndCharacters.js.map +1 -1
  91. package/module/String/trimStartCharacters.js +3 -1
  92. package/module/String/trimStartCharacters.js.map +1 -1
  93. package/module/String/unescapeHtml.d.ts +1 -1
  94. package/module/String/unescapeHtml.js +48 -4
  95. package/module/String/unescapeHtml.js.map +1 -1
  96. package/module/Tool/parseJson.js +13 -1
  97. package/module/Tool/parseJson.js.map +1 -1
  98. package/module/URL/buildUrl.js +4 -0
  99. package/module/URL/buildUrl.js.map +1 -1
  100. package/module/URL/parseQueryString.js +4 -0
  101. package/module/URL/parseQueryString.js.map +1 -1
  102. package/module/Validate/isDeepEqual.js +7 -5
  103. package/module/Validate/isDeepEqual.js.map +1 -1
  104. package/module/Validate/isPrimeNumber.js +12 -2
  105. package/module/Validate/isPrimeNumber.js.map +1 -1
  106. package/module/Validate/object/index.d.ts +2 -0
  107. package/module/Validate/object/index.js +2 -0
  108. package/module/Validate/object/index.js.map +1 -1
  109. package/module/Validate/object/intersection.d.ts +10 -0
  110. package/module/Validate/object/intersection.js +25 -0
  111. package/module/Validate/object/intersection.js.map +1 -0
  112. package/module/Validate/object/optional.d.ts +6 -0
  113. package/module/Validate/object/optional.js +6 -0
  114. package/module/Validate/object/optional.js.map +1 -1
  115. package/module/Validate/object/union.d.ts +9 -0
  116. package/module/Validate/object/union.js +27 -0
  117. package/module/Validate/object/union.js.map +1 -0
  118. package/module/Validate/parseEmail.js +6 -0
  119. package/module/Validate/parseEmail.js.map +1 -1
  120. package/module/Validate/string/uuid.d.ts +1 -5
  121. package/module/Validate/string/uuid.js +19 -2
  122. package/module/Validate/string/uuid.js.map +1 -1
  123. package/module/es5/Array/arraysJoin.js +20 -2
  124. package/module/es5/Array/sum.js +38 -4
  125. package/module/es5/Array/zip.js +23 -17
  126. package/module/es5/Array/zipLongest.js +27 -14
  127. package/module/es5/Crypto/decodeBase58.js +1 -2
  128. package/module/es5/Crypto/encodeBase32.js +12 -6
  129. package/module/es5/DataStructure/priorityQueue.js +8 -3
  130. package/module/es5/IP/ipToBinaryString.js +2 -2
  131. package/module/es5/IP/longToIp.d.ts +1 -1
  132. package/module/es5/IP/longToIp.js +2 -13
  133. package/module/es5/Math/addition.js +4 -13
  134. package/module/es5/Math/multiplication.js +37 -6
  135. package/module/es5/Math/nCr.js +7 -2
  136. package/module/es5/Math/standardDeviation.js +25 -10
  137. package/module/es5/Math/subtract.js +12 -9
  138. package/module/es5/Object/deepClone.d.ts +10 -0
  139. package/module/es5/Object/deepClone.js +16 -9
  140. package/module/es5/Object/getObjectsCommon.d.ts +10 -0
  141. package/module/es5/Object/getObjectsCommon.js +10 -0
  142. package/module/es5/Object/getObjectsDiff.d.ts +10 -0
  143. package/module/es5/Object/getObjectsDiff.js +32 -17
  144. package/module/es5/Object/has.d.ts +10 -0
  145. package/module/es5/Object/has.js +11 -7
  146. package/module/es5/Object/index.d.ts +4 -0
  147. package/module/es5/Object/index.js +44 -0
  148. package/module/es5/Object/keyBy.d.ts +10 -0
  149. package/module/es5/Object/keyBy.js +10 -0
  150. package/module/es5/Object/mapKeys.d.ts +10 -0
  151. package/module/es5/Object/mapKeys.js +12 -1
  152. package/module/es5/Object/mapValues.d.ts +10 -0
  153. package/module/es5/Object/mapValues.js +10 -0
  154. package/module/es5/Object/merge.d.ts +10 -0
  155. package/module/es5/Object/merge.js +19 -1
  156. package/module/es5/Object/mergeDeep.d.ts +10 -0
  157. package/module/es5/Object/mergeDeep.js +34 -18
  158. package/module/es5/Object/pick.d.ts +10 -0
  159. package/module/es5/Object/pick.js +10 -0
  160. package/module/es5/Object/pickDeep.d.ts +10 -0
  161. package/module/es5/Object/pickDeep.js +10 -3
  162. package/module/es5/Object/removePrototype.d.ts +15 -0
  163. package/module/es5/Object/removePrototype.js +31 -0
  164. package/module/es5/Object/removePrototypeDeep.d.ts +11 -0
  165. package/module/es5/Object/removePrototypeDeep.js +81 -0
  166. package/module/es5/Object/removePrototypeMap.d.ts +9 -0
  167. package/module/es5/Object/removePrototypeMap.js +20 -0
  168. package/module/es5/Object/removePrototypeMapDeep.d.ts +9 -0
  169. package/module/es5/Object/removePrototypeMapDeep.js +20 -0
  170. package/module/es5/String/escapeHtml.js +12 -3
  171. package/module/es5/String/formatString/applyFormatter.js +5 -5
  172. package/module/es5/String/formatString/getValue.js +4 -1
  173. package/module/es5/String/levenshteinDistance.js +43 -28
  174. package/module/es5/String/slugify.js +8 -1
  175. package/module/es5/String/trimEndCharacters.js +3 -1
  176. package/module/es5/String/trimStartCharacters.js +3 -1
  177. package/module/es5/String/unescapeHtml.d.ts +1 -1
  178. package/module/es5/String/unescapeHtml.js +46 -4
  179. package/module/es5/Tool/parseJson.js +14 -1
  180. package/module/es5/URL/buildUrl.js +4 -0
  181. package/module/es5/URL/parseQueryString.js +4 -0
  182. package/module/es5/Validate/isDeepEqual.js +48 -39
  183. package/module/es5/Validate/isPrimeNumber.js +14 -2
  184. package/module/es5/Validate/object/index.d.ts +2 -0
  185. package/module/es5/Validate/object/index.js +22 -0
  186. package/module/es5/Validate/object/intersection.d.ts +10 -0
  187. package/module/es5/Validate/object/intersection.js +34 -0
  188. package/module/es5/Validate/object/optional.d.ts +6 -0
  189. package/module/es5/Validate/object/optional.js +6 -0
  190. package/module/es5/Validate/object/union.d.ts +9 -0
  191. package/module/es5/Validate/object/union.js +36 -0
  192. package/module/es5/Validate/parseEmail.js +8 -0
  193. package/module/es5/Validate/string/uuid.d.ts +1 -5
  194. package/module/es5/Validate/string/uuid.js +24 -2
  195. package/package.json +19 -19
  196. package/module/es5/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Creates a new object with the same properties as the given object, but with
3
+ * the prototype polluting properties removed recursively.
4
+ * ("__proto__", "constructor", "prototype" are excluded from nested objects
5
+ * and objects inside arrays)
6
+ *
7
+ * @param object - The object to remove the prototype polluting properties from.
8
+ * @returns A new object with the prototype polluting properties removed
9
+ * recursively.
10
+ */
11
+ export declare const removePrototypeDeep: <T extends Record<string, unknown>>(object: T) => T;
@@ -0,0 +1,60 @@
1
+ import { isPlainObject } from "../Object/isPlainObject";
2
+ /**
3
+ * Creates a new object with the same properties as the given object, but with
4
+ * the prototype polluting properties removed recursively.
5
+ * ("__proto__", "constructor", "prototype" are excluded from nested objects
6
+ * and objects inside arrays)
7
+ *
8
+ * @param object - The object to remove the prototype polluting properties from.
9
+ * @returns A new object with the prototype polluting properties removed
10
+ * recursively.
11
+ */
12
+ export const removePrototypeDeep = (object) => {
13
+ const result = Object.create(null);
14
+ const stack = [[object, result]];
15
+ while (stack.length > 0) {
16
+ // biome-ignore lint/style/noNonNullAssertion: stack.length > 0 guarantees pop() returns a value
17
+ const [source, destination] = stack.pop();
18
+ if (Array.isArray(source)) {
19
+ const array = destination;
20
+ for (const value of source) {
21
+ if (Array.isArray(value)) {
22
+ const child = [];
23
+ array.push(child);
24
+ stack.push([value, child]);
25
+ }
26
+ else if (isPlainObject(value)) {
27
+ const child = Object.create(null);
28
+ array.push(child);
29
+ stack.push([value, child]);
30
+ }
31
+ else {
32
+ array.push(value);
33
+ }
34
+ }
35
+ continue;
36
+ }
37
+ const target = destination;
38
+ for (const key of Object.keys(source)) {
39
+ if (key === "__proto__" || key === "constructor" || key === "prototype") {
40
+ continue;
41
+ }
42
+ const value = source[key];
43
+ if (Array.isArray(value)) {
44
+ const child = [];
45
+ target[key] = child;
46
+ stack.push([value, child]);
47
+ }
48
+ else if (isPlainObject(value)) {
49
+ const child = Object.create(null);
50
+ target[key] = child;
51
+ stack.push([value, child]);
52
+ }
53
+ else {
54
+ target[key] = value;
55
+ }
56
+ }
57
+ }
58
+ return result;
59
+ };
60
+ //# sourceMappingURL=removePrototypeDeep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removePrototypeDeep.js","sourceRoot":"","sources":["../../src/Object/removePrototypeDeep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,MAAS,EACN,EAAE;IACL,MAAM,MAAM,GAA4B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,KAAK,GAGL,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAEzB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,gGAAgG;QAChG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAE3C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,WAAwB,CAAC;YACvC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,MAAM,KAAK,GAAc,EAAE,CAAC;oBAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAClB,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC7B,CAAC;qBAAM,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;oBAChC,MAAM,KAAK,GAA4B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC3D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAClB,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,WAAsC,CAAC;QACtD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;gBACxE,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAc,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YAC7B,CAAC;iBAAM,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,KAAK,GAA4B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC3D,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAW,CAAC;AACrB,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Creates a new array of objects with prototype polluting properties removed
3
+ * from each item.
4
+ *
5
+ * @param objects - The objects to remove the prototype polluting properties
6
+ * from.
7
+ * @returns A new array with shallowly sanitized objects.
8
+ */
9
+ export declare const removePrototypeMap: <T extends Record<string, unknown>>(objects: readonly T[]) => Omit<T, "__proto__" | "constructor" | "prototype">[];
@@ -0,0 +1,13 @@
1
+ import { removePrototype } from "../Object/removePrototype";
2
+ /**
3
+ * Creates a new array of objects with prototype polluting properties removed
4
+ * from each item.
5
+ *
6
+ * @param objects - The objects to remove the prototype polluting properties
7
+ * from.
8
+ * @returns A new array with shallowly sanitized objects.
9
+ */
10
+ export const removePrototypeMap = (objects) => {
11
+ return objects.map((object) => removePrototype(object));
12
+ };
13
+ //# sourceMappingURL=removePrototypeMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removePrototypeMap.js","sourceRoot":"","sources":["../../src/Object/removePrototypeMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,OAAqB,EACiC,EAAE;IACxD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1D,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Creates a new array of objects with prototype polluting properties removed
3
+ * recursively from each item.
4
+ *
5
+ * @param objects - The objects to remove the prototype polluting properties
6
+ * from recursively.
7
+ * @returns A new array with deeply sanitized objects.
8
+ */
9
+ export declare const removePrototypeMapDeep: <T extends Record<string, unknown>>(objects: readonly T[]) => T[];
@@ -0,0 +1,13 @@
1
+ import { removePrototypeDeep } from "../Object/removePrototypeDeep";
2
+ /**
3
+ * Creates a new array of objects with prototype polluting properties removed
4
+ * recursively from each item.
5
+ *
6
+ * @param objects - The objects to remove the prototype polluting properties
7
+ * from recursively.
8
+ * @returns A new array with deeply sanitized objects.
9
+ */
10
+ export const removePrototypeMapDeep = (objects) => {
11
+ return objects.map((object) => removePrototypeDeep(object));
12
+ };
13
+ //# sourceMappingURL=removePrototypeMapDeep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removePrototypeMapDeep.js","sourceRoot":"","sources":["../../src/Object/removePrototypeMapDeep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,OAAqB,EAChB,EAAE;IACP,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9D,CAAC,CAAC"}
@@ -1,5 +1,12 @@
1
1
  /**
2
- * HTML entities map for escaping
2
+ * HTML entities map for escaping.
3
+ *
4
+ * Security: The backtick (`) is included because it can be used as an HTML
5
+ * attribute delimiter in older browsers (e.g. IE), enabling XSS via
6
+ * constructs like <img src=`javascript:alert(1)`>. The forward slash (/)
7
+ * is included per OWASP XSS prevention recommendations to mitigate tag-
8
+ * closing injection (e.g. "</script>") when user input is embedded inside
9
+ * HTML elements.
3
10
  */
4
11
  const htmlEscapeMap = {
5
12
  "&": "&amp;",
@@ -7,6 +14,8 @@ const htmlEscapeMap = {
7
14
  ">": "&gt;",
8
15
  '"': "&quot;",
9
16
  "'": "&#39;",
17
+ "`": "&#x60;",
18
+ "/": "&#x2F;",
10
19
  };
11
20
  /**
12
21
  * Escapes HTML special characters in a string
@@ -14,6 +23,6 @@ const htmlEscapeMap = {
14
23
  * @returns The escaped string
15
24
  */
16
25
  export const escapeHtml = (string_) => {
17
- return string_.replaceAll(/["&'<>]/g, (match) => htmlEscapeMap[match]);
26
+ return string_.replaceAll(/["&'/<>`]/g, (match) => htmlEscapeMap[match]);
18
27
  };
19
28
  //# sourceMappingURL=escapeHtml.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"escapeHtml.js","sourceRoot":"","sources":["../../src/String/escapeHtml.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,aAAa,GAA2B;IAC5C,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,OAAO;CACb,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAe,EAAU,EAAE;IACpD,OAAO,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACzE,CAAC,CAAC"}
1
+ {"version":3,"file":"escapeHtml.js","sourceRoot":"","sources":["../../src/String/escapeHtml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,aAAa,GAA2B;IAC5C,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,QAAQ;CACd,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAe,EAAU,EAAE;IACpD,OAAO,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3E,CAAC,CAAC"}
@@ -41,7 +41,7 @@ export function applyFormatter(value, formatterString, formatters) {
41
41
  */
42
42
  function parseArguments(argumentsString) {
43
43
  const arguments_ = [];
44
- let current = "";
44
+ const chars = [];
45
45
  let inQuotes = false;
46
46
  let quoteChar = "";
47
47
  for (const char of argumentsString) {
@@ -56,15 +56,15 @@ function parseArguments(argumentsString) {
56
56
  continue;
57
57
  }
58
58
  if (!inQuotes && char === ",") {
59
- const trimmed = current.trim();
59
+ const trimmed = chars.join("").trim();
60
60
  arguments_.push(trimmed === "" ? " " : trimmed);
61
- current = "";
61
+ chars.length = 0;
62
62
  continue;
63
63
  }
64
- current += char;
64
+ chars.push(char);
65
65
  }
66
66
  // Handle last argument
67
- const trimmed = current.trim();
67
+ const trimmed = chars.join("").trim();
68
68
  arguments_.push(trimmed === "" ? " " : trimmed);
69
69
  return arguments_;
70
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"applyFormatter.js","sourceRoot":"","sources":["../../../src/String/formatString/applyFormatter.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAc,EACd,eAAuB,EACvB,UAAqC;IAErC,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,EAAE,aAAa,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC;IACjD,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAE5C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1E,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,UAAU,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,eAAuB;IAC7C,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAChD,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS,GAAG,IAAI,CAAC;YACjB,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACnC,QAAQ,GAAG,KAAK,CAAC;YACjB,SAAS,GAAG,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,UAAU,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAChD,OAAO,GAAG,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,OAAO,IAAI,IAAI,CAAC;IAClB,CAAC;IAED,uBAAuB;IACvB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,UAAU,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEhD,OAAO,UAAU,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"applyFormatter.js","sourceRoot":"","sources":["../../../src/String/formatString/applyFormatter.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAc,EACd,eAAuB,EACvB,UAAqC;IAErC,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,EAAE,aAAa,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC;IACjD,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAE5C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1E,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,UAAU,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,eAAuB;IAC7C,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAChD,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS,GAAG,IAAI,CAAC;YACjB,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACnC,QAAQ,GAAG,KAAK,CAAC;YACjB,SAAS,GAAG,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAChD,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACjB,SAAS;QACX,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,uBAAuB;IACvB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,UAAU,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEhD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -1,3 +1,5 @@
1
+ // Pre-compiled regex pattern for array index notation to avoid recompilation per path segment
2
+ const ARRAY_INDEX_PATTERN = /^(.+?)\[(-?\d+)]$/;
1
3
  /**
2
4
  * Retrieves a value from an object using a dot-notation path with array index support.
3
5
  *
@@ -28,7 +30,7 @@ export function getValue(object, path) {
28
30
  const segments = [];
29
31
  const parts = path.split(".");
30
32
  for (const part of parts) {
31
- const arrayMatch = /^(.+?)\[(-?\d+)]$/.exec(part);
33
+ const arrayMatch = ARRAY_INDEX_PATTERN.exec(part);
32
34
  if (arrayMatch) {
33
35
  const [, key, indexString] = arrayMatch;
34
36
  segments.push({ key, index: Number(indexString) });
@@ -1 +1 @@
1
- {"version":3,"file":"getValue.js","sourceRoot":"","sources":["../../../src/String/formatString/getValue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAe,EAAE,IAAY;IACpD,MAAM,QAAQ,GAAsC,EAAE,CAAC;IAEvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,IAAI,OAAO,GAAG,MAAM,CAAC;IAErB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACnD,OAAO;QACT,CAAC;QAED,OAAO,GAAI,OAAmC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAE5D,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO;YACT,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAC5B,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"getValue.js","sourceRoot":"","sources":["../../../src/String/formatString/getValue.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAe,EAAE,IAAY;IACpD,MAAM,QAAQ,GAAsC,EAAE,CAAC;IAEvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,IAAI,OAAO,GAAG,MAAM,CAAC;IAErB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACnD,OAAO;QACT,CAAC;QAED,OAAO,GAAI,OAAmC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAE5D,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO;YACT,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAC5B,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -9,39 +9,56 @@ export const levenshteinDistance = (string1, string2) => {
9
9
  if (string1 === string2) {
10
10
  return 0;
11
11
  }
12
- const length1 = string1.length;
13
- const length2 = string2.length;
14
- if (length1 === 0) {
15
- return length2;
12
+ let short = string1;
13
+ let long = string2;
14
+ let shortLength = short.length;
15
+ let longLength = long.length;
16
+ if (shortLength === 0) {
17
+ return longLength;
16
18
  }
17
- if (length2 === 0) {
18
- return length1;
19
+ if (longLength === 0) {
20
+ return shortLength;
19
21
  }
20
- // Ensure string1 is the shorter string to minimize space complexity to O(min(N, M))
21
- if (length1 > length2) {
22
- return levenshteinDistance(string2, string1);
22
+ // Ensure short is the shorter string to minimize space complexity to O(min(N, M))
23
+ if (shortLength > longLength) {
24
+ short = string2;
25
+ long = string1;
26
+ shortLength = short.length;
27
+ longLength = long.length;
23
28
  }
24
29
  // Create a single row array to store distances
25
30
  // We only need the current row and the previous diagonal value
26
- const row = Array.from({ length: length1 + 1 });
27
- // Initialize first row (0 to length1)
28
- for (let index = 0; index <= length1; index++) {
31
+ const row = Array.from({ length: shortLength + 1 });
32
+ // Initialize first row (0 to shortLength)
33
+ for (let index = 0; index <= shortLength; index++) {
29
34
  row[index] = index;
30
35
  }
31
- // Iterate through each character of string2
32
- for (let index = 1; index <= length2; index++) {
33
- let previousDiagonal = row[0]; // Stores the value of matrix[i-1][j-1]
34
- row[0] = index; // Update first element for the new row (matrix[0][j])
35
- const char2 = string2[index - 1];
36
- for (let index = 1; index <= length1; index++) {
37
- const temporary = row[index]; // Store current value to become prevDiagonal for next iteration
38
- const cost = string1[index - 1] === char2 ? 0 : 1;
39
- row[index] = Math.min(row[index] + 1, // deletion (value from previous row, same column)
40
- row[index - 1] + 1, // insertion (value from current row, previous column)
41
- previousDiagonal + cost);
36
+ // Iterate through each character of the longer string (rows)
37
+ for (let rowIndex = 1; rowIndex <= longLength; rowIndex++) {
38
+ let previousDiagonal = row[0];
39
+ row[0] = rowIndex;
40
+ // eslint-disable-next-line unicorn/prefer-code-point
41
+ const charCode = long.charCodeAt(rowIndex - 1);
42
+ for (let colIndex = 1; colIndex <= shortLength; colIndex++) {
43
+ const temporary = row[colIndex];
44
+ // eslint-disable-next-line unicorn/prefer-code-point
45
+ const cost = short.charCodeAt(colIndex - 1) === charCode ? 0 : 1;
46
+ // Inline min of three values instead of Math.min() call to avoid
47
+ // function-call overhead in this hot loop
48
+ const deletion = row[colIndex] + 1;
49
+ const insertion = row[colIndex - 1] + 1;
50
+ const substitution = previousDiagonal + cost;
51
+ let value = deletion;
52
+ if (insertion < value) {
53
+ value = insertion;
54
+ }
55
+ if (substitution < value) {
56
+ value = substitution;
57
+ }
58
+ row[colIndex] = value;
42
59
  previousDiagonal = temporary;
43
60
  }
44
61
  }
45
- return row[length1];
62
+ return row[shortLength];
46
63
  };
47
64
  //# sourceMappingURL=levenshteinDistance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"levenshteinDistance.js","sourceRoot":"","sources":["../../src/String/levenshteinDistance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,OAAe,EACf,OAAe,EACP,EAAE;IACV,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAE/B,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,oFAAoF;IACpF,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;QACtB,OAAO,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,+CAA+C;IAC/C,+DAA+D;IAC/D,MAAM,GAAG,GAAa,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC;IAE1D,sCAAsC;IACtC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9C,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,4CAA4C;IAC5C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9C,IAAI,gBAAgB,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,uCAAuC;QACtE,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,sDAAsD;QAEtE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAEjC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,gEAAgE;YAC9F,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAElD,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CACnB,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,kDAAkD;YAClE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,sDAAsD;YAC1E,gBAAgB,GAAG,IAAI,CACxB,CAAC;YAEF,gBAAgB,GAAG,SAAS,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC;AACtB,CAAC,CAAC"}
1
+ {"version":3,"file":"levenshteinDistance.js","sourceRoot":"","sources":["../../src/String/levenshteinDistance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,OAAe,EACf,OAAe,EACP,EAAE;IACV,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,KAAK,GAAG,OAAO,CAAC;IACpB,IAAI,IAAI,GAAG,OAAO,CAAC;IACnB,IAAI,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/B,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IAE7B,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,kFAAkF;IAClF,IAAI,WAAW,GAAG,UAAU,EAAE,CAAC;QAC7B,KAAK,GAAG,OAAO,CAAC;QAChB,IAAI,GAAG,OAAO,CAAC;QACf,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,+CAA+C;IAC/C,+DAA+D;IAC/D,MAAM,GAAG,GAAa,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,CAAC,EAAE,CAAC,CAAC;IAE9D,0CAA0C;IAC1C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,6DAA6D;IAC7D,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,IAAI,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC;QAC1D,IAAI,gBAAgB,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9B,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;QAElB,qDAAqD;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAE/C,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,IAAI,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC;YAC3D,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChC,qDAAqD;YACrD,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEjE,iEAAiE;YACjE,0CAA0C;YAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACxC,MAAM,YAAY,GAAG,gBAAgB,GAAG,IAAI,CAAC;YAE7C,IAAI,KAAK,GAAG,QAAQ,CAAC;YACrB,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;gBACtB,KAAK,GAAG,SAAS,CAAC;YACpB,CAAC;YACD,IAAI,YAAY,GAAG,KAAK,EAAE,CAAC;gBACzB,KAAK,GAAG,YAAY,CAAC;YACvB,CAAC;YAED,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;YACtB,gBAAgB,GAAG,SAAS,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC,WAAW,CAAC,CAAC;AAC1B,CAAC,CAAC"}
@@ -8,14 +8,16 @@
8
8
  * slugify("Japanese: こんにちは"); // "japanese"
9
9
  */
10
10
  export const slugify = (string_) => {
11
- return string_
11
+ return (string_
12
12
  .normalize("NFD")
13
+ // Strip combining diacritical marks (e.g. accents)
13
14
  .replaceAll(/[\u0300-\u036F]/g, "")
14
15
  .toLowerCase()
15
- .replaceAll(/[^\s\w-]/g, "-")
16
- .replaceAll(/\s+/g, "-")
17
- .replaceAll(/_+/g, "-")
16
+ // Consolidate non-word chars, whitespace, and underscores into a single
17
+ // hyphen in one pass instead of three separate regex scans
18
+ .replaceAll(/[^\w-]+|_+/g, "-")
19
+ // Collapse consecutive hyphens and strip leading/trailing hyphens
18
20
  .replaceAll(/-+/g, "-")
19
- .replaceAll(/^-+|-+$/g, "");
21
+ .replaceAll(/^-|-$/g, ""));
20
22
  };
21
23
  //# sourceMappingURL=slugify.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"slugify.js","sourceRoot":"","sources":["../../src/String/slugify.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,OAAe,EAAU,EAAE;IACjD,OAAO,OAAO;SACX,SAAS,CAAC,KAAK,CAAC;SAChB,UAAU,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAClC,WAAW,EAAE;SACb,UAAU,CAAC,WAAW,EAAE,GAAG,CAAC;SAC5B,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;SACvB,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC;SACtB,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC;SACtB,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC,CAAC"}
1
+ {"version":3,"file":"slugify.js","sourceRoot":"","sources":["../../src/String/slugify.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,OAAe,EAAU,EAAE;IACjD,OAAO,CACL,OAAO;SACJ,SAAS,CAAC,KAAK,CAAC;QACjB,mDAAmD;SAClD,UAAU,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAClC,WAAW,EAAE;QACd,wEAAwE;QACxE,2DAA2D;SAC1D,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC;QAC/B,kEAAkE;SACjE,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC;SACtB,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAC5B,CAAC;AACJ,CAAC,CAAC"}
@@ -12,8 +12,10 @@
12
12
  * ```
13
13
  */
14
14
  export const trimEndCharacters = (string_, chars) => {
15
+ // Use Set for O(1) character lookups instead of O(m) string.includes()
16
+ const charSet = new Set(chars);
15
17
  let endIndex = string_.length - 1;
16
- while (endIndex >= 0 && chars.includes(string_[endIndex])) {
18
+ while (endIndex >= 0 && charSet.has(string_[endIndex])) {
17
19
  endIndex--;
18
20
  }
19
21
  return string_.slice(0, endIndex + 1);
@@ -1 +1 @@
1
- {"version":3,"file":"trimEndCharacters.js","sourceRoot":"","sources":["../../src/String/trimEndCharacters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAE,KAAa,EAAU,EAAE;IAC1E,IAAI,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,OAAO,QAAQ,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC1D,QAAQ,EAAE,CAAC;IACb,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;AACxC,CAAC,CAAC"}
1
+ {"version":3,"file":"trimEndCharacters.js","sourceRoot":"","sources":["../../src/String/trimEndCharacters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAE,KAAa,EAAU,EAAE;IAC1E,uEAAuE;IACvE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,OAAO,QAAQ,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACvD,QAAQ,EAAE,CAAC;IACb,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;AACxC,CAAC,CAAC"}
@@ -12,8 +12,10 @@
12
12
  * ```
13
13
  */
14
14
  export const trimStartCharacters = (string_, chars) => {
15
+ // Use Set for O(1) character lookups instead of O(m) string.includes()
16
+ const charSet = new Set(chars);
15
17
  let startIndex = 0;
16
- while (startIndex < string_.length && chars.includes(string_[startIndex])) {
18
+ while (startIndex < string_.length && charSet.has(string_[startIndex])) {
17
19
  startIndex++;
18
20
  }
19
21
  return string_.slice(startIndex);
@@ -1 +1 @@
1
- {"version":3,"file":"trimStartCharacters.js","sourceRoot":"","sources":["../../src/String/trimStartCharacters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,KAAa,EAAU,EAAE;IAC5E,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAC1E,UAAU,EAAE,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AACnC,CAAC,CAAC"}
1
+ {"version":3,"file":"trimStartCharacters.js","sourceRoot":"","sources":["../../src/String/trimStartCharacters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,KAAa,EAAU,EAAE;IAC5E,uEAAuE;IACvE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACvE,UAAU,EAAE,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AACnC,CAAC,CAAC"}
@@ -5,7 +5,7 @@
5
5
  * @example
6
6
  * ```typescript
7
7
  * unescapeHtml("&lt;script&gt;alert(&quot;Hello&quot;);&lt;/script&gt;");
8
- * // Returns: "<script>alert("Hello");</script>"
8
+ * // Returns: "<script>alert(\"Hello\");</script>"
9
9
  *
10
10
  * unescapeHtml("Tom &amp; Jerry");
11
11
  * // Returns: "Tom & Jerry"
@@ -12,6 +12,36 @@ const htmlUnescapeMap = {
12
12
  "&#x60;": "`",
13
13
  "&#x3D;": "=",
14
14
  };
15
+ /**
16
+ * Security: Checks whether a numeric code point is safe to decode.
17
+ * Rejects NULL (0), C0 control chars (1-31 except TAB 9, LF 10, CR 13),
18
+ * DEL (127), C1 control chars (128-159), lone surrogates (0xD800-0xDFFF),
19
+ * and values beyond the Unicode maximum (>0x10FFFF).
20
+ */
21
+ const isSafeCodePoint = (codePoint) => {
22
+ if (codePoint > 0x10_ff_ff) {
23
+ return false;
24
+ }
25
+ if (codePoint === 0) {
26
+ return false;
27
+ }
28
+ if (codePoint >= 0xd8_00 && codePoint <= 0xdf_ff) {
29
+ return false;
30
+ }
31
+ if (codePoint <= 0x1f &&
32
+ codePoint !== 0x09 &&
33
+ codePoint !== 0x0a &&
34
+ codePoint !== 0x0d) {
35
+ return false;
36
+ }
37
+ if (codePoint === 0x7f) {
38
+ return false;
39
+ }
40
+ if (codePoint >= 0x80 && codePoint <= 0x9f) {
41
+ return false;
42
+ }
43
+ return true;
44
+ };
15
45
  /**
16
46
  * Unescapes HTML entities in a string
17
47
  * @param string_ - The string to unescape
@@ -19,7 +49,7 @@ const htmlUnescapeMap = {
19
49
  * @example
20
50
  * ```typescript
21
51
  * unescapeHtml("&lt;script&gt;alert(&quot;Hello&quot;);&lt;/script&gt;");
22
- * // Returns: "<script>alert("Hello");</script>"
52
+ * // Returns: "<script>alert(\"Hello\");</script>"
23
53
  *
24
54
  * unescapeHtml("Tom &amp; Jerry");
25
55
  * // Returns: "Tom & Jerry"
@@ -29,15 +59,29 @@ const htmlUnescapeMap = {
29
59
  * ```
30
60
  */
31
61
  export const unescapeHtml = (string_) => {
32
- const entityRegex = /&(?:amp|lt|gt|quot|#39|#x27|#x2F|#x60|#x3D);|&#(\d*);|&#x([\dA-Fa-f]*);/g;
62
+ const entityRegex = /&(?:amp|lt|gt|quot|#39|#x27|#x2F|#x60|#x3D);|&#(\d{1,7});|&#x([\dA-Fa-f]{1,6});/g;
33
63
  return string_.replaceAll(entityRegex, (match, dec, hex) => {
34
64
  if (dec !== undefined) {
35
65
  const codePoint = Number.parseInt(dec, 10);
36
- return Number.isNaN(codePoint) ? match : String.fromCodePoint(codePoint);
66
+ // Security: reject dangerous code points to prevent injection attacks.
67
+ // NULL bytes (0) enable null-byte injection that can truncate strings in
68
+ // downstream systems. C0 control chars (1-31 except TAB/LF/CR) and the
69
+ // DEL char (127) can break parsers. C1 control chars (128-159) are
70
+ // invalid in HTML. Surrogate code points (0xD800-0xDFFF) produce
71
+ // malformed strings. Out-of-range values (>0x10FFFF) are not valid
72
+ // Unicode. Leave these entity references unmodified rather than decoding
73
+ // them into potentially dangerous characters.
74
+ if (!isSafeCodePoint(codePoint)) {
75
+ return match;
76
+ }
77
+ return String.fromCodePoint(codePoint);
37
78
  }
38
79
  if (hex !== undefined) {
39
80
  const codePoint = Number.parseInt(hex, 16);
40
- return Number.isNaN(codePoint) ? match : String.fromCodePoint(codePoint);
81
+ if (!isSafeCodePoint(codePoint)) {
82
+ return match;
83
+ }
84
+ return String.fromCodePoint(codePoint);
41
85
  }
42
86
  return htmlUnescapeMap[match];
43
87
  });
@@ -1 +1 @@
1
- {"version":3,"file":"unescapeHtml.js","sourceRoot":"","sources":["../../src/String/unescapeHtml.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,eAAe,GAA2B;IAC9C,OAAO,EAAE,GAAG;IACZ,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG;CACd,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAU,EAAE;IACtD,MAAM,WAAW,GACf,0EAA0E,CAAC;IAE7E,OAAO,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACzD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC3C,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC3C,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"unescapeHtml.js","sourceRoot":"","sources":["../../src/String/unescapeHtml.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,eAAe,GAA2B;IAC9C,OAAO,EAAE,GAAG;IACZ,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG;CACd,CAAC;AAEF;;;;;GAKG;AACH,MAAM,eAAe,GAAG,CAAC,SAAiB,EAAW,EAAE;IACrD,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,SAAS,IAAI,OAAO,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IACE,SAAS,IAAI,IAAI;QACjB,SAAS,KAAK,IAAI;QAClB,SAAS,KAAK,IAAI;QAClB,SAAS,KAAK,IAAI,EAClB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAU,EAAE;IACtD,MAAM,WAAW,GACf,kFAAkF,CAAC;IAErF,OAAO,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACzD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC3C,uEAAuE;YACvE,yEAAyE;YACzE,uEAAuE;YACvE,mEAAmE;YACnE,iEAAiE;YACjE,mEAAmE;YACnE,yEAAyE;YACzE,8CAA8C;YAC9C,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -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
  }