Skip to content

Commit 15a4839

Browse files
authored
fix(core): fix custom deep merge not affecting nested properties (#4940)
1 parent 401a917 commit 15a4839

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

packages/apidom-core/src/merge/deepmerge.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ const mergeObjectElement: ObjectElementMerge = (targetElement, sourceElement, op
164164
clonedMember.value = getMergeFunction(key, options)(
165165
targetValue,
166166
value as ObjectOrArrayElement,
167+
options,
167168
);
168169
} else {
169170
clonedMember = cloneShallow(member as MemberElement);

packages/apidom-core/test/merge/deepmerge.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { assert } from 'chai';
2+
import { uniqWith, equals } from 'ramda';
23

34
import {
45
deepmerge,
@@ -455,6 +456,42 @@ describe('deepmerge', function () {
455456
assert.strictEqual(toValue(merged.get('name')), 'Alex and Tony');
456457
assert.deepEqual(toValue(merged.get('pets')), ['Cat', 'Parrot', 'Dog']);
457458
});
459+
460+
specify('should handle nested properties', function () {
461+
const x = new ObjectElement({
462+
foo: { bar: { enum: [1, 2, 3, 4] } },
463+
baz: {
464+
enum: [{ enum: [1, 2, 3] }, { enum: [1, 2, 3, 4] }],
465+
},
466+
});
467+
const y = new ObjectElement({
468+
foo: { bar: { enum: [1, 2, 3, 5] } },
469+
baz: {
470+
enum: [{ enum: [1, 2, 3, 4] }],
471+
},
472+
});
473+
const merged = deepmerge(x, y, {
474+
customMerge: (keyElement) => {
475+
if (toValue(keyElement) === 'enum') {
476+
return (targetElement, sourceElement) =>
477+
new ArrayElement(
478+
uniqWith(equals)([...toValue(targetElement), ...toValue(sourceElement)]),
479+
);
480+
}
481+
return deepmerge;
482+
},
483+
});
484+
const output = {
485+
foo: {
486+
bar: { enum: [1, 2, 3, 4, 5] },
487+
},
488+
baz: {
489+
enum: [{ enum: [1, 2, 3] }, { enum: [1, 2, 3, 4] }],
490+
},
491+
};
492+
493+
assert.deepEqual(toValue(merged), output);
494+
});
458495
});
459496

460497
context('given isMergeableElement option', function () {

0 commit comments

Comments
 (0)