import { Injectable } from '@nestjs/common'; import { DiscoveryService, Reflector } from '@nestjs/core'; export interface DecoratedProvider { instance: Record; metatype: Function; metadata: TMetadata; } @Injectable() export class DecoratedProviderScanner { constructor( private readonly discoveryService: DiscoveryService, private readonly reflector: Reflector, ) {} scan( metadataKey: string | symbol, ): Array> { return this.discoveryService .getProviders() .flatMap((wrapper): Array> => { const instance = wrapper.instance as | Record | undefined; const metatype = wrapper.metatype; if (!instance || !metatype) { return []; } const metadata = this.reflector.get(metadataKey, metatype); if (!metadata) { return []; } return [ { instance, metatype, metadata, }, ]; }); } }