From 23e0f695595c0a9a8ee44ed1a354d9e0359ef17e Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 26 May 2015 17:48:05 -0400 Subject: [PATCH] fix finalisers --- src/Bundle.js | 1 - src/finalisers/amd.js | 7 ++++-- src/finalisers/es6.js | 25 ++++++++++++++++--- src/finalisers/iife.js | 29 +++++++++++++++++++--- src/finalisers/umd.js | 23 +++++++++++++---- test/form/export-default/_config.js | 7 ++++++ test/form/export-default/_expected/amd.js | 7 ++++++ test/form/export-default/_expected/cjs.js | 5 ++++ test/form/export-default/_expected/es6.js | 3 +++ test/form/export-default/_expected/iife.js | 7 ++++++ test/form/export-default/_expected/umd.js | 11 ++++++++ test/form/export-default/main.js | 1 + test/test.js | 6 +++-- 13 files changed, 116 insertions(+), 16 deletions(-) create mode 100644 test/form/export-default/_config.js create mode 100644 test/form/export-default/_expected/amd.js create mode 100644 test/form/export-default/_expected/cjs.js create mode 100644 test/form/export-default/_expected/es6.js create mode 100644 test/form/export-default/_expected/iife.js create mode 100644 test/form/export-default/_expected/umd.js create mode 100644 test/form/export-default/main.js diff --git a/src/Bundle.js b/src/Bundle.js index 6583efc..c1e2ef1 100644 --- a/src/Bundle.js +++ b/src/Bundle.js @@ -97,7 +97,6 @@ export default class Bundle { this.statements = statements; this.deconflict(); }); - } deconflict () { diff --git a/src/finalisers/amd.js b/src/finalisers/amd.js index a81221e..0fae690 100644 --- a/src/finalisers/amd.js +++ b/src/finalisers/amd.js @@ -23,13 +23,16 @@ export default function amd ( bundle, magicString, exportMode, options ) { if ( exportMode === 'default' ) { exportBlock = `return ${bundle.entryModule.getCanonicalName('default')};`; } else { - exportBlock = '\n\n' + Object.keys( exports ).map( name => { + exportBlock = Object.keys( exports ).map( name => { return `exports.${name} = ${exports[name].localName};`; }).join( '\n' ); } + if ( exportBlock ) { + magicString.append( '\n\n' + exportBlock ); + } + return magicString - .append( exportBlock ) .trim() .indent() .append( '\n\n});' ) diff --git a/src/finalisers/es6.js b/src/finalisers/es6.js index f88ea40..b7a2620 100644 --- a/src/finalisers/es6.js +++ b/src/finalisers/es6.js @@ -1,7 +1,26 @@ +import { keys } from '../utils/object'; + export default function es6 ( bundle, magicString, exportMode, options ) { - // TODO - const introBlock = ''; - const exportBlock = ''; + const introBlock = ''; // TODO... + + const exports = bundle.entryModule.exports; + const exportBlock = keys( exports ).map( exportedName => { + const specifier = exports[ exportedName ]; + + const canonicalName = bundle.entryModule.getCanonicalName( specifier.localName ); + + if ( exportedName === 'default' ) { + return `export default ${canonicalName};`; + } + + return exportedName === canonicalName ? + `export { ${exportedName} };` : + `export { ${canonicalName} as ${exportedName} };`; + }).join( '\n' ); + + if ( exportBlock ) { + magicString.append( '\n\n' + exportBlock ); + } return magicString.trim(); } diff --git a/src/finalisers/iife.js b/src/finalisers/iife.js index 39aadc2..da006ae 100644 --- a/src/finalisers/iife.js +++ b/src/finalisers/iife.js @@ -1,10 +1,33 @@ +import { has } from '../utils/object'; +import { getName } from '../utils/map-helpers'; + export default function iife ( bundle, magicString, exportMode, options ) { + const globalNames = options.globals || {}; + + let dependencies = bundle.externalModules.map( module => { + return has( globalNames, module.id ) ? globalNames[ module.id ] : module.name; + }); + + let args = bundle.externalModules.map( getName ); + + if ( exportMode !== 'none' && !options.moduleName ) { + throw new Error( 'You must supply options.moduleName for IIFE bundles' ); + } + + if ( exportMode === 'named' ) { + dependencies.unshift( `(window.${options.moduleName} = {})` ); + args.unshift( 'exports' ); + } + + let intro = `(function (${args}) { 'use strict';\n\n`; + let outro = `\n\n})(${dependencies});`; - const intro = `(function () { 'use strict';\n\n`; - const outro = `\n\n})();`; + if ( exportMode === 'default' ) { + intro = `var ${options.moduleName} = ${intro}`; + magicString.append( `\n\nreturn ${bundle.entryModule.getCanonicalName('default')};` ); + } return magicString - .trim() .indent() .prepend( intro ) .append( outro ); diff --git a/src/finalisers/umd.js b/src/finalisers/umd.js index 53eba7e..54be34f 100644 --- a/src/finalisers/umd.js +++ b/src/finalisers/umd.js @@ -26,23 +26,36 @@ export default function umd ( bundle, magicString, exportMode, options ) { ( has( options, 'moduleId' ) ? `['${options.moduleId}'], ` : `` ) + ( amdDeps.length ? `[${amdDeps.join( ', ' )}], ` : `` ); + const defaultExport = exportMode === 'default' ? `global.${options.moduleName} = ` : ''; + const intro = `(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(${cjsDeps.join( ', ' )}) : typeof define === 'function' && define.amd ? define(${amdParams}factory) : - factory(${globalDeps}); + ${defaultExport}factory(${globalDeps}); }(this, function (${args}) { 'use strict'; `.replace( /^\t\t/gm, '' ).replace( /^\t/gm, indentStr ); const exports = bundle.entryModule.exports; - const exportBlock = '\n\n' + Object.keys( exports ).map( name => { - return `exports.${name} = ${exports[name].localName};`; - }).join( '\n' ); + let exportBlock; + + if ( exportMode === 'default' ) { + const canonicalName = bundle.entryModule.getCanonicalName( 'default' ); + exportBlock = `return ${canonicalName};`; + } else { + exportBlock = Object.keys( exports ).map( name => { + const canonicalName = bundle.entryModule.getCanonicalName( exports[ name ].localName ); + return `exports.${name} = ${canonicalName};`; + }).join( '\n' ); + } + + if ( exportBlock ) { + magicString.append( '\n\n' + exportBlock ); + } return magicString - .append( exportBlock ) .trim() .indent() .append( '\n\n}));' ) diff --git a/test/form/export-default/_config.js b/test/form/export-default/_config.js new file mode 100644 index 0000000..64c8831 --- /dev/null +++ b/test/form/export-default/_config.js @@ -0,0 +1,7 @@ +module.exports = { + description: 'single (default) exports', + options: { + moduleName: 'myBundle' + } + // solo: true +}; diff --git a/test/form/export-default/_expected/amd.js b/test/form/export-default/_expected/amd.js new file mode 100644 index 0000000..37d2571 --- /dev/null +++ b/test/form/export-default/_expected/amd.js @@ -0,0 +1,7 @@ +define(function () { 'use strict'; + + var main = 42; + + return main; + +}); diff --git a/test/form/export-default/_expected/cjs.js b/test/form/export-default/_expected/cjs.js new file mode 100644 index 0000000..5a370cd --- /dev/null +++ b/test/form/export-default/_expected/cjs.js @@ -0,0 +1,5 @@ +'use strict'; + +var main = 42; + +module.exports = main; diff --git a/test/form/export-default/_expected/es6.js b/test/form/export-default/_expected/es6.js new file mode 100644 index 0000000..d862de8 --- /dev/null +++ b/test/form/export-default/_expected/es6.js @@ -0,0 +1,3 @@ +var main = 42; + +export default main; diff --git a/test/form/export-default/_expected/iife.js b/test/form/export-default/_expected/iife.js new file mode 100644 index 0000000..b7b15ee --- /dev/null +++ b/test/form/export-default/_expected/iife.js @@ -0,0 +1,7 @@ +var myBundle = (function () { 'use strict'; + + var main = 42; + + return main; + +})(); diff --git a/test/form/export-default/_expected/umd.js b/test/form/export-default/_expected/umd.js new file mode 100644 index 0000000..667a50c --- /dev/null +++ b/test/form/export-default/_expected/umd.js @@ -0,0 +1,11 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory() : + typeof define === 'function' && define.amd ? define(factory) : + global.myBundle = factory(); +}(this, function () { 'use strict'; + + var main = 42; + + return main; + +})); diff --git a/test/form/export-default/main.js b/test/form/export-default/main.js new file mode 100644 index 0000000..7a4e8a7 --- /dev/null +++ b/test/form/export-default/main.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/test.js b/test/test.js index 5f71f6e..bc41a61 100644 --- a/test/test.js +++ b/test/test.js @@ -155,9 +155,11 @@ describe( 'rollup', function () { PROFILES.forEach( function ( profile ) { ( config.skip ? it.skip : config.solo ? it.only : it )( 'generates ' + profile.format, function () { return bundlePromise.then( function ( bundle ) { - var actual = bundle.generate({ + var options = extend( {}, config.options, { format: profile.format - }).code.trim(); + }); + + var actual = bundle.generate( options ).code.trim(); try { var expected = sander.readFileSync( FORM, dir, '_expected', profile.format + '.js' ).toString().trim();