in src/core/moduleManager.ts [859:935]
private _resolve(module: Module): void {
let dependencies = module.dependencies;
if (dependencies) {
for (let i = 0, len = dependencies.length; i < len; i++) {
let dependency = dependencies[i];
if (dependency === RegularDependency.EXPORTS) {
module.exportsPassedIn = true;
module.unresolvedDependenciesCount--;
continue;
}
if (dependency === RegularDependency.MODULE) {
module.unresolvedDependenciesCount--;
continue;
}
if (dependency === RegularDependency.REQUIRE) {
module.unresolvedDependenciesCount--;
continue;
}
let dependencyModule = this._modules2[dependency.id];
if (dependencyModule && dependencyModule.isComplete()) {
if (dependencyModule.error) {
module.onDependencyError(dependencyModule.error);
return;
}
module.unresolvedDependenciesCount--;
continue;
}
if (this._hasDependencyPath(dependency.id, module.id)) {
this._hasDependencyCycle = true;
console.warn('There is a dependency cycle between \'' + this._moduleIdProvider.getStrModuleId(dependency.id) + '\' and \'' + this._moduleIdProvider.getStrModuleId(module.id) + '\'. The cyclic path follows:');
let cyclePath = this._findCyclePath(dependency.id, module.id, 0) || [];
cyclePath.reverse();
cyclePath.push(dependency.id);
console.warn(cyclePath.map(id => this._moduleIdProvider.getStrModuleId(id)).join(' => \n'));
// Break the cycle
module.unresolvedDependenciesCount--;
continue;
}
// record inverse dependency
this._inverseDependencies2[dependency.id] = this._inverseDependencies2[dependency.id] || [];
this._inverseDependencies2[dependency.id]!.push(module.id);
if (dependency instanceof PluginDependency) {
let plugin = this._modules2[dependency.pluginId];
if (plugin && plugin.isComplete()) {
this._loadPluginDependency(plugin.exports, dependency);
continue;
}
// Record dependency for when the plugin gets loaded
let inversePluginDeps: PluginDependency[] = this._inversePluginDependencies2.get(dependency.pluginId);
if (!inversePluginDeps) {
inversePluginDeps = [];
this._inversePluginDependencies2.set(dependency.pluginId, inversePluginDeps);
}
inversePluginDeps.push(dependency);
this._loadModule(dependency.pluginId);
continue;
}
this._loadModule(dependency.id);
}
}
if (module.unresolvedDependenciesCount === 0) {
this._onModuleComplete(module);
}
}