UNPKG

@notjustcoders/ioc-arise

Version:

Arise type-safe IoC containers from your code. Zero overhead, zero coupling.

63 lines 2.92 kB
"use strict"; 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