@notjustcoders/ioc-arise
Version:
Arise type-safe IoC containers from your code. Zero overhead, zero coupling.
63 lines • 2.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ModuleDependencyResolver = void 0;
const shared_1 = require("../shared");
/**
* Responsible for resolving dependencies within and across modules.
* Handles both internal module dependencies and external module dependencies.
*/
class ModuleDependencyResolver {
constructor(moduleGroupedClasses) {
this.moduleGroupedClasses = moduleGroupedClasses;
}
/**
* Builds constructor arguments for a class.
*/
buildConstructorArguments(classInfo, moduleClasses, moduleDeps, importGenerator) {
const constructorArgs = [];
for (const dep of classInfo.dependencies) {
const arg = this.resolveDependencyArgument(dep.name, moduleClasses, moduleDeps, importGenerator, classInfo);
if (arg) {
constructorArgs.push(arg);
}
}
return constructorArgs;
}
/**
* Resolves a dependency argument.
*/
resolveDependencyArgument(dependency, moduleClasses, moduleDeps, importGenerator, requestingClass) {
// Check if dependency is from another module
const externalModuleArg = this.findExternalModuleDependency(dependency, moduleDeps);
if (externalModuleArg) {
return externalModuleArg;
}
// Create interface mapping for the current module with aliases
const interfaceToClassMap = shared_1.InstantiationUtils.createInterfaceToClassMap(moduleClasses, importGenerator);
// Check if dependency is from the same module
return shared_1.InstantiationUtils.resolveBasicDependency(dependency, moduleClasses, interfaceToClassMap, importGenerator, requestingClass);
}
/**
* Finds a dependency from an external module.
*/
findExternalModuleDependency(dependency, moduleDeps) {
for (const depModule of moduleDeps) {
const depModuleClasses = this.moduleGroupedClasses.get(depModule);
if (depModuleClasses) {
// Check interface name, class name, and abstract class name
const depClass = depModuleClasses.find(c => c.interfaceName === dependency ||
c.name === dependency ||
c.abstractClassName === dependency);
if (depClass) {
const depModuleVarName = shared_1.InstantiationUtils.toCamelCase(depModule) + 'Container';
// PRIORITIZE interface name, then abstract class name, then class name (for dependency inversion)
const propertyName = depClass.interfaceName || depClass.abstractClassName || depClass.name;
return `${depModuleVarName}.${propertyName}`;
}
}
}
return null;
}
}
exports.ModuleDependencyResolver = ModuleDependencyResolver;
//# sourceMappingURL=module-dependency-resolver.js.map