vona-core 1.0.0 → 5.0.9
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/LICENSE +21 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/lib/bean/beanAopBase.d.ts +3 -0
- package/dist/lib/bean/beanAopBase.js +3 -0
- package/dist/lib/bean/beanAopMethodBase.d.ts +3 -0
- package/dist/lib/bean/beanAopMethodBase.js +3 -0
- package/dist/lib/bean/beanBase.d.ts +19 -0
- package/dist/lib/bean/beanBase.js +36 -0
- package/dist/lib/bean/beanBaseSimple.d.ts +14 -0
- package/dist/lib/bean/beanBaseSimple.js +27 -0
- package/dist/lib/bean/beanContainer.d.ts +40 -0
- package/dist/lib/bean/beanContainer.js +578 -0
- package/dist/lib/bean/beanSimple.d.ts +7 -0
- package/dist/lib/bean/beanSimple.js +9 -0
- package/dist/lib/bean/index.d.ts +9 -0
- package/dist/lib/bean/index.js +9 -0
- package/dist/lib/bean/resource/config/index.d.ts +1 -0
- package/dist/lib/bean/resource/config/index.js +1 -0
- package/dist/lib/bean/resource/config/type.d.ts +2 -0
- package/dist/lib/bean/resource/config/type.js +1 -0
- package/dist/lib/bean/resource/constant/index.d.ts +1 -0
- package/dist/lib/bean/resource/constant/index.js +1 -0
- package/dist/lib/bean/resource/constant/type.d.ts +1 -0
- package/dist/lib/bean/resource/constant/type.js +1 -0
- package/dist/lib/bean/resource/error/_errorInternal.d.ts +66 -0
- package/dist/lib/bean/resource/error/_errorInternal.js +66 -0
- package/dist/lib/bean/resource/error/beanScopeError.d.ts +10 -0
- package/dist/lib/bean/resource/error/beanScopeError.js +17 -0
- package/dist/lib/bean/resource/error/beanScopeErrorImpl.d.ts +13 -0
- package/dist/lib/bean/resource/error/beanScopeErrorImpl.js +18 -0
- package/dist/lib/bean/resource/error/errorApplication.d.ts +32 -0
- package/dist/lib/bean/resource/error/errorApplication.js +1 -0
- package/dist/lib/bean/resource/error/errorClass.d.ts +17 -0
- package/dist/lib/bean/resource/error/errorClass.js +71 -0
- package/dist/lib/bean/resource/error/errorGlobal.d.ts +7 -0
- package/dist/lib/bean/resource/error/errorGlobal.js +1 -0
- package/dist/lib/bean/resource/error/errorObject.d.ts +4 -0
- package/dist/lib/bean/resource/error/errorObject.js +1 -0
- package/dist/lib/bean/resource/error/index.d.ts +7 -0
- package/dist/lib/bean/resource/error/index.js +7 -0
- package/dist/lib/bean/resource/error/type.d.ts +8 -0
- package/dist/lib/bean/resource/error/type.js +1 -0
- package/dist/lib/bean/resource/index.d.ts +4 -0
- package/dist/lib/bean/resource/index.js +4 -0
- package/dist/lib/bean/resource/locale/appLocale.d.ts +7 -0
- package/dist/lib/bean/resource/locale/appLocale.js +45 -0
- package/dist/lib/bean/resource/locale/beanScopeLocale.d.ts +10 -0
- package/dist/lib/bean/resource/locale/beanScopeLocale.js +16 -0
- package/dist/lib/bean/resource/locale/index.d.ts +3 -0
- package/dist/lib/bean/resource/locale/index.js +3 -0
- package/dist/lib/bean/resource/locale/type.d.ts +19 -0
- package/dist/lib/bean/resource/locale/type.js +1 -0
- package/dist/lib/bean/scope/beanScopeBase.d.ts +19 -0
- package/dist/lib/bean/scope/beanScopeBase.js +88 -0
- package/dist/lib/bean/scope/beanScopeContainer.d.ts +7 -0
- package/dist/lib/bean/scope/beanScopeContainer.js +15 -0
- package/dist/lib/bean/scope/beanScopeScene.d.ts +11 -0
- package/dist/lib/bean/scope/beanScopeScene.js +20 -0
- package/dist/lib/bean/scope/beanScopeUtil.d.ts +10 -0
- package/dist/lib/bean/scope/beanScopeUtil.js +18 -0
- package/dist/lib/bean/scope/index.d.ts +4 -0
- package/dist/lib/bean/scope/index.js +4 -0
- package/dist/lib/bean/type.d.ts +21 -0
- package/dist/lib/bean/type.js +2 -0
- package/dist/lib/core/application.d.ts +25 -0
- package/dist/lib/core/application.js +78 -0
- package/dist/lib/core/asyncLocalStorage.d.ts +8 -0
- package/dist/lib/core/asyncLocalStorage.js +23 -0
- package/dist/lib/core/config.d.ts +12 -0
- package/dist/lib/core/config.js +120 -0
- package/dist/lib/core/context.d.ts +2 -0
- package/dist/lib/core/context.js +104 -0
- package/dist/lib/core/ctxCounter.d.ts +7 -0
- package/dist/lib/core/ctxCounter.js +20 -0
- package/dist/lib/core/index.d.ts +6 -0
- package/dist/lib/core/index.js +6 -0
- package/dist/lib/core/locales.d.ts +137 -0
- package/dist/lib/core/locales.js +6 -0
- package/dist/lib/core/logger.d.ts +22 -0
- package/dist/lib/core/logger.js +147 -0
- package/dist/lib/core/loggerDefault.d.ts +3 -0
- package/dist/lib/core/loggerDefault.js +44 -0
- package/dist/lib/core/meta.d.ts +42 -0
- package/dist/lib/core/meta.js +123 -0
- package/dist/lib/core/metadata.d.ts +15 -0
- package/dist/lib/core/metadata.js +80 -0
- package/dist/lib/core/resource.d.ts +33 -0
- package/dist/lib/core/resource.js +146 -0
- package/dist/lib/decorator/class/beanInfo.d.ts +2 -0
- package/dist/lib/decorator/class/beanInfo.js +8 -0
- package/dist/lib/decorator/class/createBeanDecorator.d.ts +3 -0
- package/dist/lib/decorator/class/createBeanDecorator.js +23 -0
- package/dist/lib/decorator/class/index.d.ts +4 -0
- package/dist/lib/decorator/class/index.js +4 -0
- package/dist/lib/decorator/class/proxyDisable.d.ts +1 -0
- package/dist/lib/decorator/class/proxyDisable.js +8 -0
- package/dist/lib/decorator/class/use.d.ts +7 -0
- package/dist/lib/decorator/class/use.js +69 -0
- package/dist/lib/decorator/class/util.d.ts +3 -0
- package/dist/lib/decorator/class/util.js +9 -0
- package/dist/lib/decorator/index.d.ts +3 -0
- package/dist/lib/decorator/index.js +3 -0
- package/dist/lib/decorator/interface/beanOptions.d.ts +21 -0
- package/dist/lib/decorator/interface/beanOptions.js +1 -0
- package/dist/lib/decorator/interface/index.d.ts +2 -0
- package/dist/lib/decorator/interface/index.js +2 -0
- package/dist/lib/decorator/interface/useOptions.d.ts +29 -0
- package/dist/lib/decorator/interface/useOptions.js +1 -0
- package/dist/lib/decorator/type/constructable.d.ts +1 -0
- package/dist/lib/decorator/type/constructable.js +1 -0
- package/dist/lib/decorator/type/containerScope.d.ts +1 -0
- package/dist/lib/decorator/type/containerScope.js +1 -0
- package/dist/lib/decorator/type/function.d.ts +6 -0
- package/dist/lib/decorator/type/function.js +1 -0
- package/dist/lib/decorator/type/index.d.ts +4 -0
- package/dist/lib/decorator/type/index.js +4 -0
- package/dist/lib/decorator/type/injectionScope.d.ts +1 -0
- package/dist/lib/decorator/type/injectionScope.js +1 -0
- package/dist/lib/framework/bootstrap.d.ts +3 -0
- package/dist/lib/framework/bootstrap.js +13 -0
- package/dist/lib/framework/cluster.d.ts +2 -0
- package/dist/lib/framework/cluster.js +32 -0
- package/dist/lib/framework/createApp.d.ts +2 -0
- package/dist/lib/framework/createApp.js +71 -0
- package/dist/lib/framework/index.d.ts +4 -0
- package/dist/lib/framework/index.js +4 -0
- package/dist/lib/framework/process.d.ts +2 -0
- package/dist/lib/framework/process.js +36 -0
- package/dist/lib/framework/start.d.ts +10 -0
- package/dist/lib/framework/start.js +51 -0
- package/dist/lib/framework/useApp.d.ts +4 -0
- package/dist/lib/framework/useApp.js +49 -0
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.js +6 -0
- package/dist/lib/locale/en-us.d.ts +68 -0
- package/dist/lib/locale/en-us.js +68 -0
- package/dist/lib/locale/zh-cn.d.ts +68 -0
- package/dist/lib/locale/zh-cn.js +68 -0
- package/dist/lib/mappedClass/index.d.ts +3 -0
- package/dist/lib/mappedClass/index.js +3 -0
- package/dist/lib/mappedClass/mappedClass.d.ts +10 -0
- package/dist/lib/mappedClass/mappedClass.js +10 -0
- package/dist/lib/mappedClass/mixinClass.d.ts +8 -0
- package/dist/lib/mappedClass/mixinClass.js +8 -0
- package/dist/lib/mappedClass/omitClass.d.ts +2 -0
- package/dist/lib/mappedClass/omitClass.js +14 -0
- package/dist/lib/mappedClass/partialClass.d.ts +3 -0
- package/dist/lib/mappedClass/partialClass.js +15 -0
- package/dist/lib/mappedClass/pickClass.d.ts +2 -0
- package/dist/lib/mappedClass/pickClass.js +14 -0
- package/dist/lib/mappedClass/type.d.ts +6 -0
- package/dist/lib/mappedClass/type.js +1 -0
- package/dist/lib/mappedClass/utils.d.ts +8 -0
- package/dist/lib/mappedClass/utils.js +76 -0
- package/dist/lib/module/config.d.ts +3 -0
- package/dist/lib/module/config.js +17 -0
- package/dist/lib/module/constant.d.ts +3 -0
- package/dist/lib/module/constant.js +16 -0
- package/dist/lib/module/errors.d.ts +3 -0
- package/dist/lib/module/errors.js +29 -0
- package/dist/lib/module/loader.d.ts +4 -0
- package/dist/lib/module/loader.js +25 -0
- package/dist/lib/module/locales.d.ts +3 -0
- package/dist/lib/module/locales.js +48 -0
- package/dist/lib/module/module.d.ts +7 -0
- package/dist/lib/module/module.js +32 -0
- package/dist/lib/utils/index.d.ts +4 -0
- package/dist/lib/utils/index.js +4 -0
- package/dist/lib/utils/isClass.d.ts +2 -0
- package/dist/lib/utils/isClass.js +18 -0
- package/dist/lib/utils/retry.d.ts +4 -0
- package/dist/lib/utils/retry.js +16 -0
- package/dist/lib/utils/util.d.ts +59 -0
- package/dist/lib/utils/util.js +298 -0
- package/dist/lib/utils/zod-openapi.d.ts +1 -0
- package/dist/lib/utils/zod-openapi.js +3 -0
- package/dist/types/application/app.d.ts +36 -0
- package/dist/types/application/app.js +1 -0
- package/dist/types/application/index.d.ts +1 -0
- package/dist/types/application/index.js +1 -0
- package/dist/types/config/config.d.ts +36 -0
- package/dist/types/config/config.js +1 -0
- package/dist/types/config/index.d.ts +3 -0
- package/dist/types/config/index.js +3 -0
- package/dist/types/config/instance.d.ts +7 -0
- package/dist/types/config/instance.js +1 -0
- package/dist/types/config/locale.d.ts +10 -0
- package/dist/types/config/locale.js +3 -0
- package/dist/types/context/contextBase.d.ts +24 -0
- package/dist/types/context/contextBase.js +1 -0
- package/dist/types/context/contextConfig.d.ts +3 -0
- package/dist/types/context/contextConfig.js +1 -0
- package/dist/types/context/contextOthers.d.ts +4 -0
- package/dist/types/context/contextOthers.js +1 -0
- package/dist/types/context/contextState.d.ts +7 -0
- package/dist/types/context/contextState.js +1 -0
- package/dist/types/context/index.d.ts +10 -0
- package/dist/types/context/index.js +1 -0
- package/dist/types/enum/appEvent.d.ts +4 -0
- package/dist/types/enum/appEvent.js +5 -0
- package/dist/types/enum/httpStatus.d.ts +68 -0
- package/dist/types/enum/httpStatus.js +69 -0
- package/dist/types/enum/index.d.ts +2 -0
- package/dist/types/enum/index.js +2 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.js +6 -0
- package/dist/types/interface/bootstrap.d.ts +10 -0
- package/dist/types/interface/bootstrap.js +1 -0
- package/dist/types/interface/index.d.ts +4 -0
- package/dist/types/interface/index.js +4 -0
- package/dist/types/interface/logger.d.ts +22 -0
- package/dist/types/interface/logger.js +1 -0
- package/dist/types/interface/module.d.ts +24 -0
- package/dist/types/interface/module.js +1 -0
- package/dist/types/interface/monkey.d.ts +31 -0
- package/dist/types/interface/monkey.js +1 -0
- package/dist/types/utils/cast.d.ts +5 -0
- package/dist/types/utils/cast.js +3 -0
- package/dist/types/utils/demo.d.ts +4 -0
- package/dist/types/utils/demo.js +1 -0
- package/dist/types/utils/env.d.ts +25 -0
- package/dist/types/utils/env.js +1 -0
- package/dist/types/utils/index.d.ts +6 -0
- package/dist/types/utils/index.js +6 -0
- package/dist/types/utils/omitNever.d.ts +9 -0
- package/dist/types/utils/omitNever.js +1 -0
- package/dist/types/utils/powerPartial.d.ts +3 -0
- package/dist/types/utils/powerPartial.js +1 -0
- package/dist/types/utils/type.d.ts +3 -0
- package/dist/types/utils/type.js +1 -0
- package/package.json +37 -18
- package/README.md +0 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ILoggerClientChildRecord, ILoggerClientRecord, ILoggerOptionsClientInfo, LoggerLevel } from '../../types/interface/logger.ts';
|
|
2
|
+
import * as Winston from 'winston';
|
|
3
|
+
import DailyRotateFile from 'winston-daily-rotate-file';
|
|
4
|
+
import { BeanSimple } from '../bean/beanSimple.ts';
|
|
5
|
+
declare const SymbolLoggerInstances: unique symbol;
|
|
6
|
+
export declare class AppLogger extends BeanSimple {
|
|
7
|
+
private [SymbolLoggerInstances];
|
|
8
|
+
dispose(): Promise<void>;
|
|
9
|
+
get(clientName?: keyof ILoggerClientRecord): Winston.Logger;
|
|
10
|
+
child(childName?: keyof ILoggerClientChildRecord, clientName?: keyof ILoggerClientRecord): Winston.Logger;
|
|
11
|
+
getLevel(clientName?: keyof ILoggerClientRecord): LoggerLevel | undefined;
|
|
12
|
+
setLevel(level: LoggerLevel | boolean, clientName?: keyof ILoggerClientRecord): void;
|
|
13
|
+
private _createClient;
|
|
14
|
+
private _prepareConfigClient;
|
|
15
|
+
createTransportFile(fileName: string, clientInfo: ILoggerOptionsClientInfo, options: Winston.transports.FileTransportOptions | DailyRotateFile.DailyRotateFileTransportOptions): DailyRotateFile | Winston.transports.FileTransportInstance;
|
|
16
|
+
}
|
|
17
|
+
export declare function getLoggerClientLevel(clientName?: keyof ILoggerClientRecord): LoggerLevel | undefined;
|
|
18
|
+
export declare function setLoggerClientLevel(level: LoggerLevel | boolean, clientName?: keyof ILoggerClientRecord): void;
|
|
19
|
+
export declare const formatLoggerAxiosError: Winston.Logform.FormatWrap;
|
|
20
|
+
export declare const formatLoggerFilter: Winston.Logform.FormatWrap;
|
|
21
|
+
export declare const formatLoggerConsole: () => Winston.Logform.Format;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { isEmptyObject } from '@cabloy/utils';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { LEVEL, MESSAGE } from 'triple-beam';
|
|
4
|
+
import * as Winston from 'winston';
|
|
5
|
+
import DailyRotateFile from 'winston-daily-rotate-file';
|
|
6
|
+
import { cast } from "../../types/utils/cast.js";
|
|
7
|
+
import { BeanSimple } from "../bean/beanSimple.js";
|
|
8
|
+
import { deepExtend } from "../utils/util.js";
|
|
9
|
+
const SymbolLoggerInstances = Symbol('SymbolLoggerInstances');
|
|
10
|
+
export class AppLogger extends BeanSimple {
|
|
11
|
+
[SymbolLoggerInstances] = {};
|
|
12
|
+
async dispose() {
|
|
13
|
+
for (const key in this[SymbolLoggerInstances]) {
|
|
14
|
+
const logger = this[SymbolLoggerInstances][key];
|
|
15
|
+
await _closeLogger(logger);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
get(clientName) {
|
|
19
|
+
clientName = clientName || 'default';
|
|
20
|
+
if (!this[SymbolLoggerInstances][clientName]) {
|
|
21
|
+
this[SymbolLoggerInstances][clientName] = this._createClient(clientName);
|
|
22
|
+
}
|
|
23
|
+
return this[SymbolLoggerInstances][clientName];
|
|
24
|
+
}
|
|
25
|
+
child(childName, clientName) {
|
|
26
|
+
const logger = this.get(clientName);
|
|
27
|
+
if (!childName)
|
|
28
|
+
return logger;
|
|
29
|
+
return logger.child({ name: childName });
|
|
30
|
+
}
|
|
31
|
+
getLevel(clientName) {
|
|
32
|
+
return getLoggerClientLevel(clientName);
|
|
33
|
+
}
|
|
34
|
+
setLevel(level, clientName) {
|
|
35
|
+
setLoggerClientLevel(level, clientName);
|
|
36
|
+
}
|
|
37
|
+
_createClient(clientName) {
|
|
38
|
+
const configClient = this.app.config.logger.clients[clientName];
|
|
39
|
+
if (!configClient)
|
|
40
|
+
throw new Error(`logger client not found: ${clientName}`);
|
|
41
|
+
const configNode = deepExtend({}, this._prepareConfigClient(clientName, this.app.config.logger.default), this._prepareConfigClient(clientName, configClient));
|
|
42
|
+
const logger = Winston.createLogger(configNode);
|
|
43
|
+
logger.on('error', err => {
|
|
44
|
+
console.error(err);
|
|
45
|
+
});
|
|
46
|
+
return logger;
|
|
47
|
+
}
|
|
48
|
+
_prepareConfigClient(clientName, configClient) {
|
|
49
|
+
if (typeof configClient !== 'function')
|
|
50
|
+
return configClient;
|
|
51
|
+
return configClient.call(this.app, Winston, {
|
|
52
|
+
clientName,
|
|
53
|
+
level: () => getLoggerClientLevel(clientName),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
createTransportFile(fileName, clientInfo, options) {
|
|
57
|
+
const configRotate = this.app.config.logger.rotate;
|
|
58
|
+
let optionsFile;
|
|
59
|
+
if (configRotate.enable) {
|
|
60
|
+
optionsFile = configRotate.options.call(this, fileName, Winston, clientInfo);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
optionsFile = { filename: `${fileName}.log` };
|
|
64
|
+
}
|
|
65
|
+
const _options = deepExtend({ dirname: this.app.config.server.loggerDir }, optionsFile, options);
|
|
66
|
+
if (configRotate.enable) {
|
|
67
|
+
const transport = new DailyRotateFile(_options);
|
|
68
|
+
transport.on('error', err => {
|
|
69
|
+
console.error(err);
|
|
70
|
+
});
|
|
71
|
+
return transport;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
return new Winston.transports.File(_options);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function _closeLogger(logger) {
|
|
79
|
+
return new Promise(resolve => {
|
|
80
|
+
if (logger.__closed__)
|
|
81
|
+
return resolve(true);
|
|
82
|
+
logger.end(() => {
|
|
83
|
+
logger.__closed__ = true;
|
|
84
|
+
resolve(true);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
export function getLoggerClientLevel(clientName) {
|
|
89
|
+
clientName = clientName || 'default';
|
|
90
|
+
const envName = `LOGGER_CLIENT_${clientName.toUpperCase()}`;
|
|
91
|
+
const level = process.env[envName];
|
|
92
|
+
if (level === 'false')
|
|
93
|
+
return;
|
|
94
|
+
if (level === 'true' || !level)
|
|
95
|
+
return 'info';
|
|
96
|
+
return level;
|
|
97
|
+
}
|
|
98
|
+
export function setLoggerClientLevel(level, clientName) {
|
|
99
|
+
clientName = clientName || 'default';
|
|
100
|
+
const envName = `LOGGER_CLIENT_${clientName.toUpperCase()}`;
|
|
101
|
+
process.env[envName] = level.toString();
|
|
102
|
+
}
|
|
103
|
+
export const formatLoggerAxiosError = Winston.format((einfo, { stack, cause }) => {
|
|
104
|
+
if ((einfo instanceof Error && einfo.constructor.name.includes('AxiosError')) || einfo.name === 'AxiosError') {
|
|
105
|
+
const info = Object.assign({}, einfo, {
|
|
106
|
+
level: einfo.level,
|
|
107
|
+
[LEVEL]: einfo[LEVEL] || einfo.level,
|
|
108
|
+
message: einfo.message,
|
|
109
|
+
[MESSAGE]: einfo[MESSAGE] || einfo.message,
|
|
110
|
+
});
|
|
111
|
+
if (stack)
|
|
112
|
+
info.stack = einfo.stack;
|
|
113
|
+
if (cause)
|
|
114
|
+
info.cause = einfo.cause;
|
|
115
|
+
info.message = `${info.message}: ${cast(info.config).url}`;
|
|
116
|
+
info[MESSAGE] = `${info[MESSAGE]}: ${cast(info.config).url}`;
|
|
117
|
+
delete info.config;
|
|
118
|
+
delete info.request;
|
|
119
|
+
delete info.response;
|
|
120
|
+
return info;
|
|
121
|
+
}
|
|
122
|
+
return einfo;
|
|
123
|
+
});
|
|
124
|
+
export const formatLoggerFilter = Winston.format((info, opts) => {
|
|
125
|
+
const level = typeof opts.level === 'function' ? opts.level() : opts.level;
|
|
126
|
+
if (!level)
|
|
127
|
+
return false;
|
|
128
|
+
if (opts.strict) {
|
|
129
|
+
if (Winston.config.npm.levels[info.level] === Winston.config.npm.levels[level])
|
|
130
|
+
return info;
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
if (Winston.config.npm.levels[info.level] <= Winston.config.npm.levels[level] || (opts.silly && info.level === 'silly'))
|
|
134
|
+
return info;
|
|
135
|
+
return false;
|
|
136
|
+
});
|
|
137
|
+
export const formatLoggerConsole = () => {
|
|
138
|
+
return Winston.format.printf(({ timestamp, level, stack, message, name, beanFullName, durationMs, ...meta }) => {
|
|
139
|
+
const textName = name ? ` ${chalk.cyan(`[${name}]`)}` : '';
|
|
140
|
+
const textBeanFullName = beanFullName ? ` ${chalk.gray(`[${beanFullName}]`)}` : '';
|
|
141
|
+
const textMeta = !isEmptyObject(meta) ? ` ${JSON.stringify(meta)}` : '';
|
|
142
|
+
const textMessage = ` ${message}`;
|
|
143
|
+
const textDurationMs = durationMs !== undefined ? ` ${chalk.cyan(`+${durationMs}ms`)}` : '';
|
|
144
|
+
const textStack = stack ? `\n${stack}` : '';
|
|
145
|
+
return `${timestamp} ${level}${textName}${textBeanFullName}${textMeta}${textMessage}${textDurationMs}${textStack}`;
|
|
146
|
+
});
|
|
147
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { formatLoggerAxiosError, formatLoggerConsole, formatLoggerFilter } from "./logger.js";
|
|
2
|
+
export function combineLoggerDefault(_appInfo) {
|
|
3
|
+
const configDefault = {
|
|
4
|
+
rotate: {
|
|
5
|
+
enable: false,
|
|
6
|
+
options(fileName) {
|
|
7
|
+
return {
|
|
8
|
+
filename: `${fileName}-%DATE%.log`,
|
|
9
|
+
datePattern: 'YYYY-MM-DD',
|
|
10
|
+
maxSize: '20m',
|
|
11
|
+
maxFiles: '7d',
|
|
12
|
+
};
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
default({ format, transports }, clientInfo) {
|
|
16
|
+
return {
|
|
17
|
+
format: format.combine(formatLoggerAxiosError({ stack: true }), format.errors({ stack: true }), format.splat(), format.timestamp()),
|
|
18
|
+
transports: [
|
|
19
|
+
this.meta.logger.createTransportFile('error', clientInfo, {
|
|
20
|
+
level: 'error',
|
|
21
|
+
format: format.combine(format.json()),
|
|
22
|
+
}),
|
|
23
|
+
this.meta.logger.createTransportFile('http', clientInfo, {
|
|
24
|
+
level: 'http',
|
|
25
|
+
format: format.combine(formatLoggerFilter({ level: 'http', strict: true }), format.json()),
|
|
26
|
+
}),
|
|
27
|
+
this.meta.logger.createTransportFile('combined', clientInfo, {
|
|
28
|
+
level: 'silly',
|
|
29
|
+
format: format.combine(formatLoggerFilter({ level: clientInfo.level }), format.json()),
|
|
30
|
+
}),
|
|
31
|
+
new transports.Console({
|
|
32
|
+
level: 'silly',
|
|
33
|
+
format: format.combine(formatLoggerFilter({ level: clientInfo.level, silly: true }), format.colorize(), formatLoggerConsole()),
|
|
34
|
+
forceConsole: true,
|
|
35
|
+
}),
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
clients: {
|
|
40
|
+
default: {},
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
return configDefault;
|
|
44
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { IModule } from '@cabloy/module-info';
|
|
2
|
+
import type { TypeModuleResourceLocaleModules, TypeModuleResourceLocales, VonaConfigEnv } from '../../types/index.ts';
|
|
3
|
+
import type { AppMonkeyConstructable } from '../../types/interface/monkey.ts';
|
|
4
|
+
import type { ErrorClass, IModuleLocaleText } from '../bean/index.ts';
|
|
5
|
+
import type { AppMetadata } from './metadata.ts';
|
|
6
|
+
import type { AppResource } from './resource.ts';
|
|
7
|
+
import { BeanSimple } from '../bean/beanSimple.ts';
|
|
8
|
+
import { AppLocale, BeanScopeContainer } from '../bean/index.ts';
|
|
9
|
+
import { CtxCounter } from './ctxCounter.ts';
|
|
10
|
+
import { AppLogger } from './logger.ts';
|
|
11
|
+
export declare class AppMeta extends BeanSimple {
|
|
12
|
+
env: VonaConfigEnv;
|
|
13
|
+
ctxCounter: CtxCounter;
|
|
14
|
+
isProd: boolean;
|
|
15
|
+
isTest: boolean;
|
|
16
|
+
isLocal: boolean;
|
|
17
|
+
error: ErrorClass;
|
|
18
|
+
logger: AppLogger;
|
|
19
|
+
locale: AppLocale;
|
|
20
|
+
text: IModuleLocaleText;
|
|
21
|
+
scopeContainer: BeanScopeContainer;
|
|
22
|
+
appMonkey?: AppMonkeyConstructable;
|
|
23
|
+
resource: AppResource;
|
|
24
|
+
metadata: AppMetadata;
|
|
25
|
+
modules: Record<string, IModule>;
|
|
26
|
+
modulesArray: IModule[];
|
|
27
|
+
modulesMonkey: Record<string, IModule>;
|
|
28
|
+
constants: Record<string, any>;
|
|
29
|
+
locales: TypeModuleResourceLocales;
|
|
30
|
+
localeModules: TypeModuleResourceLocaleModules;
|
|
31
|
+
appReady: boolean;
|
|
32
|
+
appReadyInstances: Record<string, boolean>;
|
|
33
|
+
appStarted: boolean;
|
|
34
|
+
appStartError: Error;
|
|
35
|
+
appClose: boolean;
|
|
36
|
+
appClosed: boolean;
|
|
37
|
+
protected __init__(env: VonaConfigEnv): void;
|
|
38
|
+
private _prepareEnv;
|
|
39
|
+
waitAppStarted(): Promise<unknown>;
|
|
40
|
+
close(): Promise<any>;
|
|
41
|
+
private _closeInner;
|
|
42
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import cluster from 'node:cluster';
|
|
2
|
+
import { EnumAppEvent } from "../../types/index.js";
|
|
3
|
+
import { BeanSimple } from "../bean/beanSimple.js";
|
|
4
|
+
import { AppLocale, BeanScopeContainer } from "../bean/index.js";
|
|
5
|
+
import { CtxCounter } from "./ctxCounter.js";
|
|
6
|
+
import { AppLogger } from "./logger.js";
|
|
7
|
+
import { appMetadata } from "./metadata.js";
|
|
8
|
+
import { appResource } from "./resource.js";
|
|
9
|
+
const SymbolClosePromise = Symbol('SymbolClosePromise');
|
|
10
|
+
export class AppMeta extends BeanSimple {
|
|
11
|
+
env;
|
|
12
|
+
ctxCounter;
|
|
13
|
+
isProd;
|
|
14
|
+
isTest;
|
|
15
|
+
isLocal;
|
|
16
|
+
error;
|
|
17
|
+
logger;
|
|
18
|
+
locale;
|
|
19
|
+
text;
|
|
20
|
+
scopeContainer;
|
|
21
|
+
appMonkey;
|
|
22
|
+
//
|
|
23
|
+
resource;
|
|
24
|
+
metadata;
|
|
25
|
+
//
|
|
26
|
+
modules;
|
|
27
|
+
modulesArray;
|
|
28
|
+
modulesMonkey;
|
|
29
|
+
//
|
|
30
|
+
constants;
|
|
31
|
+
locales;
|
|
32
|
+
localeModules;
|
|
33
|
+
//
|
|
34
|
+
appReady;
|
|
35
|
+
appReadyInstances;
|
|
36
|
+
//
|
|
37
|
+
appStarted;
|
|
38
|
+
appStartError;
|
|
39
|
+
//
|
|
40
|
+
appClose;
|
|
41
|
+
appClosed;
|
|
42
|
+
__init__(env) {
|
|
43
|
+
// env
|
|
44
|
+
this.env = env;
|
|
45
|
+
this._prepareEnv();
|
|
46
|
+
// ctxCounter
|
|
47
|
+
this.ctxCounter = new CtxCounter();
|
|
48
|
+
// appMonkey
|
|
49
|
+
this.appMonkey = this.app.options.AppMonkey;
|
|
50
|
+
// logger
|
|
51
|
+
this.logger = this.bean._newBean(AppLogger);
|
|
52
|
+
// locale
|
|
53
|
+
this.locale = this.bean._newBean(AppLocale);
|
|
54
|
+
// text
|
|
55
|
+
this.text = this.locale.createLocaleText();
|
|
56
|
+
// scopeContainer
|
|
57
|
+
this.scopeContainer = this.bean._newBean(BeanScopeContainer);
|
|
58
|
+
// resource
|
|
59
|
+
this.resource = appResource;
|
|
60
|
+
this.resource.app = this.app;
|
|
61
|
+
// metadata
|
|
62
|
+
this.metadata = appMetadata;
|
|
63
|
+
}
|
|
64
|
+
_prepareEnv() {
|
|
65
|
+
const mode = this.app.config.meta.mode;
|
|
66
|
+
this.isProd = mode === 'prod';
|
|
67
|
+
this.isTest = mode === 'test';
|
|
68
|
+
this.isLocal = mode === 'local';
|
|
69
|
+
}
|
|
70
|
+
async waitAppStarted() {
|
|
71
|
+
return new Promise((resolve, reject) => {
|
|
72
|
+
// check once
|
|
73
|
+
if (this.appStarted) {
|
|
74
|
+
resolve(true);
|
|
75
|
+
}
|
|
76
|
+
if (this.appStartError) {
|
|
77
|
+
reject(this.appStartError);
|
|
78
|
+
}
|
|
79
|
+
// listen
|
|
80
|
+
this.app.once(EnumAppEvent.AppStarted, () => {
|
|
81
|
+
resolve(true);
|
|
82
|
+
});
|
|
83
|
+
this.app.once(EnumAppEvent.AppStartError, err => {
|
|
84
|
+
reject(err);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async close() {
|
|
89
|
+
if (!this[SymbolClosePromise]) {
|
|
90
|
+
this[SymbolClosePromise] = this._closeInner();
|
|
91
|
+
}
|
|
92
|
+
return this[SymbolClosePromise];
|
|
93
|
+
}
|
|
94
|
+
async _closeInner() {
|
|
95
|
+
if (this.app.meta.env.SERVER_WORKERS !== '1') {
|
|
96
|
+
// disconnect
|
|
97
|
+
cluster.worker?.disconnect();
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// close server
|
|
101
|
+
if (this.app.server) {
|
|
102
|
+
this.app.server.close();
|
|
103
|
+
// maybe hang up using await
|
|
104
|
+
// await promisify(this.app.server.close).call(this.app.server);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// appClose
|
|
108
|
+
this.appClose = true;
|
|
109
|
+
// hook: appClose
|
|
110
|
+
await this.app.util.monkeyModule(this.app.meta.appMonkey, this.app.meta.modulesMonkey, 'appClose');
|
|
111
|
+
// ctx counter
|
|
112
|
+
await this.app.meta.ctxCounter.awaitUntilZero();
|
|
113
|
+
// appClosed
|
|
114
|
+
this.appClosed = true;
|
|
115
|
+
// hook: appClosed
|
|
116
|
+
await this.app.util.monkeyModule(this.app.meta.appMonkey, this.app.meta.modulesMonkey, 'appClosed');
|
|
117
|
+
// container dispose
|
|
118
|
+
await this.app.bean.dispose();
|
|
119
|
+
// logger dispose
|
|
120
|
+
await this.app.meta.logger.dispose();
|
|
121
|
+
// need not call process.exit
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
export type MetadataKey = symbol | string;
|
|
3
|
+
export declare class AppMetadata {
|
|
4
|
+
defineMetadata<V>(metadataKey: MetadataKey, metadataValue: V, target: object, prop?: MetadataKey): void;
|
|
5
|
+
hasOwnMetadata(metadataKey: MetadataKey, target: object, prop?: MetadataKey): boolean;
|
|
6
|
+
hasMetadata(metadataKey: MetadataKey, target: object, prop?: MetadataKey): boolean;
|
|
7
|
+
getOwnMetadata<V>(metadataKey: MetadataKey, target: object, prop?: MetadataKey): V | undefined;
|
|
8
|
+
getMetadata<V>(metadataKey: MetadataKey, target: object, prop?: MetadataKey): V | undefined;
|
|
9
|
+
getOwnMetadataArray<Entry>(inherit: boolean, metadataKey: MetadataKey, target: object, prop?: MetadataKey): Array<Entry>;
|
|
10
|
+
getOwnMetadataMap<K extends PropertyKey, V>(inherit: boolean, metadataKey: MetadataKey, target: object, prop?: MetadataKey): Record<K, V>;
|
|
11
|
+
getDesignType(target: object, prop?: MetadataKey): unknown;
|
|
12
|
+
getDesignParamtypes(target: object, prop?: MetadataKey): unknown;
|
|
13
|
+
getDesignReturntype(target: object, prop?: MetadataKey): unknown;
|
|
14
|
+
}
|
|
15
|
+
export declare const appMetadata: AppMetadata;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { isUndefined } from '@cabloy/utils';
|
|
2
|
+
import 'reflect-metadata';
|
|
3
|
+
export class AppMetadata {
|
|
4
|
+
defineMetadata(metadataKey, metadataValue, target, prop) {
|
|
5
|
+
if (isUndefined(prop)) {
|
|
6
|
+
Reflect.defineMetadata(metadataKey, metadataValue, target);
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
Reflect.defineMetadata(metadataKey, metadataValue, target, prop);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
hasOwnMetadata(metadataKey, target, prop) {
|
|
13
|
+
if (isUndefined(prop))
|
|
14
|
+
return Reflect.hasOwnMetadata(metadataKey, target);
|
|
15
|
+
return Reflect.hasOwnMetadata(metadataKey, target, prop);
|
|
16
|
+
}
|
|
17
|
+
hasMetadata(metadataKey, target, prop) {
|
|
18
|
+
if (isUndefined(prop))
|
|
19
|
+
return Reflect.hasMetadata(metadataKey, target);
|
|
20
|
+
return Reflect.hasMetadata(metadataKey, target, prop);
|
|
21
|
+
}
|
|
22
|
+
getOwnMetadata(metadataKey, target, prop) {
|
|
23
|
+
if (isUndefined(prop))
|
|
24
|
+
return Reflect.getOwnMetadata(metadataKey, target);
|
|
25
|
+
return Reflect.getOwnMetadata(metadataKey, target, prop);
|
|
26
|
+
}
|
|
27
|
+
getMetadata(metadataKey, target, prop) {
|
|
28
|
+
if (isUndefined(prop))
|
|
29
|
+
return Reflect.getMetadata(metadataKey, target);
|
|
30
|
+
return Reflect.getMetadata(metadataKey, target, prop);
|
|
31
|
+
}
|
|
32
|
+
getOwnMetadataArray(inherit, metadataKey, target, prop) {
|
|
33
|
+
let own = this.getOwnMetadata(metadataKey, target, prop);
|
|
34
|
+
if (!own) {
|
|
35
|
+
if (!inherit) {
|
|
36
|
+
own = [];
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const parent = this.getMetadata(metadataKey, target, prop);
|
|
40
|
+
if (parent) {
|
|
41
|
+
own = parent.slice();
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
own = [];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
this.defineMetadata(metadataKey, own, target, prop);
|
|
48
|
+
}
|
|
49
|
+
return own;
|
|
50
|
+
}
|
|
51
|
+
getOwnMetadataMap(inherit, metadataKey, target, prop) {
|
|
52
|
+
let own = this.getOwnMetadata(metadataKey, target, prop);
|
|
53
|
+
if (!own) {
|
|
54
|
+
if (!inherit) {
|
|
55
|
+
own = {};
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
const parent = this.getMetadata(metadataKey, target, prop);
|
|
59
|
+
if (parent) {
|
|
60
|
+
own = Object.assign({}, parent);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
own = {};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
this.defineMetadata(metadataKey, own, target, prop);
|
|
67
|
+
}
|
|
68
|
+
return own;
|
|
69
|
+
}
|
|
70
|
+
getDesignType(target, prop) {
|
|
71
|
+
return this.getMetadata('design:type', target, prop);
|
|
72
|
+
}
|
|
73
|
+
getDesignParamtypes(target, prop) {
|
|
74
|
+
return this.getMetadata('design:paramtypes', target, prop);
|
|
75
|
+
}
|
|
76
|
+
getDesignReturntype(target, prop) {
|
|
77
|
+
return this.getMetadata('design:returntype', target, prop);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export const appMetadata = new AppMetadata();
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { IBeanRecord } from '../bean/type.ts';
|
|
2
|
+
import type { Constructable, IDecoratorBeanOptionsBase, IDecoratorUseOptionsBase } from '../decorator/index.ts';
|
|
3
|
+
import type { MetadataKey } from './metadata.ts';
|
|
4
|
+
import { BeanSimple } from '../bean/beanSimple.ts';
|
|
5
|
+
export declare const SymbolDecoratorBeanFullName: unique symbol;
|
|
6
|
+
export declare const SymbolDecoratorBeanInfo: unique symbol;
|
|
7
|
+
export declare const SymbolDecoratorProxyDisable: unique symbol;
|
|
8
|
+
export declare const SymbolDecoratorUse: unique symbol;
|
|
9
|
+
export type IAppResourceRecord = Record<string, IDecoratorBeanOptionsBase>;
|
|
10
|
+
export declare class AppResource extends BeanSimple {
|
|
11
|
+
beans: IAppResourceRecord;
|
|
12
|
+
scenes: Record<string, Record<string, IAppResourceRecord>>;
|
|
13
|
+
addUse(target: object, options: IDecoratorUseOptionsBase): void;
|
|
14
|
+
getUses(target: object): Record<MetadataKey, IDecoratorUseOptionsBase> | undefined;
|
|
15
|
+
addBean(beanOptions: Partial<IDecoratorBeanOptionsBase>): IDecoratorBeanOptionsBase<unknown, unknown>;
|
|
16
|
+
getBeanFullName<T>(A: Constructable<T> | undefined): string | undefined;
|
|
17
|
+
getBeanFullName<K extends keyof IBeanRecord>(beanFullName: K | undefined): K | undefined;
|
|
18
|
+
getBeanFullName(beanFullName: string | undefined): string | undefined;
|
|
19
|
+
getBean<T>(A: Constructable<T>): IDecoratorBeanOptionsBase<T> | undefined;
|
|
20
|
+
getBean<K extends keyof IBeanRecord>(beanFullName: K): IDecoratorBeanOptionsBase<IBeanRecord[K]> | undefined;
|
|
21
|
+
getBean<T>(beanFullName: string): IDecoratorBeanOptionsBase<T> | undefined;
|
|
22
|
+
_parseBeanName<T>(beanClass: Constructable<T>, scene?: string, name?: string): string;
|
|
23
|
+
_parseModuleBelong(module: any, beanClass: any, virtual: any): any;
|
|
24
|
+
_getModuleBelong<T>(A: Constructable<T>): string;
|
|
25
|
+
_getModuleBelong<K extends keyof IBeanRecord>(beanFullName: K): string;
|
|
26
|
+
_getModuleBelong(beanFullName: string): string;
|
|
27
|
+
_getModuleName<T>(A: Constructable<T>): string | undefined;
|
|
28
|
+
_getModuleName<K extends keyof IBeanRecord>(beanFullName: K): string | undefined;
|
|
29
|
+
_getModuleName(beanFullName: string): string | undefined;
|
|
30
|
+
_fixClassName(className: string): string;
|
|
31
|
+
_prepareOnionOptions(options: unknown, optionsPrimitive: boolean | undefined, scene: any, name: string): any;
|
|
32
|
+
}
|
|
33
|
+
export declare const appResource: AppResource;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { toLowerCaseFirstChar } from '@cabloy/word-utils';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { cast } from "../../types/utils/cast.js";
|
|
4
|
+
import { BeanSimple } from "../bean/beanSimple.js";
|
|
5
|
+
import { useApp } from "../framework/useApp.js";
|
|
6
|
+
import { registerMappedClassMetadataKey } from "../mappedClass/utils.js";
|
|
7
|
+
import { isClass } from "../utils/isClass.js";
|
|
8
|
+
import { deepExtend } from "../utils/util.js";
|
|
9
|
+
import { appMetadata } from "./metadata.js";
|
|
10
|
+
export const SymbolDecoratorBeanFullName = Symbol('SymbolDecoratorBeanFullName');
|
|
11
|
+
export const SymbolDecoratorBeanInfo = Symbol('SymbolDecoratorBeanInfo');
|
|
12
|
+
export const SymbolDecoratorProxyDisable = Symbol('SymbolDecoratorProxyDisable');
|
|
13
|
+
export const SymbolDecoratorUse = Symbol('SymbolDecoratorUse');
|
|
14
|
+
export class AppResource extends BeanSimple {
|
|
15
|
+
beans = {};
|
|
16
|
+
scenes = {};
|
|
17
|
+
addUse(target, options) {
|
|
18
|
+
registerMappedClassMetadataKey(target, SymbolDecoratorUse);
|
|
19
|
+
const uses = appMetadata.getOwnMetadataMap(true, SymbolDecoratorUse, target);
|
|
20
|
+
uses[options.prop] = options;
|
|
21
|
+
if (process.env.NODE_ENV === 'development') {
|
|
22
|
+
if (typeof options.prop === 'string' && !options.prop.startsWith('$$')) {
|
|
23
|
+
console.error(chalk.red(`inject prop name should start with $$: ${options.prop}`));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
getUses(target) {
|
|
28
|
+
return appMetadata.getMetadata(SymbolDecoratorUse, target);
|
|
29
|
+
}
|
|
30
|
+
addBean(beanOptions) {
|
|
31
|
+
let { module, scene, name, beanClass, virtual, options, optionsPrimitive } = beanOptions;
|
|
32
|
+
// name
|
|
33
|
+
name = this._parseBeanName(beanClass, scene, name);
|
|
34
|
+
// module
|
|
35
|
+
if (!module) {
|
|
36
|
+
throw new Error(`module name not parsed for bean: ${scene}.${name}`);
|
|
37
|
+
}
|
|
38
|
+
// beanFullName
|
|
39
|
+
const beanFullName = scene && scene !== 'bean' ? `${module}.${scene}.${name}` : name;
|
|
40
|
+
// moduleBelong
|
|
41
|
+
const moduleBelong = this._parseModuleBelong(module, beanClass, virtual);
|
|
42
|
+
// options
|
|
43
|
+
const options2 = this._prepareOnionOptions(options, optionsPrimitive, scene, `${module}:${name}`);
|
|
44
|
+
// beanOptions2
|
|
45
|
+
const beanOptions2 = {
|
|
46
|
+
...beanOptions,
|
|
47
|
+
beanFullName,
|
|
48
|
+
name,
|
|
49
|
+
moduleBelong,
|
|
50
|
+
options: options2,
|
|
51
|
+
};
|
|
52
|
+
// record
|
|
53
|
+
this.beans[beanFullName] = beanOptions2;
|
|
54
|
+
if (!this.scenes[scene])
|
|
55
|
+
this.scenes[scene] = {};
|
|
56
|
+
if (!this.scenes[scene][module])
|
|
57
|
+
this.scenes[scene][module] = {};
|
|
58
|
+
this.scenes[scene][module][beanFullName] = beanOptions2;
|
|
59
|
+
// set metadata
|
|
60
|
+
appMetadata.defineMetadata(SymbolDecoratorBeanFullName, beanFullName, beanOptions2.beanClass);
|
|
61
|
+
// ok
|
|
62
|
+
return beanOptions2;
|
|
63
|
+
}
|
|
64
|
+
getBeanFullName(beanFullName) {
|
|
65
|
+
if (!beanFullName)
|
|
66
|
+
return beanFullName;
|
|
67
|
+
if (typeof beanFullName === 'function' && isClass(beanFullName)) {
|
|
68
|
+
return appMetadata.getOwnMetadata(SymbolDecoratorBeanFullName, beanFullName);
|
|
69
|
+
}
|
|
70
|
+
return beanFullName;
|
|
71
|
+
}
|
|
72
|
+
getBean(beanFullName) {
|
|
73
|
+
const fullName = this.getBeanFullName(beanFullName);
|
|
74
|
+
if (!fullName)
|
|
75
|
+
return null;
|
|
76
|
+
return this.beans[fullName];
|
|
77
|
+
}
|
|
78
|
+
_parseBeanName(beanClass, scene, name) {
|
|
79
|
+
// name
|
|
80
|
+
if (name)
|
|
81
|
+
return name;
|
|
82
|
+
// scene
|
|
83
|
+
if (!scene)
|
|
84
|
+
scene = 'bean';
|
|
85
|
+
scene = scene.replace(/\./g, '');
|
|
86
|
+
// bean class name
|
|
87
|
+
const beanClassName = this._fixClassName(beanClass.name);
|
|
88
|
+
if (beanClassName.toLocaleUpperCase().startsWith(scene.toLocaleUpperCase())) {
|
|
89
|
+
name = beanClassName.substring(scene.length);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
name = beanClassName;
|
|
93
|
+
}
|
|
94
|
+
// lowerCase
|
|
95
|
+
name = toLowerCaseFirstChar(name);
|
|
96
|
+
return name;
|
|
97
|
+
}
|
|
98
|
+
_parseModuleBelong(module, beanClass, virtual) {
|
|
99
|
+
// not set when virtual
|
|
100
|
+
if (virtual)
|
|
101
|
+
return;
|
|
102
|
+
// check parent
|
|
103
|
+
let moduleBelong;
|
|
104
|
+
let parent = Object.getPrototypeOf(beanClass);
|
|
105
|
+
while (parent) {
|
|
106
|
+
const beanOptions = this.getBean(parent);
|
|
107
|
+
if (beanOptions && beanOptions.moduleBelong) {
|
|
108
|
+
moduleBelong = beanOptions.moduleBelong;
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
parent = Object.getPrototypeOf(parent);
|
|
112
|
+
}
|
|
113
|
+
// set to current when parent not set
|
|
114
|
+
if (!moduleBelong) {
|
|
115
|
+
moduleBelong = module;
|
|
116
|
+
}
|
|
117
|
+
return moduleBelong;
|
|
118
|
+
}
|
|
119
|
+
_getModuleBelong(beanFullName) {
|
|
120
|
+
const beanOptions = this.getBean(beanFullName);
|
|
121
|
+
if (!beanOptions || !beanOptions.moduleBelong)
|
|
122
|
+
throw new Error(`not found module belong: ${beanFullName}`);
|
|
123
|
+
return beanOptions.moduleBelong;
|
|
124
|
+
}
|
|
125
|
+
_getModuleName(beanFullName) {
|
|
126
|
+
const beanOptions = this.getBean(beanFullName);
|
|
127
|
+
return beanOptions?.module;
|
|
128
|
+
}
|
|
129
|
+
_fixClassName(className) {
|
|
130
|
+
while (className.endsWith('2')) {
|
|
131
|
+
className = className.substring(0, className.length - 1);
|
|
132
|
+
}
|
|
133
|
+
return className;
|
|
134
|
+
}
|
|
135
|
+
_prepareOnionOptions(options, optionsPrimitive, scene, name) {
|
|
136
|
+
const app = useApp();
|
|
137
|
+
const optionsConfig = cast(app?.config)?.onions?.[scene]?.[name];
|
|
138
|
+
if (optionsPrimitive) {
|
|
139
|
+
return optionsConfig === undefined ? options : optionsConfig;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
return deepExtend({}, options, optionsConfig);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
export const appResource = new AppResource();
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { appMetadata } from "../../core/metadata.js";
|
|
2
|
+
import { SymbolDecoratorBeanInfo } from "../../core/resource.js";
|
|
3
|
+
export function BeanInfo(options) {
|
|
4
|
+
return function (target) {
|
|
5
|
+
// set metadata
|
|
6
|
+
appMetadata.defineMetadata(SymbolDecoratorBeanInfo, options, target);
|
|
7
|
+
};
|
|
8
|
+
}
|