0
0
mirror of https://github.com/Maks1mS/nestjs-telegraf.git synced 2025-10-01 20:41:27 +03:00
Files
.github
.husky
lib
decorators
enums
errors
execution-context
factories
interfaces
services
base-explorer.service.ts
index.ts
listeners-explorer.service.ts
metadata-accessor.service.ts
types
utils
index.ts
stage.provider.ts
telegraf-core.module.ts
telegraf.constants.ts
telegraf.module.ts
sample
website
.commitlintrc.json
.eslintrc.js
.gitignore
.npmignore
.prettierrc
LICENSE.md
README.md
package-lock.json
package.json
tsconfig.json
tsconfig.typedoc.json
nestjs-telegraf/lib/services/base-explorer.service.ts
2021-02-22 13:20:13 +03:00

54 lines
1.6 KiB
TypeScript

import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
import { Module } from '@nestjs/core/injector/module';
import { flattenDeep, identity, isEmpty } from 'lodash';
export class BaseExplorerService {
getModules(
modulesContainer: Map<string, Module>,
include: Function[],
): Module[] {
if (!include || isEmpty(include)) {
return [...modulesContainer.values()];
}
const whitelisted = this.includeWhitelisted(modulesContainer, include);
return whitelisted;
}
includeWhitelisted(
modulesContainer: Map<string, Module>,
include: Function[],
): Module[] {
const modules = [...modulesContainer.values()];
return modules.filter(({ metatype }) => include.includes(metatype));
}
flatMap<T>(
modules: Module[],
callback: (instance: InstanceWrapper, moduleRef: Module) => T | T[],
): T[] {
const visitedModules = new Set<Module>();
const unwrap = (moduleRef: Module) => {
// protection from circular recursion
if (visitedModules.has(moduleRef)) {
return [];
} else {
visitedModules.add(moduleRef);
}
const providers = [...moduleRef.providers.values()];
const defined = providers.map((wrapper) => callback(wrapper, moduleRef));
const imported: (T | T[])[] = moduleRef.imports?.size
? [...moduleRef.imports.values()].reduce((prev, cur) => {
return [...prev, ...unwrap(cur)];
}, [])
: [];
return [...defined, ...imported];
};
return flattenDeep(modules.map(unwrap)).filter(identity);
}
}