UNPKG

@clawject/di

Version:

<p align="center"> <a href="https://clawject.com/" target="_blank"><img src="https://clawject.com/img/logo.svg" align="center" alt="Clawject Logo" width="120" height="120" /></a> </p>

92 lines (91 loc) 4.76 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ApplicationConfigurationFactory = void 0; const ApplicationConfiguration_1 = require("./ApplicationConfiguration"); const Utils_1 = require("../Utils"); class ApplicationConfigurationFactory { constructor() { this.applicationConfigurations = []; this.indexToConfigurationClass = new Map(); this.configurationClassToApplicationConfiguration = new Map(); this.lastConfigurationId = 0; this.configurationClassToId = new Map(); } async init(applicationClass, applicationClassConstructorParameters) { const visited = new Set(); const firstApplicationConfiguration = this.buildApplicationConfiguration(applicationClass, applicationClassConstructorParameters); const stack = [firstApplicationConfiguration]; while (stack.length > 0) { const current = stack.pop(); const applicationClass = current.classConstructor; const configurationMetadata = current.metadata; const instance = current.instance; visited.add(applicationClass); this.applicationConfigurations.push(current); const elements = configurationMetadata.imports.map(it => it.classPropertyName); const importedConfigurationsClasses = []; for (let i = elements.length - 1; i >= 0; i--) { const importPropertyName = elements[i]; const importedConfiguration = instance[importPropertyName]; let importedConfigurationConstruction; if (Utils_1.Utils.isPromise(importedConfiguration)) { importedConfigurationConstruction = importedConfiguration .then((importedConfiguration) => { return { constructor: importedConfiguration.constructor, args: Utils_1.Utils.getResolvedConstructorParameters(importedConfiguration.constructorParameters), }; }); } else { importedConfigurationConstruction = { constructor: importedConfiguration.constructor, args: Utils_1.Utils.getResolvedConstructorParameters(importedConfiguration.constructorParameters), }; } importedConfigurationsClasses.push(importedConfigurationConstruction); } const configurationClasses = await Promise.all(importedConfigurationsClasses.map(async (it) => { const awaitedIt = await it; const awaitedItArgs = await awaitedIt.args; return { constructor: awaitedIt.constructor, args: awaitedItArgs, }; })); configurationClasses.forEach((it) => { if (!visited.has(it.constructor)) { stack.push(this.buildApplicationConfiguration(it.constructor, it.args)); } }); } this.applicationConfigurations.forEach((applicationConfiguration, index) => { const configurationClass = applicationConfiguration.classConstructor; const configurationId = this.configurationClassToId.get(configurationClass) ?? this.lastConfigurationId++; if (!this.configurationClassToId.has(configurationClass)) { this.configurationClassToId.set(configurationClass, configurationId); } applicationConfiguration.init(index, configurationId); this.indexToConfigurationClass.set(index, configurationClass); }); } mapConfigurations(callback) { return Array.from(this.configurationClassToApplicationConfiguration.values()).map((applicationConfiguration) => { return callback(applicationConfiguration); }); } getConfigurationByIndex(index) { if (!this.applicationConfigurations[index]) { throw new Error(`No configuration found for index ${index}`); } return this.applicationConfigurations[index]; } buildApplicationConfiguration(...args) { const applicationConfiguration = this.configurationClassToApplicationConfiguration.get(args[0]) ?? new ApplicationConfiguration_1.ApplicationConfiguration(...args); if (!this.configurationClassToApplicationConfiguration.has(args[0])) { this.configurationClassToApplicationConfiguration.set(args[0], applicationConfiguration); } return applicationConfiguration; } } exports.ApplicationConfigurationFactory = ApplicationConfigurationFactory;