Browse Source

Merge pull request #692 from rollup/non-string-ids

allow resolved module IDs to be non-strings
ghi-672
Rich Harris 8 years ago
parent
commit
7a03bf0583
  1. 84
      src/Bundle.js
  2. 16
      src/Module.js
  3. 15
      test/function/custom-resolver-non-string/_config.js
  4. 2
      test/function/custom-resolver-non-string/main.js

84
src/Bundle.js

@ -54,7 +54,7 @@ export default class Bundle {
.map( plugin => plugin.transformBundle )
.filter( Boolean );
this.moduleById = blank();
this.moduleById = new Map();
this.modules = [];
this.externalModules = [];
@ -164,8 +164,8 @@ export default class Bundle {
fetchModule ( id, importer ) {
// short-circuit cycles
if ( id in this.moduleById ) return null;
this.moduleById[ id ] = null;
if ( this.moduleById.has( id ) ) return null;
this.moduleById.set( id, null );
return this.load( id )
.catch( err => {
@ -188,7 +188,7 @@ export default class Bundle {
const module = new Module({ id, code, originalCode, ast, sourceMapChain, bundle: this });
this.modules.push( module );
this.moduleById[ id ] = module;
this.moduleById.set( id, module );
return this.fetchAllDependencies( module ).then( () => module );
});
@ -198,47 +198,53 @@ export default class Bundle {
return mapSequence( module.sources, source => {
return this.resolveId( source, module.id )
.then( resolvedId => {
let externalName;
if ( resolvedId ) {
// If the `resolvedId` is supposed to be external, make it so.
externalName = resolvedId.replace( /[\/\\]/g, '/' );
} else if ( isRelative( source ) ) {
// This could be an external, relative dependency, based on the current module's parent dir.
externalName = resolve( module.id, '..', source );
}
const forcedExternal = externalName && this.isExternal( externalName );
if ( !resolvedId || forcedExternal ) {
let normalizedExternal = source;
if ( !forcedExternal ) {
if ( isRelative( source ) ) throw new Error( `Could not resolve ${source} from ${module.id}` );
if ( !this.isExternal( source ) ) this.onwarn( `Treating '${source}' as external dependency` );
} else if ( resolvedId ) {
if ( isRelative(resolvedId) || isAbsolute(resolvedId) ) {
// Try to deduce relative path from entry dir if resolvedId is defined as a relative path.
normalizedExternal = this.getPathRelativeToEntryDirname( resolvedId );
} else {
normalizedExternal = resolvedId;
}
module.resolvedIds[ source ] = resolvedId;
if ( !resolvedId || typeof resolvedId === 'string' ) {
let externalName;
if ( resolvedId ) {
// If the `resolvedId` is supposed to be external, make it so.
externalName = resolvedId.replace( /[\/\\]/g, '/' );
} else if ( isRelative( source ) ) {
// This could be an external, relative dependency, based on the current module's parent dir.
externalName = resolve( module.id, '..', source );
}
module.resolvedIds[ source ] = normalizedExternal;
if ( !this.moduleById[ normalizedExternal ] ) {
const module = new ExternalModule( normalizedExternal );
this.externalModules.push( module );
this.moduleById[ normalizedExternal ] = module;
}
}
const forcedExternal = externalName && this.isExternal( externalName );
if ( !resolvedId || forcedExternal ) {
let normalizedExternal = source;
if ( !forcedExternal ) {
if ( isRelative( source ) ) throw new Error( `Could not resolve ${source} from ${module.id}` );
if ( !this.isExternal( source ) ) this.onwarn( `Treating '${source}' as external dependency` );
} else if ( resolvedId ) {
if ( isRelative(resolvedId) || isAbsolute(resolvedId) ) {
// Try to deduce relative path from entry dir if resolvedId is defined as a relative path.
normalizedExternal = this.getPathRelativeToEntryDirname( resolvedId );
} else {
normalizedExternal = resolvedId;
}
}
else {
if ( resolvedId === module.id ) {
throw new Error( `A module cannot import itself (${resolvedId})` );
// overwrite existing
module.resolvedIds[ source ] = normalizedExternal;
if ( !this.moduleById.has( normalizedExternal ) ) {
const module = new ExternalModule( normalizedExternal );
this.externalModules.push( module );
this.moduleById.set( normalizedExternal, module );
}
return null;
}
}
module.resolvedIds[ source ] = resolvedId;
return this.fetchModule( resolvedId, module.id );
if ( resolvedId === module.id ) {
throw new Error( `A module cannot import itself (${resolvedId})` );
}
return this.fetchModule( resolvedId, module.id );
});
});
}

16
src/Module.js

@ -191,10 +191,14 @@ export default class Module {
}
basename () {
const base = basename( this.id );
const ext = extname( this.id );
if ( typeof this.id === 'string' ) {
const base = basename( this.id );
const ext = extname( this.id );
return makeLegalIdentifier( ext ? base.slice( 0, -ext.length ) : base );
return makeLegalIdentifier( ext ? base.slice( 0, -ext.length ) : base );
}
return 'module';
}
bindAliases () {
@ -224,18 +228,18 @@ export default class Module {
const specifier = specifiers[ name ];
const id = this.resolvedIds[ specifier.source ];
specifier.module = this.bundle.moduleById[ id ];
specifier.module = this.bundle.moduleById.get( id );
});
});
this.exportAllModules = this.exportAllSources.map( source => {
const id = this.resolvedIds[ source ];
return this.bundle.moduleById[ id ];
return this.bundle.moduleById.get( id );
});
this.sources.forEach( source => {
const id = this.resolvedIds[ source ];
const module = this.bundle.moduleById[ id ];
const module = this.bundle.moduleById.get( id );
if ( !module.isExternal ) this.dependencies.push( module );
});

15
test/function/custom-resolver-non-string/_config.js

@ -0,0 +1,15 @@
const FOO = {};
module.exports = {
description: 'allows resolveId to return a non-string',
options: {
plugins: [{
resolveId: importee => {
if ( importee === 'foo' ) return FOO;
},
load: id => {
if ( id === FOO ) return 'export default 42';
}
}]
}
};

2
test/function/custom-resolver-non-string/main.js

@ -0,0 +1,2 @@
import foo from 'foo';
assert.equal( foo, 42 );
Loading…
Cancel
Save