From 76573093bdf92c80d2fdf6ec55effc6e8c32848e Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Wed, 1 Apr 2015 23:02:03 +1100 Subject: [PATCH] add umd globals export - fixes #375 --- src/babel/transformation/modules/_default.js | 7 ++++--- src/babel/transformation/modules/amd.js | 5 +++++ src/babel/transformation/modules/umd.js | 19 ++++++++++++++----- .../templates/umd-commonjs-strict.js | 2 +- .../templates/umd-runner-body.js | 6 +++++- .../exports-default/expected.js | 10 ++++++++-- .../es6.modules-umd/exports-from/expected.js | 12 +++++++++--- .../es6.modules-umd/exports-named/expected.js | 12 +++++++++--- .../exports-variable/expected.js | 10 ++++++++-- .../get-module-name-option/expected.js | 12 +++++++++--- .../hoist-function-exports/expected.js | 12 +++++++++--- .../imports-default/expected.js | 12 +++++++++--- .../es6.modules-umd/imports-glob/expected.js | 12 +++++++++--- .../imports-mixing/expected.js | 12 +++++++++--- .../es6.modules-umd/imports-named/expected.js | 12 +++++++++--- .../es6.modules-umd/imports/expected.js | 12 +++++++++--- .../es6.modules-umd/module-name/expected.js | 10 ++++++++-- .../es6.modules-umd/overview/expected.js | 12 +++++++++--- .../es6.modules-umd/remap/expected.js | 12 +++++++++--- .../runtime/modules-umd/expected.js | 12 +++++++++--- 20 files changed, 161 insertions(+), 52 deletions(-) diff --git a/src/babel/transformation/modules/_default.js b/src/babel/transformation/modules/_default.js index b383b638a5..ec465d2f38 100644 --- a/src/babel/transformation/modules/_default.js +++ b/src/babel/transformation/modules/_default.js @@ -78,9 +78,10 @@ var exportsVisitor = traverse.explode({ export default class DefaultFormatter { constructor(file) { - this.scope = file.scope; - this.file = file; - this.ids = object(); + this.defaultIds = object(); + this.scope = file.scope; + this.file = file; + this.ids = object(); this.hasNonDefaultExports = false; diff --git a/src/babel/transformation/modules/amd.js b/src/babel/transformation/modules/amd.js index 69192815ff..d25218a568 100644 --- a/src/babel/transformation/modules/amd.js +++ b/src/babel/transformation/modules/amd.js @@ -69,8 +69,13 @@ export default class AMDFormatter extends DefaultFormatter { } importSpecifier(specifier, node, nodes) { + var key = node.source.value; var ref = this.getExternalReference(node); + if (t.isImportNamespaceSpecifier(specifier) || t.isImportDefaultSpecifier(specifier)) { + this.defaultIds[key] = specifier.local; + } + if (includes(this.file.dynamicImportedNoDefault, node)) { // Prevent unnecessary renaming of dynamic imports. this.ids[node.source.value] = ref; diff --git a/src/babel/transformation/modules/umd.js b/src/babel/transformation/modules/umd.js index d932dece37..a0c1d81ada 100644 --- a/src/babel/transformation/modules/umd.js +++ b/src/babel/transformation/modules/umd.js @@ -10,7 +10,7 @@ export default class UMDFormatter extends AMDFormatter { // build an array of module names var names = []; - for (var name in this.ids) { + for (let name in this.ids) { names.push(t.literal(name)); } @@ -44,7 +44,13 @@ export default class UMDFormatter extends AMDFormatter { // globals - //var umdArgs = []; + var browserArgs = [t.memberExpression(t.identifier("module"), t.identifier("exports"))]; + if (this.passModuleArg) browserArgs.push(t.identifier("module")); + + for (let name in this.ids) { + var id = this.defaultIds[name] || t.identifier(t.toIdentifier(name)); + browserArgs.push(t.memberExpression(t.identifier("global"), id)); + } // @@ -54,12 +60,15 @@ export default class UMDFormatter extends AMDFormatter { var runner = util.template("umd-runner-body", { AMD_ARGUMENTS: defineArgs, COMMON_TEST: commonTests, - COMMON_ARGUMENTS: commonArgs + COMMON_ARGUMENTS: commonArgs, + BROWSER_ARGUMENTS: browserArgs, + GLOBAL_ARG: t.identifier(t.toIdentifier(this.file.opts.basename)) }); // - var call = t.callExpression(runner, [factory]); - program.body = [t.expressionStatement(call)]; + program.body = [t.expressionStatement( + t.callExpression(runner, [t.thisExpression(), factory]) + )]; } } diff --git a/src/babel/transformation/templates/umd-commonjs-strict.js b/src/babel/transformation/templates/umd-commonjs-strict.js index bd38d1e96b..91c52cc3c2 100644 --- a/src/babel/transformation/templates/umd-commonjs-strict.js +++ b/src/babel/transformation/templates/umd-commonjs-strict.js @@ -1,7 +1,7 @@ (function (root, factory) { if (typeof define === "function" && define.amd) { define(AMD_ARGUMENTS, factory); - } else if (typeof exports === 'object') { + } else if (typeof exports === "object") { factory(COMMON_ARGUMENTS); } else { factory(BROWSER_ARGUMENTS); diff --git a/src/babel/transformation/templates/umd-runner-body.js b/src/babel/transformation/templates/umd-runner-body.js index 725995b904..fb896d3253 100644 --- a/src/babel/transformation/templates/umd-runner-body.js +++ b/src/babel/transformation/templates/umd-runner-body.js @@ -1,7 +1,11 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define(AMD_ARGUMENTS, factory); } else if (COMMON_TEST) { factory(COMMON_ARGUMENTS); + } else { + var module = { exports: {} }; + factory(BROWSER_ARGUMENTS); + global.GLOBAL_ARG = module.exports; } }); diff --git a/test/core/fixtures/transformation/es6.modules-umd/exports-default/expected.js b/test/core/fixtures/transformation/es6.modules-umd/exports-default/expected.js index f861e51989..7fe1729f28 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/exports-default/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/exports-default/expected.js @@ -1,10 +1,16 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports", "module"], factory); } else if (typeof exports !== "undefined" && typeof module !== "undefined") { factory(exports, module); + } else { + var module = { + exports: {} + }; + factory(module.exports, module); + global.actual = module.exports; } -})(function (exports, module) { +})(this, function (exports, module) { "use strict"; var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; diff --git a/test/core/fixtures/transformation/es6.modules-umd/exports-from/expected.js b/test/core/fixtures/transformation/es6.modules-umd/exports-from/expected.js index a30d9902fd..c29bec31aa 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/exports-from/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/exports-from/expected.js @@ -1,10 +1,16 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports", "foo"], factory); } else if (typeof exports !== "undefined") { factory(exports, require("foo")); + } else { + var module = { + exports: {} + }; + factory(module.exports, global.foo); + global.actual = module.exports; } -})(function (exports, _foo) { +})(this, function (exports, _foo) { "use strict"; var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; }; @@ -24,4 +30,4 @@ exports["default"] = _foo.foo; exports["default"] = _foo.foo; exports.bar = _foo.bar; -}); \ No newline at end of file +}); diff --git a/test/core/fixtures/transformation/es6.modules-umd/exports-named/expected.js b/test/core/fixtures/transformation/es6.modules-umd/exports-named/expected.js index 71839235df..a34c42de0e 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/exports-named/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/exports-named/expected.js @@ -1,10 +1,16 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports"], factory); } else if (typeof exports !== "undefined") { factory(exports); + } else { + var module = { + exports: {} + }; + factory(module.exports); + global.actual = module.exports; } -})(function (exports) { +})(this, function (exports) { "use strict"; Object.defineProperty(exports, "__esModule", { @@ -17,4 +23,4 @@ exports["default"] = foo; exports["default"] = foo; exports.bar = bar; -}); \ No newline at end of file +}); diff --git a/test/core/fixtures/transformation/es6.modules-umd/exports-variable/expected.js b/test/core/fixtures/transformation/es6.modules-umd/exports-variable/expected.js index 0f1a05c14d..07a8e84353 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/exports-variable/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/exports-variable/expected.js @@ -1,10 +1,16 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports"], factory); } else if (typeof exports !== "undefined") { factory(exports); + } else { + var module = { + exports: {} + }; + factory(module.exports); + global.actual = module.exports; } -})(function (exports) { +})(this, function (exports) { "use strict"; var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; diff --git a/test/core/fixtures/transformation/es6.modules-umd/get-module-name-option/expected.js b/test/core/fixtures/transformation/es6.modules-umd/get-module-name-option/expected.js index ceb362161c..4c03225fb2 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/get-module-name-option/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/get-module-name-option/expected.js @@ -1,9 +1,15 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define("my custom module name", ["exports"], factory); } else if (typeof exports !== "undefined") { factory(exports); + } else { + var module = { + exports: {} + }; + factory(module.exports); + global.actual = module.exports; } -})(function (exports) { +})(this, function (exports) { "use strict"; -}); \ No newline at end of file +}); diff --git a/test/core/fixtures/transformation/es6.modules-umd/hoist-function-exports/expected.js b/test/core/fixtures/transformation/es6.modules-umd/hoist-function-exports/expected.js index 799c042feb..729e7a7088 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/hoist-function-exports/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/hoist-function-exports/expected.js @@ -1,10 +1,16 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports", "./evens"], factory); } else if (typeof exports !== "undefined") { factory(exports, require("./evens")); + } else { + var module = { + exports: {} + }; + factory(module.exports, global.evens); + global.actual = module.exports; } -})(function (exports, _evens) { +})(this, function (exports, _evens) { "use strict"; exports.nextOdd = nextOdd; @@ -23,4 +29,4 @@ }; })(isEven); exports.isOdd = isOdd; -}); \ No newline at end of file +}); diff --git a/test/core/fixtures/transformation/es6.modules-umd/imports-default/expected.js b/test/core/fixtures/transformation/es6.modules-umd/imports-default/expected.js index 46111b877c..eba4bc5eac 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/imports-default/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/imports-default/expected.js @@ -1,10 +1,16 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports", "foo"], factory); } else if (typeof exports !== "undefined") { factory(exports, require("foo")); + } else { + var module = { + exports: {} + }; + factory(module.exports, global.foo); + global.actual = module.exports; } -})(function (exports, _foo) { +})(this, function (exports, _foo) { "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; @@ -12,4 +18,4 @@ var foo = _interopRequire(_foo); var foo2 = _interopRequire(_foo); -}); \ No newline at end of file +}); diff --git a/test/core/fixtures/transformation/es6.modules-umd/imports-glob/expected.js b/test/core/fixtures/transformation/es6.modules-umd/imports-glob/expected.js index 45a763f2f2..914e053564 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/imports-glob/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/imports-glob/expected.js @@ -1,11 +1,17 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports", "foo"], factory); } else if (typeof exports !== "undefined") { factory(exports, require("foo")); + } else { + var module = { + exports: {} + }; + factory(module.exports, global.foo); + global.actual = module.exports; } -})(function (exports, _foo) { +})(this, function (exports, _foo) { "use strict"; var foo = _foo; -}); \ No newline at end of file +}); diff --git a/test/core/fixtures/transformation/es6.modules-umd/imports-mixing/expected.js b/test/core/fixtures/transformation/es6.modules-umd/imports-mixing/expected.js index 6b684e31de..63585ceebd 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/imports-mixing/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/imports-mixing/expected.js @@ -1,10 +1,16 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports", "foo"], factory); } else if (typeof exports !== "undefined") { factory(exports, require("foo")); + } else { + var module = { + exports: {} + }; + factory(module.exports, global.foo); + global.actual = module.exports; } -})(function (exports, _foo) { +})(this, function (exports, _foo) { "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; @@ -12,4 +18,4 @@ var foo = _interopRequire(_foo); var xyz = _foo.baz; -}); \ No newline at end of file +}); diff --git a/test/core/fixtures/transformation/es6.modules-umd/imports-named/expected.js b/test/core/fixtures/transformation/es6.modules-umd/imports-named/expected.js index 22062a454c..3b06db72a3 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/imports-named/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/imports-named/expected.js @@ -1,10 +1,16 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports", "foo"], factory); } else if (typeof exports !== "undefined") { factory(exports, require("foo")); + } else { + var module = { + exports: {} + }; + factory(module.exports, global.foo); + global.actual = module.exports; } -})(function (exports, _foo) { +})(this, function (exports, _foo) { "use strict"; var bar = _foo.bar; @@ -13,4 +19,4 @@ var baz2 = _foo.bar; var baz3 = _foo.bar; var xyz = _foo.xyz; -}); \ No newline at end of file +}); diff --git a/test/core/fixtures/transformation/es6.modules-umd/imports/expected.js b/test/core/fixtures/transformation/es6.modules-umd/imports/expected.js index 2e39b15cd2..629e2dad02 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/imports/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/imports/expected.js @@ -1,9 +1,15 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports", "foo", "foo-bar", "./directory/foo-bar"], factory); } else if (typeof exports !== "undefined") { factory(exports, require("foo"), require("foo-bar"), require("./directory/foo-bar")); + } else { + var module = { + exports: {} + }; + factory(module.exports, global.foo, global.fooBar, global.directoryFooBar); + global.actual = module.exports; } -})(function (exports, _foo, _fooBar, _directoryFooBar) { +})(this, function (exports, _foo, _fooBar, _directoryFooBar) { "use strict"; -}); \ No newline at end of file +}); diff --git a/test/core/fixtures/transformation/es6.modules-umd/module-name/expected.js b/test/core/fixtures/transformation/es6.modules-umd/module-name/expected.js index 8a9e6c5c9c..251106bb9a 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/module-name/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/module-name/expected.js @@ -1,10 +1,16 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define("es6.modules-umd/module-name/expected", ["exports"], factory); } else if (typeof exports !== "undefined") { factory(exports); + } else { + var module = { + exports: {} + }; + factory(module.exports); + global.actual = module.exports; } -})(function (exports) { +})(this, function (exports) { "use strict"; foobar(); diff --git a/test/core/fixtures/transformation/es6.modules-umd/overview/expected.js b/test/core/fixtures/transformation/es6.modules-umd/overview/expected.js index 9d745a80b4..e2b34b3bc5 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/overview/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/overview/expected.js @@ -1,10 +1,16 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports", "foo", "foo-bar", "./directory/foo-bar"], factory); } else if (typeof exports !== "undefined") { factory(exports, require("foo"), require("foo-bar"), require("./directory/foo-bar")); + } else { + var module = { + exports: {} + }; + factory(module.exports, global.foo2, global.fooBar, global.directoryFooBar); + global.actual = module.exports; } -})(function (exports, _foo, _fooBar, _directoryFooBar) { +})(this, function (exports, _foo, _fooBar, _directoryFooBar) { "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; @@ -23,4 +29,4 @@ exports.test2 = test2; exports["default"] = test; -}); \ No newline at end of file +}); diff --git a/test/core/fixtures/transformation/es6.modules-umd/remap/expected.js b/test/core/fixtures/transformation/es6.modules-umd/remap/expected.js index 09494c1703..37c08c5039 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/remap/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/remap/expected.js @@ -1,10 +1,16 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports"], factory); } else if (typeof exports !== "undefined") { factory(exports); + } else { + var module = { + exports: {} + }; + factory(module.exports); + global.actual = module.exports; } -})(function (exports) { +})(this, function (exports) { "use strict"; Object.defineProperty(exports, "__esModule", { @@ -20,4 +26,4 @@ test = 3; test++; })(); -}); \ No newline at end of file +}); diff --git a/test/core/fixtures/transformation/runtime/modules-umd/expected.js b/test/core/fixtures/transformation/runtime/modules-umd/expected.js index 6d94759838..3a89684eb3 100644 --- a/test/core/fixtures/transformation/runtime/modules-umd/expected.js +++ b/test/core/fixtures/transformation/runtime/modules-umd/expected.js @@ -1,13 +1,19 @@ -(function (factory) { +(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports", "foo", "babel-runtime/es5/helpers/interop-require"], factory); } else if (typeof exports !== "undefined") { factory(exports, require("foo"), require("babel-runtime/es5/helpers/interop-require")); + } else { + var module = { + exports: {} + }; + factory(module.exports, global.foo, global._interopRequire); + global.actual = module.exports; } -})(function (exports, _foo, _babelRuntimeEs5HelpersInteropRequire) { +})(this, function (exports, _foo, _babelRuntimeEs5HelpersInteropRequire) { "use strict"; var _interopRequire = _babelRuntimeEs5HelpersInteropRequire["default"]; var foo = _interopRequire(_foo); -}); \ No newline at end of file +});