@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
JavaScript
;
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;