@tmlmobilidade/utils 20250929.1324.18 → 20251001.1147.43
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.
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merges two objects or arrays.
|
|
3
|
+
* @param target - The target object or array.
|
|
4
|
+
* @param source - The source object or array.
|
|
5
|
+
* @returns The merged object or array.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const target = { a: 1, b: 2 };
|
|
9
|
+
* const source = { b: 3, c: 4 };
|
|
10
|
+
* const merged = mergeObjects(target, source);
|
|
11
|
+
* // merged will be:
|
|
12
|
+
* // { a: 1, b: 3, c: 4 }
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* const target = [1, 2, 3];
|
|
16
|
+
* const source = [4, 5, 6];
|
|
17
|
+
* const merged = mergeObjects(target, source);
|
|
18
|
+
* // merged will be:
|
|
19
|
+
* // [1, 2, 3, 4, 5, 6]
|
|
20
|
+
*/
|
|
21
|
+
export declare function mergeObjects<T>(target: T, source: T): T;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
/**
|
|
3
|
+
* Merges two objects or arrays.
|
|
4
|
+
* @param target - The target object or array.
|
|
5
|
+
* @param source - The source object or array.
|
|
6
|
+
* @returns The merged object or array.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const target = { a: 1, b: 2 };
|
|
10
|
+
* const source = { b: 3, c: 4 };
|
|
11
|
+
* const merged = mergeObjects(target, source);
|
|
12
|
+
* // merged will be:
|
|
13
|
+
* // { a: 1, b: 3, c: 4 }
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const target = [1, 2, 3];
|
|
17
|
+
* const source = [4, 5, 6];
|
|
18
|
+
* const merged = mergeObjects(target, source);
|
|
19
|
+
* // merged will be:
|
|
20
|
+
* // [1, 2, 3, 4, 5, 6]
|
|
21
|
+
*/
|
|
22
|
+
export function mergeObjects(target, source) {
|
|
23
|
+
if (Array.isArray(target) && Array.isArray(source)) {
|
|
24
|
+
// If arrays of primitives → unique values
|
|
25
|
+
if (target.every(x => !isObject(x)) && source.every(x => !isObject(x))) {
|
|
26
|
+
return Array.from(new Set([...source, ...target]));
|
|
27
|
+
}
|
|
28
|
+
// If arrays of objects → deduplicate by deep equality
|
|
29
|
+
const merged = [];
|
|
30
|
+
const all = [...target, ...source];
|
|
31
|
+
for (const obj of all) {
|
|
32
|
+
if (!merged.some(existing => deepEqual(existing, obj))) {
|
|
33
|
+
merged.push(mergeObjectsObject(existingDefaults(obj), obj));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return merged;
|
|
37
|
+
}
|
|
38
|
+
if (isObject(target) && isObject(source)) {
|
|
39
|
+
return mergeObjectsObject(target, source);
|
|
40
|
+
}
|
|
41
|
+
// default: override
|
|
42
|
+
return source;
|
|
43
|
+
}
|
|
44
|
+
function mergeObjectsObject(target, source) {
|
|
45
|
+
const result = { ...target };
|
|
46
|
+
for (const key of Object.keys(source)) {
|
|
47
|
+
if (key in target) {
|
|
48
|
+
result[key] = mergeObjects(target[key], source[key]);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
result[key] = source[key];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
function isObject(item) {
|
|
57
|
+
return item !== null && typeof item === 'object' && !Array.isArray(item);
|
|
58
|
+
}
|
|
59
|
+
function deepEqual(a, b) {
|
|
60
|
+
if (a === b)
|
|
61
|
+
return true;
|
|
62
|
+
if (typeof a !== typeof b)
|
|
63
|
+
return false;
|
|
64
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
65
|
+
if (a.length !== b.length)
|
|
66
|
+
return false;
|
|
67
|
+
return a.every((val, i) => deepEqual(val, b[i]));
|
|
68
|
+
}
|
|
69
|
+
if (isObject(a) && isObject(b)) {
|
|
70
|
+
const keysA = Object.keys(a);
|
|
71
|
+
const keysB = Object.keys(b);
|
|
72
|
+
if (keysA.length !== keysB.length)
|
|
73
|
+
return false;
|
|
74
|
+
return keysA.every(k => deepEqual(a[k], b[k]));
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
// Helper: ensures merging empty object structure if needed
|
|
79
|
+
function existingDefaults(obj) {
|
|
80
|
+
return isObject(obj) ? {} : obj;
|
|
81
|
+
}
|
package/package.json
CHANGED