Skip to content

Commit 8ecbb75

Browse files
authored
Fix deep merge of nested DOM elements (#3)
1 parent 8af9107 commit 8ecbb75

File tree

5 files changed

+390
-8
lines changed

5 files changed

+390
-8
lines changed

jest.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export default {
2-
testEnvironment: 'node',
2+
testEnvironment: 'jsdom',
33
transform: {
44
'^.+\\.jsx?$': 'babel-jest', // Use Babel to transpile ES modules
55
},

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
{
22
"name": "@webfactoryde/merge-objects",
3-
"version": "1.0.0",
3+
"version": "1.0.1",
44
"description": "JS Utility that merges multiple objects into one, with an option for deep merging",
55
"main": "src/merge-objects.js",
66
"type": "module",
77
"devDependencies": {
88
"@babel/core": "^7.28.3",
99
"@babel/preset-env": "^7.28.3",
1010
"babel-jest": "^30.1.1",
11-
"jest": "^30.1.0"
11+
"jest": "^30.1.0",
12+
"jest-environment-jsdom": "^30.2.0"
1213
},
1314
"scripts": {
1415
"test": "jest"

src/merge-objects.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export default function mergeObjects(...args) {
3232
const merge = (obj) => {
3333
for (const prop in obj) {
3434
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
35-
if (deep && typeof obj[prop] === 'object' && obj[prop] !== null) {
35+
if (deep && Object.prototype.toString.call(obj[prop]) === '[object Object]') {
3636
extended[prop] = mergeObjects(true, extended[prop] || {}, obj[prop]);
3737
} else {
3838
extended[prop] = obj[prop];

tests/mergeObjects.test.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,11 @@ describe('mergeObjects', () => {
3737
});
3838

3939
test('should handle empty objects', () => {
40-
const obj1 = {};
40+
const obj1 = { a: 1 };
4141
const obj2 = {};
42-
const result = mergeObjects(false, obj1, obj2);
43-
expect(result).toEqual({});
42+
const obj3 = { c: 3 };
43+
const result = mergeObjects(false, obj1, obj2, obj3);
44+
expect(result).toEqual({ a: 1, c: 3 });
4445
});
4546

4647
test('should handle deep merge with empty objects', () => {
@@ -49,4 +50,16 @@ describe('mergeObjects', () => {
4950
const result = mergeObjects(true, obj1, obj2);
5051
expect(result).toEqual({ a: 1, b: { y: 30 }, c: 4 });
5152
});
53+
54+
test('should preserve DOM element references in deep merge', () => {
55+
const div = document.createElement('div');
56+
div.id = 'test';
57+
58+
const obj1 = {};
59+
const obj2 = { element: div };
60+
const result = mergeObjects(true, obj1, obj2);
61+
62+
expect(result.element).toBe(div);
63+
expect(result.element.id).toBe('test');
64+
});
5265
});

0 commit comments

Comments
 (0)