UNPKG

@intuitionrobotics/ts-common

Version:
69 lines 2.54 kB
import { Module } from "./module.js"; import { Dispatcher } from "./dispatcher.js"; import { BadImplementationException } from "./exceptions.js"; import { Logger } from "./logger/Logger.js"; import { setAppConfig } from "./app-config.js"; import { addItemToArray, filterDuplicates } from "../utils/array-tools.js"; import {} from "../utils/types.js"; const _modules = []; export function moduleResolver() { return _modules; } export class ModuleManager extends Logger { config; modules = _modules; static instance; // noinspection JSUnusedLocalSymbols constructor() { super(); if (ModuleManager.instance) throw new BadImplementationException("Already have one instance of ModuleManager"); ModuleManager.instance = this; Dispatcher.modulesResolver = moduleResolver; } filterModules(filter) { return this.modules.filter(filter); } getModule(moduleName) { return this.modules.find(module => module.getName() === moduleName); } setConfig(config) { this.config = config || {}; // One frozen copy in the process; modules resolve their slice lazily on first // `this.config` access (see Module) instead of having it pushed into them. setAppConfig(this.config); return this; } addModules(...modules) { modules.reduce((carry, module) => { if (!carry.includes(module)) addItemToArray(carry, module); return carry; }, this.modules); return this; } setModules(...modules) { this.modules = filterDuplicates(modules); return this; } init() { this.logVerbose(`--------- initializing app ---------`); // Config is no longer pushed into modules here — each module lazily resolves // its slice from the app-config store on first `this.config` access. this.modules.forEach((module) => module.setManager(this)); this.modules.forEach(module => { this.logVerbose(`--------- ${module.getName()} ---------`); // @ts-expect-error TS struggles with this dynamic typing module.init(); // @ts-expect-error TS struggles with this dynamic typing module.initiated = true; }); this.modules.forEach(module => module.validate()); this.logVerbose(`--------- INITIALIZED ---------`); return this; } build() { this.init(); } } //# sourceMappingURL=module-manager.js.map