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.
- package/module/Array/arraysJoin.js +9 -1
- package/module/Array/arraysJoin.js.map +1 -1
- package/module/Array/sum.js +35 -2
- package/module/Array/sum.js.map +1 -1
- package/module/Array/zip.js +21 -5
- package/module/Array/zip.js.map +1 -1
- package/module/Array/zipLongest.js +23 -4
- package/module/Array/zipLongest.js.map +1 -1
- package/module/Crypto/decodeBase32.js.map +1 -1
- package/module/Crypto/decodeBase58.js +1 -2
- package/module/Crypto/decodeBase58.js.map +1 -1
- package/module/Crypto/encodeBase32.js +11 -6
- package/module/Crypto/encodeBase32.js.map +1 -1
- package/module/DataStructure/priorityQueue.js +8 -1
- package/module/DataStructure/priorityQueue.js.map +1 -1
- package/module/IP/ipToBinaryString.js +3 -1
- package/module/IP/ipToBinaryString.js.map +1 -1
- package/module/IP/longToIp.d.ts +1 -1
- package/module/IP/longToIp.js +2 -7
- package/module/IP/longToIp.js.map +1 -1
- package/module/Math/addition.js +4 -11
- package/module/Math/addition.js.map +1 -1
- package/module/Math/multiplication.js +14 -6
- package/module/Math/multiplication.js.map +1 -1
- package/module/Math/nCr.js +6 -2
- package/module/Math/nCr.js.map +1 -1
- package/module/Math/standardDeviation.js +12 -7
- package/module/Math/standardDeviation.js.map +1 -1
- package/module/Math/subtract.js +5 -9
- package/module/Math/subtract.js.map +1 -1
- package/module/Object/deepClone.d.ts +10 -0
- package/module/Object/deepClone.js +16 -9
- package/module/Object/deepClone.js.map +1 -1
- package/module/Object/getObjectsCommon.d.ts +10 -0
- package/module/Object/getObjectsCommon.js +10 -0
- package/module/Object/getObjectsCommon.js.map +1 -1
- package/module/Object/getObjectsDiff.d.ts +10 -0
- package/module/Object/getObjectsDiff.js +17 -6
- package/module/Object/getObjectsDiff.js.map +1 -1
- package/module/Object/has.d.ts +10 -0
- package/module/Object/has.js +13 -2
- package/module/Object/has.js.map +1 -1
- package/module/Object/index.d.ts +4 -0
- package/module/Object/index.js +4 -0
- package/module/Object/index.js.map +1 -1
- package/module/Object/keyBy.d.ts +10 -0
- package/module/Object/keyBy.js +10 -0
- package/module/Object/keyBy.js.map +1 -1
- package/module/Object/mapKeys.d.ts +10 -0
- package/module/Object/mapKeys.js +12 -1
- package/module/Object/mapKeys.js.map +1 -1
- package/module/Object/mapValues.d.ts +10 -0
- package/module/Object/mapValues.js +10 -0
- package/module/Object/mapValues.js.map +1 -1
- package/module/Object/merge.d.ts +10 -0
- package/module/Object/merge.js +17 -1
- package/module/Object/merge.js.map +1 -1
- package/module/Object/mergeDeep.d.ts +10 -0
- package/module/Object/mergeDeep.js +29 -15
- package/module/Object/mergeDeep.js.map +1 -1
- package/module/Object/pick.d.ts +10 -0
- package/module/Object/pick.js +10 -0
- package/module/Object/pick.js.map +1 -1
- package/module/Object/pickDeep.d.ts +10 -0
- package/module/Object/pickDeep.js +10 -5
- package/module/Object/pickDeep.js.map +1 -1
- package/module/Object/removePrototype.d.ts +15 -0
- package/module/Object/removePrototype.js +25 -0
- package/module/Object/removePrototype.js.map +1 -0
- package/module/Object/removePrototypeDeep.d.ts +11 -0
- package/module/Object/removePrototypeDeep.js +60 -0
- package/module/Object/removePrototypeDeep.js.map +1 -0
- package/module/Object/removePrototypeMap.d.ts +9 -0
- package/module/Object/removePrototypeMap.js +13 -0
- package/module/Object/removePrototypeMap.js.map +1 -0
- package/module/Object/removePrototypeMapDeep.d.ts +9 -0
- package/module/Object/removePrototypeMapDeep.js +13 -0
- package/module/Object/removePrototypeMapDeep.js.map +1 -0
- package/module/String/escapeHtml.js +11 -2
- package/module/String/escapeHtml.js.map +1 -1
- package/module/String/formatString/applyFormatter.js +5 -5
- package/module/String/formatString/applyFormatter.js.map +1 -1
- package/module/String/formatString/getValue.js +3 -1
- package/module/String/formatString/getValue.js.map +1 -1
- package/module/String/levenshteinDistance.js +41 -24
- package/module/String/levenshteinDistance.js.map +1 -1
- package/module/String/slugify.js +7 -5
- package/module/String/slugify.js.map +1 -1
- package/module/String/trimEndCharacters.js +3 -1
- package/module/String/trimEndCharacters.js.map +1 -1
- package/module/String/trimStartCharacters.js +3 -1
- package/module/String/trimStartCharacters.js.map +1 -1
- package/module/String/unescapeHtml.d.ts +1 -1
- package/module/String/unescapeHtml.js +48 -4
- package/module/String/unescapeHtml.js.map +1 -1
- package/module/Tool/parseJson.js +13 -1
- package/module/Tool/parseJson.js.map +1 -1
- package/module/URL/buildUrl.js +4 -0
- package/module/URL/buildUrl.js.map +1 -1
- package/module/URL/parseQueryString.js +4 -0
- package/module/URL/parseQueryString.js.map +1 -1
- package/module/Validate/isDeepEqual.js +7 -5
- package/module/Validate/isDeepEqual.js.map +1 -1
- package/module/Validate/isPrimeNumber.js +12 -2
- package/module/Validate/isPrimeNumber.js.map +1 -1
- package/module/Validate/object/index.d.ts +2 -0
- package/module/Validate/object/index.js +2 -0
- package/module/Validate/object/index.js.map +1 -1
- package/module/Validate/object/intersection.d.ts +10 -0
- package/module/Validate/object/intersection.js +25 -0
- package/module/Validate/object/intersection.js.map +1 -0
- package/module/Validate/object/optional.d.ts +6 -0
- package/module/Validate/object/optional.js +6 -0
- package/module/Validate/object/optional.js.map +1 -1
- package/module/Validate/object/union.d.ts +9 -0
- package/module/Validate/object/union.js +27 -0
- package/module/Validate/object/union.js.map +1 -0
- package/module/Validate/parseEmail.js +6 -0
- package/module/Validate/parseEmail.js.map +1 -1
- package/module/Validate/string/uuid.d.ts +1 -5
- package/module/Validate/string/uuid.js +19 -2
- package/module/Validate/string/uuid.js.map +1 -1
- package/module/es5/Array/arraysJoin.js +20 -2
- package/module/es5/Array/sum.js +38 -4
- package/module/es5/Array/zip.js +23 -17
- package/module/es5/Array/zipLongest.js +27 -14
- package/module/es5/Crypto/decodeBase58.js +1 -2
- package/module/es5/Crypto/encodeBase32.js +12 -6
- package/module/es5/DataStructure/priorityQueue.js +8 -3
- package/module/es5/IP/ipToBinaryString.js +2 -2
- package/module/es5/IP/longToIp.d.ts +1 -1
- package/module/es5/IP/longToIp.js +2 -13
- package/module/es5/Math/addition.js +4 -13
- package/module/es5/Math/multiplication.js +37 -6
- package/module/es5/Math/nCr.js +7 -2
- package/module/es5/Math/standardDeviation.js +25 -10
- package/module/es5/Math/subtract.js +12 -9
- package/module/es5/Object/deepClone.d.ts +10 -0
- package/module/es5/Object/deepClone.js +16 -9
- package/module/es5/Object/getObjectsCommon.d.ts +10 -0
- package/module/es5/Object/getObjectsCommon.js +10 -0
- package/module/es5/Object/getObjectsDiff.d.ts +10 -0
- package/module/es5/Object/getObjectsDiff.js +32 -17
- package/module/es5/Object/has.d.ts +10 -0
- package/module/es5/Object/has.js +11 -7
- package/module/es5/Object/index.d.ts +4 -0
- package/module/es5/Object/index.js +44 -0
- package/module/es5/Object/keyBy.d.ts +10 -0
- package/module/es5/Object/keyBy.js +10 -0
- package/module/es5/Object/mapKeys.d.ts +10 -0
- package/module/es5/Object/mapKeys.js +12 -1
- package/module/es5/Object/mapValues.d.ts +10 -0
- package/module/es5/Object/mapValues.js +10 -0
- package/module/es5/Object/merge.d.ts +10 -0
- package/module/es5/Object/merge.js +19 -1
- package/module/es5/Object/mergeDeep.d.ts +10 -0
- package/module/es5/Object/mergeDeep.js +34 -18
- package/module/es5/Object/pick.d.ts +10 -0
- package/module/es5/Object/pick.js +10 -0
- package/module/es5/Object/pickDeep.d.ts +10 -0
- package/module/es5/Object/pickDeep.js +10 -3
- package/module/es5/Object/removePrototype.d.ts +15 -0
- package/module/es5/Object/removePrototype.js +31 -0
- package/module/es5/Object/removePrototypeDeep.d.ts +11 -0
- package/module/es5/Object/removePrototypeDeep.js +81 -0
- package/module/es5/Object/removePrototypeMap.d.ts +9 -0
- package/module/es5/Object/removePrototypeMap.js +20 -0
- package/module/es5/Object/removePrototypeMapDeep.d.ts +9 -0
- package/module/es5/Object/removePrototypeMapDeep.js +20 -0
- package/module/es5/String/escapeHtml.js +12 -3
- package/module/es5/String/formatString/applyFormatter.js +5 -5
- package/module/es5/String/formatString/getValue.js +4 -1
- package/module/es5/String/levenshteinDistance.js +43 -28
- package/module/es5/String/slugify.js +8 -1
- package/module/es5/String/trimEndCharacters.js +3 -1
- package/module/es5/String/trimStartCharacters.js +3 -1
- package/module/es5/String/unescapeHtml.d.ts +1 -1
- package/module/es5/String/unescapeHtml.js +46 -4
- package/module/es5/Tool/parseJson.js +14 -1
- package/module/es5/URL/buildUrl.js +4 -0
- package/module/es5/URL/parseQueryString.js +4 -0
- package/module/es5/Validate/isDeepEqual.js +48 -39
- package/module/es5/Validate/isPrimeNumber.js +14 -2
- package/module/es5/Validate/object/index.d.ts +2 -0
- package/module/es5/Validate/object/index.js +22 -0
- package/module/es5/Validate/object/intersection.d.ts +10 -0
- package/module/es5/Validate/object/intersection.js +34 -0
- package/module/es5/Validate/object/optional.d.ts +6 -0
- package/module/es5/Validate/object/optional.js +6 -0
- package/module/es5/Validate/object/union.d.ts +9 -0
- package/module/es5/Validate/object/union.js +36 -0
- package/module/es5/Validate/parseEmail.js +8 -0
- package/module/es5/Validate/string/uuid.d.ts +1 -5
- package/module/es5/Validate/string/uuid.js +24 -2
- package/package.json +19 -19
- 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
|
"&": "&",
|
|
@@ -7,6 +14,8 @@ const htmlEscapeMap = {
|
|
|
7
14
|
">": ">",
|
|
8
15
|
'"': """,
|
|
9
16
|
"'": "'",
|
|
17
|
+
"`": "`",
|
|
18
|
+
"/": "/",
|
|
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(/["&'
|
|
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
|
|
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
|
-
|
|
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 =
|
|
59
|
+
const trimmed = chars.join("").trim();
|
|
60
60
|
arguments_.push(trimmed === "" ? " " : trimmed);
|
|
61
|
-
|
|
61
|
+
chars.length = 0;
|
|
62
62
|
continue;
|
|
63
63
|
}
|
|
64
|
-
|
|
64
|
+
chars.push(char);
|
|
65
65
|
}
|
|
66
66
|
// Handle last argument
|
|
67
|
-
const trimmed =
|
|
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,
|
|
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 =
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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 (
|
|
18
|
-
return
|
|
19
|
+
if (longLength === 0) {
|
|
20
|
+
return shortLength;
|
|
19
21
|
}
|
|
20
|
-
// Ensure
|
|
21
|
-
if (
|
|
22
|
-
|
|
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:
|
|
27
|
-
// Initialize first row (0 to
|
|
28
|
-
for (let index = 0; 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
|
|
32
|
-
for (let
|
|
33
|
-
let previousDiagonal = row[0];
|
|
34
|
-
row[0] =
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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[
|
|
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,
|
|
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"}
|
package/module/String/slugify.js
CHANGED
|
@@ -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
|
-
|
|
16
|
-
|
|
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(
|
|
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;
|
|
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 &&
|
|
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,
|
|
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 &&
|
|
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,
|
|
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("<script>alert("Hello");</script>");
|
|
8
|
-
* // Returns: "<script>alert("Hello");</script>"
|
|
8
|
+
* // Returns: "<script>alert(\"Hello\");</script>"
|
|
9
9
|
*
|
|
10
10
|
* unescapeHtml("Tom & Jerry");
|
|
11
11
|
* // Returns: "Tom & Jerry"
|
|
@@ -12,6 +12,36 @@ const htmlUnescapeMap = {
|
|
|
12
12
|
"`": "`",
|
|
13
13
|
"=": "=",
|
|
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("<script>alert("Hello");</script>");
|
|
22
|
-
* // Returns: "<script>alert("Hello");</script>"
|
|
52
|
+
* // Returns: "<script>alert(\"Hello\");</script>"
|
|
23
53
|
*
|
|
24
54
|
* unescapeHtml("Tom & 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
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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"}
|
package/module/Tool/parseJson.js
CHANGED
|
@@ -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;
|
|
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"}
|
package/module/URL/buildUrl.js
CHANGED
|
@@ -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
|
-
|
|
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 (
|
|
66
|
-
if (compare(itemX,
|
|
67
|
-
|
|
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
|
|
78
|
+
return usedIndices.size === y.length;
|
|
77
79
|
}
|
|
78
80
|
return true;
|
|
79
81
|
}
|