From 746ef032f7c7d49f02aed2fff45412f61fd15e8e Mon Sep 17 00:00:00 2001 From: Nate Silva Date: Wed, 19 Jun 2019 13:03:29 -0700 Subject: [PATCH 1/3] failing test for symbol keys --- test/merge.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/merge.js b/test/merge.js index 21a68e2..27a3f9b 100644 --- a/test/merge.js +++ b/test/merge.js @@ -614,3 +614,14 @@ test('should merge correctly if custom merge is not a valid function', function( t.end() }) + +test('add symbol keys in target that do not exist at the root', function(t) { + var mySymbol = Symbol(); + var src = { [mySymbol]: 'value1' } + var target = {} + + var res = merge(target, src) + + t.deepEqual(Object.getOwnPropertySymbols(res), Object.getOwnPropertySymbols(src)) + t.end() +}) From 8d53ab94e313fc1a739f547e4573cd30e280890a Mon Sep 17 00:00:00 2001 From: Nate Silva Date: Wed, 19 Jun 2019 13:12:45 -0700 Subject: [PATCH 2/3] Support properties that have Symbol keys --- index.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index dfc9b14..e9570a3 100644 --- a/index.js +++ b/index.js @@ -24,14 +24,20 @@ function getMergeFunction(key, options) { return typeof customMerge === 'function' ? customMerge : deepmerge } +function getKeys(target) { + return Object.getOwnPropertySymbols ? + Object.keys(target).concat(Object.getOwnPropertySymbols(target)) + : Object.keys(target) +} + function mergeObject(target, source, options) { var destination = {} if (options.isMergeableObject(target)) { - Object.keys(target).forEach(function(key) { + getKeys(target).forEach(function(key) { destination[key] = cloneUnlessOtherwiseSpecified(target[key], options) }) } - Object.keys(source).forEach(function(key) { + getKeys(source).forEach(function(key) { if (!options.isMergeableObject(source[key]) || !target[key]) { destination[key] = cloneUnlessOtherwiseSpecified(source[key], options) } else { From 2f0e45a3b2d44c4cc33caa302e3e5f92bd022f98 Mon Sep 17 00:00:00 2001 From: Nate Silva Date: Wed, 19 Jun 2019 18:04:02 -0700 Subject: [PATCH 3/3] Limit to enumerable symbols This parallels Object.keys, which only returns enumerable names. --- index.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index e9570a3..f850262 100644 --- a/index.js +++ b/index.js @@ -24,10 +24,16 @@ function getMergeFunction(key, options) { return typeof customMerge === 'function' ? customMerge : deepmerge } -function getKeys(target) { +function getEnumerableOwnPropertySymbols(target) { return Object.getOwnPropertySymbols ? - Object.keys(target).concat(Object.getOwnPropertySymbols(target)) - : Object.keys(target) + Object.getOwnPropertySymbols(target).filter(function(symbol) { + return target.propertyIsEnumerable(symbol) + }) + : []; +} + +function getKeys(target) { + return Object.keys(target).concat(getEnumerableOwnPropertySymbols(target)) } function mergeObject(target, source, options) {