@pawells/typescript-common 1.1.7 → 1.3.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/README.md +33 -6
- package/build/array/array-chunk.js +1 -1
- package/build/array/array-chunk.js.map +1 -1
- package/build/array/array-contains.d.ts +1 -1
- package/build/array/array-contains.d.ts.map +1 -1
- package/build/array/array-count-by.d.ts +1 -1
- package/build/array/array-count-by.d.ts.map +1 -1
- package/build/array/array-difference.d.ts +1 -1
- package/build/array/array-difference.d.ts.map +1 -1
- package/build/array/array-filter.d.ts +1 -1
- package/build/array/array-filter.d.ts.map +1 -1
- package/build/array/array-filter.js +5 -0
- package/build/array/array-filter.js.map +1 -1
- package/build/array/array-group-by.d.ts +1 -1
- package/build/array/array-group-by.d.ts.map +1 -1
- package/build/array/array-intersection.d.ts +1 -1
- package/build/array/array-intersection.d.ts.map +1 -1
- package/build/array/array-partition.d.ts +1 -1
- package/build/array/array-partition.d.ts.map +1 -1
- package/build/array/array-sort-by.d.ts +1 -1
- package/build/array/array-sort-by.d.ts.map +1 -1
- package/build/array/assert.d.ts +17 -24
- package/build/array/assert.d.ts.map +1 -1
- package/build/array/assert.js +13 -21
- package/build/array/assert.js.map +1 -1
- package/build/asserts/errors.d.ts +18 -0
- package/build/asserts/errors.d.ts.map +1 -1
- package/build/asserts/errors.js +23 -0
- package/build/asserts/errors.js.map +1 -1
- package/build/asserts/generic.d.ts +19 -20
- package/build/asserts/generic.d.ts.map +1 -1
- package/build/asserts/generic.js +19 -34
- package/build/asserts/generic.js.map +1 -1
- package/build/asserts/internal-utils.d.ts +1 -44
- package/build/asserts/internal-utils.d.ts.map +1 -1
- package/build/asserts/internal-utils.js +2 -104
- package/build/asserts/internal-utils.js.map +1 -1
- package/build/boolean/assert.d.ts +2 -1
- package/build/boolean/assert.d.ts.map +1 -1
- package/build/boolean/assert.js +2 -3
- package/build/boolean/assert.js.map +1 -1
- package/build/function/memoize.d.ts +2 -1
- package/build/function/memoize.d.ts.map +1 -1
- package/build/function/memoize.js +4 -7
- package/build/function/memoize.js.map +1 -1
- package/build/function/once.d.ts.map +1 -1
- package/build/function/once.js +14 -2
- package/build/function/once.js.map +1 -1
- package/build/function/throttle.d.ts.map +1 -1
- package/build/function/throttle.js +4 -2
- package/build/function/throttle.js.map +1 -1
- package/build/index.d.ts +4 -4
- package/build/index.d.ts.map +1 -1
- package/build/index.js +4 -5
- package/build/index.js.map +1 -1
- package/build/lru-cache.d.ts +15 -0
- package/build/lru-cache.d.ts.map +1 -1
- package/build/lru-cache.js +23 -5
- package/build/lru-cache.js.map +1 -1
- package/build/number/assert.d.ts +2 -1
- package/build/number/assert.d.ts.map +1 -1
- package/build/number/assert.js +2 -5
- package/build/number/assert.js.map +1 -1
- package/build/object/assert-object.d.ts +13 -2
- package/build/object/assert-object.d.ts.map +1 -1
- package/build/object/assert-object.js +13 -2
- package/build/object/assert-object.js.map +1 -1
- package/build/object/assert.d.ts +4 -3
- package/build/object/assert.d.ts.map +1 -1
- package/build/object/assert.js +5 -8
- package/build/object/assert.js.map +1 -1
- package/build/object/clone.d.ts.map +1 -1
- package/build/object/clone.js +13 -8
- package/build/object/clone.js.map +1 -1
- package/build/object/equals.js +1 -1
- package/build/object/equals.js.map +1 -1
- package/build/object/filter-cached.d.ts.map +1 -1
- package/build/object/filter-cached.js +4 -6
- package/build/object/filter-cached.js.map +1 -1
- package/build/object/filter.d.ts.map +1 -1
- package/build/object/filter.js +2 -19
- package/build/object/filter.js.map +1 -1
- package/build/object/has-circular-reference.d.ts.map +1 -1
- package/build/object/has-circular-reference.js +5 -0
- package/build/object/has-circular-reference.js.map +1 -1
- package/build/object/hash.d.ts +12 -5
- package/build/object/hash.d.ts.map +1 -1
- package/build/object/hash.js +41 -13
- package/build/object/hash.js.map +1 -1
- package/build/object/index.d.ts +2 -1
- package/build/object/index.d.ts.map +1 -1
- package/build/object/index.js +2 -1
- package/build/object/index.js.map +1 -1
- package/build/object/json-circular-replacer.d.ts +39 -0
- package/build/object/json-circular-replacer.d.ts.map +1 -0
- package/build/object/json-circular-replacer.js +60 -0
- package/build/object/json-circular-replacer.js.map +1 -0
- package/build/object/key-value-pairs.d.ts.map +1 -1
- package/build/object/key-value-pairs.js +12 -4
- package/build/object/key-value-pairs.js.map +1 -1
- package/build/object/map-cached.d.ts.map +1 -1
- package/build/object/map-cached.js +2 -3
- package/build/object/map-cached.js.map +1 -1
- package/build/object/merge.d.ts.map +1 -1
- package/build/object/merge.js +3 -6
- package/build/object/merge.js.map +1 -1
- package/build/object/object-diff.d.ts +4 -8
- package/build/object/object-diff.d.ts.map +1 -1
- package/build/object/object-diff.js +8 -11
- package/build/object/object-diff.js.map +1 -1
- package/build/object/property-paths.js +2 -2
- package/build/object/property-paths.js.map +1 -1
- package/build/object/security-utils.d.ts.map +1 -1
- package/build/object/security-utils.js +0 -4
- package/build/object/security-utils.js.map +1 -1
- package/build/object/sort-keys.js +1 -1
- package/build/object/sort-keys.js.map +1 -1
- package/build/string/assert.d.ts +2 -1
- package/build/string/assert.d.ts.map +1 -1
- package/build/string/assert.js +5 -3
- package/build/string/assert.js.map +1 -1
- package/build/time/elapsed-time/elapsed-time.d.ts +1 -0
- package/build/time/elapsed-time/elapsed-time.d.ts.map +1 -1
- package/build/time/elapsed-time/elapsed-time.js +33 -22
- package/build/time/elapsed-time/elapsed-time.js.map +1 -1
- package/build/time/elapsed-time/types.d.ts +2 -2
- package/build/time/elapsed-time/types.d.ts.map +1 -1
- package/build/time/stopwatch/stopwatch.d.ts +20 -0
- package/build/time/stopwatch/stopwatch.d.ts.map +1 -1
- package/build/time/stopwatch/stopwatch.js +26 -4
- package/build/time/stopwatch/stopwatch.js.map +1 -1
- package/package.json +9 -12
package/build/object/filter.js
CHANGED
|
@@ -1,23 +1,6 @@
|
|
|
1
1
|
import { ObjectEquals } from './equals.js';
|
|
2
2
|
import { isPropertyPathSafe } from './security-utils.js';
|
|
3
|
-
|
|
4
|
-
* Navigates to a nested property value using dot notation path
|
|
5
|
-
*
|
|
6
|
-
* @param object - The object to navigate
|
|
7
|
-
* @param path - The dot notation path (e.g., 'meta.details.category')
|
|
8
|
-
* @returns The value at the path, or undefined if path doesn't exist
|
|
9
|
-
*/
|
|
10
|
-
function objectGetValueByPath(object, path) {
|
|
11
|
-
const pathSegments = path.split('.');
|
|
12
|
-
let current = object;
|
|
13
|
-
for (const segment of pathSegments) {
|
|
14
|
-
current = current?.[segment];
|
|
15
|
-
if (current === undefined || current === null) {
|
|
16
|
-
return undefined;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return current;
|
|
20
|
-
}
|
|
3
|
+
import { ObjectGetPropertyByPath } from './property-paths.js';
|
|
21
4
|
/**
|
|
22
5
|
* Compares two objects using deep equality logic for ObjectFilter
|
|
23
6
|
*
|
|
@@ -174,7 +157,7 @@ export function ObjectFilter(object, filter, options = {}) {
|
|
|
174
157
|
if (validatePaths && !isPropertyPathSafe(key)) {
|
|
175
158
|
return false;
|
|
176
159
|
}
|
|
177
|
-
const objValue =
|
|
160
|
+
const objValue = ObjectGetPropertyByPath(object, key);
|
|
178
161
|
if (objValue === undefined) {
|
|
179
162
|
return false;
|
|
180
163
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/object/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/object/filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"has-circular-reference.d.ts","sourceRoot":"","sources":["../../src/object/has-circular-reference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"has-circular-reference.d.ts","sourceRoot":"","sources":["../../src/object/has-circular-reference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CA8ChE"}
|
|
@@ -33,6 +33,9 @@ export function ObjectHasCircularReference(obj) {
|
|
|
33
33
|
return true;
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
|
+
// Backtrack: remove from seen so shared (non-circular) references are not
|
|
37
|
+
// falsely flagged when the same object appears via a different path.
|
|
38
|
+
seen.delete(value);
|
|
36
39
|
return false;
|
|
37
40
|
}
|
|
38
41
|
// For objects, check each own enumerable property
|
|
@@ -42,6 +45,8 @@ export function ObjectHasCircularReference(obj) {
|
|
|
42
45
|
return true;
|
|
43
46
|
}
|
|
44
47
|
}
|
|
48
|
+
// Backtrack: same reason as the array case above.
|
|
49
|
+
seen.delete(value);
|
|
45
50
|
return false;
|
|
46
51
|
};
|
|
47
52
|
return detectCircular(obj);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"has-circular-reference.js","sourceRoot":"","sources":["../../src/object/has-circular-reference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,0BAA0B,CAAC,GAAY;IACtD,MAAM,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;IAE3B,MAAM,cAAc,GAAG,CAAC,KAAc,EAAW,EAAE;QAClD,yDAAyD;QACzD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACd,CAAC;QAED,8DAA8D;QAC9D,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACb,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEhB,iCAAiC;QACjC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBAC1B,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1B,OAAO,IAAI,CAAC;gBACb,CAAC;YACF,CAAC;YAED,OAAO,KAAK,CAAC;QACd,CAAC;QAED,kDAAkD;QAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC;QAE3D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,cAAc,CAAE,KAAiC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC7D,OAAO,IAAI,CAAC;YACb,CAAC;QACF,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC,CAAC;IAEF,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC"}
|
|
1
|
+
{"version":3,"file":"has-circular-reference.js","sourceRoot":"","sources":["../../src/object/has-circular-reference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,0BAA0B,CAAC,GAAY;IACtD,MAAM,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;IAE3B,MAAM,cAAc,GAAG,CAAC,KAAc,EAAW,EAAE;QAClD,yDAAyD;QACzD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACd,CAAC;QAED,8DAA8D;QAC9D,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACb,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEhB,iCAAiC;QACjC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBAC1B,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1B,OAAO,IAAI,CAAC;gBACb,CAAC;YACF,CAAC;YAED,0EAA0E;YAC1E,qEAAqE;YACrE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,KAAK,CAAC;QACd,CAAC;QAED,kDAAkD;QAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC;QAE3D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,cAAc,CAAE,KAAiC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC7D,OAAO,IAAI,CAAC;YACb,CAAC;QACF,CAAC;QAED,kDAAkD;QAClD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,KAAK,CAAC;IACd,CAAC,CAAC;IAEF,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC"}
|
package/build/object/hash.d.ts
CHANGED
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Creates a hash of an object
|
|
2
|
+
* Creates a hash of an object.
|
|
3
|
+
*
|
|
4
|
+
* By default a fast, non-cryptographic 64-bit hash is used that works in all
|
|
5
|
+
* environments including browsers and React apps with no bundler polyfills
|
|
6
|
+
* required. If you need a cryptographic hash, supply your own `hashFunction`.
|
|
3
7
|
*
|
|
4
8
|
* @param obj - The object to hash
|
|
5
|
-
* @param hashFunction - Optional custom hash function (
|
|
9
|
+
* @param hashFunction - Optional custom hash function (receives `JSON.stringify` output)
|
|
6
10
|
* @returns A hash string of the object
|
|
7
11
|
* @throws {Error} When the object contains circular references
|
|
8
12
|
* @throws {Error} When the object cannot be serialized (e.g., undefined, functions, symbols)
|
|
9
13
|
*
|
|
10
14
|
* @example
|
|
11
15
|
* ```typescript
|
|
12
|
-
* // Default
|
|
16
|
+
* // Default (fast, non-cryptographic, browser-compatible)
|
|
13
17
|
* const hash = ObjectHash({ name: 'test', value: 42 });
|
|
14
18
|
*
|
|
15
|
-
* //
|
|
16
|
-
*
|
|
19
|
+
* // Custom cryptographic hash (Node.js only)
|
|
20
|
+
* import { createHash } from 'node:crypto';
|
|
21
|
+
* const sha256Hash = ObjectHash({ name: 'test' }, (data) =>
|
|
22
|
+
* createHash('sha256').update(data).digest('base64')
|
|
23
|
+
* );
|
|
17
24
|
* ```
|
|
18
25
|
*/
|
|
19
26
|
export declare function ObjectHash(obj: any, hashFunction?: (data: string) => string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/object/hash.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/object/hash.ts"],"names":[],"mappings":"AAgCA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAcpF"}
|
package/build/object/hash.js
CHANGED
|
@@ -1,21 +1,55 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto';
|
|
2
1
|
import { ObjectHasCircularReference } from './has-circular-reference.js';
|
|
2
|
+
// cyrb53-style hash mixing constants (chosen for good avalanche properties)
|
|
3
|
+
const HASH_SEED_1 = 0xdeadbeef;
|
|
4
|
+
const HASH_SEED_2 = 0x41c6ce57;
|
|
5
|
+
const HASH_MUL_1 = 2654435761;
|
|
6
|
+
const HASH_MUL_2 = 1597334677;
|
|
7
|
+
const HASH_MIX_1 = 2246822507;
|
|
8
|
+
const HASH_MIX_2 = 3266489909;
|
|
9
|
+
const HASH_SHIFT_HIGH = 16;
|
|
10
|
+
const HASH_SHIFT_LOW = 13;
|
|
11
|
+
const HASH_PAD_WIDTH = 8;
|
|
12
|
+
const HEXADECIMAL_RADIX = 16;
|
|
3
13
|
/**
|
|
4
|
-
*
|
|
14
|
+
* A fast, non-cryptographic 64-bit hash using a cyrb53-style mixing strategy.
|
|
15
|
+
* Browser-compatible and synchronous — no Node.js APIs required.
|
|
16
|
+
* Returns a 16-character lowercase hex string.
|
|
17
|
+
*/
|
|
18
|
+
function defaultHash(data) {
|
|
19
|
+
let h1 = HASH_SEED_1;
|
|
20
|
+
let h2 = HASH_SEED_2;
|
|
21
|
+
for (let i = 0; i < data.length; i++) {
|
|
22
|
+
const ch = data.charCodeAt(i);
|
|
23
|
+
h1 = Math.imul(h1 ^ ch, HASH_MUL_1);
|
|
24
|
+
h2 = Math.imul(h2 ^ ch, HASH_MUL_2);
|
|
25
|
+
}
|
|
26
|
+
h1 = (Math.imul(h1 ^ (h1 >>> HASH_SHIFT_HIGH), HASH_MIX_1) ^ Math.imul(h2 ^ (h2 >>> HASH_SHIFT_LOW), HASH_MIX_2)) >>> 0;
|
|
27
|
+
h2 = (Math.imul(h2 ^ (h2 >>> HASH_SHIFT_HIGH), HASH_MIX_1) ^ Math.imul(h1 ^ (h1 >>> HASH_SHIFT_LOW), HASH_MIX_2)) >>> 0;
|
|
28
|
+
return h1.toString(HEXADECIMAL_RADIX).padStart(HASH_PAD_WIDTH, '0') + h2.toString(HEXADECIMAL_RADIX).padStart(HASH_PAD_WIDTH, '0');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Creates a hash of an object.
|
|
32
|
+
*
|
|
33
|
+
* By default a fast, non-cryptographic 64-bit hash is used that works in all
|
|
34
|
+
* environments including browsers and React apps with no bundler polyfills
|
|
35
|
+
* required. If you need a cryptographic hash, supply your own `hashFunction`.
|
|
5
36
|
*
|
|
6
37
|
* @param obj - The object to hash
|
|
7
|
-
* @param hashFunction - Optional custom hash function (
|
|
38
|
+
* @param hashFunction - Optional custom hash function (receives `JSON.stringify` output)
|
|
8
39
|
* @returns A hash string of the object
|
|
9
40
|
* @throws {Error} When the object contains circular references
|
|
10
41
|
* @throws {Error} When the object cannot be serialized (e.g., undefined, functions, symbols)
|
|
11
42
|
*
|
|
12
43
|
* @example
|
|
13
44
|
* ```typescript
|
|
14
|
-
* // Default
|
|
45
|
+
* // Default (fast, non-cryptographic, browser-compatible)
|
|
15
46
|
* const hash = ObjectHash({ name: 'test', value: 42 });
|
|
16
47
|
*
|
|
17
|
-
* //
|
|
18
|
-
*
|
|
48
|
+
* // Custom cryptographic hash (Node.js only)
|
|
49
|
+
* import { createHash } from 'node:crypto';
|
|
50
|
+
* const sha256Hash = ObjectHash({ name: 'test' }, (data) =>
|
|
51
|
+
* createHash('sha256').update(data).digest('base64')
|
|
52
|
+
* );
|
|
19
53
|
* ```
|
|
20
54
|
*/
|
|
21
55
|
export function ObjectHash(obj, hashFunction) {
|
|
@@ -28,12 +62,6 @@ export function ObjectHash(obj, hashFunction) {
|
|
|
28
62
|
if (jsonString === undefined) {
|
|
29
63
|
throw new Error('Cannot hash object: JSON.stringify returned undefined');
|
|
30
64
|
}
|
|
31
|
-
|
|
32
|
-
if (hashFunction) {
|
|
33
|
-
return hashFunction(jsonString);
|
|
34
|
-
}
|
|
35
|
-
// Default to SHA-256 base64
|
|
36
|
-
const hash = createHash('sha256').update(jsonString).digest('base64');
|
|
37
|
-
return hash;
|
|
65
|
+
return hashFunction ? hashFunction(jsonString) : defaultHash(jsonString);
|
|
38
66
|
}
|
|
39
67
|
//# sourceMappingURL=hash.js.map
|
package/build/object/hash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/object/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/object/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAEzE,4EAA4E;AAC5E,MAAM,WAAW,GAAG,UAAU,CAAC;AAC/B,MAAM,WAAW,GAAG,UAAU,CAAC;AAC/B,MAAM,UAAU,GAAG,UAAU,CAAC;AAC9B,MAAM,UAAU,GAAG,UAAU,CAAC;AAC9B,MAAM,UAAU,GAAG,UAAU,CAAC;AAC9B,MAAM,UAAU,GAAG,UAAU,CAAC;AAC9B,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B;;;;GAIG;AACH,SAAS,WAAW,CAAC,IAAY;IAChC,IAAI,EAAE,GAAG,WAAW,CAAC;IACrB,IAAI,EAAE,GAAG,WAAW,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9B,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;QACpC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;IACrC,CAAC;IACD,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,eAAe,CAAC,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC;IACxH,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,eAAe,CAAC,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC;IACxH,OAAO,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;AACpI,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,UAAU,CAAC,GAAQ,EAAE,YAAuC;IAC3E,+DAA+D;IAC/D,IAAI,0BAA0B,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAEvC,sDAAsD;IACtD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;AAC1E,CAAC"}
|
package/build/object/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* @module object
|
|
9
9
|
*/
|
|
10
10
|
export { ObjectHasCircularReference } from './has-circular-reference.js';
|
|
11
|
+
export { CreateJsonCircularReplacer } from './json-circular-replacer.js';
|
|
11
12
|
export { ObjectClone, TransformObject } from './clone.js';
|
|
12
13
|
export { ObjectEquals } from './equals.js';
|
|
13
14
|
export { ObjectFilter, FilterObject } from './filter.js';
|
|
@@ -21,7 +22,7 @@ export { ObjectFromKeyValuePairs, ObjectToKeyValuePairs } from './key-value-pair
|
|
|
21
22
|
export { ObjectPick } from './pick.js';
|
|
22
23
|
export { ObjectOmit } from './omit.js';
|
|
23
24
|
export { ObjectMerge } from './merge.js';
|
|
24
|
-
export {
|
|
25
|
+
export { IsObject } from './assert-object.js';
|
|
25
26
|
export { isPropertyKeySafe, isPropertyPathSafe, sanitizePropertyKey, filterDangerousKeys, createCircularReferenceDetector, isInputSafe } from './security-utils.js';
|
|
26
27
|
export { ObjectInvert } from './object-invert.js';
|
|
27
28
|
export { ObjectFlatten } from './object-flatten.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/object/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/object/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,+BAA+B,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACpK,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AACjJ,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,YAAY,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGnQ,YAAY,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
|
package/build/object/index.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
// Functions
|
|
11
11
|
export { ObjectHasCircularReference } from './has-circular-reference.js';
|
|
12
|
+
export { CreateJsonCircularReplacer } from './json-circular-replacer.js';
|
|
12
13
|
export { ObjectClone, TransformObject } from './clone.js';
|
|
13
14
|
export { ObjectEquals } from './equals.js';
|
|
14
15
|
export { ObjectFilter, FilterObject } from './filter.js';
|
|
@@ -22,7 +23,7 @@ export { ObjectFromKeyValuePairs, ObjectToKeyValuePairs } from './key-value-pair
|
|
|
22
23
|
export { ObjectPick } from './pick.js';
|
|
23
24
|
export { ObjectOmit } from './omit.js';
|
|
24
25
|
export { ObjectMerge } from './merge.js';
|
|
25
|
-
export {
|
|
26
|
+
export { IsObject } from './assert-object.js';
|
|
26
27
|
export { isPropertyKeySafe, isPropertyPathSafe, sanitizePropertyKey, filterDangerousKeys, createCircularReferenceDetector, isInputSafe } from './security-utils.js';
|
|
27
28
|
export { ObjectInvert } from './object-invert.js';
|
|
28
29
|
export { ObjectFlatten } from './object-flatten.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/object/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY;AACZ,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/object/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY;AACZ,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,+BAA+B,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACpK,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a JSON.stringify replacer function that handles circular references
|
|
3
|
+
* by replacing them with a placeholder string.
|
|
4
|
+
*
|
|
5
|
+
* Unlike `ObjectHasCircularReference` which is designed for manual recursive
|
|
6
|
+
* traversal with explicit entry/exit control, this utility works inside
|
|
7
|
+
* `JSON.stringify`'s replacer context where only entry is signaled. It infers
|
|
8
|
+
* backtracking from the `this` context (the parent object).
|
|
9
|
+
*
|
|
10
|
+
* @param placeholder - The string to use for circular references (default: '[Circular]')
|
|
11
|
+
* @returns A replacer function for use with JSON.stringify
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const circular: any = { a: 1 };
|
|
16
|
+
* circular.self = circular;
|
|
17
|
+
*
|
|
18
|
+
* // Without replacer - throws TypeError
|
|
19
|
+
* JSON.stringify(circular); // Error: Converting circular structure to JSON
|
|
20
|
+
*
|
|
21
|
+
* // With replacer - safely serializes
|
|
22
|
+
* JSON.stringify(circular, CreateJsonCircularReplacer());
|
|
23
|
+
* // '{"a":1,"self":"[Circular]"}'
|
|
24
|
+
*
|
|
25
|
+
* // Custom placeholder
|
|
26
|
+
* JSON.stringify(circular, CreateJsonCircularReplacer('[Ref]'));
|
|
27
|
+
* // '{"a":1,"self":"[Ref]"}'
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* // Utility wrapper for safe JSON serialization
|
|
33
|
+
* function safeStringify(obj: unknown): string {
|
|
34
|
+
* return JSON.stringify(obj, CreateJsonCircularReplacer());
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare function CreateJsonCircularReplacer(placeholder?: string): (this: unknown, key: string, value: unknown) => unknown;
|
|
39
|
+
//# sourceMappingURL=json-circular-replacer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-circular-replacer.d.ts","sourceRoot":"","sources":["../../src/object/json-circular-replacer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,0BAA0B,CACzC,WAAW,GAAE,MAAqB,GAChC,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CA0BzD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a JSON.stringify replacer function that handles circular references
|
|
3
|
+
* by replacing them with a placeholder string.
|
|
4
|
+
*
|
|
5
|
+
* Unlike `ObjectHasCircularReference` which is designed for manual recursive
|
|
6
|
+
* traversal with explicit entry/exit control, this utility works inside
|
|
7
|
+
* `JSON.stringify`'s replacer context where only entry is signaled. It infers
|
|
8
|
+
* backtracking from the `this` context (the parent object).
|
|
9
|
+
*
|
|
10
|
+
* @param placeholder - The string to use for circular references (default: '[Circular]')
|
|
11
|
+
* @returns A replacer function for use with JSON.stringify
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const circular: any = { a: 1 };
|
|
16
|
+
* circular.self = circular;
|
|
17
|
+
*
|
|
18
|
+
* // Without replacer - throws TypeError
|
|
19
|
+
* JSON.stringify(circular); // Error: Converting circular structure to JSON
|
|
20
|
+
*
|
|
21
|
+
* // With replacer - safely serializes
|
|
22
|
+
* JSON.stringify(circular, CreateJsonCircularReplacer());
|
|
23
|
+
* // '{"a":1,"self":"[Circular]"}'
|
|
24
|
+
*
|
|
25
|
+
* // Custom placeholder
|
|
26
|
+
* JSON.stringify(circular, CreateJsonCircularReplacer('[Ref]'));
|
|
27
|
+
* // '{"a":1,"self":"[Ref]"}'
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* // Utility wrapper for safe JSON serialization
|
|
33
|
+
* function safeStringify(obj: unknown): string {
|
|
34
|
+
* return JSON.stringify(obj, CreateJsonCircularReplacer());
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export function CreateJsonCircularReplacer(placeholder = '[Circular]') {
|
|
39
|
+
const ancestors = [];
|
|
40
|
+
return function (_key, value) {
|
|
41
|
+
// Primitives and null are safe
|
|
42
|
+
if (typeof value !== 'object' || value === null) {
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
// Find where the parent (this) is in the ancestor stack.
|
|
46
|
+
// If the parent isn't found (-1), parentIndex + 1 = 0, so we clear the
|
|
47
|
+
// entire stack (we're at the root). Otherwise, we trim to the parent's
|
|
48
|
+
// level, removing any siblings that were previously visited.
|
|
49
|
+
const parentIndex = ancestors.lastIndexOf(this);
|
|
50
|
+
ancestors.splice(parentIndex + 1);
|
|
51
|
+
// Check if we've seen this value as an ancestor (circular reference)
|
|
52
|
+
if (ancestors.includes(value)) {
|
|
53
|
+
return placeholder;
|
|
54
|
+
}
|
|
55
|
+
// Add current value to ancestor stack
|
|
56
|
+
ancestors.push(value);
|
|
57
|
+
return value;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=json-circular-replacer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-circular-replacer.js","sourceRoot":"","sources":["../../src/object/json-circular-replacer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,UAAU,0BAA0B,CACzC,cAAsB,YAAY;IAElC,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,OAAO,UAAwB,IAAY,EAAE,KAAc;QAC1D,+BAA+B;QAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACd,CAAC;QAED,yDAAyD;QACzD,uEAAuE;QACvE,uEAAuE;QACvE,6DAA6D;QAC7D,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC,IAAc,CAAC,CAAC;QAC1D,SAAS,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QAElC,qEAAqE;QACrE,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAe,CAAC,EAAE,CAAC;YACzC,OAAO,WAAW,CAAC;QACpB,CAAC;QAED,sCAAsC;QACtC,SAAS,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;QAEhC,OAAO,KAAK,CAAC;IACd,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-value-pairs.d.ts","sourceRoot":"","sources":["../../src/object/key-value-pairs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"key-value-pairs.d.ts","sourceRoot":"","sources":["../../src/object/key-value-pairs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAa9F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAExF"}
|
|
@@ -12,10 +12,18 @@
|
|
|
12
12
|
* ```
|
|
13
13
|
*/
|
|
14
14
|
export function ObjectFromKeyValuePairs(entries) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
const obj = {};
|
|
16
|
+
for (const [key, value] of entries) {
|
|
17
|
+
// Use defineProperty to bypass inherited setters (e.g. __proto__) and
|
|
18
|
+
// prevent prototype pollution.
|
|
19
|
+
Object.defineProperty(obj, key, {
|
|
20
|
+
value,
|
|
21
|
+
writable: true,
|
|
22
|
+
enumerable: true,
|
|
23
|
+
configurable: true,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return obj;
|
|
19
27
|
}
|
|
20
28
|
/**
|
|
21
29
|
* Converts an object into an array of `[key, value]` tuples.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-value-pairs.js","sourceRoot":"","sources":["../../src/object/key-value-pairs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,uBAAuB,CAAc,OAAsB;IAC1E,
|
|
1
|
+
{"version":3,"file":"key-value-pairs.js","sourceRoot":"","sources":["../../src/object/key-value-pairs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,uBAAuB,CAAc,OAAsB;IAC1E,MAAM,GAAG,GAAG,EAAuB,CAAC;IACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACpC,sEAAsE;QACtE,+BAA+B;QAC/B,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE;YAC/B,KAAK;YACL,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;SAClB,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,qBAAqB,CAAc,GAAsB;IACxE,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAkB,CAAC;AAC7C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-cached.d.ts","sourceRoot":"","sources":["../../src/object/map-cached.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"map-cached.d.ts","sourceRoot":"","sources":["../../src/object/map-cached.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAM3E;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAkGzL"}
|
|
@@ -3,7 +3,6 @@ import { ObjectHash } from './hash.js';
|
|
|
3
3
|
// Cache configuration constants
|
|
4
4
|
const DEFAULT_MAX_CACHE_SIZE = 1000;
|
|
5
5
|
const CACHE_EVICTION_PERCENTAGE = 0.2; // 20%
|
|
6
|
-
const INITIAL_CACHE_HASH_LENGTH = 16;
|
|
7
6
|
/**
|
|
8
7
|
* Creates a cached version of {@link MapObject} for improved performance
|
|
9
8
|
* when mapping the same objects repeatedly.
|
|
@@ -79,10 +78,10 @@ export function MapObjectCached(options = {}) {
|
|
|
79
78
|
objectCache = new Map();
|
|
80
79
|
cache.set(resolvedMapperKey, objectCache);
|
|
81
80
|
}
|
|
82
|
-
//
|
|
81
|
+
// Generate a full hash as the cache key for the object being mapped
|
|
83
82
|
let objectKey;
|
|
84
83
|
try {
|
|
85
|
-
objectKey = ObjectHash(cursor)
|
|
84
|
+
objectKey = ObjectHash(cursor);
|
|
86
85
|
}
|
|
87
86
|
catch {
|
|
88
87
|
// If object has circular references, skip caching and compute directly
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-cached.js","sourceRoot":"","sources":["../../src/object/map-cached.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC,gCAAgC;AAChC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AACpC,MAAM,yBAAyB,GAAG,GAAG,CAAC,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"map-cached.js","sourceRoot":"","sources":["../../src/object/map-cached.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/object/merge.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/object/merge.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAyBvF"}
|
package/build/object/merge.js
CHANGED
|
@@ -30,11 +30,8 @@ export function ObjectMerge(target, source) {
|
|
|
30
30
|
// Security: Filter out dangerous keys from source object
|
|
31
31
|
const safeSource = filterDangerousKeys(source);
|
|
32
32
|
const output = { ...target };
|
|
33
|
-
Object.keys(
|
|
34
|
-
|
|
35
|
-
if (!Object.prototype.hasOwnProperty.call(safeSource, key)) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
33
|
+
// Object.keys() returns only own enumerable properties — no further guard needed.
|
|
34
|
+
for (const key of Object.keys(safeSource)) {
|
|
38
35
|
const targetValue = output[key];
|
|
39
36
|
const sourceValue = safeSource[key];
|
|
40
37
|
if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {
|
|
@@ -46,7 +43,7 @@ export function ObjectMerge(target, source) {
|
|
|
46
43
|
else {
|
|
47
44
|
output[key] = sourceValue;
|
|
48
45
|
}
|
|
49
|
-
}
|
|
46
|
+
}
|
|
50
47
|
return output;
|
|
51
48
|
}
|
|
52
49
|
//# sourceMappingURL=merge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/object/merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,WAAW,CAA4B,MAAS,EAAE,MAAkB;IACnF,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAW,CAAC;IAC9D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAEzD,yDAAyD;IACzD,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAA6B,CAAC,CAAC;IAEtE,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7B,
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/object/merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,WAAW,CAA4B,MAAS,EAAE,MAAkB;IACnF,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAW,CAAC;IAC9D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAEzD,yDAAyD;IACzD,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAA6B,CAAC,CAAC;IAEtE,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7B,kFAAkF;IAClF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAI,MAA8B,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAEpC,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7D,MAA8B,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,WAAW,CAAC,CAAC;QACzE,CAAC;aAAM,IACN,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAC/F,CAAC;YACD,MAA8B,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,MAA8B,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;QACpD,CAAC;IACF,CAAC;IAED,OAAO,MAAW,CAAC;AACpB,CAAC"}
|
|
@@ -19,14 +19,10 @@ export interface IObjectDiffResult {
|
|
|
19
19
|
* - **changed** — keys present in both whose values are not strictly equal
|
|
20
20
|
* (compared via `JSON.stringify` for deep value equality)
|
|
21
21
|
*
|
|
22
|
-
* **Important**:
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* - Objects with identical structure but different prototypes are considered equal
|
|
27
|
-
*
|
|
28
|
-
* For values containing functions, `undefined`, symbols, or circular references,
|
|
29
|
-
* consider a custom comparison function or pre-filtering the objects.
|
|
22
|
+
* **Important**: Comparison is performed with deep equality (`ObjectEquals`),
|
|
23
|
+
* which correctly handles nested objects regardless of key insertion order,
|
|
24
|
+
* Dates, RegExps, and NaN. Functions, Symbols, and circular references are
|
|
25
|
+
* not supported (see `ObjectEquals` for details).
|
|
30
26
|
*
|
|
31
27
|
* @param objA - The baseline object ("before")
|
|
32
28
|
* @param objB - The comparison object ("after")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object-diff.d.ts","sourceRoot":"","sources":["../../src/object/object-diff.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"object-diff.d.ts","sourceRoot":"","sources":["../../src/object/object-diff.ts"],"names":[],"mappings":"AAEA,sEAAsE;AACtE,MAAM,WAAW,iBAAiB;IACjC,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACxD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,UAAU,CACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,iBAAiB,CAkBnB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ObjectEquals } from './equals.js';
|
|
1
2
|
/**
|
|
2
3
|
* Computes a shallow diff between two objects.
|
|
3
4
|
*
|
|
@@ -7,14 +8,10 @@
|
|
|
7
8
|
* - **changed** — keys present in both whose values are not strictly equal
|
|
8
9
|
* (compared via `JSON.stringify` for deep value equality)
|
|
9
10
|
*
|
|
10
|
-
* **Important**:
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* - Objects with identical structure but different prototypes are considered equal
|
|
15
|
-
*
|
|
16
|
-
* For values containing functions, `undefined`, symbols, or circular references,
|
|
17
|
-
* consider a custom comparison function or pre-filtering the objects.
|
|
11
|
+
* **Important**: Comparison is performed with deep equality (`ObjectEquals`),
|
|
12
|
+
* which correctly handles nested objects regardless of key insertion order,
|
|
13
|
+
* Dates, RegExps, and NaN. Functions, Symbols, and circular references are
|
|
14
|
+
* not supported (see `ObjectEquals` for details).
|
|
18
15
|
*
|
|
19
16
|
* @param objA - The baseline object ("before")
|
|
20
17
|
* @param objB - The comparison object ("after")
|
|
@@ -37,15 +34,15 @@ export function ObjectDiff(objA, objB) {
|
|
|
37
34
|
const result = { added: {}, removed: {}, changed: {} };
|
|
38
35
|
const allKeys = new Set([...Object.keys(objA), ...Object.keys(objB)]);
|
|
39
36
|
for (const key of allKeys) {
|
|
40
|
-
const inA = Object.
|
|
41
|
-
const inB = Object.
|
|
37
|
+
const inA = Object.hasOwn(objA, key);
|
|
38
|
+
const inB = Object.hasOwn(objB, key);
|
|
42
39
|
if (inA && !inB) {
|
|
43
40
|
result.removed[key] = objA[key];
|
|
44
41
|
}
|
|
45
42
|
else if (!inA && inB) {
|
|
46
43
|
result.added[key] = objB[key];
|
|
47
44
|
}
|
|
48
|
-
else if (
|
|
45
|
+
else if (!ObjectEquals(objA[key], objB[key])) {
|
|
49
46
|
result.changed[key] = { from: objA[key], to: objB[key] };
|
|
50
47
|
}
|
|
51
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object-diff.js","sourceRoot":"","sources":["../../src/object/object-diff.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"object-diff.js","sourceRoot":"","sources":["../../src/object/object-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAY3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,UAAU,CACzB,IAA6B,EAC7B,IAA6B;IAE7B,MAAM,MAAM,GAAsB,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC1E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEtE,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAErC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
@@ -72,8 +72,8 @@ export function ObjectGetPropertyByPath(obj, path, defaultValue) {
|
|
|
72
72
|
if (result === null || result === undefined || typeof result !== 'object') {
|
|
73
73
|
return defaultValue;
|
|
74
74
|
}
|
|
75
|
-
// Use Object.
|
|
76
|
-
if (!Object.
|
|
75
|
+
// Use Object.hasOwn to prevent prototype chain access
|
|
76
|
+
if (!Object.hasOwn(result, key)) {
|
|
77
77
|
return defaultValue;
|
|
78
78
|
}
|
|
79
79
|
result = result[key];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"property-paths.js","sourceRoot":"","sources":["../../src/object/property-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,MAAM,UAAU,uBAAuB,CAAU,GAAQ,EAAE,IAAY,EAAE,YAAgB;IACxF,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,YAAY,CAAC;IACrB,CAAC;IAED,iDAAiD;IACjD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,YAAY,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,MAAM,GAAG,GAAG,CAAC;IAEjB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,8BAA8B;QAC9B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,YAAY,CAAC;QACrB,CAAC;QAED,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC3E,OAAO,YAAY,CAAC;QACrB,CAAC;QAED,
|
|
1
|
+
{"version":3,"file":"property-paths.js","sourceRoot":"","sources":["../../src/object/property-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,MAAM,UAAU,uBAAuB,CAAU,GAAQ,EAAE,IAAY,EAAE,YAAgB;IACxF,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,YAAY,CAAC;IACrB,CAAC;IAED,iDAAiD;IACjD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,YAAY,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,MAAM,GAAG,GAAG,CAAC;IAEjB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,8BAA8B;QAC9B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,YAAY,CAAC;QACrB,CAAC;QAED,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC3E,OAAO,YAAY,CAAC;QACrB,CAAC;QAED,sDAAsD;QACtD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAiC,EAAE,GAAG,CAAC,EAAE,CAAC;YAC5D,OAAO,YAAY,CAAC;QACrB,CAAC;QAED,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAW,CAAC;AAC1D,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,MAAM,UAAU,uBAAuB,CAAU,GAAQ,EAAE,IAAY,EAAE,KAAQ;IAChF,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO;IACR,CAAC;IAED,iDAAiD;IACjD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO;IACR,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO;IACR,CAAC;IAED,8CAA8C;IAC9C,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,OAAO;IACR,CAAC;IAED,IAAI,OAAO,GAAG,GAAG,CAAC;IAElB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,2CAA2C;QAC3C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO;QACR,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC7F,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;AAC1B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security-utils.d.ts","sourceRoot":"","sources":["../../src/object/security-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwBH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"security-utils.d.ts","sourceRoot":"","sources":["../../src/object/security-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwBH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAkBtD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAkBxD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO9D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAUrF;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IAC1C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,KAAK,IAAI,IAAI,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,IAAI,0BAA0B,CA6B5E;AAKD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,GAAE,MAAiC,GAAG,OAAO,CAqB7F"}
|