diff --git a/packages/babel-plugin-transform-es2015-modules-umd/README.md b/packages/babel-plugin-transform-es2015-modules-umd/README.md index c96b1cdf4a..cfcdc5b359 100644 --- a/packages/babel-plugin-transform-es2015-modules-umd/README.md +++ b/packages/babel-plugin-transform-es2015-modules-umd/README.md @@ -18,6 +18,22 @@ $ npm install babel-plugin-transform-es2015-modules-umd } ``` +You can also override the names of particular libraries when this module is +running in the browser. For example the `es6-promise` library exposes itself +as `global.Promise` rather than `global.es6Promise`. This can be accomidated by: + +``` +{ + "plugins": [ + ["transform-es2015-modules-umd", { + "globals": { + "es6-promise": "Promise" + } + }] + ] +} +``` + ### Via CLI ```sh diff --git a/packages/babel-plugin-transform-es2015-modules-umd/src/index.js b/packages/babel-plugin-transform-es2015-modules-umd/src/index.js index cf94ffdc96..26b59f19d0 100644 --- a/packages/babel-plugin-transform-es2015-modules-umd/src/index.js +++ b/packages/babel-plugin-transform-es2015-modules-umd/src/index.js @@ -39,7 +39,7 @@ export default function ({ types: t }) { visitor: { Program: { - exit(path) { + exit(path, state) { let last = path.get("body").pop(); if (!isValidDefine(last)) return; @@ -49,6 +49,7 @@ export default function ({ types: t }) { let moduleName = args.length === 3 ? args.shift() : null; let amdArgs = call.arguments[0]; let func = call.arguments[1]; + let browserGlobals = state.opts.globals || {}; let commonArgs = amdArgs.elements.map((arg) => { if (arg.value === "module" || arg.value === "exports") { @@ -64,8 +65,11 @@ export default function ({ types: t }) { } else if (arg.value === "exports") { return t.memberExpression(t.identifier("mod"), t.identifier("exports")); } else { + let requireName = basename(arg.value, extname(arg.value)); + let globalName = browserGlobals[requireName] || requireName; + return t.memberExpression(t.identifier("global"), t.identifier( - t.toIdentifier(basename(arg.value, extname(arg.value))) + t.toIdentifier(globalName) )); } }); diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-import-name/actual.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-import-name/actual.js new file mode 100644 index 0000000000..3d0a8255a4 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-import-name/actual.js @@ -0,0 +1 @@ +import "babel-template"; diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-import-name/expected.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-import-name/expected.js new file mode 100644 index 0000000000..b93ebd1057 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-import-name/expected.js @@ -0,0 +1,13 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["babel-template"], factory); + } else if (typeof exports !== "undefined") { + factory(require("babel-template")); + } else { + var mod = { + exports: {} + }; + factory(global.baz); + global.actual = mod.exports; + } +})(this, function () {}); diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-import-name/options.json b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-import-name/options.json new file mode 100644 index 0000000000..2a7db4bc1a --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-import-name/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + ["transform-es2015-modules-umd", { + "globals": { + "babel-template": "baz" + } + }] + ] +}