@notjustcoders/ioc-arise
Version:
Arise type-safe IoC containers from your code. Zero overhead, zero coupling.
46 lines • 1.78 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DependencyResolver = void 0;
const topological_sorter_1 = require("../utils/topological-sorter");
class DependencyResolver {
constructor(classes) {
this.classes = classes;
}
resolve() {
const graph = this.buildDependencyGraph();
return topological_sorter_1.TopologicalSorter.sort(graph);
}
buildDependencyGraph() {
const graph = {};
const classNames = new Set(this.classes.map(c => c.name));
// Create interface-to-class mapping
const interfaceToClassMap = new Map();
for (const classInfo of this.classes) {
if (classInfo.interfaceName) {
interfaceToClassMap.set(classInfo.interfaceName, classInfo.name);
}
}
for (const classInfo of this.classes) {
const managedDependencies = [];
for (const dep of classInfo.dependencies) {
// Check if dependency is a direct class name
if (classNames.has(dep.name)) {
managedDependencies.push(dep.name);
}
// Check if dependency is an interface that maps to a managed class
else if (interfaceToClassMap.has(dep.name)) {
const implementingClass = interfaceToClassMap.get(dep.name);
managedDependencies.push(implementingClass);
}
}
graph[classInfo.name] = managedDependencies;
}
return graph;
}
detectCircularDependencies() {
const result = this.resolve();
return result.cycles;
}
}
exports.DependencyResolver = DependencyResolver;
//# sourceMappingURL=dependency-resolver.js.map