diff --git a/src/Bundle.js b/src/Bundle.js index 07348aada5a..0d422f82dec 100644 --- a/src/Bundle.js +++ b/src/Bundle.js @@ -169,7 +169,18 @@ export default class Bundle { if ( declaration.isNamespace ) { declaration.needsNamespaceBlock = true; } - } ); + }); + + entryModule.getReexports().forEach( name => { + const declaration = entryModule.traceExport( name ); + + if ( declaration.isExternal ) { + declaration.reexported = declaration.module.reexported = true; + } else { + declaration.exportName = name; + declaration.activate(); + } + }); // mark statements that should appear in the bundle if ( this.treeshake ) { @@ -211,7 +222,7 @@ export default class Bundle { this.externalModules.forEach( module => { const unused = Object.keys( module.declarations ) .filter( name => name !== '*' ) - .filter( name => !module.declarations[ name ].activated ); + .filter( name => !module.declarations[ name ].activated && !module.declarations[ name ].reexported ); if ( unused.length === 0 ) return; @@ -471,7 +482,7 @@ export default class Bundle { } } ); - if ( !magicString.toString().trim() && this.entryModule.getExports().length === 0 ) { + if ( !magicString.toString().trim() && this.entryModule.getExports().length === 0 && this.entryModule.getReexports().length === 0 ) { this.warn( { code: 'EMPTY_BUNDLE', message: 'Generated an empty bundle' diff --git a/src/Declaration.js b/src/Declaration.js index 8c6503b4bfe..2470af4ba37 100644 --- a/src/Declaration.js +++ b/src/Declaration.js @@ -48,7 +48,7 @@ export class SyntheticNamespaceDeclaration { this.needsNamespaceBlock = false; this.originals = blank(); - module.getExports().forEach( name => { + module.getExports().concat( module.getReexports() ).forEach( name => { this.originals[ name ] = module.traceExport( name ); }); } diff --git a/src/Module.js b/src/Module.js index 4a1cf1fa0e8..f44638c8cba 100644 --- a/src/Module.js +++ b/src/Module.js @@ -303,28 +303,28 @@ export default class Module { } getExports () { - const exports = blank(); + return keys( this.exports ); + } - keys( this.exports ).forEach( name => { - exports[ name ] = true; - } ); + getReexports () { + const reexports = blank(); keys( this.reexports ).forEach( name => { - exports[ name ] = true; + reexports[ name ] = true; } ); this.exportAllModules.forEach( module => { if ( module.isExternal ) { - exports[ `*${module.id}` ] = true; + reexports[ `*${module.id}` ] = true; return; } - module.getExports().forEach( name => { - if ( name !== 'default' ) exports[ name ] = true; + module.getExports().concat( module.getReexports() ).forEach( name => { + if ( name !== 'default' ) reexports[ name ] = true; } ); } ); - return keys( exports ); + return keys( reexports ); } namespace () { diff --git a/src/finalisers/cjs.js b/src/finalisers/cjs.js index cb571c27d48..f57f409bf16 100644 --- a/src/finalisers/cjs.js +++ b/src/finalisers/cjs.js @@ -31,7 +31,9 @@ export default function cjs ( bundle, magicString, { exportMode, intro, outro }, const activated = Object.keys( module.declarations ) .filter( name => module.declarations[ name ].activated ); - return activated.length ? + const needsVar = activated.length || module.reexported; + + return needsVar ? `${varOrConst} ${module.name} = require('${module.path}');` : `require('${module.path}');`; } diff --git a/src/finalisers/es.js b/src/finalisers/es.js index c0c367a39fd..87930beafa9 100644 --- a/src/finalisers/es.js +++ b/src/finalisers/es.js @@ -62,7 +62,7 @@ export default function es ( bundle, magicString, { intro, outro } ) { const exportAllDeclarations = []; - const specifiers = module.getExports() + const specifiers = module.getExports().concat( module.getReexports() ) .filter( notDefault ) .map( name => { const declaration = module.traceExport( name ); diff --git a/src/finalisers/shared/getExportBlock.js b/src/finalisers/shared/getExportBlock.js index 0345dd64e79..70c2f65fa74 100644 --- a/src/finalisers/shared/getExportBlock.js +++ b/src/finalisers/shared/getExportBlock.js @@ -5,7 +5,7 @@ export default function getExportBlock ( bundle, exportMode, mechanism = 'return return `${mechanism} ${entryModule.traceExport( 'default' ).getName( false )};`; } - return entryModule.getExports() + const exports = entryModule.getExports().concat( entryModule.getReexports() ) .map( name => { if ( name[0] === '*' ) { // export all from external @@ -27,7 +27,9 @@ export default function getExportBlock ( bundle, exportMode, mechanism = 'return if ( lhs === rhs ) return null; return `${lhs} = ${rhs};`; - }) + }); + + return exports .filter( Boolean ) .join( '\n' ); }