@feature-hub/core
Version:
Create scalable web applications using micro frontends.
30 lines • 1.43 kB
JavaScript
import toposort from 'toposort';
function createTuple(first) {
return (second) => [first, second];
}
function createDependencyEdges(dependentName, dependencies) {
return Object.keys(dependencies).map(createTuple(dependentName));
}
function createAllDependencyEdges(dependencyGraph) {
return Array.from(dependencyGraph.keys()).reduce((allDependencyEdges, dependencyName) => {
const dependencies = dependencyGraph.get(dependencyName);
/* istanbul ignore next */
if (!dependencies) {
return allDependencyEdges;
}
const dependencyEdges = createDependencyEdges(dependencyName, dependencies);
return [...allDependencyEdges, ...dependencyEdges];
}, []);
}
export function toposortDependencies(dependencyGraph) {
const dependencyNames = Array.from(dependencyGraph.keys());
const dependencyEdges = createAllDependencyEdges(dependencyGraph);
const sortedDependencyNames = toposort(dependencyEdges);
// Add modules that are not part of sortedDependencyNames because they
// don't have dependencies and are not a dependency.
sortedDependencyNames.push(...dependencyNames.filter((dependencyName) => dependencyGraph.has(dependencyName) &&
sortedDependencyNames.indexOf(dependencyName) === -1));
// Reverse array to yield execution order.
return sortedDependencyNames.reverse();
}
//# sourceMappingURL=toposort-dependencies.js.map