@fluixi/utils 1.0.0-alpha.53
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/LICENSE +21 -0
- package/README.md +73 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.mjs +1 -0
- package/dist/lib/array/advanced.cjs +1 -0
- package/dist/lib/array/advanced.d.ts +1116 -0
- package/dist/lib/array/advanced.d.ts.map +1 -0
- package/dist/lib/array/advanced.js +2429 -0
- package/dist/lib/array/advanced.mjs +1 -0
- package/dist/lib/array/array.cjs +1 -0
- package/dist/lib/array/array.d.ts +6 -0
- package/dist/lib/array/array.d.ts.map +1 -0
- package/dist/lib/array/array.js +31 -0
- package/dist/lib/array/array.mjs +1 -0
- package/dist/lib/array/index.cjs +1 -0
- package/dist/lib/array/index.d.ts +4 -0
- package/dist/lib/array/index.d.ts.map +1 -0
- package/dist/lib/array/index.js +3 -0
- package/dist/lib/array/index.mjs +1 -0
- package/dist/lib/array/utils.cjs +1 -0
- package/dist/lib/array/utils.d.ts +100 -0
- package/dist/lib/array/utils.d.ts.map +1 -0
- package/dist/lib/array/utils.js +165 -0
- package/dist/lib/array/utils.mjs +1 -0
- package/dist/lib/color/color.cjs +1 -0
- package/dist/lib/color/color.d.ts +366 -0
- package/dist/lib/color/color.d.ts.map +1 -0
- package/dist/lib/color/color.js +722 -0
- package/dist/lib/color/color.mjs +1 -0
- package/dist/lib/color/constants.cjs +1 -0
- package/dist/lib/color/constants.d.ts +361 -0
- package/dist/lib/color/constants.d.ts.map +1 -0
- package/dist/lib/color/constants.js +358 -0
- package/dist/lib/color/constants.mjs +1 -0
- package/dist/lib/color/conversions.cjs +1 -0
- package/dist/lib/color/conversions.d.ts +166 -0
- package/dist/lib/color/conversions.d.ts.map +1 -0
- package/dist/lib/color/conversions.js +766 -0
- package/dist/lib/color/conversions.mjs +1 -0
- package/dist/lib/color/helpers.cjs +1 -0
- package/dist/lib/color/helpers.d.ts +75 -0
- package/dist/lib/color/helpers.d.ts.map +1 -0
- package/dist/lib/color/helpers.js +419 -0
- package/dist/lib/color/helpers.mjs +1 -0
- package/dist/lib/color/index.cjs +1 -0
- package/dist/lib/color/index.d.ts +12 -0
- package/dist/lib/color/index.d.ts.map +1 -0
- package/dist/lib/color/index.js +15 -0
- package/dist/lib/color/index.mjs +1 -0
- package/dist/lib/color/types.cjs +1 -0
- package/dist/lib/color/types.d.ts +179 -0
- package/dist/lib/color/types.d.ts.map +1 -0
- package/dist/lib/color/types.js +1 -0
- package/dist/lib/color/types.mjs +0 -0
- package/dist/lib/color/utils.cjs +1 -0
- package/dist/lib/color/utils.d.ts +199 -0
- package/dist/lib/color/utils.d.ts.map +1 -0
- package/dist/lib/color/utils.js +858 -0
- package/dist/lib/color/utils.mjs +1 -0
- package/dist/lib/compare/comparators.cjs +1 -0
- package/dist/lib/compare/comparators.d.ts +65 -0
- package/dist/lib/compare/comparators.d.ts.map +1 -0
- package/dist/lib/compare/comparators.js +210 -0
- package/dist/lib/compare/comparators.mjs +1 -0
- package/dist/lib/compare/index.cjs +1 -0
- package/dist/lib/compare/index.d.ts +2 -0
- package/dist/lib/compare/index.d.ts.map +1 -0
- package/dist/lib/compare/index.js +1 -0
- package/dist/lib/compare/index.mjs +1 -0
- package/dist/lib/crypto/hash.cjs +1 -0
- package/dist/lib/crypto/hash.d.ts +6 -0
- package/dist/lib/crypto/hash.d.ts.map +1 -0
- package/dist/lib/crypto/hash.js +53 -0
- package/dist/lib/crypto/hash.mjs +1 -0
- package/dist/lib/crypto/index.cjs +1 -0
- package/dist/lib/crypto/index.d.ts +2 -0
- package/dist/lib/crypto/index.d.ts.map +1 -0
- package/dist/lib/crypto/index.js +1 -0
- package/dist/lib/crypto/index.mjs +1 -0
- package/dist/lib/dom/events.cjs +1 -0
- package/dist/lib/dom/events.d.ts +159 -0
- package/dist/lib/dom/events.d.ts.map +1 -0
- package/dist/lib/dom/events.js +50 -0
- package/dist/lib/dom/events.mjs +1 -0
- package/dist/lib/dom/index.cjs +1 -0
- package/dist/lib/dom/index.d.ts +3 -0
- package/dist/lib/dom/index.d.ts.map +1 -0
- package/dist/lib/dom/index.js +2 -0
- package/dist/lib/dom/index.mjs +1 -0
- package/dist/lib/dom/utils.cjs +1 -0
- package/dist/lib/dom/utils.d.ts +6 -0
- package/dist/lib/dom/utils.d.ts.map +1 -0
- package/dist/lib/dom/utils.js +37 -0
- package/dist/lib/dom/utils.mjs +1 -0
- package/dist/lib/functions/functions.cjs +1 -0
- package/dist/lib/functions/functions.d.ts +329 -0
- package/dist/lib/functions/functions.d.ts.map +1 -0
- package/dist/lib/functions/functions.js +585 -0
- package/dist/lib/functions/functions.mjs +1 -0
- package/dist/lib/functions/index.cjs +1 -0
- package/dist/lib/functions/index.d.ts +3 -0
- package/dist/lib/functions/index.d.ts.map +1 -0
- package/dist/lib/functions/index.js +1 -0
- package/dist/lib/functions/index.mjs +1 -0
- package/dist/lib/functions/types.cjs +1 -0
- package/dist/lib/functions/types.d.ts +2 -0
- package/dist/lib/functions/types.d.ts.map +1 -0
- package/dist/lib/functions/types.js +1 -0
- package/dist/lib/functions/types.mjs +0 -0
- package/dist/lib/helpers.cjs +1 -0
- package/dist/lib/helpers.d.ts +13 -0
- package/dist/lib/helpers.d.ts.map +1 -0
- package/dist/lib/helpers.js +66 -0
- package/dist/lib/helpers.mjs +1 -0
- package/dist/lib/index.cjs +1 -0
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +8 -0
- package/dist/lib/index.mjs +1 -0
- package/dist/lib/maths/constants.cjs +1 -0
- package/dist/lib/maths/constants.d.ts +84 -0
- package/dist/lib/maths/constants.d.ts.map +1 -0
- package/dist/lib/maths/constants.js +79 -0
- package/dist/lib/maths/constants.mjs +1 -0
- package/dist/lib/maths/fn/advanced.cjs +1 -0
- package/dist/lib/maths/fn/advanced.d.ts +149 -0
- package/dist/lib/maths/fn/advanced.d.ts.map +1 -0
- package/dist/lib/maths/fn/advanced.js +264 -0
- package/dist/lib/maths/fn/advanced.mjs +1 -0
- package/dist/lib/maths/fn/basic.cjs +1 -0
- package/dist/lib/maths/fn/basic.d.ts +182 -0
- package/dist/lib/maths/fn/basic.d.ts.map +1 -0
- package/dist/lib/maths/fn/basic.js +343 -0
- package/dist/lib/maths/fn/basic.mjs +1 -0
- package/dist/lib/maths/fn/complex.cjs +1 -0
- package/dist/lib/maths/fn/complex.d.ts +153 -0
- package/dist/lib/maths/fn/complex.d.ts.map +1 -0
- package/dist/lib/maths/fn/complex.js +383 -0
- package/dist/lib/maths/fn/complex.mjs +1 -0
- package/dist/lib/maths/fn/index.cjs +1 -0
- package/dist/lib/maths/fn/index.d.ts +10 -0
- package/dist/lib/maths/fn/index.d.ts.map +1 -0
- package/dist/lib/maths/fn/index.js +9 -0
- package/dist/lib/maths/fn/index.mjs +1 -0
- package/dist/lib/maths/fn/trigo.cjs +1 -0
- package/dist/lib/maths/fn/trigo.d.ts +147 -0
- package/dist/lib/maths/fn/trigo.d.ts.map +1 -0
- package/dist/lib/maths/fn/trigo.js +227 -0
- package/dist/lib/maths/fn/trigo.mjs +1 -0
- package/dist/lib/maths/fn/vector.cjs +1 -0
- package/dist/lib/maths/fn/vector.d.ts +512 -0
- package/dist/lib/maths/fn/vector.d.ts.map +1 -0
- package/dist/lib/maths/fn/vector.js +1136 -0
- package/dist/lib/maths/fn/vector.mjs +1 -0
- package/dist/lib/maths/formatter.cjs +1 -0
- package/dist/lib/maths/formatter.d.ts +35 -0
- package/dist/lib/maths/formatter.d.ts.map +1 -0
- package/dist/lib/maths/formatter.js +56 -0
- package/dist/lib/maths/formatter.mjs +1 -0
- package/dist/lib/maths/guards.cjs +1 -0
- package/dist/lib/maths/guards.d.ts +166 -0
- package/dist/lib/maths/guards.d.ts.map +1 -0
- package/dist/lib/maths/guards.js +315 -0
- package/dist/lib/maths/guards.mjs +1 -0
- package/dist/lib/maths/index.cjs +1 -0
- package/dist/lib/maths/index.d.ts +24 -0
- package/dist/lib/maths/index.d.ts.map +1 -0
- package/dist/lib/maths/index.js +29 -0
- package/dist/lib/maths/index.mjs +1 -0
- package/dist/lib/maths/parser.cjs +1 -0
- package/dist/lib/maths/parser.d.ts +20 -0
- package/dist/lib/maths/parser.d.ts.map +1 -0
- package/dist/lib/maths/parser.js +78 -0
- package/dist/lib/maths/parser.mjs +1 -0
- package/dist/lib/maths/random.cjs +1 -0
- package/dist/lib/maths/random.d.ts +27 -0
- package/dist/lib/maths/random.d.ts.map +1 -0
- package/dist/lib/maths/random.js +49 -0
- package/dist/lib/maths/random.mjs +1 -0
- package/dist/lib/maths/types/advanced.cjs +1 -0
- package/dist/lib/maths/types/advanced.d.ts +357 -0
- package/dist/lib/maths/types/advanced.d.ts.map +1 -0
- package/dist/lib/maths/types/advanced.js +5 -0
- package/dist/lib/maths/types/advanced.mjs +0 -0
- package/dist/lib/maths/types/basic.cjs +1 -0
- package/dist/lib/maths/types/basic.d.ts +95 -0
- package/dist/lib/maths/types/basic.d.ts.map +1 -0
- package/dist/lib/maths/types/basic.js +5 -0
- package/dist/lib/maths/types/basic.mjs +0 -0
- package/dist/lib/maths/types/index.cjs +1 -0
- package/dist/lib/maths/types/index.d.ts +4 -0
- package/dist/lib/maths/types/index.d.ts.map +1 -0
- package/dist/lib/maths/types/index.js +3 -0
- package/dist/lib/maths/types/index.mjs +0 -0
- package/dist/lib/maths/types/negative.cjs +1 -0
- package/dist/lib/maths/types/negative.d.ts +51 -0
- package/dist/lib/maths/types/negative.d.ts.map +1 -0
- package/dist/lib/maths/types/negative.js +5 -0
- package/dist/lib/maths/types/negative.mjs +0 -0
- package/dist/lib/maths/types/operations.cjs +1 -0
- package/dist/lib/maths/types/operations.d.ts +188 -0
- package/dist/lib/maths/types/operations.d.ts.map +1 -0
- package/dist/lib/maths/types/operations.js +6 -0
- package/dist/lib/maths/types/operations.mjs +0 -0
- package/dist/lib/object/clone.cjs +1 -0
- package/dist/lib/object/clone.d.ts +46 -0
- package/dist/lib/object/clone.d.ts.map +1 -0
- package/dist/lib/object/clone.js +104 -0
- package/dist/lib/object/clone.mjs +1 -0
- package/dist/lib/object/diff.cjs +1 -0
- package/dist/lib/object/diff.d.ts +203 -0
- package/dist/lib/object/diff.d.ts.map +1 -0
- package/dist/lib/object/diff.js +805 -0
- package/dist/lib/object/diff.mjs +1 -0
- package/dist/lib/object/getter-setter.cjs +1 -0
- package/dist/lib/object/getter-setter.d.ts +361 -0
- package/dist/lib/object/getter-setter.d.ts.map +1 -0
- package/dist/lib/object/getter-setter.js +1771 -0
- package/dist/lib/object/getter-setter.mjs +1 -0
- package/dist/lib/object/index.cjs +6 -0
- package/dist/lib/object/index.d.ts +13 -0
- package/dist/lib/object/index.d.ts.map +1 -0
- package/dist/lib/object/index.js +12 -0
- package/dist/lib/object/index.mjs +6 -0
- package/dist/lib/object/merge.cjs +1 -0
- package/dist/lib/object/merge.d.ts +93 -0
- package/dist/lib/object/merge.d.ts.map +1 -0
- package/dist/lib/object/merge.js +474 -0
- package/dist/lib/object/merge.mjs +1 -0
- package/dist/lib/object/object.cjs +1 -0
- package/dist/lib/object/object.d.ts +128 -0
- package/dist/lib/object/object.d.ts.map +1 -0
- package/dist/lib/object/object.js +432 -0
- package/dist/lib/object/object.mjs +1 -0
- package/dist/lib/object/omit.cjs +1 -0
- package/dist/lib/object/omit.d.ts +351 -0
- package/dist/lib/object/omit.d.ts.map +1 -0
- package/dist/lib/object/omit.js +656 -0
- package/dist/lib/object/omit.mjs +1 -0
- package/dist/lib/object/reconcile.cjs +1 -0
- package/dist/lib/object/reconcile.d.ts +7 -0
- package/dist/lib/object/reconcile.d.ts.map +1 -0
- package/dist/lib/object/reconcile.js +122 -0
- package/dist/lib/object/reconcile.mjs +1 -0
- package/dist/lib/object/selector.cjs +1 -0
- package/dist/lib/object/selector.d.ts +50 -0
- package/dist/lib/object/selector.d.ts.map +1 -0
- package/dist/lib/object/selector.js +371 -0
- package/dist/lib/object/selector.mjs +1 -0
- package/dist/lib/object/sort.cjs +1 -0
- package/dist/lib/object/sort.d.ts +149 -0
- package/dist/lib/object/sort.d.ts.map +1 -0
- package/dist/lib/object/sort.js +298 -0
- package/dist/lib/object/sort.mjs +1 -0
- package/dist/lib/object/transform.cjs +1 -0
- package/dist/lib/object/transform.d.ts +620 -0
- package/dist/lib/object/transform.d.ts.map +1 -0
- package/dist/lib/object/transform.js +1058 -0
- package/dist/lib/object/transform.mjs +1 -0
- package/dist/lib/object/types.cjs +1 -0
- package/dist/lib/object/types.d.ts +250 -0
- package/dist/lib/object/types.d.ts.map +1 -0
- package/dist/lib/object/types.js +1 -0
- package/dist/lib/object/types.mjs +0 -0
- package/dist/lib/object/utils.cjs +6 -0
- package/dist/lib/object/utils.d.ts +165 -0
- package/dist/lib/object/utils.d.ts.map +1 -0
- package/dist/lib/object/utils.js +444 -0
- package/dist/lib/object/utils.mjs +6 -0
- package/dist/lib/primitive/boolean/boolean.cjs +1 -0
- package/dist/lib/primitive/boolean/boolean.d.ts +276 -0
- package/dist/lib/primitive/boolean/boolean.d.ts.map +1 -0
- package/dist/lib/primitive/boolean/boolean.js +615 -0
- package/dist/lib/primitive/boolean/boolean.mjs +1 -0
- package/dist/lib/primitive/boolean/index.cjs +1 -0
- package/dist/lib/primitive/boolean/index.d.ts +3 -0
- package/dist/lib/primitive/boolean/index.d.ts.map +1 -0
- package/dist/lib/primitive/boolean/index.js +2 -0
- package/dist/lib/primitive/boolean/index.mjs +1 -0
- package/dist/lib/primitive/boolean/types.cjs +1 -0
- package/dist/lib/primitive/boolean/types.d.ts +14 -0
- package/dist/lib/primitive/boolean/types.d.ts.map +1 -0
- package/dist/lib/primitive/boolean/types.js +1 -0
- package/dist/lib/primitive/boolean/types.mjs +0 -0
- package/dist/lib/primitive/date/date.cjs +1 -0
- package/dist/lib/primitive/date/date.d.ts +641 -0
- package/dist/lib/primitive/date/date.d.ts.map +1 -0
- package/dist/lib/primitive/date/date.js +1998 -0
- package/dist/lib/primitive/date/date.mjs +1 -0
- package/dist/lib/primitive/date/index.cjs +1 -0
- package/dist/lib/primitive/date/index.d.ts +3 -0
- package/dist/lib/primitive/date/index.d.ts.map +1 -0
- package/dist/lib/primitive/date/index.js +2 -0
- package/dist/lib/primitive/date/index.mjs +1 -0
- package/dist/lib/primitive/date/types.cjs +1 -0
- package/dist/lib/primitive/date/types.d.ts +205 -0
- package/dist/lib/primitive/date/types.d.ts.map +1 -0
- package/dist/lib/primitive/date/types.js +7 -0
- package/dist/lib/primitive/date/types.mjs +0 -0
- package/dist/lib/primitive/index.cjs +5 -0
- package/dist/lib/primitive/index.d.ts +5 -0
- package/dist/lib/primitive/index.d.ts.map +1 -0
- package/dist/lib/primitive/index.js +4 -0
- package/dist/lib/primitive/index.mjs +5 -0
- package/dist/lib/primitive/string/index.cjs +5 -0
- package/dist/lib/primitive/string/index.d.ts +3 -0
- package/dist/lib/primitive/string/index.d.ts.map +1 -0
- package/dist/lib/primitive/string/index.js +2 -0
- package/dist/lib/primitive/string/index.mjs +5 -0
- package/dist/lib/primitive/string/parser-2.cjs +8 -0
- package/dist/lib/primitive/string/parser-2.d.ts +17 -0
- package/dist/lib/primitive/string/parser-2.d.ts.map +1 -0
- package/dist/lib/primitive/string/parser-2.js +656 -0
- package/dist/lib/primitive/string/parser-2.mjs +8 -0
- package/dist/lib/primitive/string/parser.cjs +3 -0
- package/dist/lib/primitive/string/parser.d.ts +9 -0
- package/dist/lib/primitive/string/parser.d.ts.map +1 -0
- package/dist/lib/primitive/string/parser.js +775 -0
- package/dist/lib/primitive/string/parser.mjs +3 -0
- package/dist/lib/primitive/string/string.cjs +5 -0
- package/dist/lib/primitive/string/string.d.ts +535 -0
- package/dist/lib/primitive/string/string.d.ts.map +1 -0
- package/dist/lib/primitive/string/string.js +1301 -0
- package/dist/lib/primitive/string/string.mjs +5 -0
- package/dist/lib/primitive/string/types.cjs +1 -0
- package/dist/lib/primitive/string/types.d.ts +318 -0
- package/dist/lib/primitive/string/types.d.ts.map +1 -0
- package/dist/lib/primitive/string/types.js +5 -0
- package/dist/lib/primitive/string/types.mjs +0 -0
- package/dist/lib/primitive/types.cjs +1 -0
- package/dist/lib/primitive/types.d.ts +27 -0
- package/dist/lib/primitive/types.d.ts.map +1 -0
- package/dist/lib/primitive/types.js +1 -0
- package/dist/lib/primitive/types.mjs +0 -0
- package/dist/lib/url/index.cjs +1 -0
- package/dist/lib/url/index.d.ts +3 -0
- package/dist/lib/url/index.d.ts.map +1 -0
- package/dist/lib/url/index.js +2 -0
- package/dist/lib/url/index.mjs +1 -0
- package/dist/lib/url/parser.cjs +1 -0
- package/dist/lib/url/parser.d.ts +216 -0
- package/dist/lib/url/parser.d.ts.map +1 -0
- package/dist/lib/url/parser.js +488 -0
- package/dist/lib/url/parser.mjs +1 -0
- package/dist/lib/url/types.cjs +1 -0
- package/dist/lib/url/types.d.ts +18 -0
- package/dist/lib/url/types.d.ts.map +1 -0
- package/dist/lib/url/types.js +1 -0
- package/dist/lib/url/types.mjs +0 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +150 -0
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
import { isPlainObject } from './utils.js';
|
|
2
|
+
import { deepClone } from './clone.js';
|
|
3
|
+
import { diffObjectDetailed, applyDiff, } from './diff.js';
|
|
4
|
+
import { parseSelector } from './selector.js';
|
|
5
|
+
export function merge(...sources) {
|
|
6
|
+
if (sources.length === 0)
|
|
7
|
+
return {};
|
|
8
|
+
// Check if we're merging arrays or objects
|
|
9
|
+
const firstItem = sources[0];
|
|
10
|
+
const isArrayMerge = Array.isArray(firstItem);
|
|
11
|
+
// Ensure consistent types (all objects or all arrays)
|
|
12
|
+
for (const source of sources) {
|
|
13
|
+
if (source && Array.isArray(source) !== isArrayMerge) {
|
|
14
|
+
throw new Error('Cannot mix arrays and objects in deepMerge');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// Create appropriate empty result
|
|
18
|
+
let result = isArrayMerge ? [] : {};
|
|
19
|
+
// Merge the sources into the result
|
|
20
|
+
for (const source of sources) {
|
|
21
|
+
// Skip null/undefined sources
|
|
22
|
+
if (source == null)
|
|
23
|
+
continue;
|
|
24
|
+
if (isArrayMerge) {
|
|
25
|
+
// Array merging - concatenate arrays after deep cloning items
|
|
26
|
+
const resultArray = result;
|
|
27
|
+
const sourceArray = source;
|
|
28
|
+
for (const item of sourceArray) {
|
|
29
|
+
resultArray.push(deepClone(item));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// Object merging
|
|
34
|
+
if (!isPlainObject(source))
|
|
35
|
+
continue;
|
|
36
|
+
const resultObj = result;
|
|
37
|
+
const sourceObj = source;
|
|
38
|
+
// Handle regular properties
|
|
39
|
+
for (const key in sourceObj) {
|
|
40
|
+
if (Object.prototype.hasOwnProperty.call(sourceObj, key)) {
|
|
41
|
+
const value = sourceObj[key];
|
|
42
|
+
const existing = resultObj[key];
|
|
43
|
+
if (existing === undefined) {
|
|
44
|
+
// No existing value, deep clone the new value
|
|
45
|
+
resultObj[key] = deepClone(value);
|
|
46
|
+
}
|
|
47
|
+
else if (Array.isArray(value) && Array.isArray(existing)) {
|
|
48
|
+
// Both are arrays, concatenate them after deep cloning
|
|
49
|
+
resultObj[key] = [
|
|
50
|
+
...existing,
|
|
51
|
+
...value.map((item) => deepClone(item)),
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
else if (isPlainObject(value) && isPlainObject(existing)) {
|
|
55
|
+
// Both are plain objects, recursively merge
|
|
56
|
+
resultObj[key] = merge(existing, value);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Primitive or type mismatch, replace with cloned value
|
|
60
|
+
resultObj[key] = deepClone(value);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Handle symbols
|
|
65
|
+
const symbols = Object.getOwnPropertySymbols(sourceObj);
|
|
66
|
+
for (const symbol of symbols) {
|
|
67
|
+
const value = sourceObj[symbol];
|
|
68
|
+
const existing = resultObj[symbol];
|
|
69
|
+
if (existing === undefined) {
|
|
70
|
+
// No existing value, deep clone the new value
|
|
71
|
+
resultObj[symbol] = deepClone(value);
|
|
72
|
+
}
|
|
73
|
+
else if (Array.isArray(value) && Array.isArray(existing)) {
|
|
74
|
+
// Both are arrays, concatenate them after deep cloning
|
|
75
|
+
resultObj[symbol] = [
|
|
76
|
+
...existing,
|
|
77
|
+
...value.map((item) => deepClone(item)),
|
|
78
|
+
];
|
|
79
|
+
}
|
|
80
|
+
else if (isPlainObject(value) && isPlainObject(existing)) {
|
|
81
|
+
// Both are plain objects, recursively merge
|
|
82
|
+
resultObj[symbol] = merge(existing, value);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Primitive or type mismatch, replace with cloned value
|
|
86
|
+
resultObj[symbol] = deepClone(value);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
function getKey(value, keys) {
|
|
94
|
+
let key;
|
|
95
|
+
if (typeof value === 'undefined' || value === null)
|
|
96
|
+
return;
|
|
97
|
+
const data_keys = keys ? keys : ["id"];
|
|
98
|
+
if (typeof value === 'object') {
|
|
99
|
+
if (!Array.isArray(value)) {
|
|
100
|
+
let i = 0;
|
|
101
|
+
while (!key) {
|
|
102
|
+
key = data_keys[i];
|
|
103
|
+
i += 1;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return key;
|
|
108
|
+
}
|
|
109
|
+
export function mergeArrays(arr1, arr2, options) {
|
|
110
|
+
const { key, override = true } = options || {};
|
|
111
|
+
// 👉 Case 1: primitives
|
|
112
|
+
if (!key) {
|
|
113
|
+
return Array.from(new Set([...arr1, ...arr2]));
|
|
114
|
+
}
|
|
115
|
+
// 👉 Case 2: objects with key
|
|
116
|
+
const map = new Map();
|
|
117
|
+
for (const item of arr1) {
|
|
118
|
+
map.set(item[key], item);
|
|
119
|
+
}
|
|
120
|
+
for (const item of arr2) {
|
|
121
|
+
const existing = map.get(item[key]);
|
|
122
|
+
if (!existing) {
|
|
123
|
+
map.set(item[key], item);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
map.set(item[key], override
|
|
127
|
+
? { ...existing, ...item } // merge + override
|
|
128
|
+
: { ...item, ...existing } // keep original
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return Array.from(map.values());
|
|
133
|
+
}
|
|
134
|
+
function mergeInPlace(target, source) {
|
|
135
|
+
for (const key in source) {
|
|
136
|
+
const tVal = target[key];
|
|
137
|
+
const sVal = source[key];
|
|
138
|
+
const diff = diffObjectDetailed(tVal, sVal);
|
|
139
|
+
if (Array.isArray(tVal) && Array.isArray(sVal)) {
|
|
140
|
+
// keep same array reference
|
|
141
|
+
tVal.length = 0;
|
|
142
|
+
tVal.push(...sVal);
|
|
143
|
+
}
|
|
144
|
+
else if (typeof tVal === 'object' &&
|
|
145
|
+
typeof sVal === 'object' &&
|
|
146
|
+
tVal &&
|
|
147
|
+
sVal &&
|
|
148
|
+
diff.hasChanges) {
|
|
149
|
+
applyDiff(tVal, sVal);
|
|
150
|
+
// mergeInPlace(tVal, sVal);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
target[key] = sVal;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Merges objects or arrays with options for reference preservation and strict merging
|
|
159
|
+
*
|
|
160
|
+
* @param target - The target object/array to merge into (can be modified if preserveTarget is true)
|
|
161
|
+
* @param sources - The source objects/arrays to merge from
|
|
162
|
+
* @param options - Configuration options
|
|
163
|
+
* @returns The merged result
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* // With reference preservation
|
|
167
|
+
* const obj1 = { a: 1, b: { c: 2 } };
|
|
168
|
+
* const result = deepMergeWithOptions(obj1, { b: { d: 3 }, e: 4 }, { preserveTarget: true });
|
|
169
|
+
* // result === obj1 (same reference)
|
|
170
|
+
* // result: { a: 1, b: { c: 2, d: 3 }, e: 4 }
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* // With strict merging (only merge properties that exist in target)
|
|
174
|
+
* const obj1 = { a: 1, b: { c: 2 } };
|
|
175
|
+
* const result = deepMergeWithOptions(obj1, { b: { d: 3 }, e: 4 }, { strict: true });
|
|
176
|
+
* // result: { a: 1, b: { c: 2 } } - e is not added as it doesn't exist in obj1
|
|
177
|
+
*/
|
|
178
|
+
export function deepMergeWithOptions(target, ...args) {
|
|
179
|
+
if (args.length === 0)
|
|
180
|
+
return deepClone(target);
|
|
181
|
+
// Check if last argument is options
|
|
182
|
+
let options = { preserveTarget: false, strict: false };
|
|
183
|
+
let sources = args;
|
|
184
|
+
const lastArg = args[args.length - 1];
|
|
185
|
+
if (lastArg &&
|
|
186
|
+
typeof lastArg === 'object' &&
|
|
187
|
+
('preserveTarget' in lastArg || 'strict' in lastArg)) {
|
|
188
|
+
options = { ...options, ...lastArg };
|
|
189
|
+
sources = args.slice(0, -1);
|
|
190
|
+
}
|
|
191
|
+
// Create or use target as result base
|
|
192
|
+
const result = options.preserveTarget ? target : deepClone(target);
|
|
193
|
+
// Ensure consistent types (all objects or all arrays)
|
|
194
|
+
const isArrayMerge = Array.isArray(result);
|
|
195
|
+
for (const source of sources) {
|
|
196
|
+
if (source && Array.isArray(source) !== isArrayMerge) {
|
|
197
|
+
throw new Error('Cannot mix arrays and objects in deepMergeWithOptions');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Process each source
|
|
201
|
+
for (const source of sources) {
|
|
202
|
+
if (source == null)
|
|
203
|
+
continue;
|
|
204
|
+
if (isArrayMerge) {
|
|
205
|
+
// Array merging
|
|
206
|
+
const resultArray = result;
|
|
207
|
+
const sourceArray = source;
|
|
208
|
+
if (options.strict) {
|
|
209
|
+
// In strict mode, only modify existing array elements
|
|
210
|
+
for (let i = 0; i < resultArray.length && i < sourceArray.length; i++) {
|
|
211
|
+
if (isPlainObject(resultArray[i]) && isPlainObject(sourceArray[i])) {
|
|
212
|
+
resultArray[i] = deepMergeWithOptions(resultArray[i], sourceArray[i], options);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
// For non-objects in strict mode, only replace if same type
|
|
216
|
+
if (typeof resultArray[i] === typeof sourceArray[i]) {
|
|
217
|
+
resultArray[i] = deepClone(sourceArray[i]);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
// In non-strict mode, concatenate arrays
|
|
224
|
+
// console.log('pushing', [...resultArray], [...sourceArray])
|
|
225
|
+
mergeInPlace(resultArray, sourceArray);
|
|
226
|
+
// if(sourceArray.length===resultArray.length){
|
|
227
|
+
// for (let i=0; i<sourceArray.length; i++) {
|
|
228
|
+
// const item = sourceArray[i];
|
|
229
|
+
// // const result = resultArray[i];
|
|
230
|
+
// // let index = -1;
|
|
231
|
+
// // if(typeof item === 'object'){
|
|
232
|
+
// // const key = getKey(item);
|
|
233
|
+
// // if(key){
|
|
234
|
+
// // index = resultArray.find(s=>)
|
|
235
|
+
// // }else{
|
|
236
|
+
// // }
|
|
237
|
+
// // }else{
|
|
238
|
+
// // }
|
|
239
|
+
// resultArray.push(deepClone(item));
|
|
240
|
+
// }
|
|
241
|
+
// }else{
|
|
242
|
+
// for (let i=0; i<sourceArray.length; i++) {
|
|
243
|
+
// const item = sourceArray[i]
|
|
244
|
+
// resultArray.push(deepClone(item));
|
|
245
|
+
// }
|
|
246
|
+
// }
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
// Object merging
|
|
251
|
+
if (!isPlainObject(source))
|
|
252
|
+
continue;
|
|
253
|
+
const resultObj = result;
|
|
254
|
+
const sourceObj = source;
|
|
255
|
+
// Handle regular properties
|
|
256
|
+
for (const key in sourceObj) {
|
|
257
|
+
if (!Object.prototype.hasOwnProperty.call(sourceObj, key))
|
|
258
|
+
continue;
|
|
259
|
+
const value = sourceObj[key];
|
|
260
|
+
if (options.strict && !(key in resultObj)) {
|
|
261
|
+
// In strict mode, skip properties that don't exist in the target
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
const existing = resultObj[key];
|
|
265
|
+
if (existing === undefined) {
|
|
266
|
+
// Property doesn't exist in result yet, clone and add it
|
|
267
|
+
resultObj[key] = deepClone(value);
|
|
268
|
+
}
|
|
269
|
+
else if (Array.isArray(value) && Array.isArray(existing)) {
|
|
270
|
+
// Both are arrays, handle according to options
|
|
271
|
+
if (options.strict) {
|
|
272
|
+
// In strict mode, recursively merge array elements
|
|
273
|
+
resultObj[key] = deepMergeWithOptions(existing, value, options);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
// In non-strict mode, concatenate arrays
|
|
277
|
+
resultObj[key] = [
|
|
278
|
+
...existing,
|
|
279
|
+
...value.map((item) => deepClone(item)),
|
|
280
|
+
];
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
else if (isPlainObject(value) && isPlainObject(existing)) {
|
|
284
|
+
// Both are plain objects, recursively merge
|
|
285
|
+
resultObj[key] = deepMergeWithOptions(existing, value, options);
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
// Primitive or type mismatch, replace with cloned value
|
|
289
|
+
resultObj[key] = deepClone(value);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Handle symbols
|
|
293
|
+
const symbols = Object.getOwnPropertySymbols(sourceObj);
|
|
294
|
+
for (const symbol of symbols) {
|
|
295
|
+
if (options.strict && !(symbol in resultObj)) {
|
|
296
|
+
// In strict mode, skip symbols that don't exist in the target
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
const value = sourceObj[symbol];
|
|
300
|
+
const existing = resultObj[symbol];
|
|
301
|
+
if (existing === undefined) {
|
|
302
|
+
// Symbol doesn't exist in result yet, clone and add it
|
|
303
|
+
resultObj[symbol] = deepClone(value);
|
|
304
|
+
}
|
|
305
|
+
else if (Array.isArray(value) && Array.isArray(existing)) {
|
|
306
|
+
// Both are arrays, handle according to options
|
|
307
|
+
if (options.strict) {
|
|
308
|
+
// In strict mode, recursively merge array elements
|
|
309
|
+
resultObj[symbol] = deepMergeWithOptions(existing, value, options);
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
// In non-strict mode, concatenate arrays
|
|
313
|
+
resultObj[symbol] = [
|
|
314
|
+
...existing,
|
|
315
|
+
...value.map((item) => deepClone(item)),
|
|
316
|
+
];
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
else if (isPlainObject(value) && isPlainObject(existing)) {
|
|
320
|
+
// Both are plain objects, recursively merge
|
|
321
|
+
resultObj[symbol] = deepMergeWithOptions(existing, value, options);
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
// Primitive or type mismatch, replace with cloned value
|
|
325
|
+
resultObj[symbol] = deepClone(value);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return result;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Deep merges objects/arrays while preserving the reference to the first object/array
|
|
334
|
+
* Modifies the first object directly rather than creating a new one
|
|
335
|
+
*
|
|
336
|
+
* @param target - The target object that will be modified
|
|
337
|
+
* @param sources - The source objects to merge from
|
|
338
|
+
* @returns The modified target object (same reference)
|
|
339
|
+
*
|
|
340
|
+
* @example
|
|
341
|
+
* const obj1 = { a: 1, b: { c: 2 } };
|
|
342
|
+
* const result = deepMergeKeepReference(obj1, { b: { d: 3 }, e: 4 });
|
|
343
|
+
* // result === obj1 (same reference)
|
|
344
|
+
* // obj1 is now: { a: 1, b: { c: 2, d: 3 }, e: 4 }
|
|
345
|
+
*/
|
|
346
|
+
export function deepMergeKeepReference(target, ...sources) {
|
|
347
|
+
return deepMergeWithOptions(target, ...sources, {
|
|
348
|
+
preserveTarget: true,
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Strict deep merge - only merges properties that already exist in the target
|
|
353
|
+
* Does not add new properties that don't exist in the target
|
|
354
|
+
*
|
|
355
|
+
* @param target - The target object
|
|
356
|
+
* @param sources - The source objects to merge from
|
|
357
|
+
* @param preserveReference - Whether to preserve the reference to target (default: false)
|
|
358
|
+
* @returns The merged object
|
|
359
|
+
*
|
|
360
|
+
* @example
|
|
361
|
+
* const obj1 = { a: 1, b: { c: 2 } };
|
|
362
|
+
* const result = deepMergeStrict(obj1, { b: { d: 3 }, e: 4 });
|
|
363
|
+
* // result: { a: 1, b: { c: 2 } } - e is not added as it doesn't exist in obj1
|
|
364
|
+
* // d is not added as it doesn't exist in obj1.b
|
|
365
|
+
*/
|
|
366
|
+
export function deepMergeStrict(target, ...args) {
|
|
367
|
+
// Check if last argument is a boolean flag for preserving reference
|
|
368
|
+
let preserveReference = false;
|
|
369
|
+
let sources = args;
|
|
370
|
+
if (args.length > 0 && typeof args[args.length - 1] === 'boolean') {
|
|
371
|
+
preserveReference = args[args.length - 1];
|
|
372
|
+
sources = args.slice(0, -1);
|
|
373
|
+
}
|
|
374
|
+
return deepMergeWithOptions(target, ...sources, {
|
|
375
|
+
preserveTarget: preserveReference,
|
|
376
|
+
strict: true,
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Helper to merge a value into a structure based on selector
|
|
381
|
+
* @param target - Target object to merge into
|
|
382
|
+
* @param selector - Selector string
|
|
383
|
+
* @param value - Value to merge
|
|
384
|
+
* @example
|
|
385
|
+
* mergeIntoStructure({ a: { b: { c: 1 } } }, 'a.b.c', 2);
|
|
386
|
+
* // { a: { b: { c: 2 } } }
|
|
387
|
+
*/
|
|
388
|
+
export const mergeIntoStructure = (target, selector, value) => {
|
|
389
|
+
const segments = parseSelector(selector);
|
|
390
|
+
let current = target;
|
|
391
|
+
for (let i = 0; i < segments.length; i++) {
|
|
392
|
+
const segment = segments[i];
|
|
393
|
+
const isLast = i === segments.length - 1;
|
|
394
|
+
switch (segment.type) {
|
|
395
|
+
case 'property':
|
|
396
|
+
if (isLast) {
|
|
397
|
+
current[String(segment.value)] = value;
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
if (!current[String(segment.value)]) {
|
|
401
|
+
const nextSegment = segments[i + 1];
|
|
402
|
+
current[String(segment.value)] =
|
|
403
|
+
nextSegment.type === 'index' ||
|
|
404
|
+
nextSegment.type === 'slice' ||
|
|
405
|
+
nextSegment.type === 'union' ||
|
|
406
|
+
nextSegment.type === 'wildcard'
|
|
407
|
+
? []
|
|
408
|
+
: {};
|
|
409
|
+
}
|
|
410
|
+
current = current[String(segment.value)];
|
|
411
|
+
}
|
|
412
|
+
break;
|
|
413
|
+
case 'index':
|
|
414
|
+
if (!Array.isArray(current)) {
|
|
415
|
+
current = [];
|
|
416
|
+
}
|
|
417
|
+
const index = segment.value;
|
|
418
|
+
if (isLast) {
|
|
419
|
+
if (index >= current.length) {
|
|
420
|
+
for (let j = current.length; j <= index; j++) {
|
|
421
|
+
current.push(undefined);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
current[index] = value;
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
if (!current[index]) {
|
|
428
|
+
const nextSegment = segments[i + 1];
|
|
429
|
+
current[index] =
|
|
430
|
+
nextSegment.type === 'index' ||
|
|
431
|
+
nextSegment.type === 'slice' ||
|
|
432
|
+
nextSegment.type === 'union' ||
|
|
433
|
+
nextSegment.type === 'wildcard'
|
|
434
|
+
? []
|
|
435
|
+
: {};
|
|
436
|
+
}
|
|
437
|
+
current = current[index];
|
|
438
|
+
}
|
|
439
|
+
break;
|
|
440
|
+
case 'wildcard':
|
|
441
|
+
// For wildcards in get, we need to handle all elements
|
|
442
|
+
if (Array.isArray(current)) {
|
|
443
|
+
if (isLast) {
|
|
444
|
+
// Fill all positions with value
|
|
445
|
+
for (let j = 0; j < current.length; j++) {
|
|
446
|
+
current[j] = value;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
// Ensure all elements have the structure
|
|
451
|
+
const nextSegment = segments[i + 1];
|
|
452
|
+
for (let j = 0; j < current.length; j++) {
|
|
453
|
+
if (!current[j]) {
|
|
454
|
+
current[j] =
|
|
455
|
+
nextSegment.type === 'index' ||
|
|
456
|
+
nextSegment.type === 'slice' ||
|
|
457
|
+
nextSegment.type === 'union' ||
|
|
458
|
+
nextSegment.type === 'wildcard'
|
|
459
|
+
? []
|
|
460
|
+
: {};
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
// Continue with first element (structure should be same for all)
|
|
464
|
+
if (current.length > 0) {
|
|
465
|
+
current = current[0];
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
break;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
};
|
|
473
|
+
// Export aliases for convenience
|
|
474
|
+
export { deepMergeKeepReference as deepMerge, deepMergeStrict as mergeStrict, deepMergeWithOptions as mergeWithOptions, };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var b=e=>e==null||Array.isArray(e)||typeof e=="function"||e instanceof Date||e instanceof RegExp||e instanceof Map||e instanceof Set||e instanceof Error?!1:typeof e=="object";function $(e){if(typeof e!="object"||e===null)return!1;let s=Object.getPrototypeOf(e);return s===Object.prototype||s===null}var w=(e,s)=>{if(e==null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof Map){let a=new Map;return e.forEach((c,t)=>{(!s||!s.some(r=>r.toString()===t.toString()))&&a.set(t,w(c))}),a}if(e instanceof Set){let a=new Set;return e.forEach(c=>{a.add(w(c))}),a}if(Array.isArray(e))return Array.from(e).map(a=>w(a));if(b(e)){let a={};for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&(!s||!s.some(r=>r.toString()===t.toString()))&&(a[t]=w(e[t]));let c=Object.getOwnPropertySymbols(e);for(let t of c)(!s||!s.some(r=>r.toString()===t.toString()))&&(a[t]=w(e[t]));return a}return e};var E=(e,s)=>e===s,O=(e,s)=>{if(e.length!==s.length)return!1;for(let a=0;a<e.length;a++)if(Array.isArray(e[a])&&Array.isArray(s[a])){if(!O(e[a],s[a]))return!1}else if(b(e[a])&&b(s[a])){if(!D(e[a],s[a]))return!1}else if(e[a]!==s[a])return!1;return!0},D=(e,s)=>{let a=Object.keys(e),c=Object.keys(s);if(a.length!==c.length)return!1;for(let t of a){if(!(t in s))return!1;let r=e[t],d=s[t];if(Array.isArray(r)&&Array.isArray(d)){if(!O(r,d))return!1}else if(b(r)&&b(d)){if(!D(r,d))return!1}else if(r!==d)return!1}return!0},P=(e,s,a={})=>{let{includeDeleted:c=!1,includeAdded:t=!0,deepArrayComparison:r=!0,equalityFn:d=E,preserveStructure:m=!1}=a;if(e==null&&s==null)return{};if(e==null)return t?{...s}:{};if(s==null){if(c){let u={};for(let A in e)u[A]=void 0;return u}return{}}if(!b(e)||!b(s))return d(e,s)?{}:s;let l={},f=new Set;for(let u in s){f.add(u);let A=e[u],S=s[u];if(!(u in e)){t&&(l[u]=S);continue}if(Array.isArray(A)&&Array.isArray(S)){r?O(A,S)?m&&(l[u]=void 0):l[u]=S:A!==S?l[u]=S:m&&(l[u]=void 0);continue}if(b(A)&&b(S)){let h=P(A,S,a);Object.keys(h).length>0?l[u]=h:m&&(l[u]=void 0);continue}d(A,S)?m&&(l[u]=void 0):l[u]=S}if(c)for(let u in e)f.has(u)||(l[u]=void 0);return l},C=(e,s,a={})=>{let c=[],t=[],r=[],d={},{includeDeleted:m=!1,includeAdded:l=!0,deepArrayComparison:f=!0,equalityFn:u=E}=a;if(Array.isArray(e)&&Array.isArray(s)){let h=Math.max(e.length,s.length),o=[],i=!1;for(let n=0;n<h;n++){let y=`[${n}]`;if(n>=e.length)c.push(y),o[n]=s[n],i=!0;else if(n>=s.length)t.push(y),i=!0;else{let p=e[n],g=s[n];b(p)&&b(g)||Array.isArray(p)&&Array.isArray(g)?C(p,g,a).hasChanges?(r.push(y),o[n]=g,i=!0):o[n]=p:u(p,g)?o[n]=p:(r.push(y),o[n]=g,i=!0)}}return{changes:i?o:{},added:c,deleted:t,modified:r,hasChanges:i||t.length>0}}let A=(h,o,i="")=>{let n={added:[],deleted:[],modified:[]};if(Array.isArray(h)&&Array.isArray(o)){let y=Math.max(h.length,o.length);for(let p=0;p<y;p++){let g=i?`${i}[${p}]`:`[${p}]`;if(p>=h.length)n.added.push(g);else if(p>=o.length)n.deleted.push(g);else{let T=h[p],x=o[p];if(b(T)&&b(x)){let k=A(T,x,g);n.added.push(...k.added),n.deleted.push(...k.deleted),n.modified.push(...k.modified)}else if(Array.isArray(T)&&Array.isArray(x)){let k=A(T,x,g);n.added.push(...k.added),n.deleted.push(...k.deleted),n.modified.push(...k.modified)}else T!==x&&n.modified.push(g)}}return n}if(b(h)&&b(o)){let y=new Set([...Object.keys(h||{}),...Object.keys(o||{})]);for(let p of y){let g=h?.[p],T=o?.[p],x=i?`${i}.${p}`:p;if(!(p in(h||{})))n.added.push(x);else if(!(p in(o||{})))n.deleted.push(x);else if(Array.isArray(g)&&Array.isArray(T)){if(!O(g,T)){let k=A(g,T,x);n.added.push(...k.added),n.deleted.push(...k.deleted),n.modified.push(...k.modified)}}else if(b(g)&&b(T)){let k=A(g,T,x);n.added.push(...k.added),n.deleted.push(...k.deleted),n.modified.push(...k.modified)}else g!==T&&n.modified.push(x)}}return n};if(e==null&&s==null)return{changes:{},added:c,deleted:t,modified:r,hasChanges:!1};if(e==null){if(l&&s)for(let h in s)c.push(h),d[h]=s[h];return{changes:d,added:c,deleted:t,modified:r,hasChanges:c.length>0}}if(s==null){if(m)for(let h in e)t.push(h),d[h]=void 0;return{changes:d,added:c,deleted:t,modified:r,hasChanges:t.length>0}}let S=new Set;for(let h in s){S.add(h);let o=e[h],i=s[h];if(!(h in e)){l&&(c.push(h),d[h]=i);continue}let n=!1;if(Array.isArray(o)&&Array.isArray(i)){if(n=f?!O(o,i):o!==i,n){let y=A(o,i,h);c.push(...y.added),t.push(...y.deleted),r.push(...y.modified),d[h]=i}}else if(b(o)&&b(i)){let y=P(o,i,a);if(n=Object.keys(y).length>0,n){let p=A(o,i,h);c.push(...p.added),t.push(...p.deleted),r.push(...p.modified),d[h]=y}}else n=!u(o,i),n&&(r.push(h),d[h]=i)}for(let h in e)S.has(h)||(t.push(h),d[h]=void 0);return{changes:d,added:c,deleted:t,modified:r,hasChanges:c.length>0||t.length>0||r.length>0}};function I(e){return!!(e&&(e.diff||e.changes)&&(e.modified||e.deleted||e.hasChanges))}var v=(e,s,a)=>{if(!I(s)){let n=s,y=a||!1;if(Array.isArray(e)&&Array.isArray(n)){let g=y?e:[...e];n.length<g.length&&(g.length=n.length);for(let T=0;T<n.length;T++){let x=n[T];x!==void 0&&(b(g[T])&&b(x)||Array.isArray(g[T])&&Array.isArray(x)?g[T]=v(g[T],x,y):g[T]=x)}return g}if(!b(e))return n;if(!b(n))return e;let p=y?e:{...e};for(let g in n){let T=n[g];T===void 0?delete p[g]:Array.isArray(p[g])&&Array.isArray(T)||b(p[g])&&b(T)?p[g]=v(p[g],T,y):p[g]=T}return p}let{diff:c,added:t=[],deleted:r=[],modified:d=[],changes:m,keepRef:l}=s,f=a!==void 0?a:l,u=m||c;if(!u)return e;let A=new Set(t),S=new Set(r),h=new Set(d),o=n=>{if(t.length===0&&r.length===0&&d.length===0)return!0;let y=n.split(/[.\[\]]+/).filter(Boolean);for(let p=0;p<=y.length;p++){let g=y.slice(0,p).join("."),T=y.slice(0,p).map((x,k)=>/^\d+$/.test(x)?`[${x}]`:k>0?`.${x}`:x).join("");if(A.has(g)||A.has(T)||S.has(g)||S.has(T)||h.has(g)||h.has(T))return!0}return!1};if(Array.isArray(e)&&Array.isArray(u)){let n=f?e:[...e];n.length=u.length;for(let y=0;y<u.length;y++){let p=`[${y}]`,g=u[y];g!==void 0&&o(p)&&(b(n[y])&&b(g)||Array.isArray(n[y])&&Array.isArray(g)?n[y]=v(n[y],g,f):n[y]=g)}return n}if(!b(e))return u;if(!b(u))return e;let i=f?e:{...e};for(let n of r)n.includes(".")||n.includes("[")||o(n)&&delete i[n];for(let n in u){let y=u[n];o(n)&&(y===void 0?delete i[n]:Array.isArray(i[n])&&Array.isArray(y)||b(i[n])&&b(y)?i[n]=v(i[n],y,f):i[n]=y)}return i};var j=(e,s={})=>{let{type:a="auto",throwOnError:c=!1}=s;if(!e||typeof e!="string")return[];let t=[],r="",d=!1,m=!1,l="",f="",u=0,S=a==="auto"?(o=>o.includes("..")?"descendant":o.includes("[?(")?"filter":o.includes("[:")||o.includes("[0:")?"slice":o.includes("[,")||o.includes("[0,1]")?"union":o.includes("[*]")||o.includes(".*.")?"wildcard":o.includes("[]")?"array-wildcard":o.includes("[")&&o.includes("]")?"bracket":"dot")(e):a,h=o=>{let i=o.trim();if(i==="*"||i==="")return{type:"wildcard",value:i===""?"[]":"*",raw:i===""?"[]":o};if(i==="[]")return{type:"wildcard",value:"[]",raw:o};if(/^-?\d+$/.test(i))return{type:"index",value:parseInt(i,10),raw:o};if(i.includes(":")){let n=i.split(":").map(g=>g.trim()),y=n[0]===""?0:parseInt(n[0],10),p=n[1]===""?1/0:parseInt(n[1],10);if(isNaN(y)||isNaN(p)){if(c)throw new Error(`Invalid slice notation: ${o}`);return{type:"wildcard",value:"*",raw:o}}return{type:"slice",value:[y,p],raw:o}}if(i.includes(",")){let n=i.split(",").map(y=>{let p=parseInt(y.trim(),10);return isNaN(p)?-1:p}).filter(y=>y>=0);if(n.length===0){if(c)throw new Error(`Invalid union notation: ${o}`);return{type:"wildcard",value:"*",raw:o}}return{type:"union",value:n,raw:o}}if(i.startsWith("?(")&&i.endsWith(")")){let n=i.slice(2,-1);try{return{type:"filter",value:F(n),raw:o}}catch(y){if(c)throw y;return{type:"wildcard",value:"*",raw:o}}}return i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'")?{type:"property",value:i.slice(1,-1),raw:o}:{type:"property",value:i,raw:o}};for(let o=0;o<e.length;o++){let i=e[o],n=e[o+1];if((i==='"'||i==="'")&&!m){m=!0,l=i;continue}else if(i===l&&m){m=!1,l="",i==='"'||i==="'"||(d?f+=i:r+=i);continue}if(m){d?f+=i:r+=i;continue}if(i==="["&&!d){r&&(t.push({type:"property",value:r,raw:r}),r=""),d=!0,f="";continue}if(i==="]"&&d&&!m){d=!1;let p=h(f);t.push(p);continue}let y=t.length>0?t[t.length-1]:null;if(i==="."&&!d&&!m){if(n==="."){let p=e.split("..")[0];t.push({type:"property",value:p,raw:p}),t.push({type:"descendant",value:"..",raw:".."}),o++}else r&&(r==="*"?t.push({type:"wildcard",value:r,raw:r}):t.push({type:"property",value:r,raw:r}),r="");continue}if(d)f+=i;else if(y&&y.type!=="descendant")r+=i;else{let p=e.split(y?.raw)[1];p!==void 0?r=p:r+=i}}return r&&t.push({type:"property",value:r,raw:r}),t.map(o=>{if(o.type==="property"&&typeof o.value=="string"&&/^-?\d+$/.test(o.value)){let i=parseInt(o.value,10);if(!isNaN(i))return{...o,type:"index",value:i}}return o})},F=e=>{let s=e.replace(/@\.([a-zA-Z_$][\w$]*)/g,(a,c)=>`item.${c}`).replace(/@/g,"item");try{return new Function("item",`return ${s}`)}catch{throw new Error(`Invalid filter expression: ${e}`)}};function M(...e){if(e.length===0)return{};let s=e[0],a=Array.isArray(s);for(let t of e)if(t&&Array.isArray(t)!==a)throw new Error("Cannot mix arrays and objects in deepMerge");let c=a?[]:{};for(let t of e)if(t!=null)if(a){let r=c,d=t;for(let m of d)r.push(w(m))}else{if(!$(t))continue;let r=c,d=t;for(let l in d)if(Object.prototype.hasOwnProperty.call(d,l)){let f=d[l],u=r[l];u===void 0?r[l]=w(f):Array.isArray(f)&&Array.isArray(u)?r[l]=[...u,...f.map(A=>w(A))]:$(f)&&$(u)?r[l]=M(u,f):r[l]=w(f)}let m=Object.getOwnPropertySymbols(d);for(let l of m){let f=d[l],u=r[l];u===void 0?r[l]=w(f):Array.isArray(f)&&Array.isArray(u)?r[l]=[...u,...f.map(A=>w(A))]:$(f)&&$(u)?r[l]=M(u,f):r[l]=w(f)}}return c}function G(e,s,a){let{key:c,override:t=!0}=a||{};if(!c)return Array.from(new Set([...e,...s]));let r=new Map;for(let d of e)r.set(d[c],d);for(let d of s){let m=r.get(d[c]);m?r.set(d[c],t?{...m,...d}:{...d,...m}):r.set(d[c],d)}return Array.from(r.values())}function N(e,s){for(let a in s){let c=e[a],t=s[a],r=C(c,t);Array.isArray(c)&&Array.isArray(t)?(c.length=0,c.push(...t)):typeof c=="object"&&typeof t=="object"&&c&&t&&r.hasChanges?v(c,t):e[a]=t}}function R(e,...s){if(s.length===0)return w(e);let a={preserveTarget:!1,strict:!1},c=s,t=s[s.length-1];t&&typeof t=="object"&&("preserveTarget"in t||"strict"in t)&&(a={...a,...t},c=s.slice(0,-1));let r=a.preserveTarget?e:w(e),d=Array.isArray(r);for(let m of c)if(m&&Array.isArray(m)!==d)throw new Error("Cannot mix arrays and objects in deepMergeWithOptions");for(let m of c)if(m!=null)if(d){let l=r,f=m;if(a.strict)for(let u=0;u<l.length&&u<f.length;u++)$(l[u])&&$(f[u])?l[u]=R(l[u],f[u],a):typeof l[u]==typeof f[u]&&(l[u]=w(f[u]));else N(l,f)}else{if(!$(m))continue;let l=r,f=m;for(let A in f){if(!Object.prototype.hasOwnProperty.call(f,A))continue;let S=f[A];if(a.strict&&!(A in l))continue;let h=l[A];h===void 0?l[A]=w(S):Array.isArray(S)&&Array.isArray(h)?a.strict?l[A]=R(h,S,a):l[A]=[...h,...S.map(o=>w(o))]:$(S)&&$(h)?l[A]=R(h,S,a):l[A]=w(S)}let u=Object.getOwnPropertySymbols(f);for(let A of u){if(a.strict&&!(A in l))continue;let S=f[A],h=l[A];h===void 0?l[A]=w(S):Array.isArray(S)&&Array.isArray(h)?a.strict?l[A]=R(h,S,a):l[A]=[...h,...S.map(o=>w(o))]:$(S)&&$(h)?l[A]=R(h,S,a):l[A]=w(S)}}return r}function H(e,...s){return R(e,...s,{preserveTarget:!0})}function X(e,...s){let a=!1,c=s;return s.length>0&&typeof s[s.length-1]=="boolean"&&(a=s[s.length-1],c=s.slice(0,-1)),R(e,...c,{preserveTarget:a,strict:!0})}var Y=(e,s,a)=>{let c=j(s),t=e;for(let r=0;r<c.length;r++){let d=c[r],m=r===c.length-1;switch(d.type){case"property":if(m)t[String(d.value)]=a;else{if(!t[String(d.value)]){let f=c[r+1];t[String(d.value)]=f.type==="index"||f.type==="slice"||f.type==="union"||f.type==="wildcard"?[]:{}}t=t[String(d.value)]}break;case"index":Array.isArray(t)||(t=[]);let l=d.value;if(m){if(l>=t.length)for(let f=t.length;f<=l;f++)t.push(void 0);t[l]=a}else{if(!t[l]){let f=c[r+1];t[l]=f.type==="index"||f.type==="slice"||f.type==="union"||f.type==="wildcard"?[]:{}}t=t[l]}break;case"wildcard":if(Array.isArray(t))if(m)for(let f=0;f<t.length;f++)t[f]=a;else{let f=c[r+1];for(let u=0;u<t.length;u++)t[u]||(t[u]=f.type==="index"||f.type==="slice"||f.type==="union"||f.type==="wildcard"?[]:{});t.length>0&&(t=t[0])}break}}};export{H as deepMerge,H as deepMergeKeepReference,X as deepMergeStrict,R as deepMergeWithOptions,M as merge,G as mergeArrays,Y as mergeIntoStructure,X as mergeStrict,R as mergeWithOptions};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var l=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var g=(e,r)=>{for(var n in r)l(e,n,{get:r[n],enumerable:!0})},T=(e,r,n,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of p(r))!A.call(e,s)&&s!==n&&l(e,s,{get:()=>r[s],enumerable:!(t=d(r,s))||t.enumerable});return e};var O=e=>T(l({},"__esModule",{value:!0}),e);var h={};g(h,{clean:()=>y,deepFreeze:()=>u,defaults:()=>b,filter:()=>m,fromQueryString:()=>x,groupBy:()=>S,invert:()=>a,isNonNullObject:()=>$,size:()=>R,toQueryString:()=>w,transform:()=>k});module.exports=O(h);var i=e=>e==null||Array.isArray(e)||typeof e=="function"||e instanceof Date||e instanceof RegExp||e instanceof Map||e instanceof Set||e instanceof Error?!1:typeof e=="object";var f=(e,r)=>{if(e==null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof Map){let n=new Map;return e.forEach((t,s)=>{(!r||!r.some(o=>o.toString()===s.toString()))&&n.set(s,f(t))}),n}if(e instanceof Set){let n=new Set;return e.forEach(t=>{n.add(f(t))}),n}if(Array.isArray(e))return Array.from(e).map(n=>f(n));if(i(e)){let n={};for(let s in e)Object.prototype.hasOwnProperty.call(e,s)&&(!r||!r.some(o=>o.toString()===s.toString()))&&(n[s]=f(e[s]));let t=Object.getOwnPropertySymbols(e);for(let s of t)(!r||!r.some(o=>o.toString()===s.toString()))&&(n[s]=f(e[s]));return n}return e};var a=(e,r=!1)=>{if(Array.isArray(e))return e.map(t=>a(t,r));if(!i(e))return{};let n={};for(let t in e){let s=e[t];typeof s=="string"||typeof s=="number"||typeof s=="symbol"?n[s]=t:i(s)?r&&(n[t]=a(s,r)):Array.isArray(s)&&r&&(n[t]=s.map(o=>a(o,r)))}return n},m=(e,r)=>{if(Array.isArray(e))return e.filter(r);if(!i(e))return{};let n={};for(let t in e)r(e[t],t)&&(n[t]=e[t]);return n},y=(e,r=!1)=>{if(!i(e))return{};let n={};for(let t in e){let s=e[t];if(s!=null)if(r&&i(s)){let o=y(s,!0);Object.keys(o).length>0&&(n[t]=o)}else n[t]=s}return n},b=(e,r)=>{if(Array.isArray(e))return Array.isArray(r)?[...e,...r]:[...e,r];let n=f(e);for(let t in r)n[t]===void 0&&(n[t]=r[t]);return n},R=e=>i(e)?Object.keys(e).length:0,k=(e,r)=>{if(Array.isArray(e))return e.map(r);if(!i(e))return{};let n={};for(let t in e){let[s,o]=r(t,e[t]);n[s]=o}return n},S=(e,r)=>Array.isArray(e)?e.reduce((n,t)=>{let s=t[r];if(s==null)return n;let o=String(s);return n[o]||(n[o]=[]),n[o].push(t),n},{}):{},w=e=>{if(!i(e))return"";let r=[],n=(t,s)=>{s!=null&&(Array.isArray(s)?s.forEach(o=>{r.push(`${encodeURIComponent(t)}=${encodeURIComponent(o)}`)}):r.push(`${encodeURIComponent(t)}=${encodeURIComponent(s)}`))};for(let t in e)n(t,e[t]);return r.join("&")},x=e=>{if(!e||typeof e!="string")return{};let r=e.startsWith("?")?e.slice(1):e;if(!r)return{};let n={},t=r.split("&");for(let s of t){let[o,c]=s.split("=").map(decodeURIComponent);o&&(o in n?Array.isArray(n[o])?n[o].push(c||""):n[o]=[n[o],c||""]:n[o]=c||"")}return n},u=e=>{if(e==null||typeof e!="object")return e;Object.freeze(e);for(let n in e){let t=e[n];t!=null&&typeof t=="object"&&u(t)}let r=Object.getOwnPropertySymbols(e);for(let n of r){let t=e[n];t!=null&&typeof t=="object"&&u(t)}return e},$=e=>e!=null&&typeof e=="object"&&!Array.isArray(e);
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type { AnyObject, DeepReadonly, RecordObject } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Inverts an object (swaps keys and values)
|
|
4
|
+
* @param obj - Source object
|
|
5
|
+
* @returns Inverted object
|
|
6
|
+
* @example
|
|
7
|
+
* invert({a: 1, b: 2}) // {1: 'a', 2: 'b'}
|
|
8
|
+
*/
|
|
9
|
+
export declare const invert: (obj: AnyObject, deep?: boolean) => AnyObject;
|
|
10
|
+
/**
|
|
11
|
+
* Maps object values using a callback function
|
|
12
|
+
* @param obj - Source object
|
|
13
|
+
* @param callback - Mapping function
|
|
14
|
+
* @returns New object with mapped values
|
|
15
|
+
* @example
|
|
16
|
+
* mapValues({a: 1, b: 2}, (value) => value * 2) // {a: 2, b: 4}
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Maps object keys using a callback function
|
|
20
|
+
* @param obj - Source object
|
|
21
|
+
* @param callback - Mapping function
|
|
22
|
+
* @returns New object with mapped keys
|
|
23
|
+
* @example
|
|
24
|
+
* mapKeys({a: 1, b: 2}, (key) => key.toUpperCase()) // {A: 1, B: 2}
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Filters object properties using a predicate
|
|
28
|
+
* @param obj - Source object
|
|
29
|
+
* @param predicate - Filter function
|
|
30
|
+
* @returns New object with filtered properties
|
|
31
|
+
* @example
|
|
32
|
+
* filter({a: 1, b: 2, c: 3}, (value) => value > 1) // {b: 2, c: 3}
|
|
33
|
+
*/
|
|
34
|
+
export declare const filter: <T extends AnyObject>(obj: T, predicate: (value: T[keyof T], key: keyof T) => boolean) => T extends RecordObject ? Partial<T> : Partial<T>[];
|
|
35
|
+
/**
|
|
36
|
+
* Flattens a nested object
|
|
37
|
+
* @param obj - Source object
|
|
38
|
+
* @param separator - Separator for nested keys (default: '.')
|
|
39
|
+
* @returns Flattened object
|
|
40
|
+
* @example
|
|
41
|
+
* flatten({a: {b: {c: 1}}, d: 2}) // {'a.b.c': 1, d: 2}
|
|
42
|
+
*/
|
|
43
|
+
/**
|
|
44
|
+
* Unflattens an object (reverse of flatten)
|
|
45
|
+
* @param obj - Source object
|
|
46
|
+
* @param separator - Separator used for nested keys (default: '.')
|
|
47
|
+
* @returns Unflattened object
|
|
48
|
+
* @example
|
|
49
|
+
* unflatten({'a.b.c': 1, d: 2}) // {a: {b: {c: 1}}, d: 2}
|
|
50
|
+
*/
|
|
51
|
+
/**
|
|
52
|
+
* Removes undefined or null properties from an object
|
|
53
|
+
* @param obj - Source object
|
|
54
|
+
* @param deep - Whether to clean recursively (default: false)
|
|
55
|
+
* @returns Cleaned object
|
|
56
|
+
* @example
|
|
57
|
+
* clean({a: 1, b: null, c: undefined, d: {e: null}}) // {a: 1, d: {}}
|
|
58
|
+
* clean({a: 1, b: null, d: {e: null}}, true) // {a: 1}
|
|
59
|
+
*/
|
|
60
|
+
export declare const clean: <T extends AnyObject>(obj: T, deep?: boolean) => Partial<T>;
|
|
61
|
+
/**
|
|
62
|
+
* Creates a new object with default values
|
|
63
|
+
* @param defaults - Default values
|
|
64
|
+
* @param overrides - Override values
|
|
65
|
+
* @returns Merged object with defaults
|
|
66
|
+
* @example
|
|
67
|
+
* defaults({a: 1, b: 2}, {b: 3, c: 4}) // {a: 1, b: 3, c: 4}
|
|
68
|
+
*/
|
|
69
|
+
export declare const defaults: <T extends AnyObject, U extends AnyObject>(current: T, overrides: U) => T & U;
|
|
70
|
+
/**
|
|
71
|
+
* Gets the size of an object (number of own enumerable properties)
|
|
72
|
+
* @param obj - Source object
|
|
73
|
+
* @returns Number of properties
|
|
74
|
+
* @example
|
|
75
|
+
* size({a: 1, b: 2, c: 3}) // 3
|
|
76
|
+
*/
|
|
77
|
+
export declare const size: (obj: AnyObject) => number;
|
|
78
|
+
/**
|
|
79
|
+
* Creates a new object with the same keys but transformed values
|
|
80
|
+
* @param obj - Source object
|
|
81
|
+
* @param transformer - Transformation function
|
|
82
|
+
* @returns Transformed object
|
|
83
|
+
* @example
|
|
84
|
+
* transform({a: 1, b: 2}, (key, value) => ({[key]: value * 2})) // {a: 2, b: 4}
|
|
85
|
+
*/
|
|
86
|
+
export declare const transform: <T extends AnyObject>(obj: T, transformer: (key: keyof T, value: T[keyof T]) => [string, any]) => AnyObject;
|
|
87
|
+
/**
|
|
88
|
+
* Groups an array of objects by a key
|
|
89
|
+
* @param array - Array of objects
|
|
90
|
+
* @param key - Key to group by
|
|
91
|
+
* @returns Grouped object
|
|
92
|
+
* @example
|
|
93
|
+
* groupBy([{type: 'a', value: 1}, {type: 'b', value: 2}, {type: 'a', value: 3}], 'type')
|
|
94
|
+
* // {a: [{type: 'a', value: 1}, {type: 'a', value: 3}], b: [{type: 'b', value: 2}]}
|
|
95
|
+
*/
|
|
96
|
+
export declare const groupBy: <T extends AnyObject>(array: T[], key: keyof T) => Record<string | number, T[]>;
|
|
97
|
+
/**
|
|
98
|
+
* Converts an object to a query string
|
|
99
|
+
* @param obj - Source object
|
|
100
|
+
* @returns Query string
|
|
101
|
+
* @example
|
|
102
|
+
* toQueryString({a: 1, b: 'test', c: [1, 2, 3]}) // 'a=1&b=test&c=1&c=2&c=3'
|
|
103
|
+
*/
|
|
104
|
+
export declare const toQueryString: (obj: AnyObject) => string;
|
|
105
|
+
/**
|
|
106
|
+
* Parses a query string to an object
|
|
107
|
+
* @param queryString - Query string
|
|
108
|
+
* @returns Parsed object
|
|
109
|
+
* @example
|
|
110
|
+
* fromQueryString('a=1&b=test&c=1&c=2&c=3') // {a: '1', b: 'test', c: ['1', '2', '3']}
|
|
111
|
+
*/
|
|
112
|
+
export declare const fromQueryString: (queryString: string) => AnyObject;
|
|
113
|
+
/**
|
|
114
|
+
* Creates a frozen deep clone of an object
|
|
115
|
+
* @param obj - Source object
|
|
116
|
+
* @returns Deep frozen object
|
|
117
|
+
* @example
|
|
118
|
+
* const frozen = deepFreeze({a: {b: 1}})
|
|
119
|
+
* frozen.a.b = 2 // Error in strict mode
|
|
120
|
+
*/
|
|
121
|
+
export declare const deepFreeze: <T>(obj: T) => DeepReadonly<T>;
|
|
122
|
+
/**
|
|
123
|
+
* Type guard for non-null object
|
|
124
|
+
* @param value - Value to check
|
|
125
|
+
* @returns True if value is a non-null object
|
|
126
|
+
*/
|
|
127
|
+
export declare const isNonNullObject: (value: unknown) => value is AnyObject;
|
|
128
|
+
//# sourceMappingURL=object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../../src/lib/object/object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAIxE;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,GAAI,KAAK,SAAS,EAAE,OAAM,OAAe,KAAG,SAgC9D,CAAC;AAEF;;;;;;;GAOG;AAqBH;;;;;;;GAOG;AAsBH;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,SAAS,SAAS,EACxC,KAAK,CAAC,EACN,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,OAAO,KACtD,CAAC,SAAS,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAiBlD,CAAC;AAEF;;;;;;;GAOG;AA+CH;;;;;;;GAOG;AA4DH;;;;;;;;GAQG;AACH,eAAO,MAAM,KAAK,GAAI,CAAC,SAAS,SAAS,EACvC,KAAK,CAAC,EACN,OAAM,OAAe,KACpB,OAAO,CAAC,CAAC,CAuBX,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,EAC/D,SAAS,CAAC,EACV,WAAW,CAAC,KACX,CAAC,GAAG,CAgBN,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,GAAI,KAAK,SAAS,KAAG,MAMrC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,SAAS,EAC3C,KAAK,CAAC,EACN,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,KAC9D,SAgBF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,SAAS,EACzC,OAAO,CAAC,EAAE,EACV,KAAK,MAAM,CAAC,KACX,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,CAqB7B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GAAI,KAAK,SAAS,KAAG,MAwB9C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,aAAa,MAAM,KAAG,SAkCrD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,KAAK,CAAC,KAAG,YAAY,CAAC,CAAC,CA4BpD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,SAEzD,CAAC"}
|