import "reflect-metadata"; import { AlveoFactory, Inject, Injectable, Module, ModuleRef, type OnModuleInit, } from "./index"; const LOGGER_TOKEN = Symbol("LOGGER"); @Injectable() class LoggerService { log(message: string) { console.log(`[Logger]: ${message}`); } } @Injectable() class DatabaseService implements OnModuleInit { constructor( @Inject(LOGGER_TOKEN) private readonly logger: LoggerService, @Inject(ModuleRef) private readonly moduleRef: ModuleRef, ) {} async onModuleInit() { this.logger.log("DatabaseService initialized."); const self = await this.moduleRef.get(DatabaseService); this.logger.log(`ModuleRef self-check: ${self === this}`); } query() { return "data"; } } @Injectable() export class TestService { constructor(private readonly logger: LoggerService) { this.logger.log("TestService initialized."); } } @Module({ providers: [ DatabaseService, LoggerService, { provide: LOGGER_TOKEN, useExisting: LoggerService }, ], exports: [DatabaseService, LoggerService], }) class DatabaseModule {} @Module({ imports: [DatabaseModule], providers: [TestService], }) class AppModule {} async function bootstrap() { console.log("Starting AlveoJS test..."); const app = await AlveoFactory.create(AppModule); const db = await app.get(DatabaseService); console.log(`Query result: ${db.query()}`); await app.close(); } bootstrap().catch(console.error);