|
|
|
|
|
|
|
export default class ExternalModule {
|
|
|
|
constructor ( { id, bundle } ) {
|
|
|
|
this.id = id;
|
|
|
|
|
|
|
|
// Implement `Identifier` interface.
|
|
|
|
this.originalName = id;
|
|
|
|
this.name = id;
|
|
|
|
this.module = this;
|
|
|
|
|
|
|
|
this.isExternal = true;
|
|
|
|
this.importedByBundle = [];
|
|
|
|
|
|
|
|
// Invariant: needsNamed and needsAll are never both true at once.
|
|
|
|
// Because an import with both a namespace and named import is invalid:
|
|
|
|
//
|
|
|
|
// import * as ns, { a } from '...'
|
|
|
|
//
|
|
|
|
this.needsNamed = false;
|
|
|
|
this.needsAll = false;
|
|
|
|
|
|
|
|
this.exports = bundle.scope.virtual();
|
|
|
|
|
|
|
|
const { reference } = this.exports;
|
|
|
|
|
|
|
|
// Override reference.
|
|
|
|
this.exports.reference = name => {
|
|
|
|
if ( name !== 'default' ) {
|
|
|
|
this.needsNamed = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !this.exports.defines( name ) ) {
|
|
|
|
this.exports.define( name, {
|
|
|
|
originalName: name,
|
|
|
|
name,
|
|
|
|
|
|
|
|
module: this
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return reference.call( this.exports, name );
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|