Skip to content

Commit

Permalink
Merge pull request #1747 from adrianheine/master
Browse files Browse the repository at this point in the history
Use globals map for export name
  • Loading branch information
lukastaegert committed Dec 5, 2017
2 parents bcfa1bb + ab232a3 commit d92f072
Show file tree
Hide file tree
Showing 10 changed files with 84 additions and 27 deletions.
17 changes: 3 additions & 14 deletions src/finalisers/iife.js
Expand Up @@ -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 ) {
Expand Down Expand Up @@ -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}));`;
Expand Down
22 changes: 22 additions & 0 deletions 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';
}
}
16 changes: 3 additions & 13 deletions src/finalisers/umd.js
Expand Up @@ -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( '.' );

Expand Down Expand Up @@ -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' );
}
Expand All @@ -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';` : ``;

Expand Down
10 changes: 10 additions & 0 deletions 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'
}
}
};
@@ -0,0 +1,8 @@
define(['leaflet'], function (L) { 'use strict';

L = L && L.hasOwnProperty('default') ? L['default'] : L;

L.terminator = function(options) {
};

});
@@ -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) {
};
@@ -0,0 +1,4 @@
import L from 'leaflet';

L.terminator = function(options) {
};
10 changes: 10 additions & 0 deletions 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));
12 changes: 12 additions & 0 deletions 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) {
};

})));
4 changes: 4 additions & 0 deletions test/form/samples/use-global-map-for-export-name/main.js
@@ -0,0 +1,4 @@
import L from 'leaflet';

L.terminator = function(options) {
};

0 comments on commit d92f072

Please sign in to comment.