From a94a1edbf7bb9e82e159a2c6b604f386926205be Mon Sep 17 00:00:00 2001 From: fluidbyte Date: Sun, 21 May 2017 08:30:01 -0500 Subject: [PATCH 1/5] fix(deep-assign): add deepAssign to objects in strategy create's --- package.json | 1 + src/plugins/array.js | 4 ++++ src/plugins/json.js | 4 +++- src/plugins/object.js | 4 +++- yarn.lock | 10 ++++++++++ 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 324bf2b..0480995 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ ] }, "dependencies": { + "deep-assign": "^2.0.0", "halcyon": "^0.19.1" } } diff --git a/src/plugins/array.js b/src/plugins/array.js index 54fbf01..e02f8e9 100644 --- a/src/plugins/array.js +++ b/src/plugins/array.js @@ -1,3 +1,4 @@ +const deepAssign = require('deep-assign') const { without } = require('halcyon') module.exports = { @@ -30,6 +31,9 @@ module.exports = { if (mods.remove && !Array.isArray(mods.remove)) throw new Error(`Remove property must be an array`) mods.add = mods.add || [] mods.remove = mods.remove || [] + // Deep assign nested objects + data = data.map((x) => typeof x === 'object' ? deepAssign({}, x) : x) + mods.add = mods.add.map(x => typeof x === 'object' ? deepAssign({}, x): x) // Apply modifications and return return without(mods.remove, [ ...data ]).concat([ ...mods.add ]) } diff --git a/src/plugins/json.js b/src/plugins/json.js index 23c702c..ce1747a 100644 --- a/src/plugins/json.js +++ b/src/plugins/json.js @@ -1,3 +1,5 @@ +const deepAssign = require('deep-assign') + module.exports = { /** * @property {String} plugin name @@ -24,6 +26,6 @@ module.exports = { */ create: (data, mods = {}) => { if (typeof mods !== 'object') throw new Error(`Must supply a valid object`) - return JSON.stringify(Object.assign({}, data, mods)) + return JSON.stringify(deepAssign({}, data, mods)) } } diff --git a/src/plugins/object.js b/src/plugins/object.js index 2762599..b6df8e1 100644 --- a/src/plugins/object.js +++ b/src/plugins/object.js @@ -1,3 +1,5 @@ +const deepAssign = require('deep-assign') + module.exports = { /** * @property {String} plugin name @@ -21,6 +23,6 @@ module.exports = { */ create: (data, mods = {}) => { if (typeof mods !== 'object') throw new Error(`Must supply a valid object`) - return Object.assign({}, data, mods) + return deepAssign({}, data, mods) } } diff --git a/yarn.lock b/yarn.lock index a91794e..172c4ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -242,6 +242,12 @@ decamelize@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" +deep-assign@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-2.0.0.tgz#ebe06b1f07f08dae597620e3dd1622f371a1c572" + dependencies: + is-obj "^1.0.0" + deep-eql@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" @@ -794,6 +800,10 @@ is-my-json-valid@^2.10.0: jsonpointer "^4.0.0" xtend "^4.0.0" +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" From ff26d1430a7d41e94160692a3cf33c8af0b65d15 Mon Sep 17 00:00:00 2001 From: fluidbyte Date: Sun, 21 May 2017 09:38:21 -0500 Subject: [PATCH 2/5] fix(deep-assign): cleanup, coverage --- src/plugins/array.js | 5 ++--- test/src/plugins/array.spec.js | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/plugins/array.js b/src/plugins/array.js index e02f8e9..e296d81 100644 --- a/src/plugins/array.js +++ b/src/plugins/array.js @@ -32,9 +32,8 @@ module.exports = { mods.add = mods.add || [] mods.remove = mods.remove || [] // Deep assign nested objects - data = data.map((x) => typeof x === 'object' ? deepAssign({}, x) : x) - mods.add = mods.add.map(x => typeof x === 'object' ? deepAssign({}, x): x) + const assign = (arr) => arr.map((x) => typeof x === 'object' ? deepAssign({}, x) : x) // Apply modifications and return - return without(mods.remove, [ ...data ]).concat([ ...mods.add ]) + return without(mods.remove, [ ...assign(data) ]).concat([ ...assign(mods.add) ]) } } diff --git a/test/src/plugins/array.spec.js b/test/src/plugins/array.spec.js index 7ac36e2..eb613de 100644 --- a/test/src/plugins/array.spec.js +++ b/test/src/plugins/array.spec.js @@ -17,13 +17,13 @@ describe('plugins/array', () => { }) describe('create', () => { it('returns a new instance of the array with mods applied', () => { - const original = [ 'foo', 'bar' ] + const original = [ 'foo', { fizz: 'buzz' }, 'bar' ] const actual = array.create(original, { add: [ 'baz' ], remove: [ 'bar' ] }) - expect(original).to.deep.equal([ 'foo', 'bar' ]) - expect(actual).to.deep.equal([ 'foo', 'baz' ]) + expect(original).to.deep.equal([ 'foo', { fizz: 'buzz' }, 'bar' ]) + expect(actual).to.deep.equal([ 'foo', { fizz: 'buzz' }, 'baz' ]) }) it('throws if mods argument is not an object', () => { expect(() => array.create([ 'foo' ], 'bar')).to.throw(/Must supply a valid object/) From 1c18db938c5133330c69bf80dc3f2b504c7edcc6 Mon Sep 17 00:00:00 2001 From: fluidbyte Date: Sun, 21 May 2017 09:51:33 -0500 Subject: [PATCH 3/5] fix(deep-assign): swap deep-assign for lodash.merge --- package.json | 4 ++-- src/plugins/array.js | 4 ++-- src/plugins/json.js | 4 ++-- src/plugins/object.js | 4 ++-- yarn.lock | 14 ++++---------- 5 files changed, 12 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 0480995..6567e4c 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ ] }, "dependencies": { - "deep-assign": "^2.0.0", - "halcyon": "^0.19.1" + "halcyon": "^0.19.1", + "lodash.merge": "^4.6.0" } } diff --git a/src/plugins/array.js b/src/plugins/array.js index e296d81..db7dca4 100644 --- a/src/plugins/array.js +++ b/src/plugins/array.js @@ -1,4 +1,4 @@ -const deepAssign = require('deep-assign') +const merge = require('lodash.merge') const { without } = require('halcyon') module.exports = { @@ -32,7 +32,7 @@ module.exports = { mods.add = mods.add || [] mods.remove = mods.remove || [] // Deep assign nested objects - const assign = (arr) => arr.map((x) => typeof x === 'object' ? deepAssign({}, x) : x) + const assign = (arr) => arr.map((x) => typeof x === 'object' ? merge({}, x) : x) // Apply modifications and return return without(mods.remove, [ ...assign(data) ]).concat([ ...assign(mods.add) ]) } diff --git a/src/plugins/json.js b/src/plugins/json.js index ce1747a..da8eab4 100644 --- a/src/plugins/json.js +++ b/src/plugins/json.js @@ -1,4 +1,4 @@ -const deepAssign = require('deep-assign') +const merge = require('lodash.merge') module.exports = { /** @@ -26,6 +26,6 @@ module.exports = { */ create: (data, mods = {}) => { if (typeof mods !== 'object') throw new Error(`Must supply a valid object`) - return JSON.stringify(deepAssign({}, data, mods)) + return JSON.stringify(merge({}, data, mods)) } } diff --git a/src/plugins/object.js b/src/plugins/object.js index b6df8e1..2442c5c 100644 --- a/src/plugins/object.js +++ b/src/plugins/object.js @@ -1,4 +1,4 @@ -const deepAssign = require('deep-assign') +const merge = require('lodash.merge') module.exports = { /** @@ -23,6 +23,6 @@ module.exports = { */ create: (data, mods = {}) => { if (typeof mods !== 'object') throw new Error(`Must supply a valid object`) - return deepAssign({}, data, mods) + return merge({}, data, mods) } } diff --git a/yarn.lock b/yarn.lock index 172c4ee..7242071 100644 --- a/yarn.lock +++ b/yarn.lock @@ -242,12 +242,6 @@ decamelize@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" -deep-assign@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-2.0.0.tgz#ebe06b1f07f08dae597620e3dd1622f371a1c572" - dependencies: - is-obj "^1.0.0" - deep-eql@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" @@ -800,10 +794,6 @@ is-my-json-valid@^2.10.0: jsonpointer "^4.0.0" xtend "^4.0.0" -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" @@ -988,6 +978,10 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" +lodash.merge@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" + lodash@^4.0.0, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" From fe1b687ec8726dfdd353ed8d2a932c03bc8ff6c9 Mon Sep 17 00:00:00 2001 From: fluidbyte Date: Sun, 21 May 2017 09:57:58 -0500 Subject: [PATCH 4/5] test(deep-assign): ensure ref is broken --- test/src/plugins/array.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/src/plugins/array.spec.js b/test/src/plugins/array.spec.js index eb613de..849dcc7 100644 --- a/test/src/plugins/array.spec.js +++ b/test/src/plugins/array.spec.js @@ -22,8 +22,8 @@ describe('plugins/array', () => { add: [ 'baz' ], remove: [ 'bar' ] }) - expect(original).to.deep.equal([ 'foo', { fizz: 'buzz' }, 'bar' ]) - expect(actual).to.deep.equal([ 'foo', { fizz: 'buzz' }, 'baz' ]) + expect(original[1]).to.not.equal(actual[1]) + expect(original[1]).to.deep.equal(actual[1]) }) it('throws if mods argument is not an object', () => { expect(() => array.create([ 'foo' ], 'bar')).to.throw(/Must supply a valid object/) From f94abe32e5db4a51f67c9eff0616671ec3511b6b Mon Sep 17 00:00:00 2001 From: fluidbyte Date: Sun, 21 May 2017 11:00:46 -0500 Subject: [PATCH 5/5] test(object): ensure actual and original not equal --- test/src/plugins/object.spec.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/src/plugins/object.spec.js b/test/src/plugins/object.spec.js index 91fee1a..3474b45 100644 --- a/test/src/plugins/object.spec.js +++ b/test/src/plugins/object.spec.js @@ -21,6 +21,7 @@ describe('plugin/object', () => { const actual = object.create(original, { foo: 'biz' }) expect(original).to.deep.equal({ foo: 'bar' }) expect(actual).to.deep.equal({ foo: 'biz' }) + expect(actual).to.not.equal(original) }) it('throws if mods argument is not an object', () => { expect(() => object.create({ foo: 'bar' }, 'biz')).to.throw(/Must supply a valid object/)