@typed/content-hash
Version:
Content hash a directory of HTML/JS/CSS files and other static assets
50 lines • 1.91 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getStronglyConnectedComponents = void 0;
const toDependencyMap_1 = require("./toDependencyMap");
function getStronglyConnectedComponents(graph) {
const indices = new Map();
const lowlinks = new Map();
const onStack = new Set();
const stack = [];
const stronglyConnectedComponents = [];
const dependencyMap = (0, toDependencyMap_1.toDependencyMap)(graph);
let index = 0;
for (const v of dependencyMap.keys()) {
if (!indices.has(v)) {
strongConnect(v);
}
}
return stronglyConnectedComponents;
function strongConnect(v) {
indices.set(v, index);
lowlinks.set(v, index++);
stack.push(v);
onStack.add(v);
const dependencies = dependencyMap.get(v);
if (dependencies) {
for (const dependency of dependencies) {
const hasNotBeenSeenBefore = !indices.has(dependency);
if (hasNotBeenSeenBefore) {
strongConnect(dependency);
}
if (hasNotBeenSeenBefore || onStack.has(dependency)) {
const depIndex = hasNotBeenSeenBefore ? lowlinks.get(dependency) : indices.get(dependency);
lowlinks.set(v, Math.min(lowlinks.get(v), depIndex));
}
}
}
if (lowlinks.get(v) === indices.get(v)) {
const vertices = new Set();
let current = null;
while (v !== current) {
current = stack.pop();
onStack.delete(current);
vertices.add(current);
}
stronglyConnectedComponents.push(Array.from(vertices));
}
}
}
exports.getStronglyConnectedComponents = getStronglyConnectedComponents;
//# sourceMappingURL=getStronglyConnectedComponents.js.map