diff --git a/.travis.yml b/.travis.yml index a1ace24..161fdae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,9 +6,7 @@ cache: notifications: email: false node_js: - - '4' -before_install: - - npm i -g npm@^2.0.0 + - '6' before_script: - npm prune after_success: diff --git a/src/migrations/molecules/merge/index.js b/src/migrations/molecules/merge/index.js index feb54bc..95e05cf 100644 --- a/src/migrations/molecules/merge/index.js +++ b/src/migrations/molecules/merge/index.js @@ -9,7 +9,7 @@ const merge = (path, value, subject) => Object.keys(value).reduce( return merge([...path, key], value[key], subject); } - return $set([...resolveObjectPath(path), ...key], value[key], subject); + return $set([...resolveObjectPath(path), key], value[key], subject); }, subject ); diff --git a/src/migrations/molecules/merge/index.spec.js b/src/migrations/molecules/merge/index.spec.js index a8594c4..52e698b 100644 --- a/src/migrations/molecules/merge/index.spec.js +++ b/src/migrations/molecules/merge/index.spec.js @@ -103,6 +103,36 @@ describe('Migrations > Atoms > $merge', () => { const subject = undefined; expect($merge('some.path', {some: 'value'}, subject)).to.be.an('undefined'); }); + + it('should not split up keys in deep object structures (bugfix #12)', () => { + const subject = { + test: { + a: { + b: { + cdef: 'c' + } + } + } + }; + const result = $merge('test', { + a: { + b: { + cdef: 'foo' + } + } + }, subject); + + expect(result.test.a.b.c).to.be.an('undefined'); + expect(result).to.deep.equal({ + test: { + a: { + b: { + cdef: 'foo' + } + } + } + }); + }); }); describe('Immutable', () => { diff --git a/src/util/resolveObjectPath/index.js b/src/util/resolveObjectPath/index.js index b189319..f540d7e 100644 --- a/src/util/resolveObjectPath/index.js +++ b/src/util/resolveObjectPath/index.js @@ -13,7 +13,7 @@ export default path => { return path.split('.').map(part => { const partAsInteger = parseInt(part); - if (!isNaN(partAsInteger)) { + if (!isNaN(partAsInteger) && String(partAsInteger) === part) { return partAsInteger; } diff --git a/src/util/resolveObjectPath/index.spec.js b/src/util/resolveObjectPath/index.spec.js index 50b64b8..34fad49 100644 --- a/src/util/resolveObjectPath/index.spec.js +++ b/src/util/resolveObjectPath/index.spec.js @@ -8,11 +8,13 @@ describe('Internals: resolveObjectPath', () => { expect(resolveObjectPath('a.b.c')).to.deep.equal(['a', 'b', 'c']); expect(resolveObjectPath('a.b.c.1')).to.deep.equal(['a', 'b', 'c', 1]); expect(resolveObjectPath('a.b.c.1.d.0')).to.deep.equal(['a', 'b', 'c', 1, 'd', 0]); + expect(resolveObjectPath('a.1.c1.2d.d.0')).to.deep.equal(['a', 1, 'c1', '2d', 'd', 0]); }); it('should leave arrays untouched', () => { expect(resolveObjectPath(['a'])).to.deep.equal(['a']); expect(resolveObjectPath(['a', 1, 'b'])).to.deep.equal(['a', 1, 'b']); expect(resolveObjectPath(['a', '2', 'c'])).to.deep.equal(['a', '2', 'c']); + expect(resolveObjectPath(['a', '2', 'c', '3d'])).to.deep.equal(['a', '2', 'c', '3d']); }); });