milkio 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api-test/index.ts +65 -65
- package/c.ts +37 -35
- package/defines/define-api-test.ts +24 -17
- package/defines/define-api.ts +9 -9
- package/defines/define-command-handler.ts +41 -41
- package/defines/define-http-handler.ts +181 -181
- package/defines/define-middleware.ts +6 -6
- package/defines/define-use.ts +10 -10
- package/index.ts +22 -22
- package/kernel/context.ts +17 -17
- package/kernel/fail.ts +13 -13
- package/kernel/logger.ts +96 -96
- package/kernel/meta.ts +6 -6
- package/kernel/middleware.ts +32 -32
- package/kernel/milkio.ts +250 -224
- package/kernel/runtime.ts +9 -9
- package/kernel/validate.ts +9 -9
- package/package.json +1 -1
- package/scripts/gen-insignificant.ts +239 -239
- package/scripts/gen-significant.ts +118 -120
- package/utils/create-ulid.ts +3 -3
- package/utils/env-to-boolean.ts +5 -5
- package/utils/env-to-number.ts +2 -2
- package/utils/env-to-string.ts +2 -2
- package/utils/exec.ts +18 -18
- package/utils/handle-catch-error.ts +37 -37
- package/utils/header-to-plain-object.ts +7 -7
- package/utils/remove-dir.ts +19 -19
- package/utils/tson.ts +2 -2
- package/.co.toml +0 -2
package/kernel/logger.ts
CHANGED
|
@@ -1,113 +1,113 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
|
|
3
|
-
import { runtime, type ExecuteId } from ".."
|
|
4
|
-
import { loggerOptions } from "../../../src/logger"
|
|
3
|
+
import { runtime, type ExecuteId } from "..";
|
|
4
|
+
import { loggerOptions } from "../../../src/logger";
|
|
5
5
|
|
|
6
6
|
export type LoggerItem = {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
executeId: ExecuteId;
|
|
8
|
+
loggerLevel: LoggerLevel;
|
|
9
|
+
description: string;
|
|
10
|
+
params: Array<unknown>;
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
export type LoggerTags = Record<string, any>;
|
|
14
14
|
|
|
15
15
|
export type LoggerOptions = {
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
onInsert: (options: LoggerItem) => boolean;
|
|
17
|
+
onSubmit: (tags: LoggerTags, logs: Array<LoggerItem>) => Promise<void> | void;
|
|
18
18
|
};
|
|
19
19
|
|
|
20
20
|
export type Logger = {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
debug: (description: string, ...params: Array<unknown>) => void;
|
|
22
|
+
log: (description: string, ...params: Array<unknown>) => void;
|
|
23
|
+
warn: (description: string, ...params: Array<unknown>) => void;
|
|
24
|
+
error: (description: string, ...params: Array<unknown>) => void;
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
export const loggerController = (() => {
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
})()
|
|
104
|
-
|
|
105
|
-
export const useLogger = loggerController.useLogger
|
|
106
|
-
|
|
107
|
-
export const loggerPushTags = loggerController.loggerPushTags
|
|
108
|
-
|
|
109
|
-
export const loggerSubmit = loggerController.loggerSubmit
|
|
110
|
-
|
|
111
|
-
export const loggerSubmitAll = loggerController.loggerSubmitAll
|
|
28
|
+
const logs = new Map<ExecuteId, { __LOG_DEATIL__: Array<LoggerItem>; [key: string]: any }>();
|
|
29
|
+
|
|
30
|
+
const loggerPushTags = (executeId: ExecuteId, tags: Record<string, any>) => {
|
|
31
|
+
if (!logs.has(executeId)) logs.set(executeId, { __LOG_DEATIL__: [] });
|
|
32
|
+
const logItem = logs.get(executeId);
|
|
33
|
+
for (const key in tags) {
|
|
34
|
+
logItem![key] = tags[key];
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const loggerSubmit = async (executeId: ExecuteId) => {
|
|
39
|
+
if (!logs.has(executeId)) return;
|
|
40
|
+
if (executeId === "global") return;
|
|
41
|
+
const loggerSubmitOptions: Record<string, string> = {
|
|
42
|
+
executeId,
|
|
43
|
+
};
|
|
44
|
+
const log = logs.get(executeId)!;
|
|
45
|
+
for (const key in log) {
|
|
46
|
+
if (key === "__LOG_DEATIL__") continue;
|
|
47
|
+
loggerSubmitOptions[key] = log[key];
|
|
48
|
+
}
|
|
49
|
+
logs.delete(executeId);
|
|
50
|
+
loggerOptions.onSubmit(loggerSubmitOptions, log.__LOG_DEATIL__);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const loggerSubmitAll = async () => {
|
|
54
|
+
for (const executeId of logs.keys()) {
|
|
55
|
+
await loggerSubmit(executeId);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const insertItem = (executeId: ExecuteId, level: LoggerLevel, description: string, params: Array<unknown>): void => {
|
|
60
|
+
let executeIds: Array<string> = [];
|
|
61
|
+
if (executeId === "global") {
|
|
62
|
+
executeIds = Array.from(new Set([...Array.from(runtime.execute.executeIds), ...Array.from(runtime.execute.executeIds)]));
|
|
63
|
+
} else {
|
|
64
|
+
executeIds = [executeId];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
for (const executeId of executeIds) {
|
|
68
|
+
if (!logs.has(executeId as ExecuteId)) logs.set(executeId as ExecuteId, { __LOG_DEATIL__: [] });
|
|
69
|
+
const loggerItem = {
|
|
70
|
+
executeId: executeId as ExecuteId,
|
|
71
|
+
loggerLevel: level,
|
|
72
|
+
description,
|
|
73
|
+
params,
|
|
74
|
+
} satisfies LoggerItem;
|
|
75
|
+
if (!loggerOptions.onInsert(loggerItem)) return;
|
|
76
|
+
logs.get(executeId as ExecuteId)!.__LOG_DEATIL__.push(loggerItem);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const useLogger = (executeId: ExecuteId) => {
|
|
81
|
+
return {
|
|
82
|
+
debug(description: string, ...params: Array<unknown>) {
|
|
83
|
+
insertItem(executeId, "debug", description, params);
|
|
84
|
+
},
|
|
85
|
+
log(description: string, ...params: Array<unknown>) {
|
|
86
|
+
insertItem(executeId, "log", description, params);
|
|
87
|
+
},
|
|
88
|
+
warn(description: string, ...params: Array<unknown>) {
|
|
89
|
+
insertItem(executeId, "warn", description, params);
|
|
90
|
+
},
|
|
91
|
+
error(description: string, ...params: Array<unknown>) {
|
|
92
|
+
insertItem(executeId, "error", description, params);
|
|
93
|
+
},
|
|
94
|
+
} satisfies Logger;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
loggerPushTags,
|
|
99
|
+
loggerSubmit,
|
|
100
|
+
loggerSubmitAll,
|
|
101
|
+
useLogger,
|
|
102
|
+
};
|
|
103
|
+
})();
|
|
104
|
+
|
|
105
|
+
export const useLogger = loggerController.useLogger;
|
|
106
|
+
|
|
107
|
+
export const loggerPushTags = loggerController.loggerPushTags;
|
|
108
|
+
|
|
109
|
+
export const loggerSubmit = loggerController.loggerSubmit;
|
|
110
|
+
|
|
111
|
+
export const loggerSubmitAll = loggerController.loggerSubmitAll;
|
|
112
112
|
|
|
113
113
|
export type LoggerLevel = "debug" | "log" | "warn" | "error";
|
package/kernel/meta.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { Meta } from "../../../src/meta"
|
|
2
|
-
import schema from "../../../generated/api-schema"
|
|
1
|
+
import type { Meta } from "../../../src/meta";
|
|
2
|
+
import schema from "../../../generated/api-schema";
|
|
3
3
|
|
|
4
4
|
export async function useMeta(path: string): Promise<Meta> {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
// @ts-ignore
|
|
6
|
+
const api = schema.apiMethodsSchema[path as keyof (typeof schema)["apiMethodsTypeSchema"]]();
|
|
7
|
+
const module = await api.module;
|
|
8
|
+
return module.api.meta;
|
|
9
9
|
}
|
package/kernel/middleware.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-unnecessary-type-constraint, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument */
|
|
2
2
|
|
|
3
|
-
import type { Context } from "../../../src/context"
|
|
4
|
-
import type { FrameworkHTTPDetail } from "./context"
|
|
5
|
-
import {
|
|
3
|
+
import type { Context } from "../../../src/context";
|
|
4
|
+
import type { FrameworkHTTPDetail } from "./context";
|
|
5
|
+
import type { MilkioApp } from "milkio";
|
|
6
6
|
|
|
7
7
|
export type BootstrapMiddleware = (milkio: MilkioApp) => Promise<void> | void;
|
|
8
8
|
export type BeforeExecuteMiddleware = (context: Context) => Promise<void> | void;
|
|
@@ -10,41 +10,41 @@ export type AfterExecuteMiddleware = (context: Context, response: { value: unkno
|
|
|
10
10
|
export type AfterHTTPRequestMiddleware = (headers: Headers, detail: FrameworkHTTPDetail) => Promise<void> | void;
|
|
11
11
|
export type BeforeHTTPResponseMiddleware = (response: { value: string }, detail: FrameworkHTTPDetail) => Promise<void> | void;
|
|
12
12
|
export type MiddlewareOptions = {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
bootstrap?: BootstrapMiddleware;
|
|
14
|
+
beforeExecute?: BeforeExecuteMiddleware;
|
|
15
|
+
afterExecute?: AfterExecuteMiddleware;
|
|
16
|
+
afterHTTPRequest?: AfterHTTPRequestMiddleware;
|
|
17
|
+
beforeHTTPResponse?: BeforeHTTPResponseMiddleware;
|
|
18
18
|
} & Record<string, (...args: Array<any>) => Promise<void> | void>;
|
|
19
19
|
export type MiddlewareFn = (...args: Array<any>) => Promise<void> | void;
|
|
20
20
|
export type MiddlewareT<T extends MiddlewareFn = MiddlewareFn> = { id: string; index: number; middleware: T };
|
|
21
21
|
|
|
22
|
-
export const _middlewareEvents = new Map<string, (a: MiddlewareT, b: MiddlewareT) => number>()
|
|
23
|
-
export const _middlewares = new Map<string, Array<MiddlewareT>>()
|
|
22
|
+
export const _middlewareEvents = new Map<string, (a: MiddlewareT, b: MiddlewareT) => number>();
|
|
23
|
+
export const _middlewares = new Map<string, Array<MiddlewareT>>();
|
|
24
24
|
|
|
25
25
|
export const MiddlewareEvent = (() => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
const defineMiddlewareEvent = (name: string, sortFn: (a: MiddlewareT, b: MiddlewareT) => number) => {
|
|
27
|
+
_middlewareEvents.set(name, sortFn);
|
|
28
|
+
};
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
const sortMiddlewareEvent = () => {
|
|
31
|
+
for (const [key, middleware] of _middlewares) {
|
|
32
|
+
const sort = _middlewareEvents.get(key);
|
|
33
|
+
if (sort) middleware.sort(sort);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
const handleMiddleware = async (name: string, args: Array<any> /* Parameters<MiddlewareOptions[Name]> */) => {
|
|
38
|
+
const mds = _middlewares.get(name);
|
|
39
|
+
if (!mds) return;
|
|
40
|
+
for (const md of mds) {
|
|
41
|
+
await md.middleware(...args);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
})()
|
|
45
|
+
return {
|
|
46
|
+
define: defineMiddlewareEvent,
|
|
47
|
+
handle: handleMiddleware,
|
|
48
|
+
_sort: sortMiddlewareEvent,
|
|
49
|
+
};
|
|
50
|
+
})();
|