From 9a929335897a92bb4ead686526e300d304ab5b54 Mon Sep 17 00:00:00 2001 From: Brian Ng Date: Sat, 20 May 2017 08:08:23 -0500 Subject: [PATCH] Fix incorrect property ordering with obj rest spread on nested (#5750) --- .../src/index.js | 9 ++++++++- .../test/fixtures/object-rest/nested-2/actual.js | 15 +++++++++++++++ .../fixtures/object-rest/nested-2/expected.js | 16 ++++++++++++++++ .../test/fixtures/object-rest/nested/actual.js | 10 ++++++++++ .../test/fixtures/object-rest/nested/expected.js | 11 +++++++++++ 5 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested-2/actual.js create mode 100644 packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested-2/expected.js create mode 100644 packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested/actual.js create mode 100644 packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/nested/expected.js 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']);