Browse Source

More tests pass

* Move `name` definition closer to usage.
* Fixed mistake where `locals` should have been `exports`
gh-109
Oskar Segersvärd 9 years ago
parent
commit
3b6977f590
  1. 21
      src/ExternalModule.js
  2. 17
      src/Module.js
  3. 6
      src/finalisers/es6.js
  4. 2
      src/finalisers/shared/getInteropBlock.js

21
src/ExternalModule.js

@ -11,8 +11,6 @@ export default class ExternalModule {
this.isExternal = true;
this.importedByBundle = [];
this.needsDefault = false;
// Invariant: needsNamed and needsAll are never both true at once.
// Because an import with both a namespace and named import is invalid:
//
@ -21,21 +19,17 @@ export default class ExternalModule {
this.needsNamed = false;
this.needsAll = false;
bundle.scope.define( this.originalName, this );
this.exports = bundle.scope.virtual();
const { lookup, reference } = this.exports;
const { reference } = this.exports;
// Override reference.
this.exports.reference = name => {
if ( name === 'default' ) {
this.needsDefault = true;
return bundle.scope.reference( this.originalName );
if ( name !== 'default' ) {
this.needsNamed = true;
}
if ( !this.exports.defines( name ) ) {
this.needsNamed = true;
this.exports.define( name, {
originalName: name,
name,
@ -46,14 +40,5 @@ export default class ExternalModule {
return reference.call( this.exports, name );
};
// Override lookup.
this.exports.lookup = name => {
if ( name === 'default' ) {
return this;
}
return lookup.call( this.exports, name );
};
}
}

17
src/Module.js

@ -14,7 +14,7 @@ function isEmptyExportedVarDeclaration ( node, exports, toExport ) {
const id = exports.lookup( name );
return !~toExport.indexOf( id.name );
return id.name in toExport;
}
function removeSourceMappingURLComments ( source, magicString ) {
@ -172,7 +172,6 @@ export default class Module {
const isDefault = specifier.type === 'ImportDefaultSpecifier';
const isNamespace = specifier.type === 'ImportNamespaceSpecifier';
const name = isDefault ? 'default' : specifier.imported.name;
const localName = specifier.local.name;
if ( this.locals.defines( localName ) ) {
@ -186,6 +185,8 @@ export default class Module {
// If it's a namespace import, we bind the localName to the module itself.
this.locals.bind( localName, module );
} else {
const name = isDefault ? 'default' : specifier.imported.name;
this.locals.bind( localName, module.exports.reference( name ) );
// For compliance with earlier Rollup versions.
@ -296,7 +297,7 @@ export default class Module {
statement.node.specifiers.forEach( specifier => {
let name = specifier.exported.name;
let id = this.locals.lookup( name );
let id = this.exports.lookup( name );
addDependency( strongDependencies, id );
});
@ -534,10 +535,10 @@ export default class Module {
.forEach( name => {
const id = this.locals.lookup( name );
// HACK: We check that `id` isn't its own module,
// since that is the case for external defaults.
if ( id.module && id !== id.module && id.module.isExternal ) {
replacements[ name ] = `${id.module.name}.${id.originalName}`;
if ( id.module && id.module.isExternal ) {
replacements[ name ] = id.originalName === 'default' ?
`${id.module.name}['default']` :
`${id.module.name}.${id.originalName}`;
}
});
}
@ -549,7 +550,7 @@ export default class Module {
if ( toExport[ bundleName ] ) {
bundleExports[ name ] = replacements[ name ] = toExport[ bundleName ];
} else if ( bundleName !== name ) { // TODO weird structure
} else if ( bundleName !== name && !replacements[ name ] ) { // TODO weird structure
replacements[ name ] = bundleName;
}
});

6
src/finalisers/es6.js

@ -19,8 +19,10 @@ export default function es6 ( bundle, magicString ) {
.map( module => {
const specifiers = [];
if ( module.needsDefault ) {
specifiers.push( module.exports.lookup( 'default' ).name );
const id = module.exports.lookup( 'default' );
if ( id ) {
specifiers.push( id.name );
}
if ( module.needsAll ) {

2
src/finalisers/shared/getInteropBlock.js

@ -1,7 +1,7 @@
export default function getInteropBlock ( bundle ) {
return bundle.externalModules
.map( module => {
if ( !module.needsDefault ) return;
if ( !module.exports.inScope( 'default' ) ) return;
if ( module.needsNamed ) {
return `var ${module.name}__default = 'default' in ${module.name} ? ${module.name}['default'] : ${module.name};`;

Loading…
Cancel
Save