function hasCircularDependency(config) {
const visited = new Set();
const checked = new Set();
for (const node of Object.keys(config)) {
if (checked.has(node)) continue;
const stack = [[node, new Set([node])]];
while (stack.length > 0) {
const [current, path] = stack.pop();
const deps = config[current].deps;
for (const dep of deps) {
if (path.has(dep)) {
return true;
}
if (!checked.has(dep) && !visited.has(dep)) {
const newPath = new Set(path);
newPath.add(dep);
stack.push([dep, newPath]);
visited.add(dep);
}
}
checked.add(current);
visited.delete(current);
}
}
return false;
}
console.log(hasCircularDependency({ "A": { deps: [] } }));
console.log(hasCircularDependency({ "A": { deps: ["A"] } }));
console.log(hasCircularDependency({
"A": { deps: ["B"] },
"B": { deps: ["A"] }
}));
console.log(hasCircularDependency({
"A": { deps: ["B"] },
"B": { deps: ["C"] },
"C": { deps: ["A"] }
}));
console.log(hasCircularDependency({
"A": { deps: ["B", "C"] },
"B": { deps: [] },
"C": { deps: [] }
}));