UNPKG

@nestjs/core

Version:

Nest - modern, fast, powerful node.js web framework (@core)

99 lines (98 loc) 4.55 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DiscoveryService = void 0; const tslib_1 = require("tslib"); const common_1 = require("@nestjs/common"); const uid_1 = require("uid"); const modules_container_1 = require("../injector/modules-container"); const discoverable_meta_host_collection_1 = require("./discoverable-meta-host-collection"); /** * @publicApi */ let DiscoveryService = class DiscoveryService { constructor(modulesContainer) { this.modulesContainer = modulesContainer; } /** * Creates a decorator that can be used to decorate classes and methods with metadata. * The decorator will also add the class to the collection of discoverable classes (by metadata key). * Decorated classes can be discovered using the `getProviders` and `getControllers` methods. * @returns A decorator function. */ static createDecorator() { const metadataKey = (0, uid_1.uid)(21); const decoratorFn = (opts) => (target, key, descriptor) => { if (!descriptor) { discoverable_meta_host_collection_1.DiscoverableMetaHostCollection.addClassMetaHostLink(target, metadataKey); } (0, common_1.SetMetadata)(metadataKey, opts ?? {})(target, key, descriptor); }; decoratorFn.KEY = metadataKey; return decoratorFn; } /** * Returns an array of instance wrappers (providers). * Depending on the options, the array will contain either all providers or only providers with the specified metadata key. * @param options Discovery options. * @param modules A list of modules to filter by. * @returns An array of instance wrappers (providers). */ getProviders(options = {}, modules = this.getModules(options)) { if ('metadataKey' in options) { const providers = discoverable_meta_host_collection_1.DiscoverableMetaHostCollection.getProvidersByMetaKey(this.modulesContainer, options.metadataKey); return Array.from(providers); } const providers = modules.map(item => [...item.providers.values()]); return (0, common_1.flatten)(providers); } /** * Returns an array of instance wrappers (controllers). * Depending on the options, the array will contain either all controllers or only controllers with the specified metadata key. * @param options Discovery options. * @param modules A list of modules to filter by. * @returns An array of instance wrappers (controllers). */ getControllers(options = {}, modules = this.getModules(options)) { if ('metadataKey' in options) { const controllers = discoverable_meta_host_collection_1.DiscoverableMetaHostCollection.getControllersByMetaKey(this.modulesContainer, options.metadataKey); return Array.from(controllers); } const controllers = modules.map(item => [...item.controllers.values()]); return (0, common_1.flatten)(controllers); } /** * Retrieves metadata from the specified instance wrapper. * @param decorator The decorator to retrieve metadata of. * @param instanceWrapper Reference to the instance wrapper. * @param methodKey An optional method key to retrieve metadata from. * @returns Discovered metadata. */ getMetadataByDecorator(decorator, instanceWrapper, methodKey) { if (methodKey) { return Reflect.getMetadata(decorator.KEY, instanceWrapper.instance[methodKey]); } const clsRef = instanceWrapper.instance?.constructor ?? instanceWrapper.metatype; return Reflect.getMetadata(decorator.KEY, clsRef); } /** * Returns a list of modules to be used for discovery. */ getModules(options = {}) { const includeInOpts = 'include' in options; if (!includeInOpts) { const moduleRefs = [...this.modulesContainer.values()]; return moduleRefs; } const whitelisted = this.includeWhitelisted(options.include); return whitelisted; } includeWhitelisted(include) { const moduleRefs = [...this.modulesContainer.values()]; return moduleRefs.filter(({ metatype }) => include.some(item => item === metatype)); } }; exports.DiscoveryService = DiscoveryService; exports.DiscoveryService = DiscoveryService = tslib_1.__decorate([ (0, common_1.Injectable)(), tslib_1.__metadata("design:paramtypes", [modules_container_1.ModulesContainer]) ], DiscoveryService);