UNPKG

nestjs-autoloader

Version:
59 lines (58 loc) 2.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AutoloadModule = AutoloadModule; const common_1 = require("@nestjs/common"); const constants_1 = require("@nestjs/common/constants"); const combine_1 = require("./combine"); const listFiles_1 = require("./listFiles"); const isScript_1 = require("./isScript"); const logger = new common_1.Logger('AutoloadModule'); function AutoloadModule(dirName, metadata) { return (target) => { log(`Autoloading module: ${dirName}`); const loaded = loadScripts(dirName); const combinedMeta = { ...metadata, controllers: (0, combine_1.combine)(metadata?.controllers, loaded.controllers), providers: (0, combine_1.combine)(metadata?.providers, loaded.providers), }; (0, common_1.Module)(combinedMeta)(target); }; } function loadScripts(dirName) { const scripts = (0, listFiles_1.listFiles)(dirName).filter(isScript_1.isScript); const result = { controllers: [], providers: [], }; for (const script of scripts) { log(`Autoloading file: ${script}`); // Here we have to use require, to get the exports into a variable. // eslint-disable-next-line @typescript-eslint/no-require-imports const reqVals = Object.values(require(script)); for (const check of reqVals) { if (typeof check === 'function') { if (isController(check)) { log(`Found controller: ${check.name}`); result.controllers.push(check); } if (isProvider(check)) { log(`Found provider: ${check.name}`); result.providers.push(check); } } } } return result; } function log(message) { if (common_1.Logger.isLevelEnabled('verbose')) { logger.verbose(message); } } function isController(fn) { return Reflect.hasMetadata(constants_1.CONTROLLER_WATERMARK, fn); } function isProvider(fn) { return Reflect.hasMetadata(constants_1.INJECTABLE_WATERMARK, fn); }