From 2558a5e12eaa40895d539789b3cf116cdaa89af2 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Tue, 6 Jan 2015 11:48:23 +1100 Subject: [PATCH] better wildcard imports and exports - fixes #224 --- NOTES.md | 3 +++ lib/6to5/file.js | 3 ++- lib/6to5/transformation/modules/_default.js | 6 +++--- .../transformation/templates/exports-wildcard.js | 6 ++++-- .../es6-modules-amd/exports-from/expected.js | 16 +++++++++++++--- .../es6-modules-common/exports-from/expected.js | 16 +++++++++++++--- .../es6-modules-umd/exports-from/expected.js | 16 +++++++++++++--- 7 files changed, 51 insertions(+), 15 deletions(-) create mode 100644 NOTES.md diff --git a/NOTES.md b/NOTES.md new file mode 100644 index 0000000000..c97032fd33 --- /dev/null +++ b/NOTES.md @@ -0,0 +1,3 @@ +# Notes + + * Wildcard exports/imports wont normalise if `export default` is a non-object. diff --git a/lib/6to5/file.js b/lib/6to5/file.js index be2f61a613..3d0bf8b4e3 100644 --- a/lib/6to5/file.js +++ b/lib/6to5/file.js @@ -34,7 +34,8 @@ File.helpers = [ "define-property", "async-to-generator", "interop-require-wildcard", - "typeof" + "typeof", + "exports-wildcard" ]; File.excludeHelpersFromRuntime = [ diff --git a/lib/6to5/transformation/modules/_default.js b/lib/6to5/transformation/modules/_default.js index 7713fff73c..084197352a 100644 --- a/lib/6to5/transformation/modules/_default.js +++ b/lib/6to5/transformation/modules/_default.js @@ -162,9 +162,9 @@ DefaultFormatter.prototype._exportSpecifier = function (getRef, specifier, node, }; DefaultFormatter.prototype._exportsWildcard = function (objectIdentifier) { - return util.template("exports-wildcard", { - OBJECT: objectIdentifier - }, true); + return t.expressionStatement(t.callExpression(this.file.addHelper("exports-wildcard"), [ + t.callExpression(this.file.addHelper("interop-require-wildcard"), [objectIdentifier]) + ])); }; DefaultFormatter.prototype._exportsAssign = function (id, init) { diff --git a/lib/6to5/transformation/templates/exports-wildcard.js b/lib/6to5/transformation/templates/exports-wildcard.js index 26e5b73c7d..fc4db3f90a 100644 --- a/lib/6to5/transformation/templates/exports-wildcard.js +++ b/lib/6to5/transformation/templates/exports-wildcard.js @@ -1,5 +1,7 @@ (function (obj) { for (var i in obj) { - exports[i] = obj[i]; + if (exports[i] !== undefined) { + exports[i] = obj[i]; + } } -})(OBJECT); +}) diff --git a/test/fixtures/transformation/es6-modules-amd/exports-from/expected.js b/test/fixtures/transformation/es6-modules-amd/exports-from/expected.js index 7483137265..7faee68424 100644 --- a/test/fixtures/transformation/es6-modules-amd/exports-from/expected.js +++ b/test/fixtures/transformation/es6-modules-amd/exports-from/expected.js @@ -5,11 +5,21 @@ define(["exports", "foo"], function (exports, _foo) { return obj && (obj["default"] || obj); }; - (function (obj) { + var _interopRequireWildcard = function (obj) { + return obj && obj.constructor === Object ? obj : { + "default": obj + }; + }; + + var _exportsWildcard = function (obj) { for (var i in obj) { - exports[i] = obj[i]; + if (exports[i] !== undefined) { + exports[i] = obj[i]; + } } - })(_foo); + }; + + _exportsWildcard(_interopRequireWildcard(_foo)); exports.foo = _interopRequire(_foo); exports.foo = _interopRequire(_foo); diff --git a/test/fixtures/transformation/es6-modules-common/exports-from/expected.js b/test/fixtures/transformation/es6-modules-common/exports-from/expected.js index 23274cc873..1107502014 100644 --- a/test/fixtures/transformation/es6-modules-common/exports-from/expected.js +++ b/test/fixtures/transformation/es6-modules-common/exports-from/expected.js @@ -4,11 +4,21 @@ var _interopRequire = function (obj) { return obj && (obj["default"] || obj); }; -(function (obj) { +var _interopRequireWildcard = function (obj) { + return obj && obj.constructor === Object ? obj : { + "default": obj + }; +}; + +var _exportsWildcard = function (obj) { for (var i in obj) { - exports[i] = obj[i]; + if (exports[i] !== undefined) { + exports[i] = obj[i]; + } } -})(require("foo")); +}; + +_exportsWildcard(_interopRequireWildcard(require("foo"))); exports.foo = _interopRequire(require("foo")); exports.foo = _interopRequire(require("foo")); diff --git a/test/fixtures/transformation/es6-modules-umd/exports-from/expected.js b/test/fixtures/transformation/es6-modules-umd/exports-from/expected.js index 70af3ecb6f..9575b15b17 100644 --- a/test/fixtures/transformation/es6-modules-umd/exports-from/expected.js +++ b/test/fixtures/transformation/es6-modules-umd/exports-from/expected.js @@ -11,11 +11,21 @@ return obj && (obj["default"] || obj); }; - (function (obj) { + var _interopRequireWildcard = function (obj) { + return obj && obj.constructor === Object ? obj : { + "default": obj + }; + }; + + var _exportsWildcard = function (obj) { for (var i in obj) { - exports[i] = obj[i]; + if (exports[i] !== undefined) { + exports[i] = obj[i]; + } } - })(_foo); + }; + + _exportsWildcard(_interopRequireWildcard(_foo)); exports.foo = _interopRequire(_foo); exports.foo = _interopRequire(_foo);