From 7e726a81e63ca88b2d6e6254a320a569cc8918d3 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Mon, 21 Aug 2017 14:15:40 -0400 Subject: [PATCH] Complete export transform split (#6139) They were each transforming the other's syntax (including namespace transform would transform default, too, and vice-versa). --- .../src/index.js | 42 +++++----------- .../default-compound-namespace/actual.js | 1 + .../default-compound-namespace/expected.js | 3 ++ .../export-default/namespace-es6/actual.js | 1 + .../export-default/namespace-es6/expected.js | 1 + .../src/index.js | 48 ++++++++----------- .../export-namespace/default-es6/actual.js | 1 + .../export-namespace/default-es6/expected.js | 1 + .../namespace-compound-es6/expected.js | 3 +- .../babel-types/src/definitions/es2015.js | 8 +++- 10 files changed, 50 insertions(+), 59 deletions(-) create mode 100644 packages/babel-plugin-transform-export-default/test/fixtures/export-default/default-compound-namespace/actual.js create mode 100644 packages/babel-plugin-transform-export-default/test/fixtures/export-default/default-compound-namespace/expected.js create mode 100644 packages/babel-plugin-transform-export-default/test/fixtures/export-default/namespace-es6/actual.js create mode 100644 packages/babel-plugin-transform-export-default/test/fixtures/export-default/namespace-es6/expected.js create mode 100644 packages/babel-plugin-transform-export-namespace/test/fixtures/export-namespace/default-es6/actual.js create mode 100644 packages/babel-plugin-transform-export-namespace/test/fixtures/export-namespace/default-es6/expected.js diff --git a/packages/babel-plugin-transform-export-default/src/index.js b/packages/babel-plugin-transform-export-default/src/index.js index 87b1320b47..3d32e5a8be 100644 --- a/packages/babel-plugin-transform-export-default/src/index.js +++ b/packages/babel-plugin-transform-export-default/src/index.js @@ -1,44 +1,28 @@ import syntaxExportExtensions from "babel-plugin-syntax-export-extensions"; export default function({ types: t }) { - function build(node, nodes, scope) { - const hasNoExportDefault = node.specifiers.every( - specifier => !t.isExportDefaultSpecifier(specifier), - ); - if (hasNoExportDefault) return; - - const specifier = node.specifiers.shift(); - const uid = scope.generateUidIdentifier(specifier.exported.name); - - let newSpecifier; - if (t.isExportNamespaceSpecifier(specifier)) { - newSpecifier = t.importNamespaceSpecifier(uid); - } else { - newSpecifier = t.importDefaultSpecifier(uid); - } - nodes.push(t.importDeclaration([newSpecifier], node.source)); - nodes.push( - t.exportNamedDeclaration(null, [ - t.exportSpecifier(uid, specifier.exported), - ]), - ); - - build(node, nodes, scope); - } - return { inherits: syntaxExportExtensions, visitor: { ExportNamedDeclaration(path) { const { node, scope } = path; - const nodes = []; - build(node, nodes, scope); - if (!nodes.length) return; + const { specifiers } = node; + if (!t.isExportDefaultSpecifier(specifiers[0])) return; - if (node.specifiers.length >= 1) { + const specifier = specifiers.shift(); + const { exported } = specifier; + const uid = scope.generateUidIdentifier(exported.name); + + const nodes = [ + t.importDeclaration([t.importDefaultSpecifier(uid)], node.source), + t.exportNamedDeclaration(null, [t.exportSpecifier(uid, exported)]), + ]; + + if (specifiers.length >= 1) { nodes.push(node); } + path.replaceWithMultiple(nodes); }, }, diff --git a/packages/babel-plugin-transform-export-default/test/fixtures/export-default/default-compound-namespace/actual.js b/packages/babel-plugin-transform-export-default/test/fixtures/export-default/default-compound-namespace/actual.js new file mode 100644 index 0000000000..8287306a07 --- /dev/null +++ b/packages/babel-plugin-transform-export-default/test/fixtures/export-default/default-compound-namespace/actual.js @@ -0,0 +1 @@ +export v, * as all from "mod"; diff --git a/packages/babel-plugin-transform-export-default/test/fixtures/export-default/default-compound-namespace/expected.js b/packages/babel-plugin-transform-export-default/test/fixtures/export-default/default-compound-namespace/expected.js new file mode 100644 index 0000000000..bc377b5fc2 --- /dev/null +++ b/packages/babel-plugin-transform-export-default/test/fixtures/export-default/default-compound-namespace/expected.js @@ -0,0 +1,3 @@ +import _v from "mod"; +export { _v as v }; +export * as all from "mod"; diff --git a/packages/babel-plugin-transform-export-default/test/fixtures/export-default/namespace-es6/actual.js b/packages/babel-plugin-transform-export-default/test/fixtures/export-default/namespace-es6/actual.js new file mode 100644 index 0000000000..d9d78f9ccd --- /dev/null +++ b/packages/babel-plugin-transform-export-default/test/fixtures/export-default/namespace-es6/actual.js @@ -0,0 +1 @@ +export * as foo from "bar"; diff --git a/packages/babel-plugin-transform-export-default/test/fixtures/export-default/namespace-es6/expected.js b/packages/babel-plugin-transform-export-default/test/fixtures/export-default/namespace-es6/expected.js new file mode 100644 index 0000000000..d9d78f9ccd --- /dev/null +++ b/packages/babel-plugin-transform-export-default/test/fixtures/export-default/namespace-es6/expected.js @@ -0,0 +1 @@ +export * as foo from "bar"; diff --git a/packages/babel-plugin-transform-export-namespace/src/index.js b/packages/babel-plugin-transform-export-namespace/src/index.js index c9306c00f6..d3f61966d6 100644 --- a/packages/babel-plugin-transform-export-namespace/src/index.js +++ b/packages/babel-plugin-transform-export-namespace/src/index.js @@ -1,44 +1,38 @@ import syntaxExportExtensions from "babel-plugin-syntax-export-extensions"; export default function({ types: t }) { - function build(node, nodes, scope) { - const hasNoExportNs = node.specifiers.every( - specifier => !t.isExportNamespaceSpecifier(specifier), - ); - if (hasNoExportNs) return; - - const specifier = node.specifiers.shift(); - const uid = scope.generateUidIdentifier(specifier.exported.name); - - let newSpecifier; - if (t.isExportNamespaceSpecifier(specifier)) { - newSpecifier = t.importNamespaceSpecifier(uid); - } else { - newSpecifier = t.importDefaultSpecifier(uid); - } - nodes.push(t.importDeclaration([newSpecifier], node.source)); - nodes.push( - t.exportNamedDeclaration(null, [ - t.exportSpecifier(uid, specifier.exported), - ]), - ); - - build(node, nodes, scope); - } - return { inherits: syntaxExportExtensions, visitor: { ExportNamedDeclaration(path) { const { node, scope } = path; + const { specifiers } = node; + + const index = t.isExportDefaultSpecifier(specifiers[0]) ? 1 : 0; + if (!t.isExportNamespaceSpecifier(specifiers[index])) return; + const nodes = []; - build(node, nodes, scope); - if (!nodes.length) return; + + if (index === 1) { + nodes.push( + t.exportNamedDeclaration(null, [specifiers.shift()], node.source), + ); + } + + const specifier = specifiers.shift(); + const { exported } = specifier; + const uid = scope.generateUidIdentifier(exported.name); + + nodes.push( + t.importDeclaration([t.importNamespaceSpecifier(uid)], node.source), + t.exportNamedDeclaration(null, [t.exportSpecifier(uid, exported)]), + ); if (node.specifiers.length >= 1) { nodes.push(node); } + path.replaceWithMultiple(nodes); }, }, diff --git a/packages/babel-plugin-transform-export-namespace/test/fixtures/export-namespace/default-es6/actual.js b/packages/babel-plugin-transform-export-namespace/test/fixtures/export-namespace/default-es6/actual.js new file mode 100644 index 0000000000..48783b0466 --- /dev/null +++ b/packages/babel-plugin-transform-export-namespace/test/fixtures/export-namespace/default-es6/actual.js @@ -0,0 +1 @@ +export foo from "bar"; diff --git a/packages/babel-plugin-transform-export-namespace/test/fixtures/export-namespace/default-es6/expected.js b/packages/babel-plugin-transform-export-namespace/test/fixtures/export-namespace/default-es6/expected.js new file mode 100644 index 0000000000..48783b0466 --- /dev/null +++ b/packages/babel-plugin-transform-export-namespace/test/fixtures/export-namespace/default-es6/expected.js @@ -0,0 +1 @@ +export foo from "bar"; diff --git a/packages/babel-plugin-transform-export-namespace/test/fixtures/export-namespace/namespace-compound-es6/expected.js b/packages/babel-plugin-transform-export-namespace/test/fixtures/export-namespace/namespace-compound-es6/expected.js index 4db1e64aa3..d3fef4daae 100644 --- a/packages/babel-plugin-transform-export-namespace/test/fixtures/export-namespace/namespace-compound-es6/expected.js +++ b/packages/babel-plugin-transform-export-namespace/test/fixtures/export-namespace/namespace-compound-es6/expected.js @@ -1,4 +1,3 @@ -import _v from "mod"; -export { _v as v }; +export v from "mod"; import * as _ns from "mod"; export { _ns as ns }; diff --git a/packages/babel-types/src/definitions/es2015.js b/packages/babel-types/src/definitions/es2015.js index 63c131597e..c785a007d7 100644 --- a/packages/babel-types/src/definitions/es2015.js +++ b/packages/babel-types/src/definitions/es2015.js @@ -234,7 +234,13 @@ defineType("ExportNamedDeclaration", { specifiers: { validate: chain( assertValueType("array"), - assertEach(assertNodeType("ExportSpecifier")), + assertEach( + assertNodeType( + "ExportSpecifier", + "ExportDefaultSpecifier", + "ExportNamespaceSpecifier", + ), + ), ), }, source: {