diff --git a/src/finalisers/iife.js b/src/finalisers/iife.js index 2eacc14ddc8..592353f3ac5 100644 --- a/src/finalisers/iife.js +++ b/src/finalisers/iife.js @@ -3,23 +3,12 @@ import error from '../utils/error.js'; import getInteropBlock from './shared/getInteropBlock.js'; import getExportBlock from './shared/getExportBlock.js'; import getGlobalNameMaker from './shared/getGlobalNameMaker.js'; -import { property, keypath } from './shared/sanitize.js'; +import { keypath } from './shared/sanitize.js'; import warnOnBuiltins from './shared/warnOnBuiltins.js'; import trimEmptyImports from './shared/trimEmptyImports.js'; +import setupNamespace from './shared/setupNamespace.js'; import { isLegal } from '../utils/identifierHelpers.js'; -function setupNamespace ( keypath ) { - const parts = keypath.split( '.' ); - - parts.pop(); - - let acc = 'this'; - - return parts - .map( part => ( acc += property( part ), `${acc} = ${acc} || {};` ) ) - .join( '\n' ) + '\n'; -} - const thisProp = name => `this${keypath( name )}`; export default function iife ( bundle, magicString, { exportMode, indentString, intro, outro }, options ) { @@ -66,7 +55,7 @@ export default function iife ( bundle, magicString, { exportMode, indentString, } if ( isNamespaced ) { - wrapperIntro = setupNamespace( name ) + wrapperIntro; + wrapperIntro = setupNamespace( name, 'this', false, options.globals ) + wrapperIntro; } let wrapperOutro = `\n\n}(${dependencies}));`; diff --git a/src/finalisers/shared/setupNamespace.js b/src/finalisers/shared/setupNamespace.js new file mode 100644 index 00000000000..e6107b30eaf --- /dev/null +++ b/src/finalisers/shared/setupNamespace.js @@ -0,0 +1,22 @@ +import { property } from './sanitize.js'; + +export default function setupNamespace ( name, root, forAssignment, globals ) { + const parts = name.split( '.' ); + if (globals) { + parts[0] = (typeof globals === 'function' ? globals( parts[0] ) : globals[ parts[ 0 ] ]) || parts[0]; + } + + const last = parts.pop(); + + let acc = root; + if (forAssignment) { + return parts + .map( part => ( acc += property( part ), `${acc} = ${acc} || {}` ) ) + .concat( `${acc}${property( last )}` ) + .join( ', ' ); + } else { + return parts + .map( part => ( acc += property( part ), `${acc} = ${acc} || {};` ) ) + .join( '\n' ) + '\n'; + } +} diff --git a/src/finalisers/umd.js b/src/finalisers/umd.js index 049ea14c44d..ecf2de20b5c 100644 --- a/src/finalisers/umd.js +++ b/src/finalisers/umd.js @@ -7,23 +7,13 @@ import esModuleExport from './shared/esModuleExport.js'; import { property, keypath } from './shared/sanitize.js'; import warnOnBuiltins from './shared/warnOnBuiltins.js'; import trimEmptyImports from './shared/trimEmptyImports.js'; +import setupNamespace from './shared/setupNamespace.js'; function globalProp ( name ) { if ( !name ) return 'null'; return `global${ keypath( name ) }`; } -function setupNamespace ( name ) { - const parts = name.split( '.' ); - const last = property( parts.pop() ); - - let acc = 'global'; - return parts - .map( part => ( acc += property( part ), `${acc} = ${acc} || {}` ) ) - .concat( `${acc}${last}` ) - .join( ', ' ); -} - function safeAccess ( name ) { const parts = name.split( '.' ); @@ -57,7 +47,7 @@ export default function umd ( bundle, magicString, { exportMode, getPath, indent if ( exportMode === 'named' ) { amdDeps.unshift( `'exports'` ); cjsDeps.unshift( `exports` ); - globalDeps.unshift( `(${setupNamespace(options.name)} = ${options.extend ? `${globalProp(options.name)} || ` : '' }{})` ); + globalDeps.unshift( `(${setupNamespace(options.name, 'global', true, options.globals)} = ${options.extend ? `${globalProp(options.name)} || ` : '' }{})` ); args.unshift( 'exports' ); } @@ -71,7 +61,7 @@ export default function umd ( bundle, magicString, { exportMode, getPath, indent const define = amdOptions.define || 'define'; const cjsExport = exportMode === 'default' ? `module.exports = ` : ``; - const defaultExport = exportMode === 'default' ? `${setupNamespace(options.name)} = ` : ''; + const defaultExport = exportMode === 'default' ? `${setupNamespace(options.name, 'global', true, options.globals)} = ` : ''; const useStrict = options.strict !== false ? ` 'use strict';` : ``; diff --git a/test/form/samples/use-global-map-for-export-name/_config.js b/test/form/samples/use-global-map-for-export-name/_config.js new file mode 100644 index 00000000000..1e589caa2fa --- /dev/null +++ b/test/form/samples/use-global-map-for-export-name/_config.js @@ -0,0 +1,10 @@ +module.exports = { + description: 'applies globals to output name', + options: { + name: 'leaflet.terminator', + external: [ 'leaflet' ], + globals: { + 'leaflet': 'L' + } + } +}; diff --git a/test/form/samples/use-global-map-for-export-name/_expected/amd.js b/test/form/samples/use-global-map-for-export-name/_expected/amd.js new file mode 100644 index 00000000000..3ee270a88f1 --- /dev/null +++ b/test/form/samples/use-global-map-for-export-name/_expected/amd.js @@ -0,0 +1,8 @@ +define(['leaflet'], function (L) { 'use strict'; + + L = L && L.hasOwnProperty('default') ? L['default'] : L; + + L.terminator = function(options) { + }; + +}); diff --git a/test/form/samples/use-global-map-for-export-name/_expected/cjs.js b/test/form/samples/use-global-map-for-export-name/_expected/cjs.js new file mode 100644 index 00000000000..9a71b1060c9 --- /dev/null +++ b/test/form/samples/use-global-map-for-export-name/_expected/cjs.js @@ -0,0 +1,8 @@ +'use strict'; + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var L = _interopDefault(require('leaflet')); + +L.terminator = function(options) { +}; diff --git a/test/form/samples/use-global-map-for-export-name/_expected/es.js b/test/form/samples/use-global-map-for-export-name/_expected/es.js new file mode 100644 index 00000000000..183aab39a1d --- /dev/null +++ b/test/form/samples/use-global-map-for-export-name/_expected/es.js @@ -0,0 +1,4 @@ +import L from 'leaflet'; + +L.terminator = function(options) { +}; diff --git a/test/form/samples/use-global-map-for-export-name/_expected/iife.js b/test/form/samples/use-global-map-for-export-name/_expected/iife.js new file mode 100644 index 00000000000..5ba1f560aad --- /dev/null +++ b/test/form/samples/use-global-map-for-export-name/_expected/iife.js @@ -0,0 +1,10 @@ +this.L = this.L || {}; +(function (L) { + 'use strict'; + + L = L && L.hasOwnProperty('default') ? L['default'] : L; + + L.terminator = function(options) { + }; + +}(L)); diff --git a/test/form/samples/use-global-map-for-export-name/_expected/umd.js b/test/form/samples/use-global-map-for-export-name/_expected/umd.js new file mode 100644 index 00000000000..47e48e577f5 --- /dev/null +++ b/test/form/samples/use-global-map-for-export-name/_expected/umd.js @@ -0,0 +1,12 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('leaflet')) : + typeof define === 'function' && define.amd ? define(['leaflet'], factory) : + (factory(global.L)); +}(this, (function (L) { 'use strict'; + + L = L && L.hasOwnProperty('default') ? L['default'] : L; + + L.terminator = function(options) { + }; + +}))); diff --git a/test/form/samples/use-global-map-for-export-name/main.js b/test/form/samples/use-global-map-for-export-name/main.js new file mode 100644 index 00000000000..183aab39a1d --- /dev/null +++ b/test/form/samples/use-global-map-for-export-name/main.js @@ -0,0 +1,4 @@ +import L from 'leaflet'; + +L.terminator = function(options) { +};