diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/src/index.js b/packages/babel-plugin-transform-es2015-modules-commonjs/src/index.js index 2afc2d6fbbf2..22e5a8167a55 100644 --- a/packages/babel-plugin-transform-es2015-modules-commonjs/src/index.js +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/src/index.js @@ -73,23 +73,53 @@ export default function () { if (node[REASSIGN_REMAP_SKIP]) return; const left = path.get("left"); - if (!left.isIdentifier()) return; + if (left.isIdentifier()) { + const name = left.node.name; + const exports = this.exports[name]; + if (!exports) return; - const name = left.node.name; - const exports = this.exports[name]; - if (!exports) return; + // redeclared in this scope + if (this.scope.getBinding(name) !== path.scope.getBinding(name)) return; - // redeclared in this scope - if (this.scope.getBinding(name) !== path.scope.getBinding(name)) return; + node[REASSIGN_REMAP_SKIP] = true; - node[REASSIGN_REMAP_SKIP] = true; + for (const reid of exports) { + node = buildExportsAssignment(reid, node).expression; + } - for (const reid of exports) { - node = buildExportsAssignment(reid, node).expression; + path.replaceWith(node); + this.requeueInParent(path); } + else if (left.isObjectPattern()) { + for (const property of left.node.properties) { + const name = property.value.name; - path.replaceWith(node); - this.requeueInParent(path); + const exports = this.exports[name]; + if (!exports) continue; + + // redeclared in this scope + if (this.scope.getBinding(name) !== path.scope.getBinding(name)) return; + + node[REASSIGN_REMAP_SKIP] = true; + + path.insertAfter(buildExportsAssignment(t.identifier(name), t.identifier(name))); + } + } + else if (left.isArrayPattern()) { + for (const element of left.node.elements) { + const name = element.name; + + const exports = this.exports[name]; + if (!exports) continue; + + // redeclared in this scope + if (this.scope.getBinding(name) !== path.scope.getBinding(name)) return; + + node[REASSIGN_REMAP_SKIP] = true; + + path.insertAfter(buildExportsAssignment(t.identifier(name), t.identifier(name))); + } + } }, UpdateExpression(path) { diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/export-destructured/actual.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/export-destructured/actual.js new file mode 100644 index 000000000000..09c986a2d1b5 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/export-destructured/actual.js @@ -0,0 +1,14 @@ +export let x = 0; +export let y = 0; + +export function f1 () { + ({x} = { x: 1 }); +} + +export function f2 () { + ({x, y} = { x: 2, y: 3 }); +} + +export function f3 () { + [x, y, z] = [3, 4, 5] +} diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/export-destructured/expected.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/export-destructured/expected.js new file mode 100644 index 000000000000..d7015886fc41 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/export-destructured/expected.js @@ -0,0 +1,27 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.f1 = f1; +exports.f2 = f2; +exports.f3 = f3; +let x = exports.x = 0; +let y = exports.y = 0; + +function f1() { + ({ x } = { x: 1 }); + exports.x = x; +} + +function f2() { + ({ x, y } = { x: 2, y: 3 }); + exports.y = y; + exports.x = x; +} + +function f3() { + [x, y, z] = [3, 4, 5]; + exports.y = y; + exports.x = x; +}