/* eslint-disable sort-keys */ import type { DynamicModule } from '@nestjs/common'; import { Module } from '@nestjs/common'; import type { Constructor } from '@rsdk/common'; import { LoggerFactory } from '@rsdk/logging'; import type { PlatformRawGlobalMetadata } from '@rsdk/metadata'; import { PLATFORM_RAW_GLOBAL_METADATA_SCOPE, RsdkMetadata, } from '@rsdk/metadata'; import { LOGGING_RSDK_METADATA_SCOPE } from './metadata/constants'; import { getLoggerToken } from './helpers'; import type { LoggingRsdkMetadata } from './types'; @Module({}) export class LoggingModule { static register( target: object, context: string | Constructor, token = getLoggerToken(context), ): void { RsdkMetadata.add( target, this.forFeature(context, token), PLATFORM_RAW_GLOBAL_METADATA_SCOPE, ); RsdkMetadata.add( target, { context, token, target, }, LOGGING_RSDK_METADATA_SCOPE, ); } /** * Дополнительная возможность добавить в DI контейнер логгер в случаях когда нужен инлайн вызов например через `useFactory` * @example * const moduleDef = { * imports: [LoggingModule.forFeature(MyService)], * module: MyModule, * providers: [ * { * inject: [getLoggerToken(MyService)], * provide: MyService, * useFactory(logger: ILogger) * } * ] * } * // Но по возможности * const moduleDef = { * module: MyModule, * providers: [ * { * inject: [getLoggerToken(MyService)], * provide: MyService, * useFactory(logger: ILogger) * } * ] * } * LoggerModule.register(moduleDef, MyService) * @param context в обычном случае это или класс или строка по которой вы его инжектите например для `getLoggerToken(MyService)`/`@InjectLogger(MyService)`, необходимо будет сделать LoggerModule.forFeature(MyService) * @param token если по какой-то причине вы хотите подменить логгер `@InjectLogger(MyService)` на логгер `@InjectLogger(NotMyService)`, используйте `getLoggerToken(MyService)` в качестве второго аргумента */ static forFeature( context: string | Constructor, token = getLoggerToken(context), ): DynamicModule { return { global: true, module: LoggingModule, providers: [ { provide: token, useValue: LoggerFactory.create(context), }, ], exports: [token], }; } }