@notjustcoders/ioc-arise
Version:
Arise type-safe IoC containers from your code. Zero overhead, zero coupling.
77 lines • 4.47 kB
JavaScript
;
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