nestjs-autoloader
Version:
Module autoloading for NestJS
59 lines (58 loc) • 2.14 kB
JavaScript
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);
}
;