Files
gridpilot.gg/apps/website/lib/di/container.ts
2026-01-07 16:20:19 +01:00

92 lines
2.5 KiB
TypeScript

import { Container } from 'inversify';
// Module imports
import { ApiModule } from './modules/api.module';
import { AuthModule } from './modules/auth.module';
import { CoreModule } from './modules/core.module';
import { DashboardModule } from './modules/dashboard.module';
import { DriverModule } from './modules/driver.module';
import { LeagueModule } from './modules/league.module';
import { TeamModule } from './modules/team.module';
import { RaceModule } from './modules/race.module';
import { AnalyticsModule } from './modules/analytics.module';
import { LandingModule } from './modules/landing.module';
import { PolicyModule } from './modules/policy.module';
import { SponsorModule } from './modules/sponsor.module';
/**
* Creates and configures the root DI container
*/
export function createContainer(): Container {
const container = new Container();
// Load all modules
container.load(
CoreModule,
ApiModule,
AuthModule,
LeagueModule,
DriverModule,
TeamModule,
DashboardModule,
AnalyticsModule,
RaceModule,
LandingModule,
PolicyModule,
SponsorModule
);
return container;
}
/**
* Creates a container for testing with mock overrides
*/
export function createTestContainer(overrides: Map<symbol, any> = new Map()): Container {
const container = createContainer();
// Apply mock overrides using rebind
const promises = Array.from(overrides.entries()).map(([token, mockInstance]) => {
return container.rebind(token).then(bind => bind.toConstantValue(mockInstance));
});
// Return container immediately, mocks will be available after promises resolve
// For synchronous testing, users can bind directly before loading modules
return container;
}
/**
* Container lifecycle management
*/
export class ContainerManager {
private static instance: ContainerManager | null = null;
private container: Container | null = null;
private constructor() {}
static getInstance(): ContainerManager {
if (!ContainerManager.instance) {
ContainerManager.instance = new ContainerManager();
}
return ContainerManager.instance;
}
getContainer(): Container {
if (!this.container) {
this.container = createContainer();
}
return this.container;
}
createScopedContainer(): Container {
// In this version, we create a new container
return new Container();
}
dispose(): void {
if (this.container) {
this.container.unbindAll();
this.container = null;
}
}
}