import type { ClassProvider, DynamicModule, ExistingProvider, FactoryProvider, InjectionToken, OptionalFactoryDependency, ValueProvider, } from '@nestjs/common'; import type { Resource, ResourceExtractor } from '@rsdk/metadata'; import { PLATFORM_RAW_GLOBAL_METADATA_SCOPE, RsdkMetadata, } from '@rsdk/metadata'; import { Assert, NestDefinition } from '@rsdk/nest-tools'; import { Config, PlatformConfigModule } from '../config'; /** * @private */ export class ConfigMetadataExtractor implements ResourceExtractor { extract( value: | DynamicModule | ClassProvider | ValueProvider | FactoryProvider | ExistingProvider | InjectionToken, ): Resource[] { if (!Assert.isObjectOrCtor(value)) { return []; } if ('useExisting' in value) { return this.handle(value.useExisting); } /** * Получаем аргументы конструктора */ const args = NestDefinition.extractDeps(value); /** * Если их нет, просто возвращаем пустой массив */ if (!Array.isArray(args)) { return []; } return args.flatMap(this.handle); } private handle( arg: InjectionToken | OptionalFactoryDependency, ): Resource[] { if (!Assert.isObjectOrCtor(arg)) { return []; } const isConfigSection = Config.isConfigSection(arg); if (!isConfigSection) { return []; } const rs: Resource = >{ value: PlatformConfigModule.createConfigProvider(arg), key: arg, scope: PLATFORM_RAW_GLOBAL_METADATA_SCOPE, }; const configs = RsdkMetadata.get(arg); return [rs, ...(configs ?? [])]; } }