UNPKG

@notjustcoders/ioc-arise

Version:

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

77 lines 4.47 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ContainerGeneratorFactory = void 0; const modular_container_generator_1 = require("./modular/modular-container-generator"); const module_dependency_resolver_1 = require("../analyser/module-dependency-resolver"); const import_generator_1 = require("./import-generator"); const file_writer_1 = require("./file-writer"); const module_container_function_generator_1 = require("./modular/module-container-function-generator"); const module_function_signature_generator_1 = require("./modular/module-function-signature-generator"); const module_dependency_resolver_2 = require("./modular/module-dependency-resolver"); const module_function_body_generator_1 = require("./modular/module-function-body-generator"); const module_instantiation_generator_1 = require("./modular/module-instantiation-generator"); const container_aggregator_1 = require("./modular/container-aggregator"); /** * Factory class for creating the appropriate container generator * based on the input type (flat classes or module-grouped classes). * Handles dependency injection at the factory level instead of constructor level. */ class ContainerGeneratorFactory { /** * Creates the appropriate container generator based on the input type. * Injects all necessary dependencies in the constructor. * * @param classesOrModules - Either a flat array of classes or a Map of module-grouped classes * @param outputPath - The output path for the generated container file * @returns The appropriate container generator instance with dependencies injected */ static create(classesOrModules, outputPath) { // Create FileWriter instance that will be injected into generators const fileWriter = new file_writer_1.FileWriter(outputPath); // Module-based generation - create dependencies and inject in constructor const moduleDependencyResolver = new module_dependency_resolver_1.ModuleDependencyResolver(classesOrModules); const allClasses = Array.from(classesOrModules.values()).flat(); const importGenerator = new import_generator_1.ImportGenerator(allClasses); const moduleFunctionSignatureGenerator = new module_function_signature_generator_1.ModuleFunctionSignatureGenerator(); const modularModuleDependencyResolver = new module_dependency_resolver_2.ModuleDependencyResolver(classesOrModules); const moduleFunctionBodyGenerator = new module_function_body_generator_1.ModuleFunctionBodyGenerator(modularModuleDependencyResolver); const moduleContainerFunctionGenerator = new module_container_function_generator_1.ModuleContainerFunctionGenerator(classesOrModules, moduleFunctionSignatureGenerator, modularModuleDependencyResolver, moduleFunctionBodyGenerator, importGenerator); const moduleInstantiationGenerator = new module_instantiation_generator_1.ModuleInstantiationGenerator(); const containerAggregator = new container_aggregator_1.ContainerAggregator(); return new modular_container_generator_1.ModularContainerGenerator(fileWriter, classesOrModules, moduleDependencyResolver, importGenerator, moduleContainerFunctionGenerator, moduleInstantiationGenerator, containerAggregator); } /** * Determines if the input represents a modular structure. * * @param classesOrModules - The input to check * @returns true if the input is a Map (modular), false if it's an array (flat) */ static isModular(classesOrModules) { return classesOrModules instanceof Map; } /** * Gets the total number of classes from either flat or modular input. * * @param classesOrModules - The input to count classes from * @returns The total number of classes */ static getClassCount(classesOrModules) { if (classesOrModules instanceof Map) { return Array.from(classesOrModules.values()).flat().length; } else { return classesOrModules.length; } } /** * Gets the number of modules from modular input. * * @param classesOrModules - The input to count modules from * @returns The number of modules, or 1 for flat structure */ static getModuleCount(classesOrModules) { return classesOrModules.size; } } exports.ContainerGeneratorFactory = ContainerGeneratorFactory; //# sourceMappingURL=container-generator-factory.js.map