vona-core 1.0.0 → 5.0.10

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.
Files changed (233) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.d.ts +4 -0
  3. package/dist/index.js +4 -0
  4. package/dist/lib/bean/beanAopBase.d.ts +3 -0
  5. package/dist/lib/bean/beanAopBase.js +3 -0
  6. package/dist/lib/bean/beanAopMethodBase.d.ts +3 -0
  7. package/dist/lib/bean/beanAopMethodBase.js +3 -0
  8. package/dist/lib/bean/beanBase.d.ts +19 -0
  9. package/dist/lib/bean/beanBase.js +36 -0
  10. package/dist/lib/bean/beanBaseSimple.d.ts +14 -0
  11. package/dist/lib/bean/beanBaseSimple.js +27 -0
  12. package/dist/lib/bean/beanContainer.d.ts +40 -0
  13. package/dist/lib/bean/beanContainer.js +578 -0
  14. package/dist/lib/bean/beanSimple.d.ts +7 -0
  15. package/dist/lib/bean/beanSimple.js +9 -0
  16. package/dist/lib/bean/index.d.ts +9 -0
  17. package/dist/lib/bean/index.js +9 -0
  18. package/dist/lib/bean/resource/config/index.d.ts +1 -0
  19. package/dist/lib/bean/resource/config/index.js +1 -0
  20. package/dist/lib/bean/resource/config/type.d.ts +2 -0
  21. package/dist/lib/bean/resource/config/type.js +1 -0
  22. package/dist/lib/bean/resource/constant/index.d.ts +1 -0
  23. package/dist/lib/bean/resource/constant/index.js +1 -0
  24. package/dist/lib/bean/resource/constant/type.d.ts +1 -0
  25. package/dist/lib/bean/resource/constant/type.js +1 -0
  26. package/dist/lib/bean/resource/error/_errorInternal.d.ts +66 -0
  27. package/dist/lib/bean/resource/error/_errorInternal.js +66 -0
  28. package/dist/lib/bean/resource/error/beanScopeError.d.ts +10 -0
  29. package/dist/lib/bean/resource/error/beanScopeError.js +17 -0
  30. package/dist/lib/bean/resource/error/beanScopeErrorImpl.d.ts +13 -0
  31. package/dist/lib/bean/resource/error/beanScopeErrorImpl.js +18 -0
  32. package/dist/lib/bean/resource/error/errorApplication.d.ts +32 -0
  33. package/dist/lib/bean/resource/error/errorApplication.js +1 -0
  34. package/dist/lib/bean/resource/error/errorClass.d.ts +17 -0
  35. package/dist/lib/bean/resource/error/errorClass.js +71 -0
  36. package/dist/lib/bean/resource/error/errorGlobal.d.ts +7 -0
  37. package/dist/lib/bean/resource/error/errorGlobal.js +1 -0
  38. package/dist/lib/bean/resource/error/errorObject.d.ts +4 -0
  39. package/dist/lib/bean/resource/error/errorObject.js +1 -0
  40. package/dist/lib/bean/resource/error/index.d.ts +7 -0
  41. package/dist/lib/bean/resource/error/index.js +7 -0
  42. package/dist/lib/bean/resource/error/type.d.ts +8 -0
  43. package/dist/lib/bean/resource/error/type.js +1 -0
  44. package/dist/lib/bean/resource/index.d.ts +4 -0
  45. package/dist/lib/bean/resource/index.js +4 -0
  46. package/dist/lib/bean/resource/locale/appLocale.d.ts +7 -0
  47. package/dist/lib/bean/resource/locale/appLocale.js +45 -0
  48. package/dist/lib/bean/resource/locale/beanScopeLocale.d.ts +10 -0
  49. package/dist/lib/bean/resource/locale/beanScopeLocale.js +16 -0
  50. package/dist/lib/bean/resource/locale/index.d.ts +3 -0
  51. package/dist/lib/bean/resource/locale/index.js +3 -0
  52. package/dist/lib/bean/resource/locale/type.d.ts +19 -0
  53. package/dist/lib/bean/resource/locale/type.js +1 -0
  54. package/dist/lib/bean/scope/beanScopeBase.d.ts +19 -0
  55. package/dist/lib/bean/scope/beanScopeBase.js +88 -0
  56. package/dist/lib/bean/scope/beanScopeContainer.d.ts +7 -0
  57. package/dist/lib/bean/scope/beanScopeContainer.js +15 -0
  58. package/dist/lib/bean/scope/beanScopeScene.d.ts +11 -0
  59. package/dist/lib/bean/scope/beanScopeScene.js +20 -0
  60. package/dist/lib/bean/scope/beanScopeUtil.d.ts +10 -0
  61. package/dist/lib/bean/scope/beanScopeUtil.js +18 -0
  62. package/dist/lib/bean/scope/index.d.ts +4 -0
  63. package/dist/lib/bean/scope/index.js +4 -0
  64. package/dist/lib/bean/type.d.ts +21 -0
  65. package/dist/lib/bean/type.js +2 -0
  66. package/dist/lib/core/application.d.ts +25 -0
  67. package/dist/lib/core/application.js +78 -0
  68. package/dist/lib/core/asyncLocalStorage.d.ts +8 -0
  69. package/dist/lib/core/asyncLocalStorage.js +23 -0
  70. package/dist/lib/core/config.d.ts +12 -0
  71. package/dist/lib/core/config.js +120 -0
  72. package/dist/lib/core/context.d.ts +2 -0
  73. package/dist/lib/core/context.js +104 -0
  74. package/dist/lib/core/ctxCounter.d.ts +7 -0
  75. package/dist/lib/core/ctxCounter.js +20 -0
  76. package/dist/lib/core/index.d.ts +6 -0
  77. package/dist/lib/core/index.js +6 -0
  78. package/dist/lib/core/locales.d.ts +137 -0
  79. package/dist/lib/core/locales.js +6 -0
  80. package/dist/lib/core/logger.d.ts +22 -0
  81. package/dist/lib/core/logger.js +147 -0
  82. package/dist/lib/core/loggerDefault.d.ts +3 -0
  83. package/dist/lib/core/loggerDefault.js +44 -0
  84. package/dist/lib/core/meta.d.ts +42 -0
  85. package/dist/lib/core/meta.js +123 -0
  86. package/dist/lib/core/metadata.d.ts +15 -0
  87. package/dist/lib/core/metadata.js +80 -0
  88. package/dist/lib/core/resource.d.ts +33 -0
  89. package/dist/lib/core/resource.js +146 -0
  90. package/dist/lib/decorator/class/beanInfo.d.ts +2 -0
  91. package/dist/lib/decorator/class/beanInfo.js +8 -0
  92. package/dist/lib/decorator/class/createBeanDecorator.d.ts +3 -0
  93. package/dist/lib/decorator/class/createBeanDecorator.js +23 -0
  94. package/dist/lib/decorator/class/index.d.ts +4 -0
  95. package/dist/lib/decorator/class/index.js +4 -0
  96. package/dist/lib/decorator/class/proxyDisable.d.ts +1 -0
  97. package/dist/lib/decorator/class/proxyDisable.js +8 -0
  98. package/dist/lib/decorator/class/use.d.ts +7 -0
  99. package/dist/lib/decorator/class/use.js +69 -0
  100. package/dist/lib/decorator/class/util.d.ts +3 -0
  101. package/dist/lib/decorator/class/util.js +9 -0
  102. package/dist/lib/decorator/index.d.ts +3 -0
  103. package/dist/lib/decorator/index.js +3 -0
  104. package/dist/lib/decorator/interface/beanOptions.d.ts +21 -0
  105. package/dist/lib/decorator/interface/beanOptions.js +1 -0
  106. package/dist/lib/decorator/interface/index.d.ts +2 -0
  107. package/dist/lib/decorator/interface/index.js +2 -0
  108. package/dist/lib/decorator/interface/useOptions.d.ts +29 -0
  109. package/dist/lib/decorator/interface/useOptions.js +1 -0
  110. package/dist/lib/decorator/type/constructable.d.ts +1 -0
  111. package/dist/lib/decorator/type/constructable.js +1 -0
  112. package/dist/lib/decorator/type/containerScope.d.ts +1 -0
  113. package/dist/lib/decorator/type/containerScope.js +1 -0
  114. package/dist/lib/decorator/type/function.d.ts +6 -0
  115. package/dist/lib/decorator/type/function.js +1 -0
  116. package/dist/lib/decorator/type/index.d.ts +4 -0
  117. package/dist/lib/decorator/type/index.js +4 -0
  118. package/dist/lib/decorator/type/injectionScope.d.ts +1 -0
  119. package/dist/lib/decorator/type/injectionScope.js +1 -0
  120. package/dist/lib/framework/bootstrap.d.ts +3 -0
  121. package/dist/lib/framework/bootstrap.js +13 -0
  122. package/dist/lib/framework/cluster.d.ts +2 -0
  123. package/dist/lib/framework/cluster.js +32 -0
  124. package/dist/lib/framework/createApp.d.ts +2 -0
  125. package/dist/lib/framework/createApp.js +71 -0
  126. package/dist/lib/framework/index.d.ts +4 -0
  127. package/dist/lib/framework/index.js +4 -0
  128. package/dist/lib/framework/process.d.ts +2 -0
  129. package/dist/lib/framework/process.js +36 -0
  130. package/dist/lib/framework/start.d.ts +10 -0
  131. package/dist/lib/framework/start.js +51 -0
  132. package/dist/lib/framework/useApp.d.ts +4 -0
  133. package/dist/lib/framework/useApp.js +49 -0
  134. package/dist/lib/index.d.ts +6 -0
  135. package/dist/lib/index.js +6 -0
  136. package/dist/lib/locale/en-us.d.ts +68 -0
  137. package/dist/lib/locale/en-us.js +68 -0
  138. package/dist/lib/locale/zh-cn.d.ts +68 -0
  139. package/dist/lib/locale/zh-cn.js +68 -0
  140. package/dist/lib/mappedClass/index.d.ts +3 -0
  141. package/dist/lib/mappedClass/index.js +3 -0
  142. package/dist/lib/mappedClass/mappedClass.d.ts +10 -0
  143. package/dist/lib/mappedClass/mappedClass.js +10 -0
  144. package/dist/lib/mappedClass/mixinClass.d.ts +8 -0
  145. package/dist/lib/mappedClass/mixinClass.js +8 -0
  146. package/dist/lib/mappedClass/omitClass.d.ts +2 -0
  147. package/dist/lib/mappedClass/omitClass.js +14 -0
  148. package/dist/lib/mappedClass/partialClass.d.ts +3 -0
  149. package/dist/lib/mappedClass/partialClass.js +15 -0
  150. package/dist/lib/mappedClass/pickClass.d.ts +2 -0
  151. package/dist/lib/mappedClass/pickClass.js +14 -0
  152. package/dist/lib/mappedClass/type.d.ts +6 -0
  153. package/dist/lib/mappedClass/type.js +1 -0
  154. package/dist/lib/mappedClass/utils.d.ts +8 -0
  155. package/dist/lib/mappedClass/utils.js +76 -0
  156. package/dist/lib/module/config.d.ts +3 -0
  157. package/dist/lib/module/config.js +17 -0
  158. package/dist/lib/module/constant.d.ts +3 -0
  159. package/dist/lib/module/constant.js +16 -0
  160. package/dist/lib/module/errors.d.ts +3 -0
  161. package/dist/lib/module/errors.js +29 -0
  162. package/dist/lib/module/loader.d.ts +4 -0
  163. package/dist/lib/module/loader.js +25 -0
  164. package/dist/lib/module/locales.d.ts +3 -0
  165. package/dist/lib/module/locales.js +48 -0
  166. package/dist/lib/module/module.d.ts +7 -0
  167. package/dist/lib/module/module.js +32 -0
  168. package/dist/lib/utils/index.d.ts +4 -0
  169. package/dist/lib/utils/index.js +4 -0
  170. package/dist/lib/utils/isClass.d.ts +2 -0
  171. package/dist/lib/utils/isClass.js +18 -0
  172. package/dist/lib/utils/retry.d.ts +4 -0
  173. package/dist/lib/utils/retry.js +16 -0
  174. package/dist/lib/utils/util.d.ts +59 -0
  175. package/dist/lib/utils/util.js +298 -0
  176. package/dist/lib/utils/zod-openapi.d.ts +1 -0
  177. package/dist/lib/utils/zod-openapi.js +3 -0
  178. package/dist/types/application/app.d.ts +36 -0
  179. package/dist/types/application/app.js +1 -0
  180. package/dist/types/application/index.d.ts +1 -0
  181. package/dist/types/application/index.js +1 -0
  182. package/dist/types/config/config.d.ts +36 -0
  183. package/dist/types/config/config.js +1 -0
  184. package/dist/types/config/index.d.ts +3 -0
  185. package/dist/types/config/index.js +3 -0
  186. package/dist/types/config/instance.d.ts +7 -0
  187. package/dist/types/config/instance.js +1 -0
  188. package/dist/types/config/locale.d.ts +10 -0
  189. package/dist/types/config/locale.js +3 -0
  190. package/dist/types/context/contextBase.d.ts +24 -0
  191. package/dist/types/context/contextBase.js +1 -0
  192. package/dist/types/context/contextConfig.d.ts +3 -0
  193. package/dist/types/context/contextConfig.js +1 -0
  194. package/dist/types/context/contextOthers.d.ts +4 -0
  195. package/dist/types/context/contextOthers.js +1 -0
  196. package/dist/types/context/contextState.d.ts +7 -0
  197. package/dist/types/context/contextState.js +1 -0
  198. package/dist/types/context/index.d.ts +10 -0
  199. package/dist/types/context/index.js +1 -0
  200. package/dist/types/enum/appEvent.d.ts +4 -0
  201. package/dist/types/enum/appEvent.js +5 -0
  202. package/dist/types/enum/httpStatus.d.ts +68 -0
  203. package/dist/types/enum/httpStatus.js +69 -0
  204. package/dist/types/enum/index.d.ts +2 -0
  205. package/dist/types/enum/index.js +2 -0
  206. package/dist/types/index.d.ts +6 -0
  207. package/dist/types/index.js +6 -0
  208. package/dist/types/interface/bootstrap.d.ts +10 -0
  209. package/dist/types/interface/bootstrap.js +1 -0
  210. package/dist/types/interface/index.d.ts +4 -0
  211. package/dist/types/interface/index.js +4 -0
  212. package/dist/types/interface/logger.d.ts +22 -0
  213. package/dist/types/interface/logger.js +1 -0
  214. package/dist/types/interface/module.d.ts +24 -0
  215. package/dist/types/interface/module.js +1 -0
  216. package/dist/types/interface/monkey.d.ts +31 -0
  217. package/dist/types/interface/monkey.js +1 -0
  218. package/dist/types/utils/cast.d.ts +5 -0
  219. package/dist/types/utils/cast.js +3 -0
  220. package/dist/types/utils/demo.d.ts +4 -0
  221. package/dist/types/utils/demo.js +1 -0
  222. package/dist/types/utils/env.d.ts +25 -0
  223. package/dist/types/utils/env.js +1 -0
  224. package/dist/types/utils/index.d.ts +6 -0
  225. package/dist/types/utils/index.js +6 -0
  226. package/dist/types/utils/omitNever.d.ts +9 -0
  227. package/dist/types/utils/omitNever.js +1 -0
  228. package/dist/types/utils/powerPartial.d.ts +3 -0
  229. package/dist/types/utils/powerPartial.js +1 -0
  230. package/dist/types/utils/type.d.ts +3 -0
  231. package/dist/types/utils/type.js +1 -0
  232. package/package.json +37 -18
  233. 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,3 @@
1
+ import type { VonaAppInfo } from '../../types/application/app.ts';
2
+ import type { ConfigLogger } from '../../types/interface/logger.ts';
3
+ export declare function combineLoggerDefault(_appInfo: VonaAppInfo): ConfigLogger;
@@ -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,2 @@
1
+ import type { IDecoratorBeanInfoOptions } from '../interface/beanOptions.ts';
2
+ export declare function BeanInfo(options: IDecoratorBeanInfoOptions): ClassDecorator;
@@ -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
+ }