From b5dfd1ed0447f75d5489b186272c9c9e8865d55e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Tue, 4 Jul 2017 12:01:03 +0200 Subject: [PATCH] Fixed issue with umd noConflict bundle + named exports. In such case undefined got exported as module. --- src/finalisers/umd.js | 33 ++++++++++++++++--- .../umd-noconflict-extend/_expected/umd.js | 3 +- .../form/umd-noconflict-namespaced/_config.js | 8 +++++ .../_expected/amd.js | 17 ++++++++++ .../_expected/cjs.js | 15 +++++++++ .../umd-noconflict-namespaced/_expected/es.js | 9 +++++ .../_expected/iife.js | 19 +++++++++++ .../_expected/umd.js | 27 +++++++++++++++ test/form/umd-noconflict-namespaced/main.js | 7 ++++ test/form/umd-noconflict/_expected/umd.js | 3 +- 10 files changed, 134 insertions(+), 7 deletions(-) create mode 100644 test/form/umd-noconflict-namespaced/_config.js create mode 100644 test/form/umd-noconflict-namespaced/_expected/amd.js create mode 100644 test/form/umd-noconflict-namespaced/_expected/cjs.js create mode 100644 test/form/umd-noconflict-namespaced/_expected/es.js create mode 100644 test/form/umd-noconflict-namespaced/_expected/iife.js create mode 100644 test/form/umd-noconflict-namespaced/_expected/umd.js create mode 100644 test/form/umd-noconflict-namespaced/main.js diff --git a/src/finalisers/umd.js b/src/finalisers/umd.js index ee252a30ea3..d502a2679da 100644 --- a/src/finalisers/umd.js +++ b/src/finalisers/umd.js @@ -25,6 +25,15 @@ function setupNamespace ( name ) { .join( ', ' ); } +function safeAccess ( name ) { + const parts = name.split( '.' ); + + let acc = 'global'; + return parts + .map( part => ( acc += property( part ), acc ) ) + .join( ` && ` ); +} + const wrapperOutro = '\n\n})));'; export default function umd ( bundle, magicString, { exportMode, indentString, intro, outro }, options ) { @@ -67,13 +76,27 @@ export default function umd ( bundle, magicString, { exportMode, indentString, i const useStrict = options.useStrict !== false ? ` 'use strict';` : ``; - const globalExport = options.noConflict === true ? - `(function() { - var current = ${globalProp(options.moduleName)}; - var exports = factory(${globalDeps}); + let globalExport; + + if (options.noConflict === true) { + let factory; + + if ( exportMode === 'default' ) { + factory = `var exports = factory(${globalDeps});`; + } else if ( exportMode === 'named' ) { + const module = globalDeps.shift(); + factory = `var exports = ${module}; + factory(${['exports'].concat(globalDeps)});`; + } + globalExport = `(function() { + var current = ${safeAccess(options.moduleName)}; + ${factory} ${globalProp(options.moduleName)} = exports; exports.noConflict = function() { ${globalProp(options.moduleName)} = current; return exports; }; - })()` : `(${defaultExport}factory(${globalDeps}))`; + })()`; + } else { + globalExport = `(${defaultExport}factory(${globalDeps}))`; + } const wrapperIntro = `(function (global, factory) { diff --git a/test/form/umd-noconflict-extend/_expected/umd.js b/test/form/umd-noconflict-extend/_expected/umd.js index 89e044819da..1ae7cf82baa 100644 --- a/test/form/umd-noconflict-extend/_expected/umd.js +++ b/test/form/umd-noconflict-extend/_expected/umd.js @@ -3,7 +3,8 @@ typeof define === 'function' && define.amd ? define(['exports'], factory) : (function() { var current = global.FooBar; - var exports = factory((global.FooBar = global.FooBar || {})); + var exports = (global.FooBar = global.FooBar || {}); + factory(exports); global.FooBar = exports; exports.noConflict = function() { global.FooBar = current; return exports; }; })(); diff --git a/test/form/umd-noconflict-namespaced/_config.js b/test/form/umd-noconflict-namespaced/_config.js new file mode 100644 index 00000000000..52864e21105 --- /dev/null +++ b/test/form/umd-noconflict-namespaced/_config.js @@ -0,0 +1,8 @@ +module.exports = { + description: 'exports noConflict method for default umd when requested', + options: { + noConflict: true, + moduleName: 'my.name.spaced.module' + } +}; + diff --git a/test/form/umd-noconflict-namespaced/_expected/amd.js b/test/form/umd-noconflict-namespaced/_expected/amd.js new file mode 100644 index 00000000000..f2fd756cbda --- /dev/null +++ b/test/form/umd-noconflict-namespaced/_expected/amd.js @@ -0,0 +1,17 @@ +define(['exports'], function (exports) { 'use strict'; + + function doThings() { + console.log( 'doing things...' ); + } + + const number = 42; + + var setting = 'no'; + + exports.doThings = doThings; + exports.number = number; + exports.setting = setting; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/test/form/umd-noconflict-namespaced/_expected/cjs.js b/test/form/umd-noconflict-namespaced/_expected/cjs.js new file mode 100644 index 00000000000..05952881691 --- /dev/null +++ b/test/form/umd-noconflict-namespaced/_expected/cjs.js @@ -0,0 +1,15 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +function doThings() { + console.log( 'doing things...' ); +} + +const number = 42; + +var setting = 'no'; + +exports.doThings = doThings; +exports.number = number; +exports.setting = setting; diff --git a/test/form/umd-noconflict-namespaced/_expected/es.js b/test/form/umd-noconflict-namespaced/_expected/es.js new file mode 100644 index 00000000000..26bd5fb357e --- /dev/null +++ b/test/form/umd-noconflict-namespaced/_expected/es.js @@ -0,0 +1,9 @@ +function doThings() { + console.log( 'doing things...' ); +} + +const number = 42; + +var setting = 'no'; + +export { doThings, number, setting }; \ No newline at end of file diff --git a/test/form/umd-noconflict-namespaced/_expected/iife.js b/test/form/umd-noconflict-namespaced/_expected/iife.js new file mode 100644 index 00000000000..40085ca93b5 --- /dev/null +++ b/test/form/umd-noconflict-namespaced/_expected/iife.js @@ -0,0 +1,19 @@ +this.my = this.my || {}; +this.my.name = this.my.name || {}; +this.my.name.spaced = this.my.name.spaced || {}; +this.my.name.spaced.module = (function (exports) { + 'use strict'; + + function doThings() { + console.log( 'doing things...' ); + } + + const number = 42; + + var setting = 'no'; + + exports.doThings = doThings; + exports.number = number; + exports.setting = setting; + +}({})); diff --git a/test/form/umd-noconflict-namespaced/_expected/umd.js b/test/form/umd-noconflict-namespaced/_expected/umd.js new file mode 100644 index 00000000000..770e508f902 --- /dev/null +++ b/test/form/umd-noconflict-namespaced/_expected/umd.js @@ -0,0 +1,27 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (function() { + var current = global.my && global.my.name && global.my.name.spaced && global.my.name.spaced.module; + var exports = (global.my = global.my || {}, global.my.name = global.my.name || {}, global.my.name.spaced = global.my.name.spaced || {}, global.my.name.spaced.module = {}); + factory(exports); + global.my.name.spaced.module = exports; + exports.noConflict = function() { global.my.name.spaced.module = current; return exports; }; + })(); +}(this, (function (exports) { 'use strict'; + + function doThings() { + console.log( 'doing things...' ); + } + + const number = 42; + + var setting = 'no'; + + exports.doThings = doThings; + exports.number = number; + exports.setting = setting; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/test/form/umd-noconflict-namespaced/main.js b/test/form/umd-noconflict-namespaced/main.js new file mode 100644 index 00000000000..136039af646 --- /dev/null +++ b/test/form/umd-noconflict-namespaced/main.js @@ -0,0 +1,7 @@ +export function doThings() { + console.log( 'doing things...' ); +} + +export const number = 42; + +export var setting = 'no'; diff --git a/test/form/umd-noconflict/_expected/umd.js b/test/form/umd-noconflict/_expected/umd.js index bd4d5a9673a..060ddcd4e69 100644 --- a/test/form/umd-noconflict/_expected/umd.js +++ b/test/form/umd-noconflict/_expected/umd.js @@ -3,7 +3,8 @@ typeof define === 'function' && define.amd ? define(['exports'], factory) : (function() { var current = global.FooBar; - var exports = factory((global.FooBar = {})); + var exports = (global.FooBar = {}); + factory(exports); global.FooBar = exports; exports.noConflict = function() { global.FooBar = current; return exports; }; })();