From 8b0179e2d5a7ae032563ffd3f5770edae3eb20d0 Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Sat, 18 Jun 2016 12:41:54 -0700 Subject: [PATCH 1/6] Fix typo in transform-es2015-modules-umd plugin README and specify json as the language for the subsequent code block --- packages/babel-plugin-transform-es2015-modules-umd/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/babel-plugin-transform-es2015-modules-umd/README.md b/packages/babel-plugin-transform-es2015-modules-umd/README.md index cfcdc5b359..6a3e8f1b7e 100644 --- a/packages/babel-plugin-transform-es2015-modules-umd/README.md +++ b/packages/babel-plugin-transform-es2015-modules-umd/README.md @@ -20,9 +20,9 @@ $ 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: +as `global.Promise` rather than `global.es6Promise`. This can be accommodated by: -``` +```json { "plugins": [ ["transform-es2015-modules-umd", { From c252d3dae6bef764b8c0a956f29880cd9fe937ba Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Sun, 19 Jun 2016 02:32:24 -0700 Subject: [PATCH 2/6] Add exactGlobals option to transform-es2015-modules-umd plugin to enable more flexibility specifying global names --- .../README.md | 98 +++++++++++++++++++ .../src/index.js | 30 +++++- .../actual.js | 3 + .../expected.js | 21 ++++ .../options.json | 12 +++ .../umd/imports-exact-globals-false/actual.js | 3 + .../imports-exact-globals-false/expected.js | 21 ++++ .../actual.js | 3 + .../expected.js | 21 ++++ .../options.json | 13 +++ .../umd/imports-exact-globals-true/actual.js | 3 + .../imports-exact-globals-true/expected.js | 21 ++++ .../imports-exact-globals-true/options.json | 8 ++ 13 files changed, 252 insertions(+), 5 deletions(-) create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false-with-overrides/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false-with-overrides/expected.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false-with-overrides/options.json create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false/expected.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true-with-overrides/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true-with-overrides/expected.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true-with-overrides/options.json create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true/expected.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true/options.json diff --git a/packages/babel-plugin-transform-es2015-modules-umd/README.md b/packages/babel-plugin-transform-es2015-modules-umd/README.md index 6a3e8f1b7e..823cd428fb 100644 --- a/packages/babel-plugin-transform-es2015-modules-umd/README.md +++ b/packages/babel-plugin-transform-es2015-modules-umd/README.md @@ -34,6 +34,104 @@ as `global.Promise` rather than `global.es6Promise`. This can be accommodated by } ``` +#### Default semantics + +There are a couple things to note about the default semantics. + +_First_, this transform uses the +[basename](https://en.wikipedia.org/wiki/Basename) of each import to generate +the global names in the UMD output. This means that if you're importing +multiple modules with the same basename, like: + +```js +import fooBar1 from "foo-bar"; +import fooBar2 from "./mylib/foo-bar"; +``` + +it will transpile into two references to the same browser global: + +```js +factory(global.fooBar, global.fooBar); +``` + +If you set the plugin options to: + +```json +{ + "globals": { + "foo-bar": "fooBAR", + "./mylib/foo-bar": "mylib.fooBar" + } +} +``` + +it will still transpile both to one browser global: + +```js +factory(global.fooBAR, global.fooBAR); +``` + +because again the transform is only using the basename of the import. + +_Second_, the specified override will still be passed to the `toIdentifier` +function in [babel-types/src/converters](../babel-types/src/converters.js). +This means that if you specify an override as a member expression like: + +```json +{ + "globals": { + "fizzbuzz": "fizz.buzz" + } +} +``` + +this will _not_ transpile to `factory(global.fizz.buzz)`. Instead, it will +transpile to `factory(global.fizzBuzz)` based on the logic in `toIdentifier`. + +#### More flexible semantics with `exactGlobals: true` + +Both of these behaviors can limit the flexibility of the `globals` map. To +remove these limitations, you can set the `exactGlobals` option to `true`. +Doing this instructs the plugin to: + +1. always use the full import string instead of the basename when generating +the global names +2. skip passing `globals` overrides to the `toIdentifier` function. Instead, +they are used exactly as written, so you will get errors if you do not use +valid identifiers or valid uncomputed (dot) member expressions. + +Thus, if you set `exactGlobals` to `true` and do not pass any overrides, the +first example of: + +```js +import fooBar1 from "foo-bar"; +import fooBar2 from "./mylib/foo-bar"; +``` + +will transpile to: + +```js +factory(global.fooBar, global.mylibFooBar); +``` + +And if you set the plugin options to: + +```json +{ + "globals": { + "foo-bar": "fooBAR", + "./mylib/foo-bar": "mylib.fooBar" + }, + "exactGlobals": true +} +``` + +then it'll transpile to: + +```js +factory(global.fooBAR, global.mylib.fooBar) +``` + ### 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 26b59f19d0..cbe8cae0ee 100644 --- a/packages/babel-plugin-transform-es2015-modules-umd/src/index.js +++ b/packages/babel-plugin-transform-es2015-modules-umd/src/index.js @@ -65,12 +65,32 @@ 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; + let memberExpression; - return t.memberExpression(t.identifier("global"), t.identifier( - t.toIdentifier(globalName) - )); + if (state.opts.exactGlobals) { + let globalRef = browserGlobals[arg.value]; + if (globalRef) { + if (globalRef.indexOf(".") > -1) { + memberExpression = globalRef.split(".").reduce( + (accum, curr) => t.memberExpression(accum, t.identifier(curr)), t.identifier("global") + ); + } else { + memberExpression = t.memberExpression(t.identifier("global"), t.identifier(globalRef)); + } + } else { + memberExpression = t.memberExpression( + t.identifier("global"), t.identifier(t.toIdentifier(arg.value)) + ); + } + } else { + let requireName = basename(arg.value, extname(arg.value)); + let globalName = browserGlobals[requireName] || requireName; + memberExpression = t.memberExpression( + t.identifier("global"), t.identifier(t.toIdentifier(globalName)) + ); + } + + return memberExpression; } }); diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false-with-overrides/actual.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false-with-overrides/actual.js new file mode 100644 index 0000000000..0e67018dc4 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false-with-overrides/actual.js @@ -0,0 +1,3 @@ +import fooBar1 from "foo-bar"; +import fooBar2 from "./mylib/foo-bar"; +import fizzBuzz from "fizzbuzz"; diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false-with-overrides/expected.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false-with-overrides/expected.js new file mode 100644 index 0000000000..5bb49994e0 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false-with-overrides/expected.js @@ -0,0 +1,21 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["foo-bar", "./mylib/foo-bar", "fizzbuzz"], factory); + } else if (typeof exports !== "undefined") { + factory(require("foo-bar"), require("./mylib/foo-bar"), require("fizzbuzz")); + } else { + var mod = { + exports: {} + }; + factory(global.fooBAR, global.fooBAR, global.fizzBuzz); + global.actual = mod.exports; + } +})(this, function (_fooBar, _fooBar3, _fizzbuzz) { + "use strict"; + + var _fooBar2 = babelHelpers.interopRequireDefault(_fooBar); + + var _fooBar4 = babelHelpers.interopRequireDefault(_fooBar3); + + var _fizzbuzz2 = babelHelpers.interopRequireDefault(_fizzbuzz); +}); diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false-with-overrides/options.json b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false-with-overrides/options.json new file mode 100644 index 0000000000..e15ffb81e0 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false-with-overrides/options.json @@ -0,0 +1,12 @@ +{ + "plugins": [ + "external-helpers", + ["transform-es2015-modules-umd", { + "globals": { + "foo-bar": "fooBAR", + "./mylib/foo-bar": "mylib.fooBar", + "fizzbuzz": "fizz.buzz" + } + }] + ] +} diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false/actual.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false/actual.js new file mode 100644 index 0000000000..0e67018dc4 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false/actual.js @@ -0,0 +1,3 @@ +import fooBar1 from "foo-bar"; +import fooBar2 from "./mylib/foo-bar"; +import fizzBuzz from "fizzbuzz"; diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false/expected.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false/expected.js new file mode 100644 index 0000000000..527e2f698b --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-false/expected.js @@ -0,0 +1,21 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["foo-bar", "./mylib/foo-bar", "fizzbuzz"], factory); + } else if (typeof exports !== "undefined") { + factory(require("foo-bar"), require("./mylib/foo-bar"), require("fizzbuzz")); + } else { + var mod = { + exports: {} + }; + factory(global.fooBar, global.fooBar, global.fizzbuzz); + global.actual = mod.exports; + } +})(this, function (_fooBar, _fooBar3, _fizzbuzz) { + "use strict"; + + var _fooBar2 = babelHelpers.interopRequireDefault(_fooBar); + + var _fooBar4 = babelHelpers.interopRequireDefault(_fooBar3); + + var _fizzbuzz2 = babelHelpers.interopRequireDefault(_fizzbuzz); +}); diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true-with-overrides/actual.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true-with-overrides/actual.js new file mode 100644 index 0000000000..0e67018dc4 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true-with-overrides/actual.js @@ -0,0 +1,3 @@ +import fooBar1 from "foo-bar"; +import fooBar2 from "./mylib/foo-bar"; +import fizzBuzz from "fizzbuzz"; diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true-with-overrides/expected.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true-with-overrides/expected.js new file mode 100644 index 0000000000..702163cd78 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true-with-overrides/expected.js @@ -0,0 +1,21 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["foo-bar", "./mylib/foo-bar", "fizzbuzz"], factory); + } else if (typeof exports !== "undefined") { + factory(require("foo-bar"), require("./mylib/foo-bar"), require("fizzbuzz")); + } else { + var mod = { + exports: {} + }; + factory(global.fooBAR, global.mylib.fooBar, global.fizz.buzz); + global.actual = mod.exports; + } +})(this, function (_fooBar, _fooBar3, _fizzbuzz) { + "use strict"; + + var _fooBar2 = babelHelpers.interopRequireDefault(_fooBar); + + var _fooBar4 = babelHelpers.interopRequireDefault(_fooBar3); + + var _fizzbuzz2 = babelHelpers.interopRequireDefault(_fizzbuzz); +}); diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true-with-overrides/options.json b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true-with-overrides/options.json new file mode 100644 index 0000000000..01e37b5b27 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true-with-overrides/options.json @@ -0,0 +1,13 @@ +{ + "plugins": [ + "external-helpers", + ["transform-es2015-modules-umd", { + "globals": { + "foo-bar": "fooBAR", + "./mylib/foo-bar": "mylib.fooBar", + "fizzbuzz": "fizz.buzz" + }, + "exactGlobals": true + }] + ] +} diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true/actual.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true/actual.js new file mode 100644 index 0000000000..0e67018dc4 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true/actual.js @@ -0,0 +1,3 @@ +import fooBar1 from "foo-bar"; +import fooBar2 from "./mylib/foo-bar"; +import fizzBuzz from "fizzbuzz"; diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true/expected.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true/expected.js new file mode 100644 index 0000000000..990ac8401f --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true/expected.js @@ -0,0 +1,21 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["foo-bar", "./mylib/foo-bar", "fizzbuzz"], factory); + } else if (typeof exports !== "undefined") { + factory(require("foo-bar"), require("./mylib/foo-bar"), require("fizzbuzz")); + } else { + var mod = { + exports: {} + }; + factory(global.fooBar, global.mylibFooBar, global.fizzbuzz); + global.actual = mod.exports; + } +})(this, function (_fooBar, _fooBar3, _fizzbuzz) { + "use strict"; + + var _fooBar2 = babelHelpers.interopRequireDefault(_fooBar); + + var _fooBar4 = babelHelpers.interopRequireDefault(_fooBar3); + + var _fizzbuzz2 = babelHelpers.interopRequireDefault(_fizzbuzz); +}); diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true/options.json b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true/options.json new file mode 100644 index 0000000000..3ac7220822 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/imports-exact-globals-true/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "external-helpers", + ["transform-es2015-modules-umd", { + "exactGlobals": true + }] + ] +} From ac9487abf395ceea0e818f7fef46869a158e2836 Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Mon, 20 Jun 2016 21:52:36 -0700 Subject: [PATCH 3/6] Add the ability to override the exported global using the globals map when `exactGlobals` is true --- .../README.md | 35 ++++++++++++- .../src/index.js | 52 ++++++++++++++++--- .../actual.js | 1 + .../expected.js | 21 ++++++++ .../options.json | 12 +++++ .../actual.js | 1 + .../expected.js | 23 ++++++++ .../options.json | 12 +++++ .../actual.js | 1 + .../expected.js | 20 +++++++ .../options.json | 12 +++++ .../actual.js | 1 + .../expected.js | 20 +++++++ .../options.json | 12 +++++ 14 files changed, 215 insertions(+), 8 deletions(-) create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-namespace/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-namespace/expected.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-namespace/options.json create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-very-nested-namespace/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-very-nested-namespace/expected.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-very-nested-namespace/options.json create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global/expected.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global/options.json create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-name-with-overridden-global/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-name-with-overridden-global/expected.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-name-with-overridden-global/options.json diff --git a/packages/babel-plugin-transform-es2015-modules-umd/README.md b/packages/babel-plugin-transform-es2015-modules-umd/README.md index 823cd428fb..9af5b210c0 100644 --- a/packages/babel-plugin-transform-es2015-modules-umd/README.md +++ b/packages/babel-plugin-transform-es2015-modules-umd/README.md @@ -36,7 +36,7 @@ as `global.Promise` rather than `global.es6Promise`. This can be accommodated by #### Default semantics -There are a couple things to note about the default semantics. +There are a few things to note about the default semantics. _First_, this transform uses the [basename](https://en.wikipedia.org/wiki/Basename) of each import to generate @@ -88,9 +88,11 @@ This means that if you specify an override as a member expression like: this will _not_ transpile to `factory(global.fizz.buzz)`. Instead, it will transpile to `factory(global.fizzBuzz)` based on the logic in `toIdentifier`. +_Third_, you cannot override the exported global name. + #### More flexible semantics with `exactGlobals: true` -Both of these behaviors can limit the flexibility of the `globals` map. To +All of these behaviors can limit the flexibility of the `globals` map. To remove these limitations, you can set the `exactGlobals` option to `true`. Doing this instructs the plugin to: @@ -99,6 +101,8 @@ the global names 2. skip passing `globals` overrides to the `toIdentifier` function. Instead, they are used exactly as written, so you will get errors if you do not use valid identifiers or valid uncomputed (dot) member expressions. +3. allow the exported global name to be overridden via the `globals` map. Any +override must again be a valid identifier or valid member expression. Thus, if you set `exactGlobals` to `true` and do not pass any overrides, the first example of: @@ -132,6 +136,33 @@ then it'll transpile to: factory(global.fooBAR, global.mylib.fooBar) ``` +Finally, with the plugin options set to: + +```json +{ + "plugins": [ + "external-helpers", + ["transform-es2015-modules-umd", { + "globals": { + "my/custom/module/name": "My.Custom.Module.Name" + }, + "exactGlobals": true + }] + ], + "moduleId": "my/custom/module/name" +} +``` + +it will transpile to: + +```js +factory(mod.exports); +global.My = global.My || {}; +global.My.Custom = global.My.Custom || {}; +global.My.Custom.Module = global.My.Custom.Module || {}; +global.My.Custom.Module.Name = mod.exports; +``` + ### 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 cbe8cae0ee..f672e618fc 100644 --- a/packages/babel-plugin-transform-es2015-modules-umd/src/index.js +++ b/packages/babel-plugin-transform-es2015-modules-umd/src/index.js @@ -3,6 +3,17 @@ import { basename, extname } from "path"; import template from "babel-template"; +let buildPrerequisiteAssignment = template(` + GLOBAL_REFERENCE = GLOBAL_REFERENCE || {} +`); + +let buildGlobalExport = template(` + var mod = { exports: {} }; + factory(BROWSER_ARGUMENTS); + PREREQUISITE_ASSIGNMENTS + GLOBAL_TO_ASSIGN = mod.exports; +`); + let buildWrapper = template(` (function (global, factory) { if (typeof define === "function" && define.amd) { @@ -10,9 +21,7 @@ let buildWrapper = template(` } else if (typeof exports !== "undefined") { factory(COMMON_ARGUMENTS); } else { - var mod = { exports: {} }; - factory(BROWSER_ARGUMENTS); - global.GLOBAL_ARG = mod.exports; + GLOBAL_EXPORT } })(this, FUNC); `); @@ -94,14 +103,45 @@ export default function ({ types: t }) { } }); - let globalArg = t.identifier(t.toIdentifier(moduleName ? moduleName.value : this.file.opts.basename)); + let moduleNameOrBasename = moduleName ? moduleName.value : this.file.opts.basename; + let globalToAssign = t.memberExpression( + t.identifier("global"), t.identifier(t.toIdentifier(moduleNameOrBasename)) + ); + let prerequisiteAssignments = null; + + if (state.opts.exactGlobals) { + let globalName = browserGlobals[moduleNameOrBasename]; + + if (globalName) { + if (globalName.indexOf(".") > -1) { + prerequisiteAssignments = []; + + let members = globalName.split("."); + let namespacedProperties = members.slice(1).reduce((accum, curr, index) => { + let prerequisiteAssignment = buildPrerequisiteAssignment({ GLOBAL_REFERENCE: accum[index] }); + prerequisiteAssignments.push(prerequisiteAssignment); + accum.push(t.memberExpression(accum[index], t.identifier(curr))); + return accum; + }, [t.memberExpression(t.identifier("global"), t.identifier(members[0]))]); + + globalToAssign = namespacedProperties[namespacedProperties.length -1]; + } else { + globalToAssign = t.memberExpression(t.identifier("global"), t.identifier(globalName)); + } + } + } + + let globalExport = buildGlobalExport({ + BROWSER_ARGUMENTS: browserArgs, + PREREQUISITE_ASSIGNMENTS: prerequisiteAssignments, + GLOBAL_TO_ASSIGN: globalToAssign + }); last.replaceWith(buildWrapper({ MODULE_NAME: moduleName, - BROWSER_ARGUMENTS: browserArgs, AMD_ARGUMENTS: amdArgs, COMMON_ARGUMENTS: commonArgs, - GLOBAL_ARG: globalArg, + GLOBAL_EXPORT: globalExport, FUNC: func })); } diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-namespace/actual.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-namespace/actual.js new file mode 100644 index 0000000000..7a4e8a723a --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-namespace/actual.js @@ -0,0 +1 @@ +export default 42; diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-namespace/expected.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-namespace/expected.js new file mode 100644 index 0000000000..9000a0b8bd --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-namespace/expected.js @@ -0,0 +1,21 @@ +(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 mod = { + exports: {} + }; + factory(mod.exports); + global.foo = global.foo || {}; + global.foo.bar = mod.exports; + } +})(this, function (exports) { + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = 42; +}); diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-namespace/options.json b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-namespace/options.json new file mode 100644 index 0000000000..23eb69e3b8 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-namespace/options.json @@ -0,0 +1,12 @@ +{ + "plugins": [ + "external-helpers", + ["transform-es2015-modules-umd", { + "globals": { + "my custom module name": "foo.bar" + }, + "exactGlobals": true + }] + ], + "moduleId": "my custom module name" +} diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-very-nested-namespace/actual.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-very-nested-namespace/actual.js new file mode 100644 index 0000000000..7a4e8a723a --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-very-nested-namespace/actual.js @@ -0,0 +1 @@ +export default 42; diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-very-nested-namespace/expected.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-very-nested-namespace/expected.js new file mode 100644 index 0000000000..52ab4409c0 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-very-nested-namespace/expected.js @@ -0,0 +1,23 @@ +(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 mod = { + exports: {} + }; + factory(mod.exports); + global.foo = global.foo || {}; + global.foo.bar = global.foo.bar || {}; + global.foo.bar.baz = global.foo.bar.baz || {}; + global.foo.bar.baz.qux = mod.exports; + } +})(this, function (exports) { + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = 42; +}); diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-very-nested-namespace/options.json b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-very-nested-namespace/options.json new file mode 100644 index 0000000000..ad97739f25 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global-in-very-nested-namespace/options.json @@ -0,0 +1,12 @@ +{ + "plugins": [ + "external-helpers", + ["transform-es2015-modules-umd", { + "globals": { + "my custom module name": "foo.bar.baz.qux" + }, + "exactGlobals": true + }] + ], + "moduleId": "my custom module name" +} diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global/actual.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global/actual.js new file mode 100644 index 0000000000..7a4e8a723a --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global/actual.js @@ -0,0 +1 @@ +export default 42; diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global/expected.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global/expected.js new file mode 100644 index 0000000000..88c2787a3a --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global/expected.js @@ -0,0 +1,20 @@ +(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 mod = { + exports: {} + }; + factory(mod.exports); + global.baz = mod.exports; + } +})(this, function (exports) { + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = 42; +}); diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global/options.json b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global/options.json new file mode 100644 index 0000000000..88df10bb74 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-id-with-overridden-global/options.json @@ -0,0 +1,12 @@ +{ + "plugins": [ + "external-helpers", + ["transform-es2015-modules-umd", { + "globals": { + "my custom module name": "baz" + }, + "exactGlobals": true + }] + ], + "moduleId": "my custom module name" +} diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-name-with-overridden-global/actual.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-name-with-overridden-global/actual.js new file mode 100644 index 0000000000..7a4e8a723a --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-name-with-overridden-global/actual.js @@ -0,0 +1 @@ +export default 42; diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-name-with-overridden-global/expected.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-name-with-overridden-global/expected.js new file mode 100644 index 0000000000..777602f707 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-name-with-overridden-global/expected.js @@ -0,0 +1,20 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define("umd/module-name-with-overridden-global/expected", ["exports"], factory); + } else if (typeof exports !== "undefined") { + factory(exports); + } else { + var mod = { + exports: {} + }; + factory(mod.exports); + global.baz = mod.exports; + } +})(this, function (exports) { + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = 42; +}); diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-name-with-overridden-global/options.json b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-name-with-overridden-global/options.json new file mode 100644 index 0000000000..8546968383 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/module-name-with-overridden-global/options.json @@ -0,0 +1,12 @@ +{ + "plugins": [ + "external-helpers", + ["transform-es2015-modules-umd", { + "globals": { + "umd/module-name-with-overridden-global/expected": "baz" + }, + "exactGlobals": true + }] + ], + "moduleIds": true +} From 6c9f24181207f2bc4a980278bcd7fd95d5ec8d1f Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Sun, 3 Jul 2016 01:19:00 -0700 Subject: [PATCH 4/6] Add test case for overriding exported global name without specifying the moduleId or moduleIds options --- .../umd/override-export-name/actual.js | 1 + .../umd/override-export-name/expected.js | 20 +++++++++++++++++++ .../umd/override-export-name/options.json | 11 ++++++++++ 3 files changed, 32 insertions(+) create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-export-name/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-export-name/expected.js create mode 100644 packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-export-name/options.json diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-export-name/actual.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-export-name/actual.js new file mode 100644 index 0000000000..7a4e8a723a --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-export-name/actual.js @@ -0,0 +1 @@ +export default 42; diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-export-name/expected.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-export-name/expected.js new file mode 100644 index 0000000000..27f66b3fc5 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-export-name/expected.js @@ -0,0 +1,20 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["exports"], factory); + } else if (typeof exports !== "undefined") { + factory(exports); + } else { + var mod = { + exports: {} + }; + factory(mod.exports); + global.baz = mod.exports; + } +})(this, function (exports) { + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = 42; +}); diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-export-name/options.json b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-export-name/options.json new file mode 100644 index 0000000000..efdc92bc73 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/override-export-name/options.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + "external-helpers", + ["transform-es2015-modules-umd", { + "globals": { + "actual": "baz" + }, + "exactGlobals": true + }] + ] +} From fcb50de89b61046e7f01945129ad20b1d4787f7e Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Tue, 26 Jul 2016 22:17:14 -0700 Subject: [PATCH 5/6] Remove unnecessary checking for "." since the code works in either case --- .../src/index.js | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) 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 f672e618fc..f06376f8d2 100644 --- a/packages/babel-plugin-transform-es2015-modules-umd/src/index.js +++ b/packages/babel-plugin-transform-es2015-modules-umd/src/index.js @@ -79,13 +79,9 @@ export default function ({ types: t }) { if (state.opts.exactGlobals) { let globalRef = browserGlobals[arg.value]; if (globalRef) { - if (globalRef.indexOf(".") > -1) { - memberExpression = globalRef.split(".").reduce( - (accum, curr) => t.memberExpression(accum, t.identifier(curr)), t.identifier("global") - ); - } else { - memberExpression = t.memberExpression(t.identifier("global"), t.identifier(globalRef)); - } + memberExpression = globalRef.split(".").reduce( + (accum, curr) => t.memberExpression(accum, t.identifier(curr)), t.identifier("global") + ); } else { memberExpression = t.memberExpression( t.identifier("global"), t.identifier(t.toIdentifier(arg.value)) @@ -113,21 +109,17 @@ export default function ({ types: t }) { let globalName = browserGlobals[moduleNameOrBasename]; if (globalName) { - if (globalName.indexOf(".") > -1) { - prerequisiteAssignments = []; + prerequisiteAssignments = []; - let members = globalName.split("."); - let namespacedProperties = members.slice(1).reduce((accum, curr, index) => { - let prerequisiteAssignment = buildPrerequisiteAssignment({ GLOBAL_REFERENCE: accum[index] }); - prerequisiteAssignments.push(prerequisiteAssignment); - accum.push(t.memberExpression(accum[index], t.identifier(curr))); - return accum; - }, [t.memberExpression(t.identifier("global"), t.identifier(members[0]))]); + let members = globalName.split("."); + let namespacedProperties = members.slice(1).reduce((accum, curr, index) => { + let prerequisiteAssignment = buildPrerequisiteAssignment({ GLOBAL_REFERENCE: accum[index] }); + prerequisiteAssignments.push(prerequisiteAssignment); + accum.push(t.memberExpression(accum[index], t.identifier(curr))); + return accum; + }, [t.memberExpression(t.identifier("global"), t.identifier(members[0]))]); - globalToAssign = namespacedProperties[namespacedProperties.length -1]; - } else { - globalToAssign = t.memberExpression(t.identifier("global"), t.identifier(globalName)); - } + globalToAssign = namespacedProperties[namespacedProperties.length -1]; } } From 55a25c271a465cc4698545809d4e76356bfbab1e Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Tue, 26 Jul 2016 22:35:33 -0700 Subject: [PATCH 6/6] Simplify accum to just be a memberExpression not an array --- .../src/index.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) 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 f06376f8d2..44b88ee55d 100644 --- a/packages/babel-plugin-transform-es2015-modules-umd/src/index.js +++ b/packages/babel-plugin-transform-es2015-modules-umd/src/index.js @@ -112,14 +112,10 @@ export default function ({ types: t }) { prerequisiteAssignments = []; let members = globalName.split("."); - let namespacedProperties = members.slice(1).reduce((accum, curr, index) => { - let prerequisiteAssignment = buildPrerequisiteAssignment({ GLOBAL_REFERENCE: accum[index] }); - prerequisiteAssignments.push(prerequisiteAssignment); - accum.push(t.memberExpression(accum[index], t.identifier(curr))); - return accum; - }, [t.memberExpression(t.identifier("global"), t.identifier(members[0]))]); - - globalToAssign = namespacedProperties[namespacedProperties.length -1]; + globalToAssign = members.slice(1).reduce((accum, curr) => { + prerequisiteAssignments.push(buildPrerequisiteAssignment({ GLOBAL_REFERENCE: accum })); + return t.memberExpression(accum, t.identifier(curr)); + }, t.memberExpression(t.identifier("global"), t.identifier(members[0]))); } }