opinionated-machine
Version:
Very opinionated DI framework for fastify, built on top of awilix
83 lines • 3.77 kB
JavaScript
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