/
module.ts
91 lines (77 loc) · 1.73 KB
/
module.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
83
84
85
86
87
88
89
90
91
import logger, { LogLevel } from "@kosko/log";
import { importModule } from "./import";
/**
* @public
*/
export interface ResourceModule {
readonly path: string;
readonly export: string;
}
/**
* @public
*/
export interface ResourceKind {
apiVersion: string;
kind: string;
}
let moduleMap: Record<string, Record<string, ResourceModule>> = {};
function getGroup(apiVersion: string): string {
const arr = apiVersion.split("/");
return arr.length === 1 ? "" : arr[0];
}
/**
* @public
*/
export function setResourceModule(
res: ResourceKind,
mod: ResourceModule
): void {
const { apiVersion, kind } = res;
if (!moduleMap[apiVersion]) {
moduleMap[apiVersion] = {};
}
moduleMap[apiVersion][kind] = mod;
logger.log(LogLevel.Debug, "Set resource module", {
data: {
resourceKind: res,
resourceModule: mod
}
});
}
async function getKubernetesModels(
res: ResourceKind
): Promise<ResourceModule | undefined> {
const { apiVersion, kind } = res;
const group = getGroup(apiVersion);
if (group && group.includes(".") && !group.endsWith(".k8s.io")) {
return;
}
const path = `kubernetes-models/${apiVersion}/${kind}`;
try {
const result = await importModule(path);
if (result?.[kind]) {
const mod: ResourceModule = { path, export: kind };
setResourceModule(res, mod);
return mod;
}
} catch {
return;
}
}
/**
* @public
*/
export async function getResourceModule(
res: ResourceKind
): Promise<ResourceModule | undefined> {
return (
moduleMap[res.apiVersion]?.[res.kind] ?? (await getKubernetesModels(res))
);
}
/**
* @public
*/
export function resetResourceModules(): void {
moduleMap = {};
logger.log(LogLevel.Debug, "Reset resource modules");
}