diff --git a/lib/6to5/transformation/transform.js b/lib/6to5/transformation/transform.js index 43f45a3308..de2ce61733 100644 --- a/lib/6to5/transformation/transform.js +++ b/lib/6to5/transformation/transform.js @@ -109,10 +109,9 @@ _.each({ "playground.memoizationOperator": require("./transformers/playground/memoization-operator"), "playground.objectGetterMemoization": require("./transformers/playground/object-getter-memoization"), - react: require("./transformers/other/react"), + react: require("./transformers/other/react"), - // needs to be before `_blockHoist` due to function hoisting etc - "es6.modules": require("./transformers/es6/modules"), + _modulesSplit: require("./transformers/_modules-split"), // needs to be before `regenerator` due to generator comprehensions // needs to be before `_aliasFunction` @@ -164,6 +163,9 @@ _.each({ // needs to be before `es6.modules` due to dynamic imports selfContained: require("./transformers/other/self-contained"), + // needs to be before `_blockHoist` due to function hoisting etc + "es6.modules": require("./transformers/es6/modules"), + _blockHoist: require("./transformers/_block-hoist"), "spec.protoToAssign": require("./transformers/spec/proto-to-assign"), diff --git a/lib/6to5/transformation/transformers/_modules-split.js b/lib/6to5/transformation/transformers/_modules-split.js new file mode 100644 index 0000000000..2fe24a52fc --- /dev/null +++ b/lib/6to5/transformation/transformers/_modules-split.js @@ -0,0 +1,29 @@ +"use strict"; + +var t = require("../../types"); + +exports.ExportDeclaration = function (node, parent, scope, context, file) { + var declar = node.declaration; + + if (node.default) { + if (t.isClassDeclaration(declar)) { + // we need to replace default class declarations with an assignment + // because VariableDeclaration nodes aren't allowed in `export default` + node.declaration = t.assignmentExpression("=", declar.id, t.toExpression(declar)); + + return [ + t.variableDeclaration("let", [ + t.variableDeclarator(declar.id) + ]), + node + ]; + } + } else { + if (t.isFunctionDeclaration(declar)) { + node.declaration = null; + node.specifiers = [t.importSpecifier(declar.id, declar.id)]; + node._blockHoist = 2; + return [declar, node]; + } + } +}; diff --git a/lib/6to5/transformation/transformers/es6/modules.js b/lib/6to5/transformation/transformers/es6/modules.js index 8fd20b0d1f..b893690bc0 100644 --- a/lib/6to5/transformation/transformers/es6/modules.js +++ b/lib/6to5/transformation/transformers/es6/modules.js @@ -23,6 +23,7 @@ exports.ImportDeclaration = function (node, parent, scope, context, file) { exports.ExportDeclaration = function (node, parent, scope, context, file) { var nodes = []; + var i; if (node.declaration) { // make sure variable exports have an initialiser @@ -34,10 +35,16 @@ exports.ExportDeclaration = function (node, parent, scope, context, file) { file.moduleFormatter.exportDeclaration(node, nodes, parent); } else if (node.specifiers) { - for (var i = 0; i < node.specifiers.length; i++) { + for (i = 0; i < node.specifiers.length; i++) { file.moduleFormatter.exportSpecifier(node.specifiers[i], node, nodes, parent); } } + if (node._blockHoist) { + for (i = 0; i < nodes.length; i++) { + nodes[i]._blockHoist = node._blockHoist; + } + } + return nodes; }; diff --git a/lib/6to5/types/index.js b/lib/6to5/types/index.js index 8886e2da0b..08fc175326 100644 --- a/lib/6to5/types/index.js +++ b/lib/6to5/types/index.js @@ -364,6 +364,8 @@ t.toStatement = function (node, ignore) { } else if (t.isFunction(node)) { mustHaveId = true; newType = "FunctionDeclaration"; + } else if (t.isAssignmentExpression(node)) { + return t.expressionStatement(node); } if (mustHaveId && !node.id) { diff --git a/test/fixtures/transformation/es6-block-scoping/exec-switch-break/exec.js b/test/fixtures/transformation/es6-block-scoping/exec-switch-break/exec.js index 46d0adff12..baeaa30410 100644 --- a/test/fixtures/transformation/es6-block-scoping/exec-switch-break/exec.js +++ b/test/fixtures/transformation/es6-block-scoping/exec-switch-break/exec.js @@ -2,9 +2,7 @@ if (true) { const x = 1; switch (x) { case 1: { - function y() { - assert(x, 1); - } + assert(x, 1); break; } } diff --git a/test/fixtures/transformation/es6-modules-amd/exports-default/expected.js b/test/fixtures/transformation/es6-modules-amd/exports-default/expected.js index a97787be5e..ad1d087c92 100644 --- a/test/fixtures/transformation/es6-modules-amd/exports-default/expected.js +++ b/test/fixtures/transformation/es6-modules-amd/exports-default/expected.js @@ -11,7 +11,6 @@ define(["exports", "module"], function (exports, module) { module.exports = function () {}; function foo() {} - var Foo = function Foo() {}; - - module.exports = Foo; + var Foo = undefined; + module.exports = Foo = function Foo() {}; }); diff --git a/test/fixtures/transformation/es6-modules-amd/exports-variable/expected.js b/test/fixtures/transformation/es6-modules-amd/exports-variable/expected.js index 28f00837ad..e8d155830e 100644 --- a/test/fixtures/transformation/es6-modules-amd/exports-variable/expected.js +++ b/test/fixtures/transformation/es6-modules-amd/exports-variable/expected.js @@ -11,8 +11,7 @@ define(["exports"], function (exports) { var foo5 = exports.foo5 = undefined; var foo6 = exports.foo6 = 3; function foo7() {} - var foo8 = function foo8() {}; + var foo8 = exports.foo8 = function foo8() {}; - exports.foo8 = foo8; exports.__esModule = true; -}); \ No newline at end of file +}); diff --git a/test/fixtures/transformation/es6-modules-common/exports-default/expected.js b/test/fixtures/transformation/es6-modules-common/exports-default/expected.js index ef8ba56786..debf3ecc2a 100644 --- a/test/fixtures/transformation/es6-modules-common/exports-default/expected.js +++ b/test/fixtures/transformation/es6-modules-common/exports-default/expected.js @@ -10,6 +10,5 @@ module.exports = function () {}; module.exports = function () {}; function foo() {} -var Foo = function Foo() {}; - -module.exports = Foo; +var Foo = undefined; +module.exports = Foo = function Foo() {}; diff --git a/test/fixtures/transformation/es6-modules-common/exports-variable/expected.js b/test/fixtures/transformation/es6-modules-common/exports-variable/expected.js index 16b6cf7c15..4a196a3ffe 100644 --- a/test/fixtures/transformation/es6-modules-common/exports-variable/expected.js +++ b/test/fixtures/transformation/es6-modules-common/exports-variable/expected.js @@ -10,7 +10,6 @@ var foo4 = exports.foo4 = 2; var foo5 = exports.foo5 = undefined; var foo6 = exports.foo6 = 3; function foo7() {} -var foo8 = function foo8() {}; +var foo8 = exports.foo8 = function foo8() {}; -exports.foo8 = foo8; -exports.__esModule = true; \ No newline at end of file +exports.__esModule = true; diff --git a/test/fixtures/transformation/es6-modules-ignore/exports-default/expected.js b/test/fixtures/transformation/es6-modules-ignore/exports-default/expected.js index 22b082221e..48123f6d9a 100644 --- a/test/fixtures/transformation/es6-modules-ignore/exports-default/expected.js +++ b/test/fixtures/transformation/es6-modules-ignore/exports-default/expected.js @@ -1,4 +1,5 @@ "use strict"; function foo() {} -var Foo = function Foo() {}; +var Foo = undefined; +Foo = function Foo() {}; diff --git a/test/fixtures/transformation/es6-modules-system/exports-default/expected.js b/test/fixtures/transformation/es6-modules-system/exports-default/expected.js index bf1e155301..dc0951aa6c 100644 --- a/test/fixtures/transformation/es6-modules-system/exports-default/expected.js +++ b/test/fixtures/transformation/es6-modules-system/exports-default/expected.js @@ -20,9 +20,8 @@ System.register([], function (_export) { _export("default", function () {}); - Foo = function Foo() {}; - - _export("default", Foo); + Foo = undefined; + _export("default", Foo = function Foo() {}); } }; -}); \ No newline at end of file +}); diff --git a/test/fixtures/transformation/es6-modules-system/exports-variable/expected.js b/test/fixtures/transformation/es6-modules-system/exports-variable/expected.js index 236341d0c4..9483aa2386 100644 --- a/test/fixtures/transformation/es6-modules-system/exports-variable/expected.js +++ b/test/fixtures/transformation/es6-modules-system/exports-variable/expected.js @@ -14,12 +14,9 @@ System.register([], function (_export) { foo4 = _export("foo4", 2); foo5 = _export("foo5", undefined); foo6 = _export("foo6", 3); - foo8 = function foo8() {}; - - _export("foo8", foo8); - + foo8 = _export("foo8", function foo8() {}); _export("foo3", foo3 = 5); exports.__esModule = true; } }; -}); \ No newline at end of file +}); diff --git a/test/fixtures/transformation/es6-modules-umd/exports-default/expected.js b/test/fixtures/transformation/es6-modules-umd/exports-default/expected.js index 384b5e8f43..ee052defc7 100644 --- a/test/fixtures/transformation/es6-modules-umd/exports-default/expected.js +++ b/test/fixtures/transformation/es6-modules-umd/exports-default/expected.js @@ -17,7 +17,6 @@ module.exports = function () {}; function foo() {} - var Foo = function Foo() {}; - - module.exports = Foo; + var Foo = undefined; + module.exports = Foo = function Foo() {}; }); diff --git a/test/fixtures/transformation/es6-modules-umd/exports-variable/expected.js b/test/fixtures/transformation/es6-modules-umd/exports-variable/expected.js index b273713531..b5c8cf6185 100644 --- a/test/fixtures/transformation/es6-modules-umd/exports-variable/expected.js +++ b/test/fixtures/transformation/es6-modules-umd/exports-variable/expected.js @@ -17,8 +17,7 @@ var foo5 = exports.foo5 = undefined; var foo6 = exports.foo6 = 3; function foo7() {} - var foo8 = function foo8() {}; + var foo8 = exports.foo8 = function foo8() {}; - exports.foo8 = foo8; exports.__esModule = true; -}); \ No newline at end of file +}); diff --git a/test/fixtures/transformation/self-contained/full/expected.js b/test/fixtures/transformation/self-contained/full/expected.js index 8d4be1bc22..2d01238c30 100644 --- a/test/fixtures/transformation/self-contained/full/expected.js +++ b/test/fixtures/transformation/self-contained/full/expected.js @@ -1,11 +1,11 @@ "use strict"; -var _to5Helpers = require("6to5-runtime/helpers"); - var _regeneratorRuntime = require("6to5-runtime/regenerator"); var _core = require("6to5-runtime/core-js"); +var _to5Helpers = require("6to5-runtime/helpers"); + var giveWord = _regeneratorRuntime.mark(function giveWord() { return _regeneratorRuntime.wrap(function giveWord$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) {