UNPKG

opinionated-machine

Version:

Very opinionated DI framework for fastify, built on top of awilix

83 lines 3.77 kB
import { AwilixManager } from 'awilix-manager'; import { mergeConfigAndDependencyOverrides } from './configUtils.js'; export class DIContext { options; awilixManager; diContainer; // biome-ignore lint/suspicious/noExplicitAny: all controllers are controllers controllerResolvers; appConfig; constructor(diContainer, options, appConfig, awilixManager) { this.options = options; this.diContainer = diContainer; this.appConfig = appConfig; this.awilixManager = awilixManager ?? new AwilixManager({ asyncDispose: true, asyncInit: true, diContainer, eagerInject: true, strictBooleanEnforced: true, }); this.controllerResolvers = []; } registerModule(module, targetDiConfig, externalDependencies, resolveControllers, isPrimaryModule) { const resolvedDIConfig = module.resolveDependencies(this.options, externalDependencies); for (const key in resolvedDIConfig) { // @ts-expect-error we can't really ensure type-safety here if (isPrimaryModule || resolvedDIConfig[key].public) { // @ts-expect-error we can't really ensure type-safety here targetDiConfig[key] = resolvedDIConfig[key]; } } if (isPrimaryModule && resolveControllers) { this.controllerResolvers.push(...Object.values(module.resolveControllers())); } } registerDependencies(params, externalDependencies, resolveControllers = true) { const mergedOverrides = mergeConfigAndDependencyOverrides(this.appConfig, params.configDependencyId ?? 'config', params.configOverrides, params.dependencyOverrides ?? {}); const targetDiConfig = {}; for (const primaryModule of params.modules) { this.registerModule(primaryModule, targetDiConfig, externalDependencies, resolveControllers, true); } if (params.secondaryModules) { for (const secondaryModule of params.secondaryModules) { this.registerModule(secondaryModule, targetDiConfig, externalDependencies, resolveControllers, false); } } this.diContainer.register(targetDiConfig); // append dependency overrides // @ts-expect-error FixMe check this later for (const [dependencyKey, _dependencyValue] of Object.entries(mergedOverrides)) { const dependencyValue = { ..._dependencyValue }; // preserve lifetime from original resolver const originalResolver = this.diContainer.getRegistration(dependencyKey); // @ts-ignore if (dependencyValue.lifetime !== originalResolver.lifetime) { // @ts-ignore dependencyValue.lifetime = originalResolver.lifetime; } this.diContainer.register(dependencyKey, dependencyValue); } } // biome-ignore lint/suspicious/noExplicitAny: we don't care about what instance we get here registerRoutes(app) { for (const controllerResolver of this.controllerResolvers) { // biome-ignore lint/suspicious/noExplicitAny: any controller works here const controller = controllerResolver.resolve(this.diContainer); const routes = controller.buildRoutes(); for (const route of Object.values(routes)) { app.route(route); } } } async destroy() { await this.awilixManager.executeDispose(); await this.diContainer.dispose(); } async init() { await this.awilixManager.executeInit(); } } //# sourceMappingURL=DIContext.js.map