diff --git a/src/acorn/src/statement.js b/src/acorn/src/statement.js index 1fdd968549..08ae517d3d 100755 --- a/src/acorn/src/statement.js +++ b/src/acorn/src/statement.js @@ -558,9 +558,10 @@ pp.parseClassSuper = function(node) { pp.parseExport = function(node) { this.next() // export * from '...' - if (this.eat(tt.star)) { + if (this.type === tt.star) { + let specifier = this.startNode() + this.next() if (this.options.features["es7.exportExtensions"] && this.eatContextual("as")) { - let specifier = this.startNode() specifier.exported = this.parseIdent() node.specifiers = [this.finishNode(specifier, "ExportNamespaceSpecifier")] this.parseExportSpecifiersMaybe(node) @@ -573,7 +574,16 @@ pp.parseExport = function(node) { let specifier = this.startNode() specifier.exported = this.parseIdent(true) node.specifiers = [this.finishNode(specifier, "ExportDefaultSpecifier")] - this.parseExportSpecifiersMaybe(node) + if (this.type === tt.comma && this.lookahead().type === tt.star) { + this.expect(tt.comma) + let specifier = this.startNode() + this.expect(tt.star) + this.expectContextual("as") + specifier.exported = this.parseIdent() + node.specifiers.push(this.finishNode(specifier, "ExportNamespaceSpecifier")) + } else { + this.parseExportSpecifiersMaybe(node) + } this.parseExportFrom(node) } else if (this.eat(tt._default)) { // export default ... let expr = this.parseMaybeAssign() diff --git a/src/babel/transformation/transformers/es7/export-extensions.js b/src/babel/transformation/transformers/es7/export-extensions.js index 91b6d29726..d11b87bc69 100644 --- a/src/babel/transformation/transformers/es7/export-extensions.js +++ b/src/babel/transformation/transformers/es7/export-extensions.js @@ -10,28 +10,32 @@ export function check(node) { return t.isExportDefaultSpecifier(node) || t.isExportNamespaceSpecifier(node); } -export function ExportNamedDeclaration(node, parent, scope) { - var nodes = []; +function build(node, nodes, scope) { + var first = node.specifiers[0]; + if (!t.isExportNamespaceSpecifier(first) && !t.isExportDefaultSpecifier(first)) return; - if (t.isExportNamespaceSpecifier(node.specifiers[0])) { - var specifier = node.specifiers.shift(); - var uid = scope.generateUidIdentifier(specifier.exported.name); - nodes.push( - t.importDeclaration([t.importNamespaceSpecifier(uid)], node.source), - t.exportNamedDeclaration(null, [t.exportSpecifier(uid, specifier.exported)]) - ); - } else if (t.isExportDefaultSpecifier(node.specifiers[0])) { - var specifier = node.specifiers.shift(); - var uid = scope.generateUidIdentifier(specifier.exported.name); - nodes.push( - t.importDeclaration([t.importSpecifier(uid, specifier.exported)], node.source), - t.exportNamedDeclaration(null, [t.exportSpecifier(uid, t.identifier("default"))]) - ); + var specifier = node.specifiers.shift(); + var uid = scope.generateUidIdentifier(specifier.exported.name); + + var 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); +} + +export function ExportNamedDeclaration(node, parent, scope) { + var nodes = []; + build(node, nodes, scope); if (!nodes.length) return; - if (node.specifiers.length > 1) { + if (node.specifiers.length >= 1) { nodes.push(node); } diff --git a/src/babel/util.js b/src/babel/util.js index 968b08d763..f2320b258f 100644 --- a/src/babel/util.js +++ b/src/babel/util.js @@ -74,6 +74,7 @@ var templateVisitor = { if (t.isExpressionStatement(node)) { node = node.expression; } + if (t.isIdentifier(node) && has(nodes, node.name)) { this.skip(); this.replaceInline(nodes[node.name]); diff --git a/test/core/fixtures/transformation/es7.export-extensions/default-commonjs/expected.js b/test/core/fixtures/transformation/es7.export-extensions/default-commonjs/expected.js index f04a206053..390cd20052 100644 --- a/test/core/fixtures/transformation/es7.export-extensions/default-commonjs/expected.js +++ b/test/core/fixtures/transformation/es7.export-extensions/default-commonjs/expected.js @@ -1,5 +1,5 @@ "use strict"; -var _foo = require("bar").foo; +var _foo = babelHelpers.interopRequire(require("bar")); -module.exports = _foo; +exports.foo = _foo; diff --git a/test/core/fixtures/transformation/es7.export-extensions/default-compound-es6/actual.js b/test/core/fixtures/transformation/es7.export-extensions/default-compound-es6/actual.js new file mode 100644 index 0000000000..14fd3180bd --- /dev/null +++ b/test/core/fixtures/transformation/es7.export-extensions/default-compound-es6/actual.js @@ -0,0 +1 @@ +export v, { x, y as w } from "mod"; diff --git a/test/core/fixtures/transformation/es7.export-extensions/default-compound-es6/expected.js b/test/core/fixtures/transformation/es7.export-extensions/default-compound-es6/expected.js new file mode 100644 index 0000000000..dcbc7758a2 --- /dev/null +++ b/test/core/fixtures/transformation/es7.export-extensions/default-compound-es6/expected.js @@ -0,0 +1,5 @@ +"use strict"; + +import _v from "mod"; +export { _v as v }; +export { x, y as w } from "mod"; diff --git a/test/core/fixtures/transformation/es7.export-extensions/default-compound-es6/options.json b/test/core/fixtures/transformation/es7.export-extensions/default-compound-es6/options.json new file mode 100644 index 0000000000..896d86d463 --- /dev/null +++ b/test/core/fixtures/transformation/es7.export-extensions/default-compound-es6/options.json @@ -0,0 +1,3 @@ +{ + "blacklist": ["es6.modules"] +} diff --git a/test/core/fixtures/transformation/es7.export-extensions/default-es6/expected.js b/test/core/fixtures/transformation/es7.export-extensions/default-es6/expected.js index 631c7687bc..cc76180081 100644 --- a/test/core/fixtures/transformation/es7.export-extensions/default-es6/expected.js +++ b/test/core/fixtures/transformation/es7.export-extensions/default-es6/expected.js @@ -1,4 +1,4 @@ "use strict"; -import { foo as _foo } from "bar"; -export { _foo as default }; +import _foo from "bar"; +export { _foo as foo }; diff --git a/test/core/fixtures/transformation/es7.export-extensions/namespace-compound-es6/actual.js b/test/core/fixtures/transformation/es7.export-extensions/namespace-compound-es6/actual.js new file mode 100644 index 0000000000..a7ea4eec36 --- /dev/null +++ b/test/core/fixtures/transformation/es7.export-extensions/namespace-compound-es6/actual.js @@ -0,0 +1 @@ +export v, * as ns from "mod"; diff --git a/test/core/fixtures/transformation/es7.export-extensions/namespace-compound-es6/expected.js b/test/core/fixtures/transformation/es7.export-extensions/namespace-compound-es6/expected.js new file mode 100644 index 0000000000..2b2067baab --- /dev/null +++ b/test/core/fixtures/transformation/es7.export-extensions/namespace-compound-es6/expected.js @@ -0,0 +1,6 @@ +"use strict"; + +import _v from "mod"; +export { _v as v }; +import * as _ns from "mod"; +export { _ns as ns }; diff --git a/test/core/fixtures/transformation/es7.export-extensions/namespace-compound-es6/options.json b/test/core/fixtures/transformation/es7.export-extensions/namespace-compound-es6/options.json new file mode 100644 index 0000000000..896d86d463 --- /dev/null +++ b/test/core/fixtures/transformation/es7.export-extensions/namespace-compound-es6/options.json @@ -0,0 +1,3 @@ +{ + "blacklist": ["es6.modules"] +}