diff --git a/packages/babel-plugin-transform-object-rest-spread/src/index.js b/packages/babel-plugin-transform-object-rest-spread/src/index.js index 91f7a0c40a..f4dc344532 100644 --- a/packages/babel-plugin-transform-object-rest-spread/src/index.js +++ b/packages/babel-plugin-transform-object-rest-spread/src/index.js @@ -107,15 +107,22 @@ export default function ({ types: t }) { } let ref = this.originalPath.node.init; + const refPropertyPath = []; path.findParent((path) => { if (path.isObjectProperty()) { - ref = t.memberExpression(ref, t.identifier(path.node.key.name)); + refPropertyPath.unshift(path.node.key.name); } else if (path.isVariableDeclarator()) { return true; } }); + if (refPropertyPath.length) { + refPropertyPath.forEach((prop) => { + ref = t.memberExpression(ref, t.identifier(prop)); + }); + } + const [ argument, callExpression ] = createObjectSpread( file, path.parentPath.node.properties, diff --git a/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested-2/actual.js b/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested-2/actual.js new file mode 100644 index 0000000000..b2f92ebae1 --- /dev/null +++ b/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested-2/actual.js @@ -0,0 +1,15 @@ +const test = { + foo: { + bar: { + baz: { + a: { + x: 1, + y: 2, + z: 3, + }, + }, + }, + }, +}; + +const { foo: { bar: { baz: { a: { x, ...other } } } } } = test; diff --git a/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested-2/expected.js b/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested-2/expected.js new file mode 100644 index 0000000000..b9ede74663 --- /dev/null +++ b/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested-2/expected.js @@ -0,0 +1,16 @@ +const test = { + foo: { + bar: { + baz: { + a: { + x: 1, + y: 2, + z: 3 + } + } + } + } +}; + +const { foo: { bar: { baz: { a: { x } } } } } = test, + other = babelHelpers.objectWithoutProperties(test.foo.bar.baz.a, ["x"]); diff --git a/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested/actual.js b/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested/actual.js new file mode 100644 index 0000000000..a4dfbfaca7 --- /dev/null +++ b/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested/actual.js @@ -0,0 +1,10 @@ +const defunct = { + outer: { + inner: { + three: 'three', + four: 'four' + } + } +} + +const { outer: { inner: { three, ...other } } } = defunct diff --git a/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested/expected.js b/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested/expected.js new file mode 100644 index 0000000000..80b6ebf467 --- /dev/null +++ b/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested/expected.js @@ -0,0 +1,11 @@ +const defunct = { + outer: { + inner: { + three: 'three', + four: 'four' + } + } +}; + +const { outer: { inner: { three } } } = defunct, + other = babelHelpers.objectWithoutProperties(defunct.outer.inner, ['three']);