-
-
Notifications
You must be signed in to change notification settings - Fork 6.3k
/
DirectoryExportedClassesLoader.ts
82 lines (75 loc) · 2.78 KB
/
DirectoryExportedClassesLoader.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import * as glob from "glob"
import { PlatformTools } from "../platform/PlatformTools"
import { Logger } from "../logger/Logger"
import { importOrRequireFile } from "./ImportUtils"
import { ObjectUtils } from "./ObjectUtils"
import { InstanceChecker } from "./InstanceChecker"
/**
* Loads all exported classes from the given directory.
*/
export async function importClassesFromDirectories(
logger: Logger,
directories: string[],
formats = [".js", ".mjs", ".cjs", ".ts", ".mts", ".cts"],
): Promise<Function[]> {
const logLevel = "info"
const classesNotFoundMessage =
"No classes were found using the provided glob pattern: "
const classesFoundMessage = "All classes found using provided glob pattern"
function loadFileClasses(exported: any, allLoaded: Function[]) {
if (
typeof exported === "function" ||
InstanceChecker.isEntitySchema(exported)
) {
allLoaded.push(exported)
} else if (Array.isArray(exported)) {
exported.forEach((i: any) => loadFileClasses(i, allLoaded))
} else if (ObjectUtils.isObject(exported)) {
Object.keys(exported).forEach((key) =>
loadFileClasses(exported[key], allLoaded),
)
}
return allLoaded
}
const allFiles = directories.reduce((allDirs, dir) => {
return allDirs.concat(glob.sync(PlatformTools.pathNormalize(dir)))
}, [] as string[])
if (directories.length > 0 && allFiles.length === 0) {
logger.log(logLevel, `${classesNotFoundMessage} "${directories}"`)
} else if (allFiles.length > 0) {
logger.log(
logLevel,
`${classesFoundMessage} "${directories}" : "${allFiles}"`,
)
}
const dirPromises = allFiles
.filter((file) => {
const dtsExtension = file.substring(file.length - 5, file.length)
return (
formats.indexOf(PlatformTools.pathExtname(file)) !== -1 &&
dtsExtension !== ".d.ts"
)
})
.map(async (file) => {
const [importOrRequireResult] = await importOrRequireFile(
PlatformTools.pathResolve(file),
)
return importOrRequireResult
})
const dirs = await Promise.all(dirPromises)
return loadFileClasses(dirs, [])
}
/**
* Loads all json files from the given directory.
*/
export function importJsonsFromDirectories(
directories: string[],
format = ".json",
): any[] {
const allFiles = directories.reduce((allDirs, dir) => {
return allDirs.concat(glob.sync(PlatformTools.pathNormalize(dir)))
}, [] as string[])
return allFiles
.filter((file) => PlatformTools.pathExtname(file) === format)
.map((file) => require(PlatformTools.pathResolve(file)))
}