fixturio
Version:
Fixtures
39 lines (38 loc) • 1.28 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.dependencyResolver = void 0;
function dependencyResolver(input) {
const keyMap = {};
const result = [];
input.forEach((node) => {
if (keyMap[node.key]) {
throw new Error(`Duplicate key found: ${node.key}`);
}
keyMap[node.key] = node;
});
const visit = (key, ancestors) => {
if (ancestors.has(key) === true) {
throw new Error(`Circular dependency detected: ${[...ancestors, key].join(' -> ')}`);
}
const node = keyMap[key];
if (node === undefined) {
throw new Error(`Dependency not found: ${key}`);
}
ancestors.add(key);
if (new Set(node.dependencies).size !== node.dependencies.length) {
throw new Error(`Dependencies are not unique for key: ${key}`);
}
for (const dependency of node.dependencies) {
visit(dependency, ancestors);
}
ancestors.delete(key);
if (result.includes(key) === false) {
result.push(key);
}
};
for (const key of Object.keys(keyMap)) {
visit(key, new Set());
}
return result;
}
exports.dependencyResolver = dependencyResolver;