diff --git a/README.md b/README.md index 48e6d301ff..220188bc15 100644 --- a/README.md +++ b/README.md @@ -195,22 +195,23 @@ And open `test/browser/index.html` if it doesn't open automatically. ## Modules 6to5 modules compile straight to CommonJS, because of this various liberties are -taken into account to easen their usage. +taken into account to make their usage easier. ```javascript -import "foo"; // var foo = require("foo"); -import "foo-bar"; // var fooBar = require("foo-bar"); -import "./directory/foo-bar"; // var fooBar = require("./directory/foo-bar"); -import foo from "foo"; // var foo = require("foo"); +import "foo"; // require("foo"); +import "foo-bar"; // require("foo-bar"); +import "./directory/foo-bar"; // require("./directory/foo-bar"); + +import foo from "foo"; // var foo = require("foo").default; import * as foo from "foo"; // var foo = require("foo"); -import { bar } from "foo"; // var bar = require("foo").bar; -import foo as bar from "foo"; // var bar = require("foo").foo; +import {bar} from "foo"; // var bar = require("foo").bar; +import {foo as bar} from "foo"; // var bar = require("foo").foo; -export { test }; // exports.test = test; +export {test}; // exports.test = test; export var test = 5; // var test = 5; exports.test = test; -export default test; // module.exports = exports = test; +export default test; // exports.default = test; ``` If you'd like to disable this behaviour and use the more ES6-like diff --git a/lib/6to5/templates/exports-default.js b/lib/6to5/templates/exports-default.js index 292914e254..a34c07f7dc 100644 --- a/lib/6to5/templates/exports-default.js +++ b/lib/6to5/templates/exports-default.js @@ -1 +1 @@ -module.exports = exports = VALUE; +exports.default = VALUE; diff --git a/lib/6to5/templates/require.js b/lib/6to5/templates/require.js new file mode 100644 index 0000000000..9bfd3652a4 --- /dev/null +++ b/lib/6to5/templates/require.js @@ -0,0 +1 @@ +require(MODULE_NAME); diff --git a/lib/6to5/transformers/modules.js b/lib/6to5/transformers/modules.js index 0511e3490c..4588245bb4 100644 --- a/lib/6to5/transformers/modules.js +++ b/lib/6to5/transformers/modules.js @@ -3,13 +3,6 @@ var util = require("../util"); var b = require("ast-types").builders; var _ = require("lodash"); -var toModuleNameIdentifier = function (node) { - var id = node.source.value; - id = path.basename(id, path.extname(id)); - id = util.camelCase(id); - return b.identifier(id); -}; - exports.ImportDeclaration = function (node) { var nodes = []; @@ -18,11 +11,16 @@ exports.ImportDeclaration = function (node) { var variableName = specifier.name || specifier.id; var key = specifier.id.name; - var templateName = "require-assign"; - if (specifier.type === "ImportSpecifier") { - if (key !== "default") templateName += "-key"; + // import foo from "foo"; + if (specifier.type === "ImportDefaultSpecifier") { + key = b.identifier("default"); } + var templateName = "require-assign"; + + // import * as bar from "foo"; + if (specifier.type !== "ImportNamespaceSpecifier") templateName += "-key"; + nodes.push(util.template(templateName, { VARIABLE_NAME: variableName.name, MODULE_NAME: node.source.raw, @@ -30,16 +28,15 @@ exports.ImportDeclaration = function (node) { })); }); } else { - nodes.push(util.template("require-assign", { - VARIABLE_NAME: toModuleNameIdentifier(node), - MODULE_NAME: node.source.raw - })); + nodes.push(util.template("require", { + MODULE_NAME: node.source.raw + }, true)); } return nodes; }; -var pushSpecifiers = function (node, nodes) { +var pushExportSpecifiers = function (node, nodes) { _.each(node.specifiers, function (specifier) { var variableName = specifier.name || specifier.id; @@ -49,38 +46,22 @@ var pushSpecifiers = function (node, nodes) { MODULE_NAME: node.source.raw }, true)); } else { - var templateName; - - if (variableName.name === "default") { - templateName = "exports-default-require"; - } else { - templateName = "exports-require-assign"; - } - - if (specifier.id.name !== "default") templateName += "-key"; - - nodes.push(util.template(templateName, { + nodes.push(util.template("exports-require-assign-key", { VARIABLE_NAME: variableName.name, MODULE_NAME: node.source.raw, KEY: specifier.id }, true)); } } else { - if (variableName.name === "default") { - nodes.push(util.template("exports-default", { - VALUE: specifier.id - }, true)); - } else { - nodes.push(util.template("exports-assign", { - VALUE: specifier.id, - KEY: variableName - }, true)); - } + nodes.push(util.template("exports-assign", { + VALUE: specifier.id, + KEY: variableName + }, true)); } }); }; -var pushDeclaration = function (node, nodes) { +var pushExportDeclaration = function (node, nodes) { var declar = node.declaration; if (node.default) { @@ -111,9 +92,9 @@ exports.ExportDeclaration = function (node) { var nodes = []; if (node.declaration) { - pushDeclaration(node, nodes); + pushExportDeclaration(node, nodes); } else { - pushSpecifiers(node, nodes); + pushExportSpecifiers(node, nodes); } return nodes; diff --git a/package.json b/package.json index 6ec59963e3..ea18667415 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "6to5", "description": "Turn ES6 code into vanilla ES5 with source maps and no runtime", - "version": "1.5.5", + "version": "1.6.0", "author": "Sebastian McKenzie ", "homepage": "https://github.com/sebmck/6to5", "repository": { diff --git a/test/fixtures/modules/exports-default/expected.js b/test/fixtures/modules/exports-default/expected.js index 0e03dc1f79..f8eebce331 100644 --- a/test/fixtures/modules/exports-default/expected.js +++ b/test/fixtures/modules/exports-default/expected.js @@ -1,21 +1,21 @@ -module.exports = exports = 42; -module.exports = exports = {}; +exports.default = 42; +exports.default = {}; -module.exports = exports = []; +exports.default = []; -module.exports = exports = foo; +exports.default = foo; -module.exports = exports = function () {} +exports.default = function () {} -module.exports = exports = function () { +exports.default = function () { function Anonymous() { } return Anonymous; }(); -module.exports = exports = function foo () {} +exports.default = function foo () {} -module.exports = exports = function () { +exports.default = function () { function foo() { } return foo; diff --git a/test/fixtures/modules/exports-from/expected.js b/test/fixtures/modules/exports-from/expected.js index c80d8d41f8..987dbc3c62 100644 --- a/test/fixtures/modules/exports-from/expected.js +++ b/test/fixtures/modules/exports-from/expected.js @@ -11,12 +11,12 @@ exports.bar = require("foo").bar; exports.bar = require("foo").foo; -module.exports = exports = require("foo").foo; +exports.default = require("foo").foo; -module.exports = exports = require("foo").foo; +exports.default = require("foo").foo; exports.bar = require("foo").bar; -module.exports = exports = require("foo"); +exports.default = require("foo").default; -exports.foo = require("foo"); +exports.foo = require("foo").default; diff --git a/test/fixtures/modules/exports-named/expected.js b/test/fixtures/modules/exports-named/expected.js index ce4f7004a9..450777f614 100644 --- a/test/fixtures/modules/exports-named/expected.js +++ b/test/fixtures/modules/exports-named/expected.js @@ -5,7 +5,7 @@ exports.bar = bar; exports.bar = foo; -module.exports = exports = foo; +exports.default = foo; -module.exports = exports = foo; +exports.default = foo; exports.bar = bar; diff --git a/test/fixtures/modules/imports-default/expected.js b/test/fixtures/modules/imports-default/expected.js index 3cfe015496..bf0f3df3c3 100644 --- a/test/fixtures/modules/imports-default/expected.js +++ b/test/fixtures/modules/imports-default/expected.js @@ -1,2 +1,2 @@ -var foo = require("foo"); -var foo = require("foo"); +var foo = require("foo").default; +var foo = require("foo").default; diff --git a/test/fixtures/modules/imports-mixing/expected.js b/test/fixtures/modules/imports-mixing/expected.js index 410ce210b9..ebdcdfd0d3 100644 --- a/test/fixtures/modules/imports-mixing/expected.js +++ b/test/fixtures/modules/imports-mixing/expected.js @@ -1,5 +1,5 @@ -var foo = require("foo"); +var foo = require("foo").default; var xyz = require("foo").baz; -var foo = require("foo"); +var foo = require("foo").default; var bar = require("foo"); diff --git a/test/fixtures/modules/imports/expected.js b/test/fixtures/modules/imports/expected.js index 2538c17c74..7c26058f1f 100644 --- a/test/fixtures/modules/imports/expected.js +++ b/test/fixtures/modules/imports/expected.js @@ -1,3 +1,3 @@ -var foo = require("foo"); -var fooBar = require("foo-bar"); -var fooBar = require("./directory/foo-bar"); +require("foo"); +require("foo-bar"); +require("./directory/foo-bar"); diff --git a/test/fixtures/modules/overview/actual.js b/test/fixtures/modules/overview/actual.js new file mode 100644 index 0000000000..a77d4d5dfa --- /dev/null +++ b/test/fixtures/modules/overview/actual.js @@ -0,0 +1,12 @@ +import "foo"; +import "foo-bar"; +import "./directory/foo-bar"; +import foo from "foo"; +import * as foo from "foo"; +import {bar} from "foo"; +import {foo as bar} from "foo"; + +export {test}; +export var test = 5; + +export default test; diff --git a/test/fixtures/modules/overview/expected.js b/test/fixtures/modules/overview/expected.js new file mode 100644 index 0000000000..371e2c45e9 --- /dev/null +++ b/test/fixtures/modules/overview/expected.js @@ -0,0 +1,20 @@ +require("foo"); + +require("foo-bar"); + +require("./directory/foo-bar"); + +var foo = require("foo").default; + +var foo = require("foo"); + +var bar = require("foo").bar; + +var bar = require("foo").foo; + +exports.test = test; + +var test = 5; +exports.test = test; + +exports.default = test;