diff --git a/lib/6to5/templates/interop-require.js b/lib/6to5/templates/interop-require.js new file mode 100644 index 0000000000..b48ee8c30e --- /dev/null +++ b/lib/6to5/templates/interop-require.js @@ -0,0 +1,3 @@ +(function (obj) { + return obj && (obj["default"] || obj); +}) diff --git a/lib/6to5/transformation/modules/common-interop.js b/lib/6to5/transformation/modules/common-interop.js new file mode 100644 index 0000000000..97d64e828d --- /dev/null +++ b/lib/6to5/transformation/modules/common-interop.js @@ -0,0 +1,29 @@ +module.exports = CommonJSInteropFormatter; + +var CommonJSFormatter = require("./common"); +var util = require("../../util"); +var t = require("../../types"); + +function CommonJSInteropFormatter(file) { + this.file = file; +} + +util.inherits(CommonJSInteropFormatter, CommonJSFormatter); + +CommonJSInteropFormatter.prototype.importSpecifier = function (specifier, node, nodes) { + var variableName = t.getSpecifierName(specifier); + + // import foo from "foo"; + if (specifier.default) { + nodes.push(t.variableDeclaration("var", [ + t.variableDeclarator(variableName, + t.callExpression(this.file.addDeclaration("interop-require"), [util.template("require", { + MODULE_NAME: node.source.raw + })]) + ) + ])); + return; + } + + CommonJSFormatter.prototype.importSpecifier.apply(this, arguments); +}; diff --git a/lib/6to5/transformation/modules/common_interop.js b/lib/6to5/transformation/modules/common_interop.js deleted file mode 100644 index 3984b90bf2..0000000000 --- a/lib/6to5/transformation/modules/common_interop.js +++ /dev/null @@ -1,157 +0,0 @@ -module.exports = CommonJSInteropFormatter; - -var util = require("../../util"); -var t = require("../../types"); - -function CommonJSInteropFormatter(file) { - this.file = file; -} - -CommonJSInteropFormatter.prototype.import = function (node, nodes) { - // import "foo"; - nodes.push(util.template("require", { - //inherits: node, - - MODULE_NAME: node.source.raw - }, true)); -}; - -CommonJSInteropFormatter.prototype.importSpecifier = function (specifier, node, nodes) { - var variableName = t.getSpecifierName(specifier); -//console.log("HI") - // import foo from "foo"; - if (specifier.default) { - // var m_foo = require("foo"), foo = m_foo && (m_foo["default"] || m_foo); - var tmpId = util.getUid(t.identifier(variableName), this.file); - nodes.push( - t.variableDeclaration('var', [ - t.variableDeclarator(tmpId, - t.callExpression(t.identifier("require"), [node.source]) - ), - t.variableDeclarator(variableName, - t.binaryExpression( - "&&", - tmpId, - t.binaryExpression( - "||", - t.memberExpression( - tmpId, - t.identifier("default"), - true - ), - tmpId - ) - ) - ) - ]) - ); - return; - } - - var templateName = "require-assign"; - - // import * as bar from "foo"; - if (specifier.type !== "ImportBatchSpecifier") templateName += "-key"; - - nodes.push(util.template(templateName, { - //inherits: node.specifiers.length === 1 && node, - - VARIABLE_NAME: variableName, - MODULE_NAME: node.source.raw, - KEY: specifier.id - })); -}; - -CommonJSInteropFormatter.prototype.export = function (node, nodes) { - var declar = node.declaration; - - if (node.default) { - var ref = declar; - - if (t.isClass(ref) || t.isFunction(ref)) { - if (ref.id) { - nodes.push(t.toStatement(ref)); - ref = ref.id; - } - } - - nodes.push(util.template("exports-default", { - //inherits: node, - - VALUE: ref - }, true)); - } else { - var assign; - - if (t.isVariableDeclaration(declar)) { - var decl = declar.declarations[0]; - - if (decl.init) { - decl.init = util.template("exports-assign", { - //inherits: node, - - VALUE: decl.init, - KEY: decl.id - }); - } - - nodes.push(declar); - } else { - assign = util.template("exports-assign", { - //inherits: node, - - VALUE: declar.id, - KEY: declar.id - }, true); - - nodes.push(t.toStatement(declar)); - nodes.push(assign); - - if (t.isFunctionDeclaration(declar)) { - assign._blockHoist = true; - } - } - } -}; - -CommonJSInteropFormatter.prototype._exportSpecifier = function (getRef, specifier, node, nodes) { - var variableName = t.getSpecifierName(specifier); - - var inherits = false; - if (node.specifiers.length === 1) inherits = node; - - if (node.source) { - if (t.isExportBatchSpecifier(specifier)) { - // export * from "foo"; - nodes.push(util.template("exports-wildcard", { - //inherits: inherits, - - OBJECT: getRef() - }, true)); - } else { - // export { foo } from "test"; - nodes.push(util.template("exports-assign-key", { - //inherits: inherits, - - VARIABLE_NAME: variableName.name, - OBJECT: getRef(), - KEY: specifier.id - }, true)); - } - } else { - // export { foo }; - nodes.push(util.template("exports-assign", { - //inherits: inherits, - - VALUE: specifier.id, - KEY: variableName - }, true)); - } -}; - -CommonJSInteropFormatter.prototype.exportSpecifier = function (specifier, node, nodes) { - return this._exportSpecifier(function () { - return t.callExpression(t.identifier("require"), [node.source]); - }, specifier, node, nodes); -}; - diff --git a/lib/6to5/transformation/transform.js b/lib/6to5/transformation/transform.js index a7646beea3..a0ba465c72 100644 --- a/lib/6to5/transformation/transform.js +++ b/lib/6to5/transformation/transform.js @@ -21,7 +21,7 @@ transform.transformers = {}; transform.moduleFormatters = { common: require("./modules/common"), - commoninterop: require("./modules/common_interop"), + commonInterop: require("./modules/common-interop"), ignore: require("./modules/ignore"), amd: require("./modules/amd"), umd: require("./modules/umd") diff --git a/test/fixtures/transformation/modules-common-interop/exports-default/actual.js b/test/fixtures/transformation/modules-common-interop/exports-default/actual.js new file mode 100644 index 0000000000..62923e5c15 --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/exports-default/actual.js @@ -0,0 +1,8 @@ +export default 42; +export default {}; +export default []; +export default foo; +export default function () {} +export default class {} +export default function foo () {} +export default class Foo {} diff --git a/test/fixtures/transformation/modules-common-interop/exports-default/expected.js b/test/fixtures/transformation/modules-common-interop/exports-default/expected.js new file mode 100644 index 0000000000..9a3b8194a0 --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/exports-default/expected.js @@ -0,0 +1,13 @@ +"use strict"; + +exports["default"] = 42; +exports["default"] = {}; +exports["default"] = []; +exports["default"] = foo; +exports["default"] = function () {}; +exports["default"] = function () {}; +function foo() {} +exports["default"] = foo; +var Foo = function Foo() {}; + +exports["default"] = Foo; diff --git a/test/fixtures/transformation/modules-common-interop/exports-from/actual.js b/test/fixtures/transformation/modules-common-interop/exports-from/actual.js new file mode 100644 index 0000000000..60857f6542 --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/exports-from/actual.js @@ -0,0 +1,6 @@ +export * from "foo"; +export {foo} from "foo"; +export {foo, bar} from "foo"; +export {foo as bar} from "foo"; +export {foo as default} from "foo"; +export {foo as default, bar} from "foo"; diff --git a/test/fixtures/transformation/modules-common-interop/exports-from/expected.js b/test/fixtures/transformation/modules-common-interop/exports-from/expected.js new file mode 100644 index 0000000000..feaeac94ee --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/exports-from/expected.js @@ -0,0 +1,15 @@ +"use strict"; + +(function (obj) { + for (var i in obj) { + exports[i] = obj[i]; + } +})(require("foo")); + +exports.foo = require("foo").foo; +exports.foo = require("foo").foo; +exports.bar = require("foo").bar; +exports.bar = require("foo").foo; +exports["default"] = require("foo").foo; +exports["default"] = require("foo").foo; +exports.bar = require("foo").bar; diff --git a/test/fixtures/transformation/modules-common-interop/exports-named/actual.js b/test/fixtures/transformation/modules-common-interop/exports-named/actual.js new file mode 100644 index 0000000000..8515ace759 --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/exports-named/actual.js @@ -0,0 +1,5 @@ +export {foo}; +export {foo, bar}; +export {foo as bar}; +export {foo as default}; +export {foo as default, bar}; diff --git a/test/fixtures/transformation/modules-common-interop/exports-named/expected.js b/test/fixtures/transformation/modules-common-interop/exports-named/expected.js new file mode 100644 index 0000000000..ce378a6fb0 --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/exports-named/expected.js @@ -0,0 +1,9 @@ +"use strict"; + +exports.foo = foo; +exports.foo = foo; +exports.bar = bar; +exports.bar = foo; +exports["default"] = foo; +exports["default"] = foo; +exports.bar = bar; diff --git a/test/fixtures/transformation/modules-common-interop/exports-variable/actual.js b/test/fixtures/transformation/modules-common-interop/exports-variable/actual.js new file mode 100644 index 0000000000..b4629cc731 --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/exports-variable/actual.js @@ -0,0 +1,8 @@ +export var foo = 1; +export var foo2 = function () {}; +export var foo3; +export let foo4 = 2; +export let foo5; +export const foo6 = 3; +export function foo7 () {} +export class foo8 {} diff --git a/test/fixtures/transformation/modules-common-interop/exports-variable/expected.js b/test/fixtures/transformation/modules-common-interop/exports-variable/expected.js new file mode 100644 index 0000000000..886cf61824 --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/exports-variable/expected.js @@ -0,0 +1,13 @@ +"use strict"; + +exports.foo7 = foo7; +var foo = exports.foo = 1; +var foo2 = exports.foo2 = function () {}; +var foo3; +var foo4 = exports.foo4 = 2; +var foo5; +var foo6 = exports.foo6 = 3; +function foo7() {} +var foo8 = function foo8() {}; + +exports.foo8 = foo8; diff --git a/test/fixtures/transformation/modules-common-interop/hoist-function-exports/actual.js b/test/fixtures/transformation/modules-common-interop/hoist-function-exports/actual.js new file mode 100644 index 0000000000..3c40b7d1c1 --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/hoist-function-exports/actual.js @@ -0,0 +1,11 @@ +import { isEven } from "./evens"; + +export function nextOdd(n) { + return isEven(n) ? n + 1 : n + 2; +} + +export var isOdd = (function (isEven) { + return function (n) { + return !isEven(n); + }; +})(isEven); diff --git a/test/fixtures/transformation/modules-common-interop/hoist-function-exports/expected.js b/test/fixtures/transformation/modules-common-interop/hoist-function-exports/expected.js new file mode 100644 index 0000000000..5a074e1496 --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/hoist-function-exports/expected.js @@ -0,0 +1,13 @@ +"use strict"; + +exports.nextOdd = nextOdd; +var isEven = require("./evens").isEven; +function nextOdd(n) { + return isEven(n) ? n + 1 : n + 2; +} + +var isOdd = exports.isOdd = (function (isEven) { + return function (n) { + return !isEven(n); + }; +})(isEven); diff --git a/test/fixtures/transformation/modules-common-interop/imports-default/actual.js b/test/fixtures/transformation/modules-common-interop/imports-default/actual.js new file mode 100644 index 0000000000..e67418654c --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/imports-default/actual.js @@ -0,0 +1,2 @@ +import foo from "foo"; +import {default as foo} from "foo"; diff --git a/test/fixtures/transformation/modules-common-interop/imports-default/expected.js b/test/fixtures/transformation/modules-common-interop/imports-default/expected.js new file mode 100644 index 0000000000..a93b2668f9 --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/imports-default/expected.js @@ -0,0 +1,9 @@ +"use strict"; + +var _interopRequire = function (obj) { + return obj && (obj["default"] || obj); +}; + +var foo = _interopRequire(require("foo")); + +var foo = require("foo")["default"]; diff --git a/test/fixtures/transformation/modules-common-interop/imports-glob/actual.js b/test/fixtures/transformation/modules-common-interop/imports-glob/actual.js new file mode 100644 index 0000000000..e55c077500 --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/imports-glob/actual.js @@ -0,0 +1 @@ +import * as foo from "foo"; diff --git a/test/fixtures/transformation/modules-common-interop/imports-glob/expected.js b/test/fixtures/transformation/modules-common-interop/imports-glob/expected.js new file mode 100644 index 0000000000..e8c2d94a6a --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/imports-glob/expected.js @@ -0,0 +1,3 @@ +"use strict"; + +var foo = require("foo"); \ No newline at end of file diff --git a/test/fixtures/transformation/modules-common-interop/imports-mixing/actual.js b/test/fixtures/transformation/modules-common-interop/imports-mixing/actual.js new file mode 100644 index 0000000000..ef78c95b1c --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/imports-mixing/actual.js @@ -0,0 +1 @@ +import foo, {baz as xyz} from "foo"; diff --git a/test/fixtures/transformation/modules-common-interop/imports-mixing/expected.js b/test/fixtures/transformation/modules-common-interop/imports-mixing/expected.js new file mode 100644 index 0000000000..09ea4cec86 --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/imports-mixing/expected.js @@ -0,0 +1,9 @@ +"use strict"; + +var _interopRequire = function (obj) { + return obj && (obj["default"] || obj); +}; + +var foo = _interopRequire(require("foo")); + +var xyz = require("foo").baz; diff --git a/test/fixtures/transformation/modules-common-interop/imports-named/actual.js b/test/fixtures/transformation/modules-common-interop/imports-named/actual.js new file mode 100644 index 0000000000..83a766c62d --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/imports-named/actual.js @@ -0,0 +1,4 @@ +import {bar} from "foo"; +import {bar, baz} from "foo"; +import {bar as baz} from "foo"; +import {bar as baz, xyz} from "foo"; diff --git a/test/fixtures/transformation/modules-common-interop/imports-named/expected.js b/test/fixtures/transformation/modules-common-interop/imports-named/expected.js new file mode 100644 index 0000000000..ed81790165 --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/imports-named/expected.js @@ -0,0 +1,8 @@ +"use strict"; + +var bar = require("foo").bar; +var bar = require("foo").bar; +var baz = require("foo").baz; +var baz = require("foo").bar; +var baz = require("foo").bar; +var xyz = require("foo").xyz; \ No newline at end of file diff --git a/test/fixtures/transformation/modules-common-interop/imports/actual.js b/test/fixtures/transformation/modules-common-interop/imports/actual.js new file mode 100644 index 0000000000..222b6885ac --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/imports/actual.js @@ -0,0 +1,3 @@ +import "foo"; +import "foo-bar"; +import "./directory/foo-bar"; diff --git a/test/fixtures/transformation/modules-common-interop/imports/expected.js b/test/fixtures/transformation/modules-common-interop/imports/expected.js new file mode 100644 index 0000000000..f1a139f51a --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/imports/expected.js @@ -0,0 +1,7 @@ +"use strict"; + +require("foo"); + +require("foo-bar"); + +require("./directory/foo-bar"); diff --git a/test/fixtures/transformation/modules-common-interop/options.json b/test/fixtures/transformation/modules-common-interop/options.json new file mode 100644 index 0000000000..d5e2792eed --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/options.json @@ -0,0 +1,3 @@ +{ + "modules": "commonInterop" +} diff --git a/test/fixtures/transformation/modules-common-interop/overview/actual.js b/test/fixtures/transformation/modules-common-interop/overview/actual.js new file mode 100644 index 0000000000..a77d4d5dfa --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/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/transformation/modules-common-interop/overview/expected.js b/test/fixtures/transformation/modules-common-interop/overview/expected.js new file mode 100644 index 0000000000..208d3a3d3b --- /dev/null +++ b/test/fixtures/transformation/modules-common-interop/overview/expected.js @@ -0,0 +1,22 @@ +"use strict"; + +var _interopRequire = function (obj) { + return obj && (obj["default"] || obj); +}; + +require("foo"); + +require("foo-bar"); + +require("./directory/foo-bar"); + +var foo = _interopRequire(require("foo")); + +var foo = require("foo"); + +var bar = require("foo").bar; +var bar = require("foo").foo; +exports.test = test; +var test = exports.test = 5; + +exports["default"] = test;