Browse Source

Simplified `Scope.define`'s implementation by taking two arguments.

gh-109
Oskar Segersvärd 9 years ago
parent
commit
8945c3dd21
  1. 14
      src/Bundle.js
  2. 13
      src/ExternalModule.js
  3. 28
      src/Module.js
  4. 11
      src/Scope.js

14
src/Bundle.js

@ -29,8 +29,11 @@ export default class Bundle {
transform: ensureArray( options.transform )
};
// The global scope, and the bundle's internal scope.
this.globals = new Scope();
this.scope = new Scope( this.globals );
// Alias for entryModule.exports.
this.exports = null;
this.toExport = null;
@ -51,6 +54,7 @@ export default class Bundle {
.then( id => this.fetchModule( id ) )
.then( entryModule => {
this.entryModule = entryModule;
this.exports = entryModule.exports;
entryModule.markAllStatements( true );
this.markAllModifierStatements();
@ -200,10 +204,9 @@ export default class Bundle {
});
if ( format !== 'es6' && exportMode === 'named' ) {
keys( this.entryModule.exports )
.concat( keys( this.entryModule.reexports ) )
keys( this.exports.names )
.forEach( name => {
const canonicalName = this.traceExport( this.entryModule, name );
const canonicalName = this.exports.lookup( name ).name;
if ( isReassignedVarDeclaration[ canonicalName ] ) {
varExports[ name ] = true;
@ -221,12 +224,13 @@ export default class Bundle {
// since we're rewriting variable exports, we want to
// ensure we don't try and export them again at the bottom
this.toExport = this.entryModule.exports.usedNames();
this.toExport = keys( this.exports.names )
.filter( key => !varExports[ key ] );
let magicString = new MagicString.Bundle({ separator: '\n\n' });
this.orderedModules.forEach( module => {
const source = module.render( this.toExport, format );
const source = module.render( allBundleExports, format );
if ( source.toString().length ) {
magicString.addSource( source );
}

13
src/ExternalModule.js

@ -24,9 +24,16 @@ export default class ExternalModule {
// Override reference.
this.exports.reference = name => {
if ( !this.exports.defines( name ) ) {
this.exports.define({
originalName: name,
name,
let idName = name;
if (name === 'default' ) {
idName = this.name;
this.needsDefault = true;
}
this.exports.define( name, {
originalName: idName,
name: idName,
module: this
});

28
src/Module.js

@ -106,8 +106,7 @@ export default class Module {
// If the default export has an identifier, bind to it.
this.exports.bind( 'default', this.locals.reference( identifier ) );
} else {
// Define the default identifier.
const id = {
this.exports.define( this.name, {
originalName: 'default',
name: 'default',
@ -118,13 +117,7 @@ export default class Module {
isDeclaration,
isAnonymous,
isModified: false // in case of `export default foo; foo = somethingElse`
};
this.exports.define( id );
// Rename it to avoid generating the `default` identifier,
// which is invalid.
id.name = this.name;
});
}
}
@ -196,6 +189,15 @@ export default class Module {
this.locals.bind( localName, module );
} else {
this.locals.bind( localName, module.exports.reference( name ) );
// For compliance with earlier Rollup versions.
// If the module is external, and we access the default.
// Rewrite the module name, and the default name to the
// `localName` we use for it.
if ( module.isExternal && isDefault ) {
const id = module.exports.lookup( name );
module.name = id.name = localName;
}
}
});
}
@ -210,7 +212,7 @@ export default class Module {
// consolidate names that are defined/modified in this module
keys( statement.defines ).forEach( name => {
this.locals.define({
this.locals.define( name, {
originalName: name,
name,
@ -537,14 +539,16 @@ export default class Module {
.concat( keys( statement.defines ) )
.forEach( name => {
const bundleName = this.locals.lookup( name ).name;
console.log( name, bundleName, toExport[ bundleName ] );
if ( ~toExport.indexOf( bundleName ) ) {
bundleExports[ name ] = replacements[ name ] = bundleName;
if ( toExport[ bundleName ] ) {
bundleExports[ name ] = replacements[ name ] = toExport[ bundleName ];
} else if ( bundleName !== name ) { // TODO weird structure
replacements[ name ] = bundleName;
}
});
console.log( replacements );
statement.replaceIdentifiers( magicString, replacements, bundleExports );
// modify exports as necessary

11
src/Scope.js

@ -64,13 +64,10 @@ export default class Scope {
});
}
// Defines `name` in the scope. `name` must be a `string` or an `Identifier`.
define ( name ) {
if ( typeof name === 'string' ) {
this.ids[ this.index( name ) ] = new Identifier( name );
} else {
this.ids[ this.index( name.name ) ] = name;
}
// Defines `name` in the scope to be `id`.
// If no `id` is supplied, a plain `Identifier` is created.
define ( name, id = new Identifier( name ) ) {
this.ids[ this.index( name ) ] = id;
}
// TODO: rename! Too similar to `define`.

Loading…
Cancel
Save