in src/npm.ts [112:155]
function selectYarnDependencies(deps: YarnDependency[], packagedDependencies: string[]): YarnDependency[] {
const index = new (class {
private data: { [name: string]: YarnDependency } = Object.create(null);
constructor() {
for (const dep of deps) {
if (this.data[dep.name]) {
throw Error(`Dependency seen more than once: ${dep.name}`);
}
this.data[dep.name] = dep;
}
}
find(name: string): YarnDependency {
let result = this.data[name];
if (!result) {
throw new Error(`Could not find dependency: ${name}`);
}
return result;
}
})();
const reached = new (class {
values: YarnDependency[] = [];
add(dep: YarnDependency): boolean {
if (this.values.indexOf(dep) < 0) {
this.values.push(dep);
return true;
}
return false;
}
})();
const visit = (name: string) => {
let dep = index.find(name);
if (!reached.add(dep)) {
// already seen -> done
return;
}
for (const child of dep.children) {
visit(child.name);
}
};
packagedDependencies.forEach(visit);
return reached.values;
}