in src/core/moduleManager.ts [684:726]
private _hasDependencyPath(fromId: ModuleId, toId: ModuleId): boolean {
let from = this._modules2[fromId];
if (!from) {
return false;
}
let inQueue: boolean[] = [];
for (let i = 0, len = this._moduleIdProvider.getMaxModuleId(); i < len; i++) {
inQueue[i] = false;
}
let queue: Module[] = [];
// Insert 'from' in queue
queue.push(from);
inQueue[fromId] = true;
while (queue.length > 0) {
// Pop first inserted element of queue
let element = queue.shift()!;
let dependencies = element.dependencies;
if (dependencies) {
// Walk the element's dependencies
for (let i = 0, len = dependencies.length; i < len; i++) {
let dependency = dependencies[i];
if (dependency.id === toId) {
// There is a path to 'to'
return true;
}
let dependencyModule = this._modules2[dependency.id];
if (dependencyModule && !inQueue[dependency.id]) {
// Insert 'dependency' in queue
inQueue[dependency.id] = true;
queue.push(dependencyModule);
}
}
}
}
// There is no path to 'to'
return false;
}